| HTTP/API | Fastify (Node.js 22, ESM) | All endpoints live in src/routes. Swagger + Mintlify docs stay in sync with runtime schemas. |
| Data | NocoDB (REST over Postgres) | Every table (orgs, tickets, bookings, signals) is defined in lib/tables.mjs. No ORM — just NocoDB REST calls. |
| Messaging | Mailjet | Transactional email for bookings, tickets, invites. From name/subject are org-configurable. |
| Push | Web Push API + ntfy.sh | Browsers get VAPID push; phones get ntfy alerts for urgent/alert-sourced tickets. |
| Real-time | Server-Sent Events | /v1/incidents/stream, /v1/signals/stream, /v1/war-room broadcast org-scoped JSON frames. |
| Files | S3-compatible (coming) | Today: uploads land on the app server. Roadmap: S3 bucket per tenant. |
| Auth | Magic link + session cookie | /v1/auth/magic-link creates link; /v1/auth/session exchanges OTP. No passwords anywhere. |
| Deploy | GitOps via Plesk webhook | git push origin main → webhook → deploy.sh → pm2 restart. No click-ops. |