Skip to content

Deployment

Huddle deploys across two platforms, split by workload:

Railway — the services

api, app, rag, and notification run on Railway, each in its own service, built with Railpack (no Dockerfile needed for most). Services talk to each other over Railway’s private network (*.railway.internal).

Cloudflare — the web properties

website and docs deploy to Cloudflare Workers — the website via OpenNext, the docs via the @astrojs/cloudflare adapter. Both deploy from main with wrangler.

The Railway services run in three environments end-to-end:

  • developmentapp.development.huddlesurety.co, api.development.huddlesurety.co. A real, deployed environment (not just local), and blackbox-probed like the others.
  • stagingapp.staging.huddlesurety.co, api.staging.huddlesurety.co. The four services deploy here from their staging branch.
  • productionapp.huddlesurety.co, api.huddlesurety.co. Deploys from production.

The four services promote staging → production fast-forward only: production is always an exact, already-tested staging commit, so there’s no separate release pipeline, and rollback is just pointing production at an older staging SHA.

The Cloudflare properties (website, docs) and observability don’t use this flow — they deploy from main on push.

Each repo runs its own checks on push:

Service Checks
api go test, gofumpt, golangci-lint, OpenAPI docs in sync; drives SDK generation on staging
app tsc (TS7), ESLint, next build typecheck
rag No in-repo CI
notification No in-repo CI

The API’s CI additionally generates and publishes the SDKs — see API › SDK generation.

  • Railway + Railpack — services build without a hand-written Dockerfile. Railpack detects the language and builds; the private @huddlesurety packages install using an injected GITHUB_TOKEN (npm scope for TS services, git-URL rewrite for the Python SDK in rag). RAG’s Railpack config additionally installs poppler-utils and tesseract-ocr for PDF/OCR.
  • Cloudflare Workerswrangler deploy, from build output (.open-next/ for the website, ./dist for the docs).

Railway service settings — sources, domains, replicas, volumes — are managed declaratively in the infra repo: see Infrastructure as Code.