Deployment
The design
June separates what renders from where it runs:
- The framework core is portable. Routes, projections, actions, the agent
surface — all of it speaks Web standards (
Requestin,Responseout) and assumes no runtime. It is the same code on every target; deployment never changes behavior. - The host interface is the seam. Everything standards don't cover — binding a port, opening a local database, spawning a module — lives behind one small interface. A deploy target is an implementation of that interface, not a fork of the framework.
So adding a target means writing an adapter, and an adapter cannot diverge from the framework: dev, self-hosted, and edge all run the same render core (our parity suite asserts it byte-for-byte).
Targets
| target | how | status |
|---|---|---|
| Cloudflare Workers | june deploy — Rolldown bundle + frozen manifest, wrangler upload |
shipped; --dry-run runs in CI |
| Self-hosted (Bun / Node) | the host layer serves the same pipeline over Bun.serve / node:http |
serving layer CI-tested on both runtimes; a production june start verb is roadmap |
| Vercel | an adapter over the same host seam (Build Output API) | planned |
| Own Rust+V8 runtime | the experimental flagship — V8 snapshot boot, un-bundled dev | experimental track (Runtime) |
The deploy verb is fixed; the target is configuration. Resources follow the
same model: declare db / blob / kv once, and each target maps them to
its native services (D1/R2/KV on Workers, SQLite + disk locally).
Why this shape
Deployment lock-in is usually accidental: the framework leaks its favorite runtime's APIs until leaving costs a rewrite. June's rule — core speaks standards, hosts implement one interface — makes the exit door part of the architecture. The target you pick is a decision you can revisit.
Honest notes
- Workers is the one target you can deploy to today; the table above is the design and its current state, not a promise that everything works now.
- Node self-hosting note: the Node host actually exceeds the others in one
spot — real RFC 8297
103 Early Hintsinterim responses.