Start the CentraKit apps, Supabase stack, and seeded development account locally.
pnpm env:pull (.env.local + .env.production.local), plus .env.development.local for Portless/local Supabase overrides.Start local Supabase before running the SaaS or API apps:
pnpm supabase:start
pnpm supabase:syncThe local stack provides Postgres, Auth, Storage, Realtime, Edge Functions, and imgproxy for Storage image transforms. The pooler service is intentionally not required for the normal local workflow.
Start the SaaS app:
pnpm devStart the API and SaaS together:
pnpm dev:apiStart the docs app:
pnpm dev:docsThe default dev commands run plain next dev on localhost so they work in cloud and container environments. pnpm dev and pnpm dev:portless start both the SaaS frontend and its required API so Chats, Inbox, AI suggestions, and other API-backed UI work immediately. Use pnpm dev:api:portless only for API-only work, or another named variant such as pnpm dev:docs:portless.
The local seed provides a full owner account:
test@example.comPassword123!tractor-service, bike-scooter-shopAll seeded users use Password123!. Use these personas when testing role-specific paths:
| Persona | Useful coverage | |
|---|---|---|
test@example.com | Owner and system admin | Full tenant access, system admin, billing, destructive organization actions |
support@example.com | System support | System admin read/support flows and support-owned actions |
owner@example.com | Finance and settings | Billing, invoice templates, quote templates, branding, invitations, settings |
operator@example.com | Tenant admin/planner split | Admin in tractor-service, planner in bike-scooter-shop |
crm.editor@example.com | Sales advisor | Customers, quote drafting, sales tasks, denied quote-send edge case |
assets.editor@example.com | Parts manager | Products, brands, categories, tags, inventory, asset updates |
viewer@example.com | Read-only observer | Read access and write-denied checks |
team.lead@example.com | Planner/admin split | Planner in tractor-service, admin in bike-scooter-shop |
disabled@example.com | Disabled mechanic | Disabled-profile edge case with mechanic-style task/asset rows |
external@example.com | No organization access | Empty organization-access and invitation discovery paths |
The two demo organizations include deterministic data for customers, contacts, products, inventory, assets, teams, tasks, quotes, quote templates, invoices, invoice templates, invitations, billing read models, AI chat history, agent runs, public quote/invoice tokens, and cross-links between tasks, quotes, invoices, and customer assets.
After supabase db reset, sign in again because old browser sessions refer to the previous local auth database.
pnpm supabase:sync can warn about unset Google OAuth variables. That is safe when OAuth is not being tested locally.