Skip to main content
Fortress is a TypeScript monorepo. The API runs on port 3000; the web app runs on port 5173.

Prerequisites

  • Node.js 20 or newer
  • pnpm 10
  • Docker for Postgres
  • vp, the repo’s task runner wrapper

First run

vp install
vp run services:up
vp run db:migrate
vp run db:seed
vp run db:seed-dev
vp run dev
vp run dev starts Docker services before launching the API and web processes.

Common commands

CommandPurpose
vp run devStart API and web.
vp run dev:apiAPI only.
vp run dev:webWeb only.
vp run testRun tests.
vp run typecheckType-check all packages.
vp run db:migrateApply SQL migrations.
vp run db:checkDetect schema drift against the migrated dev DB.
vp run db:seedSeed default account, user, workspace, and domains.
vp run db:seed-devPopulate realistic development data.
vp run services:downStop Postgres.

Migrations

Migrations are hand-authored SQL files in:
packages/api/drizzle/
When changing the database:
  1. Update packages/api/src/db/schema.ts.
  2. Add the next numbered SQL migration.
  3. Run vp run db:migrate.
  4. Run vp run db:check.
The Drizzle schema does not generate migrations.

Scenario seeds

Focused scenario seeds live in:
packages/api/src/db/seeds/
Add a scenario seed when a UI surface is hard to exercise with db:seed-dev: empty states, long diffs, plan-limit cases, or deeply nested relationships. Scenario seeds should be idempotent.

Browser testing

Use the configured browser testing flow after UI changes. Start the dev server first:
vp run dev
Then drive the running app at localhost:5173. The browser session persists login state in the configured Playwright cache.