One platform.
Every persona.
Live in Postgres.
Multi-tenant school-management SaaS for Indian K-12. Six demo schools, seven personas, every button writes to a live Supabase project with an audit trail — no click is a mock.
Try the demo
All routes read + write live PostgresSix-tenant Client Directory, entitlement queue with write path, AMC renewal calendar. ⌘K to open the tenant switcher.
Live KPIs from Postgres views — attendance %, monthly fees, admissions, staff on leave. Weekly sparkline + grade-bucket rollup.
Class 8-B 40-student grid. Tap cells offline. Reconnect → syncs to Postgres with monotonic LWW ticks.
Create a class-wide assignment → fans out to 40 rows in one call. Edit / delete with per-student status.
Student search combobox, fee-line selection, UPI + thermal 80mm receipt with QR.
7-tab inbox (Received / Docs needed / Verified / Accepted / Waitlisted / Rejected). State machine with full audit.
Issue TC → printable A4 with school header in tenant brand, 12 CBSE fields, dual signature blocks.
Issue visitor passes with unique QR fingerprint. Check-out flow. 4-hour auto-expire on read.
Change name, color, font, logo, landing copy. Live preview panel. Save re-brands the whole tenant scope.
Priya Sharma · sibling switcher between Aarav + Kavya. Live attendance %, outstanding fees, pending homework.
Line-item selector, 3 methods (UPI / Card / Cash), instant receipt with WhatsApp confirmation line.
Aarav Sharma (Class 8-B). Timetable, homework, marks — all live from Postgres.
Six tenants, one codebase
Brand + font come from PostgresWhat's under the hood
Server components fetch from Supabase and stream. Client islands only where needed — attendance grid, editors, forms, ⌘K palette.
F-01 tokens.json → generated Tailwind + CSS vars → semantic layer → tenant/platform scopes. Change one hex on the branding page, the whole tenant re-tunes.
Every business table has a Row-Level-Security policy keyed on current_tenant_id()and current_user_role(). Server actions write; audit_logs capture before + after.
[data-scope="tenant"][data-tenant-slug=X] stanzas inject 7-stop OKLCH brand ramps + Google Fonts per tenant. Switching tenants swaps a <style> block. React doesn't re-render.
/auth/sign-in → 7 seeded demo users → role-appropriate landing route. Session cookie refreshed by middleware.
Simulate offline → tap 40 cells → reconnect → sync. Monotonic tick per row for last-write-wins on the server.