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.
Richer code presentation. Line numbers in code blocks, and sub-navigation within long
pages.
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.