Skip to content

Build output

Everything reed build writes, and what each part is for.

reed build --out dist produces a self-contained static site. Here is the whole tree for a two-page project:

dist/
index.html rendered page
quickstart/index.html rendered page
404.html not-found page
index.md markdown mirror of index.html
quickstart.md markdown mirror of quickstart/index.html
llms.txt the site, as one file, for language models
sitemap-index.xml emitted when `site` is set
sitemap-0.xml
robots.txt emitted when `site` is set
_headers response-header rules for static hosts
_astro/ hashed CSS, JS and processed images
_reed/ copied assets (favicon, OG image)
pagefind/ the search index

There is no runtime, no backend, no client-side call to any Reed service. Search runs entirely in the browser against the pagefind/ index shipped alongside the pages. The site you get is the site you serve — if Reed disappears, it keeps working.

Every page is emitted twice: once as HTML for people, once as .md for machines that would rather not parse a rendered page. llms.txt is the whole site condensed into one plain-text file with an absolute link and description per page.

Three things point at llms.txt so it can actually be found: a <link rel="alternate"> in every page’s <head>, a comment line in robots.txt, and a footer link. The <head> link is the load-bearing one — it works whether or not you set site.

These are reed build outputs only. reed dev does not write them.

Static hosts need to be told that .md files are markdown and llms.txt is plain text; without it they are commonly served as application/octet-stream and download instead of render. Reed writes the rules for you. On Cloudflare Pages and Netlify the file is read from the root of the served directory — if you serve your site from a subdirectory, _headers still belongs at the root, not next to the pages.

build writes through a staged atomic replacement, so --out is never a mixed tree of old and new files, even if the build fails partway. It also refuses an --out that overlaps a build input, which would otherwise let a build consume its own output.

Two heavy steps have generous ceilings so that a hang becomes an error instead of a process nobody notices:

Variable Default Bounds
REED_BUILD_TIMEOUT_MS 1800000 (30 min) the site build
REED_INSTALL_TIMEOUT_MS 900000 (15 min) dependency install / prefetch

Set either to 0 to remove its ceiling. A negative or non-numeric value is rejected rather than ignored, so a typo cannot silently restore an unbounded build.