All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
Everything below 1.0.0 is pre-release and may change without notice.
0.1.0 - 2026-09-04
First working slice: authenticate, submit Python code, poll for the result — sandboxed, metered by tenant, with signed completion webhooks.
- Multi-tenant auth:
POST /auth/register,/auth/login,/auth/refreshwith bcrypt passwords, JWT access/refresh pairs, andtenants[]claims. Register auto-provisions a personal tenant (owner) in one transaction. - Executions API:
POST /executions(submit,202 {id, status: queued}),GET /executions(paged list),GET /executions/{id}(status, stdout, stderr, exit code). Tenant-scoped; cross-tenant reads return404. - Tenants API:
POST /tenants(org tenant, caller becomes owner),GET /tenants/{id}. Path id must equalX-Tenant-ID. - NATS JetStream pipeline: durable
EXEC_SUBMIT/EXEC_RESULTstreams; gateway publishesexec.submit.<lang>; queue failure marks the rowfailedand returns502. - Dispatcher execution loop: durable pull consumer, conditional
queued → runningclaim (duplicates acked, never re-run), one sandbox container per execution (gVisorrunsc, non-root, no network, read-only rootfs, 128 MB / 0.5 CPU / 32 pids, 1–60 s timeout), result write-back plusexec.result.<id>summary. - Signed webhooks:
webhook_urlon submissions, HMAC-SHA256 delivery with retries, SSRF guard at submit and delivery time;503when no signing secret is configured. - Sandboxes: stale-
runningreaper, OOM detection, 64 KiB output truncation, boot-time leftover-container sweep. - Runner image:
runner/docker(python:3.12-slim, numeric nobody user). - Postgres schema with embedded idempotent migrations (auto-applied at
startup) and sqlc-generated queries; live
/readyzchecks. - Compose stack (postgres:16, nats:2, gateway, dispatcher), CI (vet + race + lint + build), OpenAPI spec, webhook signing docs.
- Tenant creation slug-conflict retry aborted the whole transaction (25P02); retries now run in per-attempt savepoints (register and org-tenant creation).