Skip to content

Commands

Run them from the repository root. Tests need bun run services:up first. | bun run docker:dev | Postgres, Mailpit, the API, web app and site, all in Docker. See Quick start | | bun run docker:down | Stop all of it |

Command What it does
bun dev API, web app and site, reloading as you edit
bun run dev:api, dev:web, dev:site One app only
bun run dev:mobile Expo, in its own terminal, for Expo Go
bun run dev:mobile:build The same, for a build of your own. See Mobile builds
bun run mobile:build --profile <name> Build the mobile app with EAS
bun run mobile:submit --profile production Send a build to the stores
bun run check Typecheck, lint, format check, then every test. Run before you commit
bun run typecheck, lint, format:check, test The parts of check, one at a time
bun run acceptance The browser journeys against the production images, with stand-ins. --teams for teams
bun run acceptance:mobile The mobile app’s flows with Maestro, on the iOS simulator. --android for Android
bun run --cwd apps/api test test/<file> One test file. See Test your features
bun run format Fix formatting
bun run build Production builds of the web app and site, and the mobile app’s bundles
bun run services:up Start Postgres, Redis and Mailpit in Docker
bun run services:down Stop them, keeping the data
bun run services:reset Delete the local database and start empty. Run db:migrate after
Command What it does
bun run db:generate Write a migration after changing the schema of your ORM. Commit it
bun run db:migrate Apply pending migrations, with the ORM in DATABASE_ORM
bun run db:studio Browse the data in Drizzle Studio
bun run test:prisma Every API test, with the API on Prisma. CI runs it after check
bun run test:typeorm Every API test, with the API on TypeORM. CI runs it too

Never edit a migration that has been committed.

Command What it does
bun run billing:sync Create or update your plans in Stripe or Polar. After changing plans, and once live
bun run billing:listen Stripe only: forward its webhooks locally and print the signing secret. Needs the Stripe CLI
bun run email:preview Preview email templates at http://localhost:3100
bun run worker Run the job worker without the API
Command What it does
bun run production:up Build and run the production images locally
bun run production:down Stop them, keeping the data
bun run deploy:init [aws] Create .env.railway, or .env.aws, with a new AUTH_SECRET
bun run deploy:plan Show what would change on Railway. Changes nothing
bun run deploy:apply Check .env.railway, then apply those changes, after asking
bun run deploy:plan:aws Show what would change on AWS. Changes nothing
bun run deploy:apply:aws Build, push and apply on AWS, after asking. See AWS
bun run deploy:destroy:aws Delete your production on AWS, after asking
bun run deploy:check --before <railway|aws> Check the settings file against the API’s rules. Changes nothing
bun run deploy:check <web address> [--site <address>] [--email <yours>] Check a deployment from outside. --email sends a sign-in link
bun run railway … Railway’s CLI, in the tested version

What deploy:check looks at is on Check a deployment.