Demo vs local mode
The same app and the same story, with two different data sources.
The app reads and writes through one data source interface. Demo mode plugs in an in-memory generator; local mode plugs in Supabase. The screens and business rules are the same.
| Demo mode | Local database mode | |
|---|---|---|
| Start | pnpm demo | pnpm db:start, pnpm db:reset, pnpm db:seed, pnpm local |
DEMO_MODE | true | false |
| Data | Generated in memory | Postgres in local Supabase |
| Persistence | Resets on restart or Reset demo | Kept until pnpm db:reset |
| Sign-in | None; switch persona with View as | Email and skyward-local |
| Access rules | Checked in the app with the same rules | Enforced by Postgres row-level security and triggers |
| External calls | None | None |
| Needs Docker | No | Yes |
Use demo mode to look around and present. Use local mode to test access rules for real: a failing write in local mode is refused by the database itself.
See Run it locally.