2026
nimbus-docs 0.19.0
Minor Changes
-
#265
2440889Thanks @MohamedH1998! - -agents: { discovery: false }leaves origin-root agent discovery to the site that owns the domain: no/.well-known/ard.json,ai-catalog.jsonorapi-catalog, norel="ard"orrel="api-catalog"homepage links, and your own.well-knownfiles are kept. -
#283
ed581a0Thanks @MohamedH1998! - - An API reference can be the whole site: a route atsrc/pages/[...slug].astroserves the API collection at the root. Every URL Nimbus builds for it is root-relative: pages, the version picker, the sidebar, breadcrumbs, Markdown versions,llms.txt, the sitemap,openapi.jsonand the API catalog.- A site whose
content.config.tsdeclares nodocscollection no longer queries one for the sidebar, so Astro’s “collection does not exist” warning is gone. A sidebar that namesdocsstill queries it.
- A site whose
-
#273
352a245Thanks @MohamedH1998! - A redesigned API reference:- The API home lists every endpoint, grouped by
x-tagGroups, with a filter; large specs load in parts as you scroll. The API route serves the later parts at/api/index/2/and on,noindexand left out of the sitemap and search; it takes the part size ashomeChunkSizein bothgetApiStaticPathsandgetApiRoute(without it, the home is one page), andgetApiRoutereturns the parts ashome. - Section pages list their endpoints name first, with the method and path beneath.
- The API version picker sits in the header, at every width.
- Code rail lines sit on whole pixels, with quieter line numbers; section titles are in full ink.
- The API sidebar’s rows match the docs sidebar’s.
- Section page operations gain
method,path,descriptionanddeprecated, and the root page gains anindexof every endpoint. getApiRootreads an API version’s root page from any route;chunkApiIndexandapiIndexRowssplit and flatten its index.
nimbus-docs migratelists the optional steps to adopt it. - The API home lists every endpoint, grouped by
-
#274
961e85dThanks @MohamedH1998! - - New sites’ share cards show the site’s logo, the page’s section and its title, on white. A long title shrinks before it’s cut and stays within three lines.- The card’s look lives in the site’s
src/pages/og/_card.ts; the logo is drawn once, insrc/components/logo.ts, for the header and the cards. @cloudflare/nimbus-docs/ogfits text by measuring it and renders cards to PNG. It needssatoriand@resvg/resvg-js, optional peers.getPageSection(page)returns the label of a page’s nearest parent, from the sidebar for docs pages and from the spec for API pages.
- The card’s look lives in the site’s
-
#274
91eb2e9Thanks @MohamedH1998! - -Cardtakeshref: the whole card becomes the link.- Diagram buttons and controls keep their 32px height inside prose.
- PUT and PATCH method chips meet 4.5:1 contrast in light mode.
- The version picker and the API field toggle are named by their visible text.
-
#288
aafc259Thanks @MohamedH1998! - -docsCollection({ markdownFields })writes the named frontmatter fields into each page’s.mdand.mdx.NestedContentshows another page’s content inside this one, its headings below yours and its section links pointing back to its page.nimbus-docs add changelogbuilds release notes: 10 releases a page, a page per release, and an@astrojs/rssfeed. Existing changelogs keep working (review entrychangelog-release-notes).
-
#267
eb1a3a6Thanks @MohamedH1998! - - A collection is served where its route file is:src/pages/products/sdk/[...slug].astroservessdkat/products/sdk, and every URL Nimbus builds follows: pages, sidebar, Markdown versions,llms.txt, sitemap, search, social cards, and for an API its versions,openapi.jsonand catalog entry. Sites whose route folders match their collection names build the same output.getCollectionUrl(collection)returns where a collection is served, for links in components. A name that isn’t a page collection throws.nimbus-docs checklists where each collection is served when a route moves one;check --jsonalways includes it.- Sites that build broken URLs today now fail with an error naming the file and the fix: several routes for one collection with none at its default URL, two collections on one URL, a collection served only from dynamic folders, a docs or version route away from its URL, a page under another collection’s moved URL, a route helper in a route whose parameter isn’t
slug([...path].astro), or a route helper running in a route its collection isn’t served from. - A sidebar
prefixfor a collection served by a route helper is deprecated: the route sets the URL. getIndexedTopLevel()groups a moved collection under its URL: a group’sslugandlabelcan contain/(products/sdk). Components that build/${slug}/llms.txtor showlabelshould expect it.- Two new warnings, from the build and
check: a second static route for a collection that’s already served elsewhere (its pages duplicate the collection’s), and a helper route in a nested folder whosegetStaticPathsNimbus can’t read. nimbus-docs lintfollows the pages Astro writes for a dynamic redirect ("/sdk/[...slug]": "/products/sdk/[...slug]") instead of taking them for pages, so a redirect to a missing page is reported andnimbus/redirected-linkfinds links through it.nimbus-docs lintsuggests the new URL for a link into a moved collection (/sdk/setup→/products/kit/setup), and never suggests the site root or an error page as a near-match. Builds record each collection’s URL in.nimbus/routes.jsonfor this.nimbus-docs checkchecks collections added since the last build, alongside the ones that build recorded.
-
#268
4b77047Thanks @MohamedH1998! - - Request-rendered collections are served where their route file is too, nested folders, kept copies andbaseincluded. A request-rendered route under a static folder no collection is served from returns not found and logs why; one under a dynamic folder ([locale]/sdk/) isn’t checked, since its folder depends on the URL. A request-rendered collection’sindexpage is listed in the sitemap, search and route checks at the collection’s URL (/products/kit/), not/products/kit/index/.- In
astro dev, moving, adding or removing a collection’s route file restarts the server onto the new URLs and logs the redirect to add. Editing a route’s template doesn’t restart. - With the nested
[...section]/llms.txtroute, a collection at a nested URL is linked from thellms.txtof the section above it, not only from the rootllms.txt.
- In
-
#253
3fa357fThanks @MohamedH1998! - - A page collection’s files can live anywhere: a glob over a folder outsidesrc/gets callouts, components, citations, links, collision checks and lint like a page undersrc/content.- A loader with no files gets citations, links, Markdown versions,
llms.txtand URL collision checks throughwithNimbusMarkdown(). - Two files with one slug fail the build in any collection,
.mdfiles included; in collections made with the factories, so does a byte-identical copy. sourcesin the Nimbus config checks out another git repository at build time;docsCollection({ source, base })andapi[].spec: { source, path }read it.- A pinned commit is fetched once and builds offline; a branch builds from its last snapshot when the remote is down.
NIMBUS_BUILD_ONLYfetches only the sources its collections andapientries read;astro dev,astro syncandastro previewstart without a source they can’t fetch, leaving its collections empty, whileastro buildfails naming what reads it.- A
repowith a token or password in it is refused; credentials come from git. - Pages from a source get the source’s
editPatternand no git date. - A source page with no frontmatter
titletakes its first heading, else its file name; the sidebar never shows a blank label. - Relative links between a source collection’s pages (
2-options.md#signal) become page URLs; a link to a file the collection doesn’t publish stays as written, with a warning. - A
refthat starts withrefs/(such asrefs/pull/12/head) is used as written. nimbus-docs checkreportsnimbus/source-floating-refandnimbus/source-unreferenced.nimbus-docs lintreads source snapshots and reports problems by source and repository path;--fixnever writes them.nimbus-docs lintsays how many Markdown (.md) pages it leaves out.nimbus-docs add source <name|url>adds a content source:git(github,gitlab,bitbucket),notion, or a guide for any provider from its docs URL.add source notionhas your agent write a Notion loader into the site, with drafts, slugs and ordering from the database’s properties. It warns when no row publishes, naming the status values the database uses.list --type sourcelists the sources.- Each source guide carries its own route, rendering and sidebar steps, ends with what to report to the user, and prints from its first heading.
- A loader with no files gets citations, links, Markdown versions,
-
#270
0b30e24Thanks @MohamedH1998! - - A collection served inside an autogenerated sidebar folder appears in that folder, as a group linking its landing page, so breadcrumbs and previous and next links cross between them. Itsindexpage sets the group’s label and order, shows only its landing (hideChildren) or leaves it out (sidebar.hidden); naming it insidebar.items, or linking to its URL there, places it by hand; a labeled{ autogenerate: { collection } }group for one links its landing page and holds the collections inside it. A page the sidebar leaves out keeps the breadcrumbs of the folders above it, and a crumb, titled like the page, for each page between there and itself. A docs folder whose only page is itsindexbecomes a group to hold such a collection, keeping the page’s label. Sites without such a collection build the same sidebar. -
#284
f256109Thanks @MohamedH1998! - -outdatedanddiffcompare a site scaffolded with an API reference against the starter it came from: the API route and config read as the starter’s, and the spec as your own. -
#244
17bf1ceThanks @MohamedH1998! - -NIMBUS_BUILD_ONLY=docs-esbuilds one collection, or a comma-separated set, and leaves the others empty;dev,syncandcheckignore it with one notice.- A slice without the
docscollection writes its sitemap, search bundle, stylesheet, assets andllms-full.txtunder its prefix, and drops the root files the root slice serves. - The root slice’s
llms.txtlists every collection’sllms.txt, and search merges the other slices’ indexes at runtime. nimbus-docs lintchecks links into other slices against the previous build’s routes, as warnings.- A slice build fails on an unknown collection, and on docs version collections split across slices. Slices work under Astro’s
base: every URL a slice serves and advertises is under it. - The route list
nimbus-docs lintchecks against reads_redirectswhere the Cloudflare adapter moves it when the site has abase, so redirects stay known to link checking. searchIndexinvirtual:nimbus/confignames the search bundles as served URLs, base included. The starter’s search provider loads its slice’s bundle and merges the others.- A guide, “Build one locale or one part”, with the Worker and zone routes per slice and a workflow that builds the slice a pull request touched.
- A slice without the
-
#272
9a65f9fThanks @MohamedH1998! - New sites start on the redesigned starter:- A fill-in Introduction as the home page, a Writing pages guide and a Components page replace the sample pages and the landing page.
- A new type scale, steel accent, code blocks, sidebar and header logo.
- One pagination bar for the previous and next pages; with focus in the bar,
[and]move between them. - Every component part has a
data-slotto style it by, except sidebar rows, which stay bare so large sidebars stay light. - Components wrap long words, URLs and labels instead of overflowing on phones.
- Text meets 4.5:1 contrast in light mode, Steps are a real list, manual Tabs render one tab list and pair each tab with its panel.
- Pages mirror correctly in right-to-left languages; code stays left to right.
- On phones, sites with several sections show them as tabs under the header.
- Thin, theme-coloured scrollbars.
PageActionsrenders extra actions passed as children; the layout passes the Copy MCP URL action that way.
Existing sites keep their look.
nimbus-docs migratelists optional steps to adopt it, the lighter sidebar rows, and the new favicons and asset caching. The registry adds avariantslib that Badge and Button install with them. -
#243
5604125Thanks @MohamedH1998! - -agents: { mcp: true }serves a remote MCP server at/mcpwithlist_pagesandget_pageover the published Markdown, plus a Server Card at/mcp/server-card, a line inllms.txtand an entry in the AI catalog. It needs a server adapter and@modelcontextprotocol/server;nimbus-docs checkreports a missing SDK.- Docs pages in the starter show a “Copy MCP URL” page action that copies the server URL when the server is on. On an existing site, run
nimbus-docs diff src/components/ConnectMcp.astro --applyandnimbus-docs diff src/components/connect-mcp.client.ts --apply, then pass{capabilities.mcpUrl && <ConnectMcp />}to<PageActions>insrc/layouts/DocsLayout.astro, as the Remote MCP server guide shows.
- Docs pages in the starter show a “Copy MCP URL” page action that copies the server URL when the server is on. On an existing site, run
-
#278
b6d4837Thanks @MohamedH1998! - - Route files say how they render.nimbus-docs checkreports each route Nimbus manages whose file disagrees withrendering, andcheck --fixrewrites it: theprerenderline, getStaticPaths on built routes only, and the collection name in a collection route’s page helper. Withoutrendering, Nimbus builds every one of these routes ahead of time, a collection route such assrc/pages/sdk/[...slug].astroincluded.renderingstill wins at build, which now warns once and lists the files.- A built dynamic route with no getStaticPaths fails the build, naming the file; Astro can’t build it.
- The page helpers take the collection as a second argument, such as
getCollectionPage(Astro, "sdk")orgetApiRoute(Astro, "api", { homeChunkSize }), so a request-rendered route needs no getStaticPaths to say which collection it serves. A route whose getStaticPaths and helper name different collections fails withnimbus/collection-route-mismatch. add adapter-*updates route files after settingrendering, and its recipes runcheck --fix.outdatedanddiffcompare starter route files in the site’s own mode, so a routecheck --fixedited doesn’t read as a local change.- The starter’s Markdown,
llms.txtand docs page routes dropexport const prerender = true; the site’soutputandrenderingdecide how they render. A scaffold with a server adapter writes its route files in the mode itsrenderinggives them.
-
#277
6c4a633Thanks @MohamedH1998! - - Previous and next links never point a page at itself, when the sidebar reaches a page twice: a group landing that is also a child link, a page linked from two groups, or an anchor link after its page.- An isolated sidebar (
isolate.boundaries) starts with the group’s landing page instead of dropping it, labeled “Overview” underindexDisplay: "overview-leaf"unless the page sets its ownsidebar.label. The landing page gains previous and next links. - A labeled
{ autogenerate: { collection } }group starts with the collection’s landing page at any depth. A collection served one segment deep, such as/sdk, now gets the landing row (“Overview”), previous and next links, and a linked breadcrumb; setsidebar.group.hideIndex: trueon itsindexpage to leave it out. - On request rendering,
/index,/<collection>/indexand/<version>/indexreturn 404 instead of a copy of the landing page, as built pages do. nimbus-docs checkstops listing and checking a collection deleted since the last build, and notes once that the last build’s collection list is out of date.- API descriptions keep text the HTML sanitizer doesn’t know as a tag, such as
metadata.<key>, as text instead of dropping it.<script>is still removed, and other unknown tags render as inert text. - Code samples for an
apiKeyin a cookie send it as a cookie, such as curl’s--cookie 'session=<session>', instead of as a header.
- An isolated sidebar (
-
#260
0c31e84Thanks @MohamedH1998! - -add --overwritewithout a terminal keeps components you’ve edited and exits 1;--overwrite --yesreplaces them and says how many carried edits.add a binstalls both; an unknown slug stops before anything is installed.checksays an optional upgrade stays listed untilmigraterecords the version as reviewed.- New pnpm sites build pages with local images:
sharpis a starter dependency. astro build --root <site>from another folder finds the social-card font.
Patch Changes
-
#266
662c1c8Thanks @MohamedH1998! - -add adapter-cloudflarein a coding agent session wires the adapter as it does from a shell; the agent gets the recipe only where the CLI can’t edit the config safely.checkreports a missing@scalar/openapi-parserfor sites with API collections, andcheck --fix --yesinstalls it.- Without a terminal,
checksuggests--fix --yesor editing by hand, whichever--fixcan do;migrate --printon a preview build says reviews start on a release.
-
#273
87f4536Thanks @MohamedH1998! - - The API sidebar lists webhooks in a Webhooks group at the end.- A webhook page no longer shows the API’s own top-level security as the receiver’s auth.
-
#288
aafc259Thanks @MohamedH1998! - - In dev on a Cloudflare site that prerenders with Node, a page’s Markdown version follows edits to the page and tocontent.config.tsinstead of failing until a restart. -
#284
f256109Thanks @MohamedH1998! - -astro devno longer warns that thedocscollection doesn’t exist on a site without one. -
#287
8a43a6cThanks @MohamedH1998! - Error messages link to the docs pages’ new addresses on nimbus-docs.com. -
#263
46ecb84Thanks @MohamedH1998! - -nimbus/image-refchecks image paths under Astro’sbase: an inline image needs the base written and a reference definition must not repeat it.lint --fixrepairs both when the file is inpublic/. Itsignorepatterns are written without the base, as for links.- Under a base,
nimbus-docs lintnow reports inline images written without it, such as/arch.png, which can fail CI where it passed before. Those images return 404 on the deployed site.
- Under a base,
-
#271
f491c71Thanks @mvvmm! - -astro devrenders a page’s headings when the page is first requested, not every page at content sync. Startup and each file save no longer scale with the number of docs.- Builds are unchanged.
-
#264
68b9f7cThanks @MohamedH1998! - - The API catalog andard.jsonlist every visible API version: a query-addressed version at its query URL, and the non-default versions of abundle: falsecollection, whose specs are now published too.- Homepage
Linkheaders advertise only API family defaults and link to the complete catalog, keeping response headers independent of version count. AgentApiPublication.markdownUrlis now optional, because versions without a Markdown reference have none. Code that reads it from@cloudflare/nimbus-docs/typesorvirtual:nimbus/agent-capabilitiesmust handleundefined.
- Homepage
-
#252
a7ea698Thanks @sansynx! -nimbus-docs checknow reports a missing server adapter foragents.mcp, request rendering andapiwithbundle: false, and a missing MCP SDK, before a build. Adapter errors name every supported host instead of suggesting Cloudflare first. The placeholdersitewarning names Cloudflare Workers only when no other adapter is configured, so a Node site with a leftoverwrangler.jsoncno longer gets it. The MCP server keeps serving requests on a connection after it rejects an oversized body. Preview builds report starter freshness and diffs correctly,add adapter-*keeps the adapter’s version range, andagents: { MCP: true }suggestsmcp. -
#282
e983040Thanks @MohamedH1998! - - The package READMEs describe Nimbus as the authoring tool for docs, with the CLI by task and the scaffolder’s options. -
#285
d45764dThanks @MohamedH1998! - -migrate’s redesigned-starter step listssrc/components/logo.ts, which the newLogo.astroimports.- Search results for API pages keep an operation’s name, method and path apart, and no longer index the API home filter’s Retry button.
-
#287
8758eebThanks @MohamedH1998! - -lintandcheckaccept relative links between a content source’s pages, which the build turns into page URLs.- Search in a slice of several collections skips the other collections’ bundles instead of failing.
@cloudflare/nimbus-docs/clientexportsmergeSearchIndexes, which the starter’s search provider uses. - API operation pages keep field names, types and labels apart in search, and leave the expand controls out.
- The search button’s accessible name starts with its visible label, and API pages name their sidebars.
- Search in a slice of several collections skips the other collections’ bundles instead of failing.
-
#287
8758eebThanks @MohamedH1998! - -add adapter-cloudflareon a pnpm site declines workerd’s build script first, so the install no longer fails.- A slice’s Markdown images are published under its prefix, and Markdown images load in
astro dev. - WebMCP search covers every slice, like the search dialog. On an existing site, pass
searchIndexto it as the starter’sWebMCP.astrodoes. - Search excerpts for request-rendered pages read as text, not Markdown syntax.
add --overwritenames the files that carry your edits.
- A slice’s Markdown images are published under its prefix, and Markdown images load in
-
#272
ba39e21Thanks @MohamedH1998! - - Relative images now load in a page’s Markdown version and inllms-full.txt.checkandlintno longer count a Markdown partial as an unlinted page.- Search results no longer show a code block’s title and language joined to its first line.
create-nimbus-docs 0.8.0
Minor Changes
-
#273
352a245Thanks @MohamedH1998! - A redesigned API reference:- The API home lists every endpoint, grouped by
x-tagGroups, with a filter; large specs load in parts as you scroll. The API route serves the later parts at/api/index/2/and on,noindexand left out of the sitemap and search; it takes the part size ashomeChunkSizein bothgetApiStaticPathsandgetApiRoute(without it, the home is one page), andgetApiRoutereturns the parts ashome. - Section pages list their endpoints name first, with the method and path beneath.
- The API version picker sits in the header, at every width.
- Code rail lines sit on whole pixels, with quieter line numbers; section titles are in full ink.
- The API sidebar’s rows match the docs sidebar’s.
- Section page operations gain
method,path,descriptionanddeprecated, and the root page gains anindexof every endpoint. getApiRootreads an API version’s root page from any route;chunkApiIndexandapiIndexRowssplit and flatten its index.
nimbus-docs migratelists the optional steps to adopt it. - The API home lists every endpoint, grouped by
-
#274
961e85dThanks @MohamedH1998! - - New sites’ share cards show the site’s logo, the page’s section and its title, on white. A long title shrinks before it’s cut and stays within three lines.- The card’s look lives in the site’s
src/pages/og/_card.ts; the logo is drawn once, insrc/components/logo.ts, for the header and the cards. @cloudflare/nimbus-docs/ogfits text by measuring it and renders cards to PNG. It needssatoriand@resvg/resvg-js, optional peers.getPageSection(page)returns the label of a page’s nearest parent, from the sidebar for docs pages and from the spec for API pages.
- The card’s look lives in the site’s
-
#274
91eb2e9Thanks @MohamedH1998! - -Cardtakeshref: the whole card becomes the link.- Diagram buttons and controls keep their 32px height inside prose.
- PUT and PATCH method chips meet 4.5:1 contrast in light mode.
- The version picker and the API field toggle are named by their visible text.
-
#272
9a65f9fThanks @MohamedH1998! - New sites start on the redesigned starter:- A fill-in Introduction as the home page, a Writing pages guide and a Components page replace the sample pages and the landing page.
- A new type scale, steel accent, code blocks, sidebar and header logo.
- One pagination bar for the previous and next pages; with focus in the bar,
[and]move between them. - Every component part has a
data-slotto style it by, except sidebar rows, which stay bare so large sidebars stay light. - Components wrap long words, URLs and labels instead of overflowing on phones.
- Text meets 4.5:1 contrast in light mode, Steps are a real list, manual Tabs render one tab list and pair each tab with its panel.
- Pages mirror correctly in right-to-left languages; code stays left to right.
- On phones, sites with several sections show them as tabs under the header.
- Thin, theme-coloured scrollbars.
PageActionsrenders extra actions passed as children; the layout passes the Copy MCP URL action that way.
Existing sites keep their look.
nimbus-docs migratelists optional steps to adopt it, the lighter sidebar rows, and the new favicons and asset caching. The registry adds avariantslib that Badge and Button install with them. -
#278
b6d4837Thanks @MohamedH1998! - - Route files say how they render.nimbus-docs checkreports each route Nimbus manages whose file disagrees withrendering, andcheck --fixrewrites it: theprerenderline, getStaticPaths on built routes only, and the collection name in a collection route’s page helper. Withoutrendering, Nimbus builds every one of these routes ahead of time, a collection route such assrc/pages/sdk/[...slug].astroincluded.renderingstill wins at build, which now warns once and lists the files.- A built dynamic route with no getStaticPaths fails the build, naming the file; Astro can’t build it.
- The page helpers take the collection as a second argument, such as
getCollectionPage(Astro, "sdk")orgetApiRoute(Astro, "api", { homeChunkSize }), so a request-rendered route needs no getStaticPaths to say which collection it serves. A route whose getStaticPaths and helper name different collections fails withnimbus/collection-route-mismatch. add adapter-*updates route files after settingrendering, and its recipes runcheck --fix.outdatedanddiffcompare starter route files in the site’s own mode, so a routecheck --fixedited doesn’t read as a local change.- The starter’s Markdown,
llms.txtand docs page routes dropexport const prerender = true; the site’soutputandrenderingdecide how they render. A scaffold with a server adapter writes its route files in the mode itsrenderinggives them.
-
#284
f256109Thanks @MohamedH1998! - - A new site can include an API reference:--apiadds one at/api, from your OpenAPI 3.x file (--api ./openapi.yaml) or a sample, and--template apimakes it the whole site, at/. Without flags, the scaffolder asks what the site includes, and it refuses a spec that isn’t OpenAPI 3.x before writing anything.AGENT.mdin a site with an API reference says where its spec and route are; a site that is only the reference has no docs-writing sections.- The starter’s header shows Docs and API reference tabs when a site has an API reference beside its docs.
Patch Changes
-
#282
e983040Thanks @MohamedH1998! - - The package READMEs describe Nimbus as the authoring tool for docs, with the CLI by task and the scaffolder’s options. -
#244
17bf1ceThanks @MohamedH1998! - -NIMBUS_BUILD_ONLY=docs-esbuilds one collection, or a comma-separated set, and leaves the others empty;dev,syncandcheckignore it with one notice.- A slice without the
docscollection writes its sitemap, search bundle, stylesheet, assets andllms-full.txtunder its prefix, and drops the root files the root slice serves. - The root slice’s
llms.txtlists every collection’sllms.txt, and search merges the other slices’ indexes at runtime. nimbus-docs lintchecks links into other slices against the previous build’s routes, as warnings.- A slice build fails on an unknown collection, and on docs version collections split across slices. Slices work under Astro’s
base: every URL a slice serves and advertises is under it. - The route list
nimbus-docs lintchecks against reads_redirectswhere the Cloudflare adapter moves it when the site has abase, so redirects stay known to link checking. searchIndexinvirtual:nimbus/confignames the search bundles as served URLs, base included. The starter’s search provider loads its slice’s bundle and merges the others.- A guide, “Build one locale or one part”, with the Worker and zone routes per slice and a workflow that builds the slice a pull request touched.
- A slice without the
-
#285
d45764dThanks @MohamedH1998! - -migrate’s redesigned-starter step listssrc/components/logo.ts, which the newLogo.astroimports.- Search results for API pages keep an operation’s name, method and path apart, and no longer index the API home filter’s Retry button.
-
#287
8758eebThanks @MohamedH1998! - -lintandcheckaccept relative links between a content source’s pages, which the build turns into page URLs.- Search in a slice of several collections skips the other collections’ bundles instead of failing.
@cloudflare/nimbus-docs/clientexportsmergeSearchIndexes, which the starter’s search provider uses. - API operation pages keep field names, types and labels apart in search, and leave the expand controls out.
- The search button’s accessible name starts with its visible label, and API pages name their sidebars.
- Search in a slice of several collections skips the other collections’ bundles instead of failing.
-
#243
5604125Thanks @MohamedH1998! - -agents: { mcp: true }serves a remote MCP server at/mcpwithlist_pagesandget_pageover the published Markdown, plus a Server Card at/mcp/server-card, a line inllms.txtand an entry in the AI catalog. It needs a server adapter and@modelcontextprotocol/server;nimbus-docs checkreports a missing SDK.- Docs pages in the starter show a “Copy MCP URL” page action that copies the server URL when the server is on. On an existing site, run
nimbus-docs diff src/components/ConnectMcp.astro --applyandnimbus-docs diff src/components/connect-mcp.client.ts --apply, then pass{capabilities.mcpUrl && <ConnectMcp />}to<PageActions>insrc/layouts/DocsLayout.astro, as the Remote MCP server guide shows.
- Docs pages in the starter show a “Copy MCP URL” page action that copies the server URL when the server is on. On an existing site, run
-
#287
8758eebThanks @MohamedH1998! - -add adapter-cloudflareon a pnpm site declines workerd’s build script first, so the install no longer fails.- A slice’s Markdown images are published under its prefix, and Markdown images load in
astro dev. - WebMCP search covers every slice, like the search dialog. On an existing site, pass
searchIndexto it as the starter’sWebMCP.astrodoes. - Search excerpts for request-rendered pages read as text, not Markdown syntax.
add --overwritenames the files that carry your edits.
- A slice’s Markdown images are published under its prefix, and Markdown images load in
-
#260
0c31e84Thanks @MohamedH1998! - -add --overwritewithout a terminal keeps components you’ve edited and exits 1;--overwrite --yesreplaces them and says how many carried edits.add a binstalls both; an unknown slug stops before anything is installed.checksays an optional upgrade stays listed untilmigraterecords the version as reviewed.- New pnpm sites build pages with local images:
sharpis a starter dependency. astro build --root <site>from another folder finds the social-card font.
nimbus-docs 0.18.1
Patch Changes
-
#247
b98bd3fThanks @MohamedH1998! - - Generated_headersrules leave out any header the site’s own_headersalready sets for that path, site-wide rules included, so hosts no longer send doubled values such asAccess-Control-Allow-Origin: *, *. -
#250
d664242Thanks @sansynx! - Keep application warnings visible during concurrent OpenAPI specification publication. -
#257
e9a4360Thanks @MohamedH1998! - - New Cloudflare projects, andnimbus-docs add adapter-cloudflarewhenwrangler.jsonchas no valid date, get acompatibility_datethe installed Workers runtime supports instead of today’s date, so local dev starts.
create-nimbus-docs 0.7.13
Patch Changes
-
#225
6832653Thanks @MohamedH1998! - Use the matching PR registry in on-demand preview scaffolds. -
#257
e9a4360Thanks @MohamedH1998! - - New Cloudflare projects, andnimbus-docs add adapter-cloudflarewhenwrangler.jsonchas no valid date, get acompatibility_datethe installed Workers runtime supports instead of today’s date, so local dev starts.
nimbus-docs 0.18.0
Minor Changes
-
#229
a04304cThanks @MohamedH1998! - - A page or reusable snippet with only frontmatter builds, and its Markdown version is just its title and source.- A snippet included inside a list item or quote keeps that structure in the page’s Markdown version.
llms.txtnames each section for its index page’s title, such as “Guides” instead ofguides.- Documentation search results link to the page itself instead of a URL ending in
#, and excerpts no longer include the page actions. - The Markdown version of an API page names each field as the page does, with its full coordinate beside it for citing.
-
#232
d655e86Thanks @MohamedH1998! - - API pages link to the previous and next page in sidebar order, even when a group is collapsed.- Error responses start collapsed; a link to one, or to a field inside it, opens it.
- A sidebar link to an API or docs-version mount, such as
/api, no longer warns. - Operations that fall back to a coordinate route print one summary line, so other warnings stay visible.
- Samples and the endpoint card keep a server URL’s query after the path.
- Response toggles meet 4.5:1 contrast in light mode, field anchors work on touch screens, and “Authorisation” reads “Authorization”.
-
#211
4a841cbThanks @MohamedH1998! - - Addbundle: falseto anapientry to serve a very large or many-version API from static assets instead of the server bundle. Unchanged pages are shared across versions, and unchanged versions aren’t prepared again on rebuild. Needssrc/live.config.tsregisteringapiPagesLoaderfrom@cloudflare/nimbus-docs/live; the build shows the snippet. The build suggests the option when an API’s bundled page data passes 16 MiB.- Add
getVersionSwitchUrlandgetApiVersionHeadfor version pickers and heads in every rendering mode; the starter’s picker and API layout use them.
- Add
-
#212
94ebe52Thanks @MohamedH1998! - API pages show the sidebar filter. Withsidebar: "on-demand"it also finds pages the sidebar hasn’t loaded. -
#222
e15eea7Thanks @MohamedH1998! - Newapi[].extensionsoption: list thex-*fields to keep, and their values are copied onto API pages aspage.extensionsandfield.extensionsfor your components to render. -
#214
825ffcfThanks @MohamedH1998! - API reference pages show the version picker for versioned APIs, in the sidebar and the mobile navigation. -
#211
02f53a1Thanks @MohamedH1998! -versionModeis nowversionUrl:versionUrl: { in: "query" }selects the version with?version=instead of?api-version=, and old links redirect. Setparamto use another name (review entryapi-version-url). -
#240
381b37aThanks @MohamedH1998! - -og:image:widthandog:image:heightdescribe the image: generated cards stay 1200 × 630, asocialImagefile inpublic/is measured at build time, and any other image gets no size tags.NimbusHeadtakessocialImageSizeto set them for an image Nimbus can’t measure.- The sitemap has
<lastmod>on every documentation page, from frontmatterlastUpdatedor the page’s last commit, and/sitemap.xmlis a copy ofsitemap-index.xmlunless the site serves its own. - The starter’s
BaseLayoutpassessocialImageSizethrough toNimbusHead, and the 404 page recipe writes the new title andnoindex. - On a shallow clone, pages get no git dates instead of the wrong one, and the build says how to fetch the history.
- The 404 page’s title is
Page not found | <site>and the page isnoindex.
- The sitemap has
-
#233
1f2ce43Thanks @MohamedH1998! - - New sites open content images at full size on click. On an existing site, runnimbus-docs add image-zoomand render<ImageZoom />insrc/layouts/DocsLayout.astro. -
#238
315ab66Thanks @MohamedH1998! - - Aresource-action-v2route convention publishes tag pages at lowercase URLs, such as/api/tags/user-management, with the same operation URLs asresource-action-v1. Existing conventions, and sites withoutroutes, are unchanged.- The API reference recipe sets
resource-action-v2on new sites and resolves the route collisions the build reports.
- The API reference recipe sets
-
#224
79b05efThanks @MohamedH1998! - - Newmarkdown.featuresoption turns on Sätteri syntax, such as{ headingAttributes: true }for## Install {#install}or{ math: true }. Pages, generated Markdown, reusable snippets and lint all follow it. New sites start with heading ids on.- Generated Markdown drops
{/* comments */}. - Invalid MDX reports the file, line and fix instead of an internal error.
- Generated Markdown drops
-
#226
dd95e97Thanks @MohamedH1998! - - Newmath()Markdown plugin typesets$…$,$$…$$and```mathat build time as native MathML, with no math JavaScript. Addmath()tomarkdown.hastPluginsandmath: truetomarkdown.featuresto use it. -
#236
fb759c5Thanks @MohamedH1998! - - With the section route atsrc/pages/[...section]/llms.txt.ts, each sub-folder gets its ownllms.txt, and its parent’s index links to it under “Sections”. New sites have this route; a[section]route keeps today’s one index per top-level section.- An
llms-full.txtover 25 MiB becomes an index of onellms-full.txtper section, split further where a section is still too big, so the site deploys to Cloudflare. LlmsEndpointReference(from@cloudflare/nimbus-docs/agent-endpoints) addssurface: "full"on section references, for the per-sectionllms-full.txtfiles.
- An
-
#224
79b05efThanks @MohamedH1998! - Starter fixes:- The theme toggle no longer submits a surrounding form, reports its state to screen readers, and still switches when storage is blocked.
- Closing a dialog no longer releases another overlay’s scroll lock.
- “Copy page” works in Safari, and a failed command copy shows it failed.
- In search, Enter on the close button closes the dialog, and status messages are announced.
<Render>params can’t replace registered components; small fixes to breadcrumbs and the mobile table of contents.- Banner content is rendered as written, like the rest of the site’s content.
-
#223
c39fdfcThanks @MohamedH1998! - The docs version picker no longer appears on pages outside the docs versions, such as API reference and blog pages.
Patch Changes
-
#228
6d4bd68Thanks @MohamedH1998! - -addreports components whose files already match the registry as up to date, and--overwritelists each file it replaces, asking first in a terminal when you’ve edited the component.add --overwritedetects edits to components that came with the starter from the starter release your site came from, so it replaces untouched ones without asking.addadds a component’s missing files even when it keeps your edited ones, and lists each file it adds, replaces or keeps.addno longer suggests registering a component thatcomponents.tsalready registers.- Upgrade reviews about API reference pages are skipped on sites without an API collection.
outdatedsays when a newer Nimbus is out, when the reviewed version only needs recording, and when a registry dependency is installed below the version a component needs.diff --applyon a file only you changed reports there’s nothing to pull, without failing.diff,outdatedandmigrateexplain preview builds instead of asking for a baseline.
-
#219
942c57bThanks @MohamedH1998! - Generated code samples formultipart/form-datarequest bodies now send every part, with file fields as<name>placeholders, instead of only theContent-Typeheader. -
#223
c39fdfcThanks @MohamedH1998! - - Generated API samples use<base-url>when a spec has no server or a relative one, instead of an invented host, and fill server variables from their defaults.- OpenAPI 3.2 tag
parentno longer prints a warning for each tag that uses it. nimbus-docs add api-layoutends by pointing to the API route instead ofsrc/components.ts.- The Markdown version of an API page fences cURL samples as
bash.
- OpenAPI 3.2 tag
-
#220
cd7f0daThanks @MohamedH1998! - - Request field lists no longer show properties markedreadOnlyacross schema alternatives, and response field lists no longer show those markedwriteOnlyacross alternatives. Synthesized examples use the selected alternative; authored examples retain their values. Webhook payloads read like responses. Cite areadOnlyfield under the response.- A string example under a non-JSON media type such as
application/x-ndjsonis sent verbatim in generated samples. - Object form examples with media-type parameters such as
; charset=utf-8generate per-field samples; authored encoded strings keep their bytes.
- A string example under a non-JSON media type such as
-
#234
1b546afThanks @MohamedH1998! - -astro devandastro checkno longer delete the build’s page-collection list, sonimbus-docs checkruns its page-collection checks after a build.nimbus-docs lintandchecksay when the lint rules in your Astro config changed since.nimbus/lint.jsonwas written, and to runastro sync.checkmarks a scope that skipped some checks◐ ok, partly checked, and says--typescovers.tsand.tsxfiles only (runastro checkfor.astro).nimbus-docs check --helplistscheck’s own flags.- The adapter warning for
@astrojs/cloudflare14.2.x says only a coldastro devcan fail; builds aren’t affected. - An invalid API spec, such as Swagger 2.0, fails the build with its message and no stack trace.
- Request-rendered routes that export
getStaticPaths()get one line explaining that the rendering policy renders them on request. - On a static Cloudflare site with
trailingSlash: "always"andbuild.format: "file", the build andcheckwarn that every/page/link redirects, and name thewrangler.jsoncfix. - Repeated API spec warnings that differ only by source print once, with a count.
lint --rule nimbus/mdx-syntaxsays the syntax check always runs.
-
#211
ff1cd57Thanks @MohamedH1998! - Load@iconify-jsonicon sets from the site root, so a build started from another directory still finds them. -
#237
7a07851Thanks @MohamedH1998! - - Search is indexed howeverastro buildis started, including./node_modules/.bin/astro build.- A site’s
pagefind.ymlapplies when the build starts from another folder with--root. - The build says to install Pagefind only when it isn’t installed.
- A site’s
-
#230
25d21cfThanks @MohamedH1998! - - Server scaffolds for Node, Vercel, and Netlify render docs pages on request, so Markdown negotiation works on them.- Scaffold into
.or an empty folder, including a freshly cloned repository. - New repositories get a first commit; scaffolding inside an existing repository no longer creates a nested one.
npm createinstalls a handful of packages instead of the whole framework.- A missing package manager fails before anything is written, and a mistyped flag suggests the right one.
- Yarn sites ignore
.yarn/the way Yarn recommends, and pin Yarn inside a folder that pins another package manager. - The starter’s
AGENT.mdexplains sidebar groups, order, and links. nimbus-docs checkand--helpshow commands for your package manager.
- Scaffold into
-
#213
7350707Thanks @MohamedH1998! - When an API’s spec can’t be published because a$refisn’t a reference string, the build warning names where it is instead of printing[object Object]. -
#227
ea8712dThanks @sansynx! - Add UTF-8 Content-Type headers for prerendered llms indexes, full documents, page Markdown, and robots.txt. Keep rules scoped to Nimbus file paths and preserve explicit owner Content-Type policies.
create-nimbus-docs 0.7.12
Patch Changes
-
#229
a04304cThanks @MohamedH1998! - - A page or reusable snippet with only frontmatter builds, and its Markdown version is just its title and source.- A snippet included inside a list item or quote keeps that structure in the page’s Markdown version.
llms.txtnames each section for its index page’s title, such as “Guides” instead ofguides.- Documentation search results link to the page itself instead of a URL ending in
#, and excerpts no longer include the page actions. - The Markdown version of an API page names each field as the page does, with its full coordinate beside it for citing.
-
#232
d655e86Thanks @MohamedH1998! - - API pages link to the previous and next page in sidebar order, even when a group is collapsed.- Error responses start collapsed; a link to one, or to a field inside it, opens it.
- A sidebar link to an API or docs-version mount, such as
/api, no longer warns. - Operations that fall back to a coordinate route print one summary line, so other warnings stay visible.
- Samples and the endpoint card keep a server URL’s query after the path.
- Response toggles meet 4.5:1 contrast in light mode, field anchors work on touch screens, and “Authorisation” reads “Authorization”.
-
#211
4a841cbThanks @MohamedH1998! - - Addbundle: falseto anapientry to serve a very large or many-version API from static assets instead of the server bundle. Unchanged pages are shared across versions, and unchanged versions aren’t prepared again on rebuild. Needssrc/live.config.tsregisteringapiPagesLoaderfrom@cloudflare/nimbus-docs/live; the build shows the snippet. The build suggests the option when an API’s bundled page data passes 16 MiB.- Add
getVersionSwitchUrlandgetApiVersionHeadfor version pickers and heads in every rendering mode; the starter’s picker and API layout use them.
- Add
-
#212
94ebe52Thanks @MohamedH1998! - API pages show the sidebar filter. Withsidebar: "on-demand"it also finds pages the sidebar hasn’t loaded. -
#214
825ffcfThanks @MohamedH1998! - API reference pages show the version picker for versioned APIs, in the sidebar and the mobile navigation. -
#240
381b37aThanks @MohamedH1998! - -og:image:widthandog:image:heightdescribe the image: generated cards stay 1200 × 630, asocialImagefile inpublic/is measured at build time, and any other image gets no size tags.NimbusHeadtakessocialImageSizeto set them for an image Nimbus can’t measure.- The sitemap has
<lastmod>on every documentation page, from frontmatterlastUpdatedor the page’s last commit, and/sitemap.xmlis a copy ofsitemap-index.xmlunless the site serves its own. - The starter’s
BaseLayoutpassessocialImageSizethrough toNimbusHead, and the 404 page recipe writes the new title andnoindex. - On a shallow clone, pages get no git dates instead of the wrong one, and the build says how to fetch the history.
- The 404 page’s title is
Page not found | <site>and the page isnoindex.
- The sitemap has
-
#233
1f2ce43Thanks @MohamedH1998! - - New sites open content images at full size on click. On an existing site, runnimbus-docs add image-zoomand render<ImageZoom />insrc/layouts/DocsLayout.astro. -
#224
79b05efThanks @MohamedH1998! - - Newmarkdown.featuresoption turns on Sätteri syntax, such as{ headingAttributes: true }for## Install {#install}or{ math: true }. Pages, generated Markdown, reusable snippets and lint all follow it. New sites start with heading ids on.- Generated Markdown drops
{/* comments */}. - Invalid MDX reports the file, line and fix instead of an internal error.
- Generated Markdown drops
-
#236
fb759c5Thanks @MohamedH1998! - - With the section route atsrc/pages/[...section]/llms.txt.ts, each sub-folder gets its ownllms.txt, and its parent’s index links to it under “Sections”. New sites have this route; a[section]route keeps today’s one index per top-level section.- An
llms-full.txtover 25 MiB becomes an index of onellms-full.txtper section, split further where a section is still too big, so the site deploys to Cloudflare. LlmsEndpointReference(from@cloudflare/nimbus-docs/agent-endpoints) addssurface: "full"on section references, for the per-sectionllms-full.txtfiles.
- An
-
#216
647471aThanks @sansynx! - Keep version-switcher entries exposed as navigation links, with the current page identified byaria-current, instead of listbox options -
#230
25d21cfThanks @MohamedH1998! - - Server scaffolds for Node, Vercel, and Netlify render docs pages on request, so Markdown negotiation works on them.- Scaffold into
.or an empty folder, including a freshly cloned repository. - New repositories get a first commit; scaffolding inside an existing repository no longer creates a nested one.
npm createinstalls a handful of packages instead of the whole framework.- A missing package manager fails before anything is written, and a mistyped flag suggests the right one.
- Yarn sites ignore
.yarn/the way Yarn recommends, and pin Yarn inside a folder that pins another package manager. - The starter’s
AGENT.mdexplains sidebar groups, order, and links. nimbus-docs checkand--helpshow commands for your package manager.
- Scaffold into
-
#224
79b05efThanks @MohamedH1998! - Starter fixes:- The theme toggle no longer submits a surrounding form, reports its state to screen readers, and still switches when storage is blocked.
- Closing a dialog no longer releases another overlay’s scroll lock.
- “Copy page” works in Safari, and a failed command copy shows it failed.
- In search, Enter on the close button closes the dialog, and status messages are announced.
<Render>params can’t replace registered components; small fixes to breadcrumbs and the mobile table of contents.- Banner content is rendered as written, like the rest of the site’s content.
-
#223
c39fdfcThanks @MohamedH1998! - The docs version picker no longer appears on pages outside the docs versions, such as API reference and blog pages.
nimbus-docs 0.17.0
Minor Changes
-
#204
a8e0d02Thanks @MohamedH1998! - - Agent files follow the rendering policy: a page’sindex.md/index.mdxrenders in its collection’s mode, a section’sllms.txtin the mode of the collection it lists,llms.txt/llms-full.txtinrendering.default, and homepage Markdown in the root collection’s mode. Mounted collections get their own agent routes, copied starter routes keep working unchanged, and static sites don’t change. -
#201
855091cThanks @MohamedH1998! - Addsamples.generateto choose which languages Nimbus generates code samples in, and fix generated samples and examples that sent different values from the page.samples.generate: setsamples: { generate: ["curl"] }on anapientry to generate only a cURL request, instead of cURL, TypeScript, and Python, on every operation.[]generates none, so operations show only their authoredx-codeSamples. The default is unchanged: all three.samples.keepGeneratedstill picks the generated languages shown next to authored samples; each of its languages must now also be ingenerate.- Python and TypeScript bodies: in Python, a string containing a newline, carriage return, or tab no longer breaks the sample with a
SyntaxError, and object keys with quotes or backslashes stay valid. In both languages, a backslash is no longer read as an escape (C:\\temp\\newwas sent with a tab and a newline), including in text bodies such astext/plain. A JSON body offalse,0, or""is now sent instead of dropped. - cURL bodies: a body containing
'was passed through an unquoted heredoc, so the shell collapsed backslashes and ran$NAMEand backticks in the example when the sample was pasted. The heredoc is now quoted. - Form bodies:
application/x-www-form-urlencodedbodies were dropped from every sample and are now sent in all three languages. A property with anencodingentry follows OpenAPI:style,explode, orallowReservedselect query-style serialization, and an entry without them sends the value as itscontentType, so an object is sent as JSON. A property without an entry nests objects in brackets (metadata[plan]=pro), repeats the name for each item of a scalar array (tags=a&tags=b), and indexes arrays of objects (items[0][price]=p_1). A string example is read as an encoded form; a form example with no fields sends no body.multipart/form-databodies are still omitted. - Form encoding: explicit JSON content types serialize scalar values as JSON before form encoding.
allowReserved: truepreserves valid percent-encoded triples and safe reserved characters without double encoding; form delimiters and unsafe characters remain encoded. - cURL text bodies: a body starting with
@is sent as text instead of uploading the file it names. - Joined form values: a
,,|, or space inside an array item no longer reads as a separator withexplode: false, unlessallowReserved: trueleaves a,unencoded. - Empty form field names: cURL now sends
=valuelike the other languages. - Request example: an operation without code samples, such as with
samples.generate: [], shows its request example on the page. - Swagger 2.0: a Swagger 2.0 document now fails the build with
Swagger 2.0 isn't supported. Convert it to OpenAPI 3.x first.and the document’s path, instead of building pages with no server URL,unknownparameter types, and missing response schemas. The API reference docs show how to convert one before each build.
If the installed httpsnippet writes a body differently from the layout Nimbus corrects, that language’s sample is left out rather than shown with an unescaped body. Authored
x-codeSamplesare unchanged. New sites scaffolded bycreate-nimbus-docsuse this release. -
#207
d77ff08Thanks @MohamedH1998! - - A request-rendered API family can setversionMode: "query": one URL per operation, the version in?api-version=(absent means the default, unknown is 404, hidden versions reachable by query only). Generated same-version links carry the query; discovery covers the default version at version-free URLs; non-default pages arenoindexwith the default counterpart as canonical. Path mode stays the default and is unchanged.- API version ids may contain dots, and must start and end with a letter or digit. An id like
-v1orv1-now fails validation; rename it.
- API version ids may contain dots, and must start and end with a letter or digit. An id like
-
#198
86b573aThanks @MohamedH1998! - - Skills inskills/<name>/SKILL.mdfolders are published at/.well-known/agent-skills/with a discovery index, archives for multi-file skills, and digests. -
#199
b8a8dbdThanks @MohamedH1998! - - Sites with API collections publish every spec, including hidden versions, as one self-containedopenapi.jsonat its mount path, and list each visible API in an RFC 9727 catalog at/.well-known/api-catalog. SetpublishSpec: falseto keep a spec private. -
#195
b685092Thanks @MohamedH1998! - - Add discovery files, homepage Markdown, and Link headers to all sites.- Add editable Content Signals to the starter’s robots.txt.
-
#205
7b76521Thanks @MohamedH1998! - - Sidebar groups are nativedetails/summarywith one class per row type, a CSS caret, and no animation; a group’s landing page lists as an “Overview” child row. Each page renders one sidebar tree, shared by the desktop rail and the mobile drawer, and a large sidebar’s page HTML drops by roughly 80%. The state scripts drive the old copied markup too. -
#203
62d7956Thanks @MohamedH1998! - - Only collections made with Nimbus’s helpers (docsCollection(),componentsCollection(),withNimbusMarkdown()) become pages; every other collection is plain Astro data with no naming rule, and the_prefix convention is removed. Ifrenderingis set, a site’s own page collection with a catch-all route now needs an entry inrendering.collections. -
#196
2e200ceThanks @MohamedH1998! - - The starter registers asearch_documentationWebMCP tool, backed by the site’s Pagefind index. -
#200
c17a945Thanks @MohamedH1998! - - On server output, a request-rendered page returns its Markdown when the request preferstext/markdown; the URL stays canonical and both forms sendVary: Accept.- The starter homepage renders on request when a collection already does under server output, so it negotiates too. All-build homepages remain prerendered in production.
- Preserve owner static-header rules while adding discovery fields, and support prose request rendering and published Markdown negotiation through Astro adapters and standard HTTP on non-Cloudflare deployments.
- Recreate the isolated browser-agent Pagefind instance after observable search failures and give accurate connection/reload guidance. Pagefind’s swallowed index-chunk failures remain a documented upstream limitation.
- Include a release-matched agent-interface guide in the framework package and point generated project instructions to it.
Patch Changes
-
#201
7b8c3e8Thanks @MohamedH1998! - For methods that support request bodies, preserve JSONnullin generated TypeScript and Python samples. They now send the same four-byte JSON payload as cURL instead of omitting it. Absent request bodies remain absent, and schema-derived examples and authored code samples keep their existing behavior. -
#193
bcc1b1eThanks @sansynx! - Keep synced tabs usable when browser storage writes fail because the storage quota is full. -
#206
bcfe446Thanks @MohamedH1998! - - The version picker keeps a reader on the same operation when itsoperationIdchanged between versions but its HTTP method and path shape did not (including a renamed path parameter). The pairing is order-independent and never guesses: anything ambiguous stays unmatched and goes to the version landing, as before.
create-nimbus-docs 0.7.11
Patch Changes
-
#204
a8e0d02Thanks @MohamedH1998! - - Agent files follow the rendering policy: a page’sindex.md/index.mdxrenders in its collection’s mode, a section’sllms.txtin the mode of the collection it lists,llms.txt/llms-full.txtinrendering.default, and homepage Markdown in the root collection’s mode. Mounted collections get their own agent routes, copied starter routes keep working unchanged, and static sites don’t change. -
#201
855091cThanks @MohamedH1998! - Addsamples.generateto choose which languages Nimbus generates code samples in, and fix generated samples and examples that sent different values from the page.samples.generate: setsamples: { generate: ["curl"] }on anapientry to generate only a cURL request, instead of cURL, TypeScript, and Python, on every operation.[]generates none, so operations show only their authoredx-codeSamples. The default is unchanged: all three.samples.keepGeneratedstill picks the generated languages shown next to authored samples; each of its languages must now also be ingenerate.- Python and TypeScript bodies: in Python, a string containing a newline, carriage return, or tab no longer breaks the sample with a
SyntaxError, and object keys with quotes or backslashes stay valid. In both languages, a backslash is no longer read as an escape (C:\\temp\\newwas sent with a tab and a newline), including in text bodies such astext/plain. A JSON body offalse,0, or""is now sent instead of dropped. - cURL bodies: a body containing
'was passed through an unquoted heredoc, so the shell collapsed backslashes and ran$NAMEand backticks in the example when the sample was pasted. The heredoc is now quoted. - Form bodies:
application/x-www-form-urlencodedbodies were dropped from every sample and are now sent in all three languages. A property with anencodingentry follows OpenAPI:style,explode, orallowReservedselect query-style serialization, and an entry without them sends the value as itscontentType, so an object is sent as JSON. A property without an entry nests objects in brackets (metadata[plan]=pro), repeats the name for each item of a scalar array (tags=a&tags=b), and indexes arrays of objects (items[0][price]=p_1). A string example is read as an encoded form; a form example with no fields sends no body.multipart/form-databodies are still omitted. - Form encoding: explicit JSON content types serialize scalar values as JSON before form encoding.
allowReserved: truepreserves valid percent-encoded triples and safe reserved characters without double encoding; form delimiters and unsafe characters remain encoded. - cURL text bodies: a body starting with
@is sent as text instead of uploading the file it names. - Joined form values: a
,,|, or space inside an array item no longer reads as a separator withexplode: false, unlessallowReserved: trueleaves a,unencoded. - Empty form field names: cURL now sends
=valuelike the other languages. - Request example: an operation without code samples, such as with
samples.generate: [], shows its request example on the page. - Swagger 2.0: a Swagger 2.0 document now fails the build with
Swagger 2.0 isn't supported. Convert it to OpenAPI 3.x first.and the document’s path, instead of building pages with no server URL,unknownparameter types, and missing response schemas. The API reference docs show how to convert one before each build.
If the installed httpsnippet writes a body differently from the layout Nimbus corrects, that language’s sample is left out rather than shown with an unescaped body. Authored
x-codeSamplesare unchanged. New sites scaffolded bycreate-nimbus-docsuse this release. -
#207
d77ff08Thanks @MohamedH1998! - - A request-rendered API family can setversionMode: "query": one URL per operation, the version in?api-version=(absent means the default, unknown is 404, hidden versions reachable by query only). Generated same-version links carry the query; discovery covers the default version at version-free URLs; non-default pages arenoindexwith the default counterpart as canonical. Path mode stays the default and is unchanged.- API version ids may contain dots, and must start and end with a letter or digit. An id like
-v1orv1-now fails validation; rename it.
- API version ids may contain dots, and must start and end with a letter or digit. An id like
-
#195
b685092Thanks @MohamedH1998! - - Add discovery files, homepage Markdown, and Link headers to all sites.- Add editable Content Signals to the starter’s robots.txt.
-
#205
7b76521Thanks @MohamedH1998! - - Sidebar groups are nativedetails/summarywith one class per row type, a CSS caret, and no animation; a group’s landing page lists as an “Overview” child row. Each page renders one sidebar tree, shared by the desktop rail and the mobile drawer, and a large sidebar’s page HTML drops by roughly 80%. The state scripts drive the old copied markup too. -
#203
62d7956Thanks @MohamedH1998! - - Only collections made with Nimbus’s helpers (docsCollection(),componentsCollection(),withNimbusMarkdown()) become pages; every other collection is plain Astro data with no naming rule, and the_prefix convention is removed. Ifrenderingis set, a site’s own page collection with a catch-all route now needs an entry inrendering.collections. -
#196
2e200ceThanks @MohamedH1998! - - The starter registers asearch_documentationWebMCP tool, backed by the site’s Pagefind index. -
#200
c17a945Thanks @MohamedH1998! - - On server output, a request-rendered page returns its Markdown when the request preferstext/markdown; the URL stays canonical and both forms sendVary: Accept.- The starter homepage renders on request when a collection already does under server output, so it negotiates too. All-build homepages remain prerendered in production.
- Preserve owner static-header rules while adding discovery fields, and support prose request rendering and published Markdown negotiation through Astro adapters and standard HTTP on non-Cloudflare deployments.
- Recreate the isolated browser-agent Pagefind instance after observable search failures and give accurate connection/reload guidance. Pagefind’s swallowed index-chunk failures remain a documented upstream limitation.
- Include a release-matched agent-interface guide in the framework package and point generated project instructions to it.
-
Updated dependencies [
a8e0d02,855091c,d77ff08,86b573a,b8a8dbd,b685092,7b8c3e8,7b76521,62d7956,2e200ce,c17a945,bcc1b1e,bcfe446]:- @cloudflare/nimbus-docs@0.17.0
nimbus-docs 0.16.0
Minor Changes
-
#191
18b0005Thanks @MohamedH1998! - Generated API code samples show<name>, such as<account_id>, for a path parameter unless a value declared in its schema produces the generated value, instead of a guess such asstring,0, or a made-up UUID. This holds for any schema shape, includingallOf, unions, andif/then. Required query parameters and headers keep the generated value, guesses included; one with no schema, or whose generated value is an array or object, now shows<name>instead of its bare name. A parameter’s ownexampleorexamplesnow wins over its schema, as OpenAPI specifies. Credential placeholders now say what goes there:Bearer <token>,Basic <credentials>, and the API key’s name, such as<X-API-Key>. Placeholders render unencoded in every language, including names that URL encoding would change, such asfilter[name]. Declared values, including ones that look like a placeholder, and request bodies are unchanged.Every authored
x-codeSamplesentry is now kept, including several with the samelang; previously only the first entry per language was shown. Each sample has anid, unique within the operation: the language for the first sample in that language, thenpython-2,python-3. A repeated label, or a missing one that falls back tolang, is numbered for display (Python (2)) in the picker and the Markdown version. To give each of them its own picker option, update theapi-code-railregistry component withnimbus-docs add api-code-rail, choosing Overwrite for its two files; see the upgrade entryapi-code-sample-ids. Without the update, a language’s samples show one after another.Add
samples.keepGeneratedtoapientries, so an operation with authoredx-codeSamplescan still show generated samples. Kept samples follow the authored ones, and an authored sample in the same language replaces the generated one. The default,[], keeps today’s behavior.api: [{ collection: "api", spec: "./src/api/openapi.yaml", samples: { keepGenerated: ["curl"] } }], -
#190
9f54406Thanks @MohamedH1998! - Breaking: API references no longer publish a page for eachcomponents/schemasentry. To keep schema pages, addschemaPages: trueto theapientry; that restores today’s output exactly.With schema pages off (the new default), schemas still shape operation pages, including the properties previewed under each union variant, but get no page, Markdown version, OG image, sitemap, search, or
llms.txtentry, or citation coordinate. Union variants, discriminator mappings, andmap<Name>types render as text. A citation in your content to a schema or schema field fails the build and names the setting. Schema names still claim theirschemas/<Name>routes, so turning pages on can’t collide with an operation. On a 400-operation slice of a large public spec, this cut output files by 60% and build time by more than half.getApiPagePropsnow throws for a coordinate that has no page, such as a schema with schema pages off or anx-tagGroupscategory, instead of returning the API root’s URLs as if they were its own. -
#181
71ff242Thanks @MohamedH1998! - Addsidebartoapientries, so large API references stop putting the whole navigation tree in every page."full"(the default) keeps today’s behavior."on-demand"includes top-level items plus the current page’s branch. A collapsed group opens in place and loads its rows from its own page, where the sidebar lists them open; a group without a page, such as anx-tagGroupscategory, loads them from the API overview. Without JavaScript, a collapsed group’s label still links to its page. The mode is read from theapientry in the Nimbus config, including for sites that pass their entry toapiCollection({ … }).api: [{ collection: "api", spec: "./src/api/openapi.yaml", sidebar: "on-demand" }],ApiNavItemgains optionaldeferredandchildrenHreffields.@cloudflare/nimbus-docs/clientaddsinitNavSidebar(), and@cloudflare/nimbus-docs/runtimeaddsnavStateScript, an inline script, andnavBuildId, which a sidebar renders asdata-nb-nav-build. Together they keep a sidebar’s open groups, loaded rows, and scroll position from page to page for the session, restored before the page paints and without replaying animations. Cached rows are tied to the build that rendered the page, so rows cached before a deployment are never shown after it, including on client-side navigation.apiCollection({ … })warns when it sets asidebarthe config doesn’t match.A tag’s
x-displayNamenow sets its label in the sidebar, page title, and breadcrumbs, while itsnamestill decides its coordinate and route. This lets a spec group hundreds of flat tags under readable parents.Group pages now list their subsections (
ApiSectionPage.sections), in HTML and Markdown, so every page stays reachable without the sidebar. The API overview no longer links anx-tagGroupscategory to itself: it lists the category’s member sections instead. Both changes apply in every sidebar mode.Starter components:
ApiSidebarItemrenders a deferred group as a closed group with an empty panel, andApiLayoutmountsinitNavSidebarand the restore script for both the desktop rail and the mobile drawer. The API sidebar now keeps the groups a reader opened and its scroll position from page to page in every mode, and no longer fades or replays group animations during navigation. The mobile drawer moved ahead of the desktop rail inApiLayout, so one inline script restores both before the page paints.ApiBodylists a group page’s subsections.Existing sites keep working unchanged with the default
sidebar: "full"."on-demand"needs the new API components: with older ones, the build fails and names the outdated files. Update them withnimbus-docs add api-layout, choosing Overwrite forapi-layoutandapi-sidebar.nimbus-docs addnow warns when the registry serves components from a different release than the project’s@cloudflare/nimbus-docs. -
#194
a14c58fThanks @MohamedH1998! -nimbus/internal-linkfollows redirects:- Links through a working redirect pass. Nimbus reads the build’s
_redirectsand Astro’sredirects; the newredirectsFileintegration option adds a redirects file your deployment reads under another name. A redirect to a page that doesn’t exist is still a broken link. - Redirects match the way your platform matches them: Netlify’s rules with a
netlify.toml, Cloudflare’s otherwise. - New
nimbus/redirected-linkrule (off by default) reports links that go through a permanent redirect, with the URL to use instead. - Run
astro buildagain after upgrading:.nimbus/routes.jsonhas a new version.
- Links through a working redirect pass. Nimbus reads the build’s
Patch Changes
-
#185
11e6d85Thanks @MohamedH1998! - Static API pages color their code samples again._nimbus/shiki.cssnow defines every token class the pages use; it used to miss the classes only API samples used, so on a site with only API pages, every sample rendered without color. -
#187
278a3ffThanks @MohamedH1998! -nimbus/internal-linkcan now gate CI:.nimbus/routes.jsonlists every file the build produced, so links to/llms.txt, feeds,.mdalternates, andpublic/files no longer show as broken.- When the rule is on and
.nimbus/routes.jsonis missing, isn’t valid JSON, or was written by another version of Nimbus,nimbus-docs lintreports one error on that file and exits 1, instead of skipping the rule. Whenastro buildstarts, it deletes the previous build’s file, or marks it incomplete if it can’t be deleted, so lint never accepts it after a failed build. If the file can be neither deleted nor changed, the build fails until its permissions are fixed. Runastro buildbeforenimbus-docs lint.nimbus-docs checkis unchanged: a missing file is still a note there, not an error. nimbus-docs lintexits 1 when.nimbus/lint.jsonis missing, instead of reporting a clean run with every rule off. Runastro buildorastro devfirst; they write therulesfrom your Astro config there.--rule <code>still runs that one rule without it.- A bare relative link such as
[CLI](cli)now counts as a relative link, like./cli, instead of being looked up as/cli. - Some lint runs that passed before now fail. Links that include Astro’s
base(for example/docs/guideunderbase: "/docs") used to pass, but Nimbus adds the base again when the page renders, so they lead to/docs/docs/guide, a 404. Lint now reports them and suggests the link without the base. To fix them, remove the base from the link. Writeignorepatterns without the base too.
-
#183
e5fe9f3Thanks @MohamedH1998! - - Generated Markdown (.mdpages andllms-full.txt) is built from the parsed MDX, so it keeps the structure the HTML page shows: code blocks and nested lists stay in their list items, components stay inside the list item, card, or blockquote that holds them, and nested components keep their own content.- Components without a Markdown renderer no longer leave raw tags.
- Text MDX reads differently from Markdown, such as an indented line or an over-indented fence, is written so it reads the same.
importandexportlines no longer appear in generated Markdown.
-
#186
aff3e9fThanks @MohamedH1998! - - Amarkdown.componentMaprenderer’s output goes into generated Markdown as written again (apart from surrounding whitespace), unless it uses another component, which still converts. In a table cell or a sentence, output with a line break or|is converted so the cell or sentence stays whole.- A page whose MDX can’t be parsed for generated Markdown keeps its text there, with a warning, instead of failing the build.
-
#182
9d2051cThanks @MohamedH1998! - -outdatedanddiffalso compareAGENT.md,CLAUDE.md, andtsconfig.jsonwith the upstream starter, so upgraded sites get guidance fixes. Files every site rewrites, such aspackage.json, are never compared.diff <file> --applyrecords the tag it took the file from innimbus.json(templatesTagByFile), so the file no longer shows as a hand-merge after the next upstream change.- Each command rejects flags it doesn’t read. Before,
outdated --cwd siteignored--cwdand checked the current directory. Scripts that pass an ignored flag now exit 1. checkandadd adapter-cloudflareuse@astrojs/cloudflare@~14.3.0. pnpm saved the old>=14.3.0 <14.4.0as^14.3.x, which allows 14.4.addandinitprint plain lines without a terminal, instead of spinner escapes.- A duplicate page or unknown MDX component fails the build without a stack trace.
create-nimbus-docs 0.7.10
Patch Changes
-
#191
11ebb39Thanks @MohamedH1998! - Theapi-code-railcomponent keys its sample picker by sampleid, so several samples in one language each get their own option. It remembers the reader’s language, not the exact sample: a saved language opens that language’s first sample, and the choice syncs across open tabs.?lang=accepts a sample id or a language. With packages before 0.16.0, which give samples noid, the picker keys by language as before.api-code-railis distributed through the registry, not the scaffolded template. Existing sites update it withnimbus-docs add api-code-rail, choosing Overwrite forApiCodeRail.astroandcode-rail.client.ts. -
#189
5c96da8Thanks @MohamedH1998! - Refinements to the starter’s API reference components:- Status and method colours are retuned. Method chips use a tint and a 25% line from the same palette (
--nb-m-*-tint,--nb-m-*-line). - Field rows fold like code. A collapsed row ends in
{ 4 properties }; an open row shows{on its signature and}under its children, centred on the guide line. “required” sits before the brace and never wraps away from it. - Union fields drop the variant list from their type text, since the list below names each variant. The full names show as a tooltip on the field name.
- Constraints and default share one line. Field rows no longer show examples, because the code rail’s request and response examples already include them. Long values wrap instead of widening the page.
- The code rail’s response toggle is a compact segmented control, and the header and response rows share 8px insets.
LayerCardtakesorientation="horizontal", whichApiEndpointCarduses.Badgegains anoutlinevariant.- Medium weight replaces semibold, letter-spacing is removed, and hover states no longer animate colour.
- Status and method colours are retuned. Method chips use a tint and a 25% line from the same palette (
-
#181
71ff242Thanks @MohamedH1998! - Addsidebartoapientries, so large API references stop putting the whole navigation tree in every page."full"(the default) keeps today’s behavior."on-demand"includes top-level items plus the current page’s branch. A collapsed group opens in place and loads its rows from its own page, where the sidebar lists them open; a group without a page, such as anx-tagGroupscategory, loads them from the API overview. Without JavaScript, a collapsed group’s label still links to its page. The mode is read from theapientry in the Nimbus config, including for sites that pass their entry toapiCollection({ … }).api: [{ collection: "api", spec: "./src/api/openapi.yaml", sidebar: "on-demand" }],ApiNavItemgains optionaldeferredandchildrenHreffields.@cloudflare/nimbus-docs/clientaddsinitNavSidebar(), and@cloudflare/nimbus-docs/runtimeaddsnavStateScript, an inline script, andnavBuildId, which a sidebar renders asdata-nb-nav-build. Together they keep a sidebar’s open groups, loaded rows, and scroll position from page to page for the session, restored before the page paints and without replaying animations. Cached rows are tied to the build that rendered the page, so rows cached before a deployment are never shown after it, including on client-side navigation.apiCollection({ … })warns when it sets asidebarthe config doesn’t match.A tag’s
x-displayNamenow sets its label in the sidebar, page title, and breadcrumbs, while itsnamestill decides its coordinate and route. This lets a spec group hundreds of flat tags under readable parents.Group pages now list their subsections (
ApiSectionPage.sections), in HTML and Markdown, so every page stays reachable without the sidebar. The API overview no longer links anx-tagGroupscategory to itself: it lists the category’s member sections instead. Both changes apply in every sidebar mode.Starter components:
ApiSidebarItemrenders a deferred group as a closed group with an empty panel, andApiLayoutmountsinitNavSidebarand the restore script for both the desktop rail and the mobile drawer. The API sidebar now keeps the groups a reader opened and its scroll position from page to page in every mode, and no longer fades or replays group animations during navigation. The mobile drawer moved ahead of the desktop rail inApiLayout, so one inline script restores both before the page paints.ApiBodylists a group page’s subsections.Existing sites keep working unchanged with the default
sidebar: "full"."on-demand"needs the new API components: with older ones, the build fails and names the outdated files. Update them withnimbus-docs add api-layout, choosing Overwrite forapi-layoutandapi-sidebar.nimbus-docs addnow warns when the registry serves components from a different release than the project’s@cloudflare/nimbus-docs. -
#182
9d2051cThanks @MohamedH1998! - - Cloudflare server scaffolds depend on@astrojs/cloudflare@~14.3.0, matchingcheck. -
Updated dependencies [
11e6d85,18b0005,9f54406,71ff242,a14c58f,278a3ff,e5fe9f3,aff3e9f,9d2051c]:- @cloudflare/nimbus-docs@0.16.0