Synaplan
Open-source AI platform for companies: self-hosted AI agents, GDPR-compliant chatbot widget, RAG knowledge base, WhatsApp and Outlook AI, MCP, multi-model routing. Docker, Kubernetes or hosted in Germ
Effortless front desk software for boutique hotels, resorts and premium stays, with your own commission-free booking website.
BusinessTypeScript · JavaScriptGitHub @AmmarkarimiOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗A complete, easy-to-use system for small and independent hotels, guest houses and homestays: bookings, a room calendar, check-in/check-out, guest records with ID photos, billing with GST invoices, payments, housekeeping, owner reports, staff accounts and a commission-free online booking website for guests.
One installation serves many hotels. As the software provider you run your
own owner panel at /platform: create a hotel and its owner's sign-in, and
see every month which hotels have paid you. Each hotel only ever sees its own data.
It is designed for people with no technical knowledge: plain words instead of hotel jargon, big buttons, one obvious next step on every screen, friendly confirmations, and it works on a phone.
Visitors who are not signed in see a landing page at / with every feature and
a 3-minute video tour recorded from the real app, so hotel owners can see how it
works before they talk to you. Set SALES_WHATSAPP so they can contact you from it.
Full reference guide: docs/ covers the owner panel, the hotel software, hosting, troubleshooting and technical details.
Why these features? See docs/RESEARCH.md — a summary of what competitors (Cloudbeds, Little Hotelier, eZee, Hotelogix, RoomRaccoon…) offer and what small-hotel owners actually complain about and ask for.
| Area | What you can do |
|---|---|
| Today screen | Arrivals with one-tap Check in, departures with Check out and bill, colour-coded board of every room, money received today (by cash/UPI/card), money still to collect, rooms to clean, setup checklist, staff activity |
| New booking wizard | 4 steps: dates (quick “2 nights” buttons) → free rooms with total price → returning-guest search or new guest → price, discount, source, advance payment. Walk-in mode checks the guest in immediately. Confirmation via WhatsApp or print |
| No double bookings | Availability is date-based; the database locks a room while a booking is saved, so two people can never book the same room for the same night |
| Room calendar | Tape chart of all rooms for 7/14 days; tap an empty box to book that room from that date |
| Booking page | Live bill (room nights, weekend/festival prices, discount, extras, taxes), payments and refunds, extend stay, change dates, move room, early/late checkout, no-show, cancel, undo check-in |
| Extras | Add food, laundry, minibar, taxi, extra bed or damage charges to the guest’s bill |
| Billing & GST | Indian GST slabs (0% / 5% / 18% by nightly tariff, editable) or one flat tax rate; separate tax on extras; final invoice snapshot at checkout |
| Printables | GST tax invoice (GSTINs, SAC codes, CGST/SGST, amount in words), proforma bill, booking confirmation, guest registration card with Form C fields for foreign guests |
| Guests | Profiles with stays, nights, total paid and money owed; ID photo upload from the phone camera; passport/visa for foreigners; company & GSTIN; VIP and “do not allow” flags |
| Housekeeping | Needs cleaning / being cleaned / clean board; rooms become dirty automatically at checkout; rooms with guests arriving today shown first |
| Payments | Cash, UPI, card, bank transfer, or prepaid on a booking site; refunds; daily cash-drawer totals (cash received minus cash expenses) |
| Booking-site payouts | For MakeMyTrip, Goibibo, Booking.com and others: the bill stays on the gross amount while the owner records the site's booking ID, commission, GST on it, TCS, TDS, the net payout and when it reached the bank |
Requirements: Node.js 20+ and PostgreSQL 14+.
# 1. Start PostgreSQL (or use your own)
docker compose up -d
# 2. Configure
cp .env.example .env
# 3. Install, create the database tables and load demo data
npm install
npm run db:setup:dev # migrations + demo hotel with rooms, guests and bookings
npm run dev
Open http://localhost:3000 and sign in:
| Role | Password | |
|---|---|---|
| Owner / manager | [email protected] | admin123 |
| Front desk | [email protected] | staff123 |
The guest booking website is at http://localhost:3000/book/sunrise-residency.
The provider's owner panel is at http://localhost:3000/platform. Set
PLATFORM_ADMIN_EMAIL and PLATFORM_ADMIN_PASSWORD in .env first (see below).
Change these passwords after the first sign-in (My account, or Settings → Staff).
/platform)PLATFORM_ADMIN_EMAIL (your email) and
PLATFORM_ADMIN_PASSWORD (at least 10 characters), then redeploy. This is the
only owner-panel account. It lives in the hosting settings, not in the
database, so nobody can create another one from inside the app. Without both
variables /platform stays locked. To change the password, change the variable
and redeploy; every open owner-panel session is signed out.https://<your-site>/platform and sign in.Sign-in emails are unique across all hotels, so hotel staff simply sign in at
/login and land in their own hotel.
npm run db:seed once — this creates only the two
sign-in accounts for the first hotel, no demo data. Further hotels are created
from /platform.| Variable | Required | Description |
|---|---|---|
DATABASE_URL | Yes | PostgreSQL connection string |
JWT_SECRET | Production | Secret for sign-in sessions. Generate with openssl rand -base64 32 |
STORAGE_DRIVER | No | local (default) or blob. Auto-selects blob when BLOB_READ_WRITE_TOKEN is set |
UPLOAD_DIR | No | Folder for ID uploads when STORAGE_DRIVER=local (default ./uploads) |
BLOB_READ_WRITE_TOKEN | Vercel | Vercel Blob token for ID uploads |
NEXT_PUBLIC_DEMO_MODE | No | true shows the demo sign-in accounts on the login page in production |
PLATFORM_ADMIN_EMAIL | For /platform | The software provider's sign-in email for the owner panel |
PLATFORM_ADMIN_PASSWORD | For /platform | Its password, at least 10 characters. Changing it signs out open owner-panel sessions |
PLATFORM_TIMEZONE | No | Time zone that decides "this month" for subscriptions (default Asia/Kolkata) |
SALES_WHATSAPP | Recommended | Your WhatsApp number (with country code) for the landing page's contact buttons |
SALES_EMAIL | No | Your email, shown on the landing page |
DATABASE_URL.BLOB_READ_WRITE_TOKEN (for ID photos).JWT_SECRET under Settings → Environment Variables.prisma generate → prisma migrate deploy → next build.
Preview builds (pull requests and branches) skip the migration step so they never
change your live database; for fully working previews, add a separate preview
database as DATABASE_URL for the Preview environment.DATABASE_URL="<production url>" npm run db:seed.P1012 Environment variable not found: DATABASE_URLThat Vercel project has no database configured. Open the project → Storage →
connect a Postgres database (or add DATABASE_URL under Settings → Environment
Variables for Production), add JWT_SECRET, and redeploy. If two Vercel projects
are connected to this repository, keep the one that has the database and delete or
disconnect the other.
Any Node host with PostgreSQL works (Railway, Render, a VPS): set the variables,
run npm run build and npm start. For local file storage, keep ./uploads on a
persistent disk.
The migration 20261008000000_hotel_suite upgrades databases from the earlier
“Hotel Billing Manager” version in place: existing rooms, guests, bookings,
payments and bills are kept, bookings get numbers starting at 1001, and old
reserved/housekeeping room statuses are converted. Run npm run db:migrate
(Vercel does this automatically on deploy).
The migration 20261009000000_multi_hotel turns a single-hotel installation into
a multi-hotel one: all existing data is moved into one hotel named after the
current hotel profile, with no monthly fee until you set one in /platform. Its
booking page moves to /book/<hotel-name>; the old /book link keeps redirecting
there while it is the only hotel.
| Command | Description |
|---|---|
npm run dev | Development server |
npm run build / npm start | Production build (applies migrations) / start |
npm test | Unit tests for dates, pricing, GST, folio maths, amount-in-words and subscriptions |
npm run lint / npm run typecheck | ESLint / TypeScript checks |
npm run db:migrate | Apply database migrations |
npm run db:seed | Create the owner and front-desk sign-in accounts only |
npm run db:seed:demo | Also load a demo hotel with rooms, guests and bookings |
npm run db:setup:dev | Migrate + demo data (development) |
YYYY-MM-DD keys
(src/lib/dates.ts) and “today” uses the hotel’s time zone setting, so night
counts are identical on any server.src/lib/pricing.ts):
nightly prices with weekend/seasonal adjustments, GST slab selection, discount
capping, extras tax, payments and refunds.src/lib/bookings.ts holds availability (overstaying guests keep their room;
guests leaving today don’t block tonight), per-room advisory locks against
double booking, and the folio/serialisation used by every screen.Bill snapshot freezes the invoice so later price changes never
alter past bills.ActivityLog.src/lib/db.ts): every table except Hotel and
SubscriptionPayment has a hotelId. The prisma client used by the hotel
screens adds the signed-in hotel to every query and every new row, inside
transactions too. withAuth sets that hotel for each request. A query made
without a hotel throws instead of returning everyone's data. Only sign-in,
booking-token lookups and /platform use rawPrisma.src/lib/platform.ts), so
a hotel session can never open /platform and an owner-panel session can't
open a hotel's screens. Subscription maths (paid, part paid, late, paid until)
is pure and unit-tested in src/lib/subscription.ts.src/
├── app/
│ ├── (app)/ # Signed-in screens: Today, calendar, bookings, guests, rooms, …
│ ├── api/ # JSON API (public/* is the guest booking website API)
│ ├── book/[hotel]/ # Public online booking website, one per hotel
│ ├── platform/ # Software provider's owner panel (hotels, subscriptions)
│ ├── print/ # Invoice, confirmation and registration card
│ └── login/
├── components/ # UI kit, app shell, booking actions, forms
└── lib/ # dates, pricing, bookings, reports, settings, auth
prisma/
├── schema.prisma
├── migrations/
└── seed.ts # accounts (+ demo hotel with --demo)
docs/RESEARCH.md # competitor & customer research
/platform for now).| Write down every cost (salaries, electricity, supplies, repairs, commission…) with date, kind, method and notes; front desk can add petty-cash costs, the owner sees everything |
| Reports (owner) | Day / week / month / year or any dates; profit (earnings − expenses) and margin; occupancy, ADR, RevPAR, TRevPAR, cost per available room and per room sold, profit per available room; earnings vs expenses and occupancy charts; table by day, week or month; room types, sources, expenses by kind, money in and out, guests and cancellations, extras, GST summary; booking-site payouts (gross vs net, received vs waiting, commission counted in profit); print / PDF and CSV downloads for Excel, including a payout sheet to match against the sites' statements |
| Prices | Normal price per room, weekend price change %, special prices for date ranges (festivals, off-season), special agreed price per booking |
Owner panel (/platform) | For you, the software provider: add hotels and hand out the owner's sign-in (copy or send on WhatsApp), monthly fee and free months, record payments (UPI/bank/cash, several months at once, part payments), see who has paid this month and who is late, give anyone a new password, pause a hotel that doesn't pay, see which hotels actually use the software |
| Online booking website | /book/<hotel> — guests pick dates, see prices per room type and book (pay at hotel). Bookings appear marked “Our website”. Spam-protected |
| Staff & security | Owner/manager and front-desk roles (front desk can’t see reports, change settings or delete records), activity history of who did what, login rate limiting, disabled staff lose access immediately |
| Help | Built-in step-by-step guide written in plain words |