Skip to content

Changelog

What has shipped in Reed, newest first.

reed check catches pages missing from navigation. A content file that no navigation entry lists is now the error content-page-not-in-navigation, reported for every such file at once. Before, reed check passed and reed build failed partway through with “Failed to find the topic”. A file whose own name starts with _ is not a page and is exempt. See Fix a page that is not in navigation.

CodeGroup and CodeBlock render correctly. CodeGroup shows one tab per child, labelled from its title, then its language as written, then Tab N. CodeBlock renders through Expressive Code like a fence, with highlighting and a copy button, and keeps quotes and braces exactly as written. It takes its code from a new code prop, a single fenced child, or loose text. See Steps, tabs and code.

Frame takes a markdown image directly. A markdown image on its own is now a valid Frame child, so the <div> wrapper is no longer needed. An empty Frame still fails with DS-S02. See Images and files.

Redirects write a _redirects file. When docs.json declares redirects, the build writes one source destination status line per entry next to _headers, with the base applied. Cloudflare Pages and Workers now serve a real 301 or 302, so permanent takes effect there. The meta-refresh page is still written as the fallback. On Netlify it still wins unless you add a forced rule. A redirect source that collides with a page or a generated file is the new error redirect-source-conflict. See Redirects.

Per-page structured data. Every page now emits schema.org JSON-LD automatically — a TechArticle, or an Article with datePublished on changelog pages, plus a BreadcrumbList. Generated API pages get none. The site-wide structuredData switch turns it off; your own jsonLd blocks are unaffected either way. See Structured data.

_headers is emitted with every build. Static hosts commonly serve .md as application/octet-stream, which turns the markdown mirrors into downloads. Reed now writes the content-type rules, including a /*/llms.txt rule that covers sites mounted under a base. See Response headers.

Page chrome and llms.txt discovery. footer.columns and footer.status join footer.socials. llms.txt gained three discovery paths — a <head> link on every page, a robots.txt comment, and a footer link — where previously it was emitted but referenced by nothing.

A layout field you never set no longer overrides your template. Omitting layout.sidebar-width now leaves the template’s own baseline in control, so rapide renders at its designed 260px and black at 300px instead of both being forced to 280px. Set the field explicitly to keep the previous rendering. See Typography and layout.

Site addressing and head injection. site, base, head.meta, head.link, jsonLd, analytics and redirects all arrived together — the fields that let a build know its own public address. Setting site is what enables sitemap.xml, robots.txt and absolute URLs in llms.txt. head is data-only: there is no script surface.

The design system. 37 named MDX components with enforced contracts, a four-layer CSS cascade, and the DS-D* density and design diagnostics. A component outside the catalog is now an error rather than something that renders as literal text.

Skill packs got substantially better. A budgeted SKILL.md index with navigation, authentication and safety sections; reference entries now carry x-internal exclusion, deprecation markers, a responses table, and correct oneOf/anyOf/allOf rendering.

Offline builds. reed prefetch populates a pinned local dependency store, after which build and dev complete with no network access at all. check was, and remains, unconditionally offline. See Offline builds in CI.

Five-language HTTP snippets on every generated endpoint page — cURL, JavaScript fetch, Python requests, Python httpx and Go net/http — derived from the spec and injected into a derived copy, never into your file on disk. Your own x-codeSamples always win.

Fern parity adoption, closing the gap between what Fern’s own configuration expresses and what the importer understands.

MCP servers and Agent Skills can be generated from a configured OpenAPI spec, into your own repository. See Derived surfaces.

The Doc IR. Every derived surface is now emitted from one intermediate representation rather than from each other — which is also when llms.txt and the per-page markdown mirrors first appeared.

Reed. The project was renamed from docshine.

The default experience. The mint palette and structural sizing were rebuilt so a scaffolded site looks finished rather than like a template awaiting configuration.

Multi-spec API support, and an end to silent data loss. api.openapi became api.specs, a named map, lifting the one-API-per-project ceiling. Diagnostics were reclassified against a normative rule: content you declared that would never appear in the output is now an error, not a warning with exit code 0. Previously, a project declaring more than one API section had every section after the first silently discarded while the command reported success.

API reference pages from OpenAPI, and the MDX component layer.

The compiler core. docs.json plus a content directory, compiled to a static site.