Real-time fire-department dispatch dashboard. A Next 16 web app renders live dispatches, weather, and hydrants from a Convex backend; a background listener polls the FirstDue API and OpenWeatherMap and pushes data into Convex. Everything runs on Cloudflare.
| Path | What it is |
|---|---|
apps/web |
Next 16 dashboard on Cloudflare Workers (OpenNext), Convex + Clerk. |
apps/firstdue-listener |
Node poller in a Cloudflare Container behind a supervisor Worker. |
apps/convex |
Convex cloud backend (live queries, Clerk JWT auth). |
infra |
OpenTofu for the two Worker custom domains (state in R2). |
packages/ holds shared eslint-config and typescript-config.
Toolchain (Node 22, pnpm, wrangler, opentofu, gh) comes from the Nix dev shell.
nix develop # enter the tool shell
CI=true pnpm install # install workspace deps
pnpm dev # turbo run dev across the appsOther root turbo tasks: pnpm build, pnpm lint, pnpm typecheck. Per-app dev
servers and env setup are in each app's README and docs/environment.md.
Pushes to main deploy automatically via GitHub Actions — web and listener to
Cloudflare, functions to Convex, custom domains via OpenTofu. GitHub secrets and
variables are the single source of truth and are re-synced onto each target on
every deploy. See docs/deployment.md for the
architecture and pipelines, docs/environment.md for
the env/secret reference, docs/porting.md to move to a new
account or domain, and infra/README.md for OpenTofu ops.