forge
Clone forge-starter
Control plane:3717 · builds, tests, releases
Data plane:3718 · runs beside your app
One ruleplane ≠ 'control'

Two planes

control plane · :3717dev · build · orchestration24capabilitiesinit · provision · install · dev · build · test · lintdeploy · productionize · release · explain · planeval · provision-monitoring · delivery-check+ the 9 on the rightDocker for 10 of themdata plane · :3718the production sidecar9capabilitiesinspect · verify · set-secret · unset-secretschedule-job · agent-run · send-emailsend-message · setup-observability+ route surfaces on both planes:/auth /mcp /oauth /connect /billing /app-events/search /blobs /notifications /groups /status …plane ≠ 'control'the filteryour repo./app · Dockerdocker compose run …your apprunning in productionHTTP · same-origin proxytwo images, one hard split · every capability declares its plane · default = control
The control plane serves everything; the sidecar serves exactly the capabilities whose plane is data or both, plus the route-registered surfaces. Ask the data plane for a control-plane slug and it answers 404 by rule.
// the exact rule
const DATA_PLANE_SLUGS = new Set(capabilities.filter((c) => (c.plane ?? 'control') !== 'control').map((c) => c.slug));