Repository navigation
Releases: ishaan-jindal/runnix
Releases · ishaan-jindal/runnix
Release list
v0.1.0
First working slice: authenticate, submit Python code, poll for the result —
sandboxed, metered by tenant, with signed completion webhooks.
Added
- Multi-tenant auth:
POST /auth/register,/auth/login,/auth/refresh
with 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 row
failedand 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.
Fixed
- Tenant creation slug-conflict retry aborted the whole transaction
(25P02); retries now run in per-attempt savepoints (register and
org-tenant creation).