Date: 2026-05-18
Status: Locked in. Supersedes the multi-container exploration in 2026-04-20-cloud-offering-sketch.md for the self-host path; that sketch remains the north star for a future Parachute-operated hosted offering.
Companions:
2026-04-20-module-architecture.md — module protocol (info / config / services.json / well-known)2026-04-20-hub-as-portal-oauth-and-service-catalog.md — OAuth architecture with hub-as-issuer2026-04-20-cloud-offering-sketch.md — multi-tenant cloud sketch (long-horizon, separate axis from v0.6 self-host)v0.6 ships one Render container running hub-as-supervisor. Vault, Notes, Scribe (and any other modules) run as child processes spawned by hub, sharing one persistent disk mounted at /parachute/. Modules install at runtime via the admin SPA — not baked into the container image.
This is the deploy mirror of the local model: locally, parachute serve runs hub, hub spawns vault/notes/scribe as children, all share ~/.parachute/. Cloud is the same process group, in a container.
Earlier exploration (mid-May) sketched a multi-service render.yaml — separate Render services for hub, vault, notes, scribe, each with its own disk. Cleaner failure isolation, separate per-service logs, independent scaling.
The cost picture broke it. Render bills $7/month per service on the Starter plan. A four-module deploy is $28/month before any traffic. A six-module deploy is $42. Modular pricing was an explicit goal — the user should pay roughly the same whether they run two modules or six. Multi-service pricing inverts that.
Aaron's framing 2026-05-18: "If we're paying $7 for each one that is not an acceptable orientation."
Single-container fixes the cost shape and keeps modularity at the level it matters — code, versions, dependencies, repos. Runtime process-group co-location is an implementation detail of the deploy target, not an architectural commitment.
Image layer (baked into the container):
@openparachute/hub (the supervisor + admin SPA + OAuth issuer)Runtime layer (installed onto the persistent disk):
@openparachute/vault, @openparachute/notes, @openparachute/scribe, third-party modules later.BUN_INSTALL=/parachute/modules so packages persist on the mounted disk rather than the ephemeral image filesystem.services.json recording which modules are installed + spawn-config per module.On container start:
/parachute/services.json.bun run /parachute/modules/node_modules/<pkg>/bin/<svc> (or the module's declared entry point)./vault, /notes, /scribe)./admin/* SPA renders against the live module list.On admin "install module":
bun install <pkg> with BUN_INSTALL=/parachute/modules.services.json.On container restart (Render redeploy, scale event, OOM, etc.):
services.json from disk → re-spawns each registered module from /parachute/modules/node_modules/.Shared process group means one module's OOM, hang, or panic can affect siblings.
Mitigations:
The trade-off is explicit and acknowledged: simpler operation now, headroom later. Splitting a single service out of the co-located group is a smaller change than building a multi-service deploy template from day one.
Two reasons:
parachute upgrade <module> from a shell) without a container redeploy.No partial ship. v0.6 ships only when the friend-experience-loop is complete end-to-end:
parachute.computer/deploy)./admin/setup.BUN_INSTALL=/parachute/modules), supervises them./notes, writes a note, transcribes audio — all working.Target time-to-working: under 5 minutes from "click Deploy" to "wrote a working note."
All Phase 1 work is tracked under the meta-issue hub#257.
Phase 1 (critical-path to v0.6 ship), as of 2026-05-18:
/admin/setup. Vault install in step 3 calls the hub#260 module-install API./deploy page with one Deploy-to-Render button, hub-only target. Modules installed post-deploy via admin SPA.Phase 2 (post-v0.6 polish, not gating ship):
render.yaml as a self-host deploy target (vault Dockerfile is retained for CI + future hub-spawns-image flows).Phase 3 (later):
2026-04-20-cloud-offering-sketch.md. Depends on multi-user UX (hub#252) and is a separate substantive build.2026-04-20-cloud-offering-sketch.md describes a multi-tenant Parachute-operated cloud (tenant-per-subdomain, Postgres-backed, CDN-hosted Notes). That north star is unchanged for the long horizon. v0.6 is the self-host path — a friend running Parachute on their own Render account. Self-host and Parachute-operated-cloud are two orientations of the same ecosystem; this doc covers only the first.render.yaml exploration (vault#339, mid-May) is set aside as the primary path. The vault Dockerfile remains useful (CI builds, future hub-spawns-vault-as-image flows). The standalone vault render.yaml is deprecated as a v0.6 deploy target — tracked at vault#341.The criterion that locked option A in: the local-host model and the cloud-self-host model are operationally identical. Hub supervises modules, modules share one persistent directory, admin SPA installs and configures. The friend deploying to Render isn't learning a new architecture — they're getting the same thing that already runs on Aaron's laptop, in a container, with a public URL.
That equivalence makes the deploy path easy to reason about, easy to document, and easy to support. It also means future hardening (better supervisor, richer admin SPA, log multiplexing) lands once and helps both deploy targets.