Local mode
The same app on a local Supabase database, with row-level security and seeded users.
Local mode runs Portline against real Postgres and Supabase Auth on your machine. Every permission rule is enforced by the database, not just the app. You need Docker running.
Start Supabase
pnpm db:startThis starts the local stack on these ports:
| Service | Port |
|---|---|
| API (PostgREST, Auth) | 4161 |
| Postgres | 4162 |
| Studio | 4163 |
Studio is at http://localhost:4163 if you want to look at the tables.
Create the schema and seed it
pnpm db:reset
pnpm db:seeddb:reset applies the migrations from scratch. db:seed fills the database from the same generator the demo uses, so ids, names and numbers match what you see in demo mode.
Seeded users
Every user has the password portline-local.
| Workspace | Role | |
|---|---|---|
avery@harborline.example | Harborline Logistics (Growth) | Owner |
priya@harborline.example | Harborline Logistics | Admin |
diego@harborline.example | Harborline Logistics | Dispatcher |
mei@harborline.example | Harborline Logistics | Dispatcher |
sam@harborline.example | Harborline Logistics | Viewer |
elif@harborline.example | Harborline Logistics | Viewer |
owner@starterfreight.example | Starter Freight (Starter) | Owner |
Sign in as Sam to see what a viewer gets: everything the plan includes is readable, and writes are refused by the app and by the database, even if you call the database directly. Sign in to the Starter workspace to see Fleet, Warehouses and Docks locked.
Changing the plan
Nobody can change a workspace's plan from the app, owners included. Only the service role can. The script uses it:
pnpm plan:set harborline scale activeThe arguments are the workspace slug, the plan (starter, growth, scale) and the subscription status (active, trialing, grace, lapsed). Try lapsed to see the workspace go read-only. Plans and access explains what each status does.
Stopping
pnpm db:stop