— The thesis
Why June
Agents are becoming half your traffic and most of your code authors. Frameworks that only render pixels are answering yesterday's question.
Vision
Software now has two audiences — people and agents — and two authors: people and agents. June is designed for that world end to end.
- Serving agents: one
route()= HTML + JSON + markdown. llms.txt, sitemap, MCP derive automatically. Tools are intent-shaped, policy-checked — never auto-CRUD. - Agents as principals: an agent calling
/mcpcarries a user's credential and hits the SAME authorization check the UI does —defineAction.run(input, ctx)is one gate for both. - Built by agents: conventions a coding agent can't misread, plain SQL migrations, and an oracle for every artifact.
Core design philosophy
No glue layer. Declare auth, resources, and your actions in one model; June wires the adapter, mounts the endpoints, and bridges identity into the agent surface. June is opinionated on purpose — these choices are made for you:
- Convention over configuration. Presence is the API: a
page.tsxis a route, anapp/_client.tsenables hydration, acontent/*.mdjoins the manifest. Nothing asks to be wired. - Don't repeat yourself. One
route()is four surfaces; onedefineAction()is a UI action, an MCP tool, and a manifest entry; one render core serves dev and prod. Nothing drifts because nothing is duplicated — even our benchmark numbers render from a single registry. - Defaults you remove, not assemble. The agent surface ships ON;
june.config.tsexists to turn things off. An undeclared resource doesn't exist; an unused one compiles away. - Blessed picks over option matrices. One recommended auth, one default data layer — each swappable, none left as homework.
- Zero client JS until a subtree earns it. Interactivity is an explicit island; navigation belongs to the browser (Speculation Rules, View Transitions), not a client router.
- The SQL you read is the SQL that runs. Plain SQL migrations — no DSL for a human or an agent to misread.
- Markdown is source, not output. The
.mdsurface serves your authored bytes; nothing is reconstructed from rendered HTML.
Where we are
June is 0.0.x — the spec is still being drafted, and APIs will change. Benchmarks are dev-machine numbers with published methodology. The owned Rust+V8 runtime and server-reactive live RSC are experimental roadmap items — today's host is Bun/Node, deploying to Workers, Vercel, or Deno.