Changelog
Only the changes you would notice
Hand-picked, not an auto-generated commit feed. Newest first, every entry links to its pull request, and breaking changes are called out.
Quota gate for the public pool: 20,000 tokens a day, then a prompt to add your key
The public model is now a read-only config, backed by a usage ledger with daily rollups. The quota gate and a global budget breaker ship together, and settings hot-reload without a restart.
Row-level tenant isolation: tenant_id plus PostgreSQL RLS across every table
Sessions, messages, configs, skills and sandbox ownership all carry a tenant_id, and isolation is enforced in the database. Every id-based entry point now asserts tenant ownership and returns 404 at the boundary.
Envelope encryption for secrets: one DEK per record, rotatable KEKs
Model keys and MCP tokens are encrypted before they reach storage, with a versioned, key-id-tagged format. The API returns masks only, logs and audit entries redact the same fields, and backfill plus rotation scripts are included.
Runtime hardening: bounded pools, per-tenant rate limits, graceful shutdown
Long-lived connections no longer grow without a ceiling and each tenant is rate-limited per window. Rolling releases drain traffic first, so running sessions are not cut off mid-turn.
Sign-in moved to Clerk, with a dedicated tenant on first login
Login page, session exchange and disabled-tenant blocking all changed together. A Clerk mirror webhook plus a daily full sync means profile edits show up without waiting for the next sign-in.
Docs split into internal and public products; bilingual docs site shipped
Internal docs stay in the repository and never enter the build; public docs gained frontmatter gates, zh/en file parity checks and a sensitive-content scan.
Full history: GitHub commits; RSS: /rss