For everyone
What is this platform?
What is this platform?
Who built this?
Who built this?
How much does it cost to run?
How much does it cost to run?
What happens when the business grows and free tiers aren't enough?
What happens when the business grows and free tiers aren't enough?
For business stakeholders
How do customers book appointments?
How do customers book appointments?
What happens after a customer books?
What happens after a customer books?
How does the SPA membership work?
How does the SPA membership work?
How does the loyalty programme work?
How does the loyalty programme work?
How are Meta/Instagram ad leads handled?
How are Meta/Instagram ad leads handled?
/book — a simple 3-field form (name,
phone, service interest). This creates a lead in the CRM. The receptionist follows
up via WhatsApp (AiSensy). When the lead books, the lead is marked as converted.How are invoices generated?
How are invoices generated?
Can the platform handle multiple branches?
Can the platform handle multiple branches?
For developers
How do I run the project locally?
How do I run the project locally?
bun install, copy
.env.example to .env.local, fill in the keys, bun run dev --filter=@rgss/web.Do I need every environment variable to run locally?
Do I need every environment variable to run locally?
SKIP_ENV_VALIDATION=1 to bypass build-time validation while
getting started. You only need DATABASE_URL and BETTER_AUTH_SECRET for core
functionality.Why is money stored as integers?
Why is money stored as integers?
100000 (paise). All
calculations happen in integers. Rounding only happens at display time.Why are all primary keys text (not auto-increment integers)?
Why are all primary keys text (not auto-increment integers)?
nanoid() generates random text IDs that prevent enumeration attacks (a user
can’t guess booking/1, booking/2, etc.) and work across distributed systems
without coordination.How do I add a new API route?
How do I add a new API route?
apps/web/src/app/api/withErrorHandlerpackages/types/packages/business/apiSuccess(data) or throw AppErrorHow do I add a new background job?
How do I add a new background job?
apps/admin/src/app/api/jobs/verifyQStashSignatureWhy is there no packages/db import in packages/business?
Why is there no packages/db import in packages/business?
packages/business can import from packages/types and packages/errors. What
it cannot import is packages/db, any framework code, or UI components. This keeps
business logic pure and testable.How do I run just the unit tests?
How do I run just the unit tests?
bun run test:unit — runs Vitest excluding integration tests and E2E.How do I check if my changes break the build?
How do I check if my changes break the build?
bun run typecheck && bun run lint && bun run test:unit — the three gates that run
on every PR to dev.What's the difference between APP_ENV and NODE_ENV?
What's the difference between APP_ENV and NODE_ENV?
NODE_ENV is always development or production (Next.js convention). APP_ENV
is dev, test, pprd, or prod — our four deployment environments. Use
APP_ENV for environment-specific logic like data seeding guards.How do I add a new database table?
How do I add a new database table?
packages/db/src/schema/packages/db/src/schema/relations/packages/db/src/schema/index.tsbunx drizzle-kit generate to create the migrationbunx drizzle-kit migrate, then add seed data if neededWhy does the docs site use Mintlify instead of a self-hosted docs app?
Why does the docs site use Mintlify instead of a self-hosted docs app?
docs/docs.json.For operations
How do I know if the site is down?
How do I know if the site is down?
status.theroyalglow.in.How do I know if a scheduled job failed?
How do I know if a scheduled job failed?
How do I roll back a bad deployment?
How do I roll back a bad deployment?
git_ref input. SST replaces the Lambda + CloudFront release in about 3–5 minutes. If a deploy fails, inspect SST/Pulumi state and both health endpoints because an update may be partially applied; redeploy the known-good ref when needed. Use a PostHog flag first when it can contain the issue.How do I restore the database from backup?
How do I restore the database from backup?
backups/weekly/). Download the
backup, restore to a new Neon branch, verify the data, then swap the connection
string. See Operations for the full procedure.How do I add a new staff member?
How do I add a new staff member?
/users (requires Owner role). Create the user and
assign the appropriate role. The staff member signs in with their Google account.How do I update service prices?
How do I update service prices?
/services (requires Manager role). Edit the
service price. The new price applies to all future bookings. Existing bookings and
invoices are unaffected (prices are snapshotted at booking time).