- Node.js >= 20.0.0 — runtime
- pnpm >= 8 — monorepo package manager (see root
package.jsonfor pinned version) - Deno — runs the db env/migrate/seed scripts in
packages/db - Bun — optional, used by the utility scripts in
src/scripts - Turso CLI — starts the local libSQL server via
pnpm --filter '@openstatus/db' dev
Two .env files are involved:
apps/dashboard/.env— copy manually now (this step)packages/db/.env— copied automatically bypnpm dxin step 3 below
cp apps/dashboard/.env.example apps/dashboard/.envThe defaults in .env.example are dummy values that work for local dev — no real API keys needed.
Fill them in before deployment to enable optional functionality (Resend for real magic-link emails, Stripe, Tinybird analytics, Sentry, GitHub/Google OAuth, etc.).
Email/Magic Link login is only available in dev.
- Install dependencies
pnpm install- Start the libSQL server (keep this terminal running)
pnpm --filter '@openstatus/db' dev- In a second terminal, set up the dev database
pnpm -w dxThis chains three turbo tasks (env → migrate → seed):
envcopiespackages/db/.env.example→packages/db/.envmigrateruns Drizzle migrations against the libSQL serverseedinserts a default workspace, user (ping@openstatus.dev), monitors, and a status page
- Stop the terminal from step 2
pnpm -w dev:dashboard starts its own libSQL on port 8080 — leaving the step-2 server running causes a port conflict.
- Start the dashboard from the repo root
pnpm -w dev:dashboardTurbo runs the dashboard (apps/dashboard) and @openstatus/db together.
The dashboard uses NextAuth with GitHub, Google, and — in dev mode — a Resend magic-link provider.
In NODE_ENV=development or SELF_HOST=true, src/lib/auth/providers.ts configures the Resend provider with apiKey: undefined and overrides sendVerificationRequest to print the magic link to the dashboard's terminal stdout instead of sending an email. No OAuth credentials required.
To log in:
- Open http://localhost:3000/login
- Enter
ping@openstatus.dev(the seeded user, bound to workspace 1) in the magic-link form - Watch the dashboard terminal — the magic link is logged there. Open it in your browser.
- Port 8080 already in use — a leftover libSQL server from step 2. Kill that terminal and re-run
pnpm -w dev:dashboard. - Magic link doesn't arrive — it isn't emailed in dev. Look in the dashboard terminal stdout for
>>> Magic Link: .... - Reset the dev DB — stop the libSQL server, delete
openstatus-dev.dbat the repo root, restart libSQL, re-runpnpm -w dx.
The dashboard's tRPC API runs on its own Next.js edge routes, so basic CRUD works without the other apps. You may also want to run:
apps/server(Hono) — for API-key features and operations that go through the public HTTP APIapps/checker(Go) — actually executes scheduled monitor checks; without it, monitors are listed but never probed- Tinybird — uptime / latency time-series graphs; without it, those charts stay empty