Build & prerender

What june build freezes at build time, and how opt-in prerender ships exactly what was tested.

june build

Everything dynamic about dev gets frozen at build time:

input output
app/**/page.* static route manifest (+ nested layout chains)
june.config.ts inlined literals (site, speculation, agent config)
content/<dir>/*.md app/_content.ts — the manifest dev AND workerd read
a page exporting prerender = true static html/md/json rendered THROUGH the built worker
app/_client.* the islands bundle served at /client.js

The bundle is self-contained ESM (rolldown; conditions baked in — workerd has no runtime conditions). Binary assets and build.external packages stay external for wrangler's own rules.

Prerender

Opt-in per route, static routes only. What ships is what was tested: the build renders through the bundled worker, not a parallel code path. Don't opt in routes whose output depends on ctx.url.origin.

Then deploy

The same bundle ships to any target — the verb is fixed, the target is one line of config. june deploy = build → upload → URL, with --dry-run as the CI test. See Deployment for the adapters (Workers, Vercel, Deno) and what each maps your resources to.