Built-in llms.txt
The feature
An agent landing on a June app finds its way without scraping. These derive from the route graph and your actions — you author none of them:
| surface | what an agent learns |
|---|---|
/llms.txt |
the route map + each route's markdown projection |
/sitemap.xml, /robots.txt |
the classic crawler contract |
/.well-known/api-catalog |
machine-readable API listing |
/mcp |
your actions as MCP tools an agent can call |
Link response header |
discovery advertised on every HTML response |
It's on by default and one switch turns it all off (agent: { enabled: false }) — the framework's defaults philosophy: removable, not assembly
required.
Try it on this site
curl https://june.build/llms.txt
curl https://june.build/.well-known/api-catalog
curl -sI https://june.build/why | grep -i '^link:'
The llms.txt here also carries the framework's canonical names — which
package is ours (@junejs/core, create-june) and which similarly-named
ones are not. Agents misinstalling lookalike packages is a real failure mode;
the discovery surface is where you correct it.
Why it matters
Discovery is the cheapest half of being agent-ready: if an agent's first fetch answers "what is here and how do I read it," everything downstream (markdown projections, MCP tools) gets found instead of guessed at.