← all posts

Building june.build with June

This site is built with June and deployed on Cloudflare Workers. That sentence is most of the pitch, so let's prove it instead of repeating it.

One route, four surfaces

Every page here is a single page module with projections:

GET /why            → streamed HTML (you, probably)
GET /why.md         → clean markdown (an agent, probably)
GET /blog.json      → structured frontmatter (a crawler with taste)
POST /mcp           → tools/call search_site, get_page (an agent at work)

The markdown an agent fetches for this very post is the file we authored, byte for byte — frontmatter included. Most frameworks reconstruct markdown from rendered HTML; June serves the source. There is nothing to drift.

Try it from your terminal

curl https://june.build/blog/2026-06-12-building-june-build-with-june.md
curl -X POST https://june.build/mcp \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_site","arguments":{"query":"cold start"}}}'

What the human side gets

Hover any link: the page prerenders in the background (Speculation Rules) and the click is a zero-network activation with a view transition. No client JavaScript was written for any of this — the browser is the client runtime.