Synaplan
開源 AI 平台,供企業使用:自行託管的 AI 代理、符合 GDPR 的聊天機器人小工具、RAG 知識庫、WhatsApp 與 Outlook AI、MCP、多模型路由。Docker、Kubernetes 或託管於 Germ
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Subscription app sold to many hotels. Each hotel (restaurant, rooms and/or banquet hall) gets: daily counter (sales by cash / UPI / card / bank / Zomato / Swiggy / credit), category-wise expenses, cash drawer close, employee advances, attendance, payroll, dues and partner reports.
Stack: Next.js 16 (App Router, server actions) + Drizzle ORM + Postgres.
Locally the database is embedded Postgres (PGlite, in .data/), so nothing
needs installing. In the cloud it is any Postgres (Railway or Supabase).
/signup: hotel name, city, sections (restaurant / rooms /
banquet), owner name, mobile number (the login) and password. The hotel is
created on a 14-day free trial (Growth plan limits) with default expense
categories and Zomato / Swiggy parties, and the owner is logged in.
The platform owner can also onboard a hotel from the Platform console./billing, set with
PLATFORM_PAYMENT_NOTE). The platform owner records the payment on the
hotel's page; that sets the plan and extends "paid until". Paying during the
trial keeps the remaining trial days.Plans (editable in Platform > Plans): Starter ₹999/mo (25 employees, 5 logins), Growth ₹1,999/mo (100 employees, 15 logins), Pro ₹3,499/mo (unlimited). Limits are enforced when adding employees and logins. These prices are placeholders.
Every hotel's data is separated by hotel_id on every table; every query and
server action filters on the logged-in user's hotel.
npm install
npm run seed -- --demo # platform owner + two demo hotels; logins in .data/logins.txt
npm run dev # http://localhost:3420
Demo: platform is the platform owner; admin owns "Shree Palace" (paying,
45 days of data, plus manager / cashier / partner / viewer / employee logins);
sagar owns "Sagar Residency" (on trial). npm run seed without --demo
creates only the plans and the platform owner login.
To start over locally: stop the server and delete .data/pglite. Always stop
the dev server normally; a hard kill can leave the local database unreadable.
/payslip/[id]), also
linked from My Salary./export).A booking is made for a future date with customer name and mobile, occasion, date and time slot (or check-in / check-out for rooms), hall or room numbers, guests / plates, rate and total. Each booking gets a number (BK-0001, per hotel) and its own customer account, so money flows through the normal books:
/bookings/[id]/slip): print / save as PDF, or send
on WhatsApp (opens WhatsApp with the details filled in, to the customer's
number).Managers and cashiers can create bookings and take payments; completing or cancelling needs a manager or the owner.
| Role | Can do |
|---|---|
| superadmin | Platform owner (you). Sees all hotels, records subscription payments, extends trials, suspends hotels, edits plan prices. Cannot see inside a hotel's counter. |
| admin | Everything. Only role that adds or edits employees, logins, categories, parties, and reopens closed days. |
| manager | Counter entries, close the day, attendance for workers assigned to them. No salary figures. |
| cashier | Counter entries only. |
| partner | Read everything (dashboard, counter, payroll, partner shares, activity log, reports). Cannot add or change anything. |
| viewer | Read dashboard, counter and reports. No payroll. |
| employee | Own attendance calendar, salary calculation and advances. |
Staff can enter only for today and yesterday, and only while the day is open.
Once a day is closed it is locked until admin reopens it. Every create, delete,
close and reopen is written to audit_log.
DATABASE_URL = the pooler string abovePLATFORM_PAYMENT_NOTE = your UPI ID / bank / WhatsApp for renewals.
Deploy. npm run build applies database migrations before building, so the
first deploy creates all tables and each later deploy updates them once.
vercel.json runs the server functions in Mumbai (bom1), next to the
database.DATABASE_URL="postgres://..." npm run seed adds the plans and the
platform login. The password is written to .data/logins.txt; log in
once and change it from My account.AWS Lightsail (Mumbai), an always-on server instead of serverless:
curl -fsSL https://raw.githubusercontent.com/neelsanjaypatel/hotel-managment/main/deploy/aws/setup.sh -o setup.sh && bash setup.sh yourdomain.in.
It asks for DATABASE_URL, DATA_KEY, the Google keys and the payment note, installs
Node 22 and Caddy (automatic HTTPS), builds, and runs the app as the hotel-desk systemd service.@ and www A records at the
static IP. Caddy then gets the certificates; the bare domain redirects to www.sudo hotel-desk-update.
Logs: journalctl -u hotel-desk -f.Railway works too: railway.json builds with npm run build and starts with
npm start (which migrates first); set DATABASE_URL to
${{Postgres.DATABASE_URL}}.
The app refuses to run in production without DATABASE_URL: a container's disk
is wiped on each deploy, so the local PGlite database cannot be used there.
Schema changes: edit src/db/schema.ts, run npm run db:generate. Locally the
dev server applies migrations to PGlite on start; in production npm start
(or npm run db:migrate) applies them to DATABASE_URL before the server
starts. Any Postgres works the same way (Supabase: use the Transaction pooler
string, port 6543).
Owners can log in with Google. Without these variables the button is hidden and passwords keep working.
https://<your-domain>/auth/google/callback.GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET and APP_URL (for example https://www.desk24.in) in the server environment.An owner connects Google from My account; after that their password stops working. If they lose the Google account, the platform owner resets the login on the hotel's Platform page.
Aadhaar numbers are encrypted with DATA_KEY, 32 random bytes in base64, set in the server's environment:
openssl rand -base64 32
Keep a safe copy. Without this key stored numbers cannot be read; the rest of the app keeps working. Staff and bill photos are shrunk in the browser and stored in the attachments table, served only through /files/[id].
Set SMTP_USER (a Gmail address) and SMTP_PASS (its Google App Password) in the server environment. People add and confirm an email in My account or at signup; a confirmed email can log in and receive a reset link. Without these variables the app keeps working and the forgot page says email reset is off.