Five workers, two Durable Object classes, one source of truth per workspace. Every section below names the mechanism that implements it.
Every workspace gets its own SQLite Durable Object — the system of record. Writes append revisions with actor and reason; environments scope values; promotions move them between environments through a durable Workflow with an approval gate. Nothing is ever just overwritten.
WorkspaceDurableObject · apps/api · Workflows
Per-secret AES-GCM-256 DEKs wrapped by an HKDF-derived workspace KEK. Plaintext exists transiently inside the API boundary; the delivery plane cannot decrypt.
| per-secret DEK | AES-GCM-256 |
| workspace KEK | HKDF from MASTER_KEK |
| plaintext scope | api worker, transient |
| delivery plane | cannot decrypt |
// real code — @edgevault/sdk (signatures verified) import { EdgeVault } from '@edgevault/sdk' import { useFlag } from '@edgevault/sdk/react' const edgevault = new EdgeVault({ apiKey: import.meta.env.VITE_EDGE_KEY, }) export function Checkout() { const { enabled } = useFlag(edgevault, 'checkout-v2') return enabled ? <CheckoutV2 /> : <CheckoutClassic /> }
Percentage rollouts and environment scoping over the same edge path as config. The client never throws on a missing flag — flag(key, fallback) returns your fallback, because a flags outage should degrade, not crash.
@edgevault/sdk · @edgevault/sdk/react
Pre-resolved values served from KV behind an in-memory L1 in 300+ cities. Environment-scoped API keys. No business logic, no key material, no decryption path — under 10 ms because there is nothing left to be slow.
apps/delivery · cdn.edgevault.io
The workspace DO broadcasts every change over hibernatable WebSockets. One hook subscribes a component to config, flag, and secret events; the console's live dashboard runs on the same stream.
@edgevault/realtime · WebSocket Hibernation
// real code — @edgevault/realtime (signatures verified) import { useWorkspaceEvents } from '@edgevault/realtime/react' const status = useWorkspaceEvents(wsUrl, (event) => { // 'config.changed' | 'config.deleted' | 'promotion.completed' | … refresh(event) })
Find config by meaning, not key name. Vectorize under the hood.
Promotions get scored before they ship — diffs weighed, blast radius named.
Grounded "what changed & why" — answers cite revisions, not vibes.
Streamable HTTP. Your agents get the same authz as your humans.
The five core workers, the SDK, the crypto — MIT. Commercial: SSO/SCIM (signed entitlements) and the managed control plane. CI enforces the boundary; no telemetry phones home.