Sajian
A multi-tenant restaurant platform for Indonesia. Restaurants get an ordering page in about fifteen minutes, keep their full margin, and take payment straight to their own bank — no aggregator in the middle.
sajian.app →A live storefront →

- Architecture
- One app, many tenants
- Isolation
- Service-role + RLS
- Test suite
- 216 tests
- Ordering
- Live in production
Tenant isolation, enforced twice
A single Next.js app serves every restaurant, routed by subdomain. Isolation runs at the application layer through service-role scoping, with Postgres row-level security underneath as a backstop — so an application-layer bug still can't hand one restaurant another's orders. A live multi-tenant integration suite verifies this against real tenants rather than mocks, because the failure mode being guarded against is exactly the one mocks don't reproduce.
Storefronts the model writes
Owners don't configure a theme; a model emits JSX for their storefront sections. That output is untrusted by definition, so it passes through a sanitizer, compiles to MDX, and renders from a SHA-256-keyed cache — versioned, and live only once the owner approves it. Roughly 73% of the 216-test suite points at that sanitizer boundary, because it's the single place where model output becomes executable code.
Onboarding from a photo
A restaurant joins by uploading menu photos. Claude vision and DALL·E 3 extract the menu items, colors, and logo, and persist them into a storefront draft the owner can edit — replacing the hours of manual data entry that usually gates this kind of platform.
Orders that reach the kitchen
A production-credentialed integration pushes orders into the ESB point-of-sale: a customer scans a QR code, orders on their phone, and the ticket appears at the cashier. Payment is cash-at-counter first, with online payments and WhatsApp notifications staged behind it. It is live at Mindiology Coffee in Bintaro.
Stack
Next.js App Router, Supabase (Postgres, Auth, Realtime), TypeScript, Tailwind, Zustand for the cart, ESB POS for order routing.