Local Development

# Setup (first time)
scripts/setup.sh  # Creates .env from AWS SSM

# Run everything
bun run dev
# Gateway: http://localhost:8080
# Web client: http://localhost:5173
Dev mode enables:
  • Auth bypass (auto-authenticated as developer)
  • Verbose error messages
  • CORS permissive headers
  • Hot reload

Production

Bun Runtime

Diminuendo runs as a single Bun process:
bun run src/main.ts

Docker

FROM oven/bun:1.0
WORKDIR /app
COPY . .
RUN bun install --production
CMD ["bun", "run", "src/main.ts"]

Data Persistence

All state is in SQLite databases under DATA_DIR:
data/
├── tenants/{id}/registry.db
└── sessions/{id}/{session,memory}.db
For production:
  • Mount DATA_DIR on a persistent volume (EBS, EFS)
  • Configure Litestream for S3 replication
  • Per-tenant database isolation makes backup/restore trivial

Scaling

Diminuendo scales by tenant routing:
  1. Each instance handles a subset of tenants
  2. A load balancer routes WebSocket connections by tenant ID (sticky sessions)
  3. No shared state between instances — tenant databases are independent
  4. To migrate a tenant: copy its data directory to a new instance
ResourceBudget per Instance
WebSocket connections~10,000
Active sessions~5,000
SQLite databases~500 open (LRU)
Memory~2GB

Health Check

GET /api/health
Returns dependency health (Podium, Ensemble connectivity) and instance metrics.

Environment Setup

Critical production environment variables:
# Required
PORT=8080
AUTH0_DOMAIN=your-tenant.auth0.com
AUTH0_CLIENT_ID=...
AUTH0_AUDIENCE=...
ENSEMBLE_URL=https://ensemble.prod.example.com
ENSEMBLE_API_KEY=ens_...
PODIUM_URL=https://podium.prod.example.com
PODIUM_API_KEY=pod_admin_...
PODIUM_SECRETS_KEY=...
DATA_DIR=/data/diminuendo

# Recommended
OTEL_EXPORTER_OTLP_ENDPOINT=https://otlp.example.com
LOG_LEVEL=info