One contract.
One platform.
Every product speaks the same health endpoint, the same OpenAPI, the same WebSocket contract, and the same queue/storage backend matrix. Learn one — and the rest take an afternoon.
Health + diagnostics
GET /up returns service health in a standard response format. Startup logging enumerates every dependency, successful or failed, before the HTTP server binds. Misconfigurations surface in seconds, not after the first user request.
OpenAPI 3.0.3 everywhere
Every REST endpoint is in the generated spec at /openapi, with Swagger UI served at /swagger/. Generate typed clients in TypeScript, Go, Python, Rust — anything.
WebSocket contract
GET /ws authenticates with SHARED_WS_KEY (query, header, or Bearer). Canonical channels system.events, system.logs, jobs.events, and jobs.<id>.events live on every service. Jobs enqueue via the jobs.enqueue publish hook.
Backend matrix
Six queue engines. Ten databases. Four object stores. Seven auth methods. Eight notification drivers. Choose per environment; swap by env var; no code changes.
Pick what fits. Never rewrite.
Services ship with broad backend support out of the box. Your production stack decides — not the service.
Queue backends
Set QUEUE_BACKEND and the service speaks it natively.
Databases
One codebase, ten dialects. Atlas migrations adapt.
Object storage
S3-compatible everywhere; Azure Blob where it matters.
Notification drivers
Eight built-in destinations for completion and alert events.
Predictable lifecycle, every time
- 1
Load config
Environment variables and optional config files are parsed. The full effective config is logged (with secrets masked).
- 2
Connect dependencies
Database, queue, cache, storage, and notification drivers are dialed. Each reports success, latency, and version.
- 3
Run migrations
Atlas applies any pending schema changes. Schema drift is fatal — the service refuses to start if the DB is not at the expected version.
- 4
Start workers + scheduler
Queue workers claim jobs. Background scheduler primes caches and runs periodic work.
- 5
Bind HTTP + WebSocket
REST API and /ws come up on the same port. Swagger is live. /up is green.
- 6
Steady state
Real-time channels stream events. Job completions fire webhooks. Notifications dispatch. Everything logs structurally.
What one contract buys you
Onboarding in hours
Any engineer who knows one service knows the next. No repeat reading. No new mental model.
Swap at scale
Need to move from Redis to Kafka? Change QUEUE_BACKEND, restart. The service doesn’t care.
Monitor as one
One Grafana dashboard set. One log format. One WebSocket debugger works for every service.
Audit as one
Compliance review a single service once. Everything inherits the same posture.
Deploy as one
One Helm chart layout. One compose layout. One Dockerfile layout. CI templates compose cleanly.
Scale as one
Stateless HTTP. Horizontal workers. The same tuning knobs work everywhere.
19 services, same contract
One contract. Your platform. Delivered.
Start with any service. The next is free — you already know how it works.