Development

Setup

Bootstrap your local env files (committed .env.example is the source of truth, .env is your gitignored copy):

cp apps/api/.env.example apps/api/.env
cp apps/web/.env.example apps/web/.env
cp apps/cli/.env.example apps/cli/.env

Generate local secret (appends BETTER_AUTH_SECRET to apps/api/.env):

./scripts/create_local_secrets.sh

Start PostgreSQL and SMTP services:

docker compose up -d db mail

Available commands

Run from your project root in a *nix system:

# Run API and Web
bun dev

# Run linter and code formatter
bun lint
bun lint:fix

# Run test
bun run test

# Post multiple random jobs locally (10 or given)
./scripts/mass_post_jobs.ts [number]

# Create multiple random users locally (10 or given)
./scripts/mass_user_create.ts [number]

App: http://localhost:3000
Webmail for the SMTP: http://localhost:1080
Better-Auth OpenAPI in dev mode: http://localhost:3001/auth/reference

Environment Variables

Each app under /apps/*/ ships two env files:

Order File Committed? Purpose
1 .env.example yes template / source of truth (no real values)
2 .env NO (.gitignore) your local copy — real values + secrets

Compose build args (VITE_API_URL, VITE_APP_URL) default to localhost in compose.yaml. To override, create a root .env (gitignored) with the desired values — docker compose auto-loads it for variable interpolation.

Production: no .env* files — inject vars via the host / orchestrator (Disco, Docker --env-file outside the image, k8s secrets, etc.). See Deploy.


Table of contents


This site uses Just the Docs, a documentation theme for Jekyll.