Multi-tenant café operating system. Phase 1 focuses on the connected sale → recipe → stock → profit chain.
- Next.js App Router + TypeScript
- Firestore-shaped data layer via Firebase Admin (cloud or emulator)
- Local file-backed store for zero-setup development
- Modular monolith API via Route Handlers
npm install
cp .env.example .env
npm run db:seed
npm run devOpen http://localhost:3000.
Default DATA_BACKEND=memory stores data in .data/cafeos-memory.json. No demo products/orders are seeded.
npm run db:upThen set in .env:
DATA_BACKEND="firestore"
FIRESTORE_EMULATOR_HOST="127.0.0.1:8080"
FIREBASE_PROJECT_ID="demo-cafeos"npm run db:seed
npm run devEmulator UI: http://127.0.0.1:4000
- Create a project at Firebase Console.
- Enable Firestore.
- Project settings → Service accounts → Generate new private key.
- Update
.env:
DATA_BACKEND="firestore"
FIREBASE_PROJECT_ID="your-project-id"
FIREBASE_CLIENT_EMAIL="firebase-adminsdk-...@your-project-id.iam.gserviceaccount.com"
FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n"
DEFAULT_TENANT_ID="tenant_default"
DEFAULT_BRANCH_ID="branch_default"Leave FIRESTORE_EMULATOR_HOST unset for cloud.
npm run db:seed
npm run dev| Script | Purpose |
|---|---|
npm run db:seed |
Upsert default tenant + branch only |
npm run db:up |
Start Firestore emulator |
npm run dev |
Next.js development server |
Collections under tenants/{tenantId}/branches/{branchId}/:
products,orders,stock,customers,employees,activitiesmeta/countersfor order numbers
- Auth/RBAC is not enabled yet. APIs use
DEFAULT_TENANT_ID/DEFAULT_BRANCH_ID. - Create products in Menu & recipes, then sell from Point of sale.