2026
nimbus-docs 0.15.2
Patch Changes
- #179
8ded65bThanks @MohamedH1998! - -migraterefuses to record a reviewed version when the project’s@cloudflare/nimbus-docsisn’t installed, and says to install dependencies. Before,npx @cloudflare/nimbus-docs migrate --yesin a fresh clone recorded the latest release while the lockfile installed an older one, and the build then failed with advice that failed too.- When
nimbus.jsonrecords a version newer than the installed one, the build error says to install dependencies or upgrade, with the command, instead of suggestingmigrate. migrate --dry-run --diffwith nothing pending prints the same result and next step asmigrate --dry-run, instead of nothing.- Before the first install,
checkreports one “Dependencies aren’t installed” error with the install command, instead of offering to install pagefind and wrangler one at a time or reporting a TypeScript error. The command follows the site’spackageManager, lockfile, orpnpm-workspace.yaml/.yarnrc.yml, not the tool that ran the CLI, so a pnpm site checked withnpxis toldpnpm install. - After
check --fixwithout a terminal, the footer namescheck --fix --yesfor skipped installs, and says a value such assiteneeds editing by hand or an interactive terminal. Before, it only said to reruncheck --fix“in a terminal”, even for installs. check --helpgives the same stop rule as the starter’sAGENT.md.- The
nimbus/request-rendering-build-requirednote no longer claims a build resolves it.checkdoesn’t verify request-rendered pages; a passing production build is the gate. - Under
trailingSlash: "always"withbuild.format: "file", canonical andog:urlURLs keep the trailing slash, so they match page links and the sitemap. <PackageManagers type="exec">runs the project’s installed CLI with every package manager:pnpm nimbus-docsandyarn nimbus-docsfor a scoped package, instead ofpnpm @cloudflare/nimbus-docs.- The starter fixes search on sites whose
basehas no trailing slash, such asbase: "/docs". Existing sites: runnpx @cloudflare/nimbus-docs outdated, thendiff src/components/ui/search/providers/pagefind.ts --apply.
- When
create-nimbus-docs 0.7.9
Patch Changes
- #179
8ded65bThanks @MohamedH1998! - - Yarn 2+ scaffolds install. A site scaffolded withyarn dlxoryarn createpins that Yarn inpackage.jsonpackageManager, and the install runs withoutyarn dlx’s Plug’n’Play hooks. Before, corepack ran Yarn 1, the install failed withCannot find module 'pnpapi', and the suggestedyarn installmade a Yarn 1 project.--package-manager yarnpins Yarn too, whenyarnin the new directory runs Yarn 2+.- A Yarn site created inside another Yarn project that doesn’t list it as a workspace gets its own empty
yarn.lockand installs, instead of failing with “doesn’t seem to be part of the project”. A workspace member still installs as a member. - When Yarn holds back a release published in the last day (
YN0016, itsnpmMinimalAgeGatesetting), the install failure says so. - Yarn sites ignore
.yarn/install-state.gz. - Search works on sites whose Astro
basehas no trailing slash, such asbase: "/docs". Before, the dialog loaded/pagefind/pagefind.jsinstead of/docs/pagefind/pagefind.jsand said “Search is available after a production build.” Existing sites can take the fix withnpx @cloudflare/nimbus-docs diff src/components/ui/search/providers/pagefind.ts --apply. - The empty starter’s home page no longer adds a second H1 under its title.
- The starter’s
AGENT.md:- Its upgrade steps now pull in starter fixes with
outdatedanddiff --apply. - Feature recipes run with
add <feature-slug> --print. - The Cloudflare audit is split into static and server output (server sites have no
assets.directory). - It says a server site’s
checkstayspartialafter a build, and what to do about an error with no fix.
- Its upgrade steps now pull in starter fixes with
- The welcome page names
@cloudflare/nimbus-docs/content.
- A Yarn site created inside another Yarn project that doesn’t list it as a workspace gets its own empty
- Updated dependencies [
8ded65b]:- @cloudflare/nimbus-docs@0.15.2
nimbus-docs 0.15.1
Patch Changes
-
#177
adb8efeThanks @MohamedH1998! - Add thecopy-promptregistry component. Runnimbus-docs add copy-promptto installCopyPrompt, a one-line prompt with a Copy prompt button for readers to paste into an AI coding agent. New sites don’t include it by default. -
#171
41376ddThanks @MohamedH1998! - Fix upgrade checks and CLI guidance.Behavior changes
nimbus-docs checkwarns about the placeholdersiteinstead of exiting1, matching the build. A CI job that relied oncheckfailing for an unsetsiteneeds its own check.migrate --dry-runandmigrate --jsonreportpassedand exit0when no migrations or required reviews remain and a baseline is recorded, including when no entries fall between the recorded and installed versions.
Upgrades
- Sites upgrading from before 0.13.0 with a custom loader on a collection Nimbus indexes now see the 0.13.0
withNimbusMarkdown()requirement inmigrateandoutdated. outdated --jsonaddssummary.requiredPackageApis, the required subset ofsummary.packageApis, and awarningsarray. It warns when the compared starter needs a newer package than the project has, which also blocksdiff --apply.outdatedandmigrateuse the same terms: migrations and upgrade reviews.migrateprints each outcome once, and declining its record prompt says how to record the baseline later.
CLI
- Upgrade and migrate hints, and the build errors that point at
migrateorinit, print a runnable command instead of a raw Node path or a barenimbus-docs. pnpm and Yarn projects that declare the package get the local bin, such aspnpm nimbus-docs migrate. With--cwd, the command runs from the current directory and pins the project’s Nimbus version, such asnpx @cloudflare/nimbus-docs@0.15.1 migrate --cwd 'site' --yes. - After
check --fixwithout a terminal, the hint says what the remaining fixes need: a terminal for prompts, or--yesfor installs. checklists what it skipped when theapiconfig or the rendering policy isn’t a plain literal, or whensrc/content.config.tsis missing.lint --helplists the lint rules and the--colorand--no-colorflags.addsuggests registering only the component you asked for insrc/components.ts, not its dependencies.
Cloudflare
add adapter-cloudflareinstalls@astrojs/cloudflare14.3, which fixes a crash on the firstastro devwith a cold cache (“Dev server process exited before becoming ready”). Existing sites can upgrade withpnpm add @astrojs/cloudflare@~14.3.0.add adapter-cloudflarenames the policy it adds:rendering: { default: "request" }, which renders every collection on request. To render only API pages on request, set that policy before running the installer, which keeps an existing policy.
-
#178
fd53431Thanks @MohamedH1998! - Behavior changes- The duplicate-route check uses a page’s frontmatter
slug, soa.mdxwithslug: bnext tob.mdxnow fails the build, as other duplicate routes do. Before, the collision went unreported and Astro served one of the two pages. withBase("/", base)returns the base without a trailing slash, such as/docs, when page URLs have none: undertrailingSlash: "never", orbuild.format: "file"with"ignore". Code that appends to the result or compares it with/docs/needs updating.
checkandinitcheckwarns when an installed Astro adapter is outside the range Nimbus supports, such as@astrojs/cloudflare14.1, with the command that installs a supported version. It doesn’t change the version itself.- On a PR preview,
checksays which release to pass tomigrate --fromonce you install a release, instead of repeating “run a build, then check again”. init --forcerebuilds only the component and install records. It keeps the rest of a validnimbus.json: the reviewed baseline, the starter version and variant, a preview’s record, and the server-output opt-in. Before, it reset them, which brought back the “no reviewed upgrade baseline” build failure.
build.format: "file"andbase- With
build.format: "file", canonical URLs andog:urlno longer end in.html, pages get previous and next links, the sidebar marks the current page, and breadcrumbs show page titles instead of “Welcome.Html”. - With a
baseand no trailing slashes, the home link, “Home” breadcrumb, and 404 page link to/docs, matching the home page’s canonical URL, instead of/docs/.
Routes and Markdown
- In per-page
.mdfiles andllms-full.txt, a code block in a nested list item stays in the item, so the text after it no longer turns into code, and a code block in a numbered item no longer splits the list. - The version switcher and missing-page redirects find pages in folders with dots, such as
1.2.3/, without aslug, and section index pages such asguides/index.mdx. ApreviousSlugwritten as a file path, such asguides/index, names the section’s page.
- The duplicate-route check uses a page’s frontmatter
-
#172
6637381Thanks @MohamedH1998! - Make generated links, the sitemap, and Markdown output follow the site config.Behavior changes
- Under the default
trailingSlash: "ignore",api.refcitation links now end in/, like sidebar links and the canonical URL, in pages, per-page.mdfiles, andllms-full.txt. - With
trailingSlash: "ignore"andbuild.format: "file"or"preserve", generated links no longer end in/, so they reach the pages Astro builds.
Links, sitemap, and routes
- Sidebar, navigation, breadcrumb, pagination, and citation links, and the API reference’s sidebar, breadcrumbs, and type links, follow Astro’s
trailingSlashandbuild.format. Under"never"they drop the slash, and API links no longer 404 under"always"or"never". With the defaultbuild.format, they match the canonical URL. noindex: truepages are left out of the sitemap on sites withoutbase, as they already were withbase.- The docs schema accepts Astro’s
slugfrontmatter field, so a page in a1.2.3/folder can keep its dots:slug: 1.2.3/setupserves it at/1.2.3/setup/. The version switcher and missing-page redirects use theslugtoo. - API pages no longer return 500 (“missing prepared page data”) in
astro devafter the Astro config switches to server output while the dev server is running, for example afteradd adapter-cloudflare.
Generated Markdown
- Per-page
.mdfiles andllms-full.txtkeep the indentation of code blocks in MDX pages, so YAML and Python keep their meaning. Code inside<Aside>gets the>prefix on every line. - A citation inside a longer fence, such as a ```` fence that shows a
example, stays literal, as does one in a fence opened on a list-item line (`-yaml`). That fence also stays inside its list item in the Markdown output. <PackageManagers>Markdown includes the package for everytypeand matches the HTML commands.type="dlx" pkg="@cloudflare/nimbus-docs" args="list"now rendersnpx @cloudflare/nimbus-docs listinstead ofnpx list.
- Under the default
-
#170
ae346f0Thanks @MohamedH1998! - Prerelease versions, such as the PR previews published to pkg.pr.new, select the upgrade entries of the release they preview. Two prereleases of the same release no longer count as newer than each other, so recording one and installing another doesn’t fail the build.
create-nimbus-docs 0.7.8
Patch Changes
-
#176
3b3d33fThanks @MohamedH1998! - New Cloudflare server sites install@astrojs/cloudflare14.3, which fixes a crash on the firstastro devwith a cold cache (“Dev server process exited before becoming ready”). -
#177
adb8efeThanks @MohamedH1998! - Add thecopy-promptregistry component. Runnimbus-docs add copy-promptto installCopyPrompt, a one-line prompt with a Copy prompt button for readers to paste into an AI coding agent. New sites don’t include it by default. -
#173
60d0af3Thanks @MohamedH1998! - - Templates used without the scaffolder includenimbus.jsonwith the reviewed Nimbus version, so their builds no longer fail with “Nimbus has no reviewed upgrade baseline”.- npm, yarn, and bun sites no longer include
pnpm-workspace.yaml. - Yarn sites get a
.yarnrc.ymlwithnodeLinker: node-modules. Before, Yarn 2+ installed in Plug’n’Play mode, and the site failed to build or start the dev server. - Unknown
--contentand--package-managervalues are rejected with the valid choices. Before, a typo such as--package-manager pnmpscaffolded a site with no install and still printed “Done”. - Without a terminal, the scaffolder lists every question it can’t ask, each with the flag that answers it, and suggests
--yes, instead of failing withuv_tty_init returned EINVAL. Flags that answer every question, including--gitor--no-git, work without--yes. - The starter’s
AGENT.mdpoints at theIconcomponent the starter uses,@cloudflare/nimbus-docs/components/Icon.astro, instead ofastro-icon, and at@cloudflare/nimbus-docs/contentfor the docs schema. Its commands usenpx @cloudflare/nimbus-docs, which runs the project’s installed version with any package manager. - The starter’s Getting Started page shows the create command.
- npm, yarn, and bun sites no longer include
-
#178
7d606e3Thanks @MohamedH1998! - Behavior changes- A failed dependency install exits
1. The scaffolder keeps the project and prints the commands that finish the setup. Before, it printed “Done” and exited0, so CI treated the site as ready. - Unknown flags, such as
--output server, stop the scaffolder with the list of valid flags. Before, they were ignored and the site was scaffolded without them. --gitwith--no-git, and--deploywith--adapter, stop the scaffolder. Before,--no-gitwon and--deploywas ignored with a warning.- A second directory argument stops the scaffolder. A leading
--, as pnpm passes it through, is accepted, sopnpm dlx … -- my-docs --yesno longer ignores--yes.
First run
yarn dlxwith Yarn 2+ can scaffold from a PR preview. Yarn now extracts the package instead of keeping it in a zip, where the preview’s bundled templates couldn’t be read.- Pressing Enter at the directory prompt uses
my-docs, as shown. Before, it failed with “Directory is required”. - bun’s install output no longer shows in the scaffolder’s output, and “Next steps” no longer has an empty line where the install command would be. An install’s own output shows only when it fails.
- The empty starter ships one home page,
src/content/docs/index.mdx, so its firstnimbus-docs checkno longer warns about a duplicate route at/. Before, a landing page shadowed it and linked to pages the empty starter doesn’t have. - The starter’s home page links to its pages through their entries, so the links follow
trailingSlashand a card whose page you delete disappears instead of linking to a 404. - The starter’s
AGENT.mdsays to setsitebefore runningcheckin a loop, and ends the loop when only fixes that need input remain, so an agent no longer loops on the placeholdersite. It also says components can be imported in the.mdxfile that uses them instead of registered.
- A failed dependency install exits
-
Updated dependencies [
adb8efe,41376dd,fd53431,6637381,ae346f0]:- @cloudflare/nimbus-docs@0.15.1
nimbus-docs 0.15.0
Minor Changes
-
#162
982a47dThanks @MohamedH1998! - Register API collections from the Nimbus config.apiCollection()now takes no arguments and reads theapientry whosecollectionmatches its key insrc/content.config.ts, so each spec is declared once, in the inline Nimbus config inastro.config.ts:// astro.config.ts const nimbusConfig = defineNimbusConfig({ site: "https://example.com", title: "Example", api: [{ collection: "api", spec: "./src/api/openapi.yaml" }], }); // src/content.config.ts export const collections = { docs: defineCollection(docsCollection()), api: defineCollection(apiCollection()), };The
api-referencerecipe now uses this shape and no longer createsnimbus.config.ts, sonimbus-docs checkvalidates the whole config statically andadd adapter-cloudflareeditsrenderingin place.A collection key with no
apientry fails content sync, and anapientry without anapiCollection()under its key fails the build, including a key registered with another loader. Both messages name the Nimbus config andsrc/content.config.ts, andnimbus-docs checkreports the same mismatches without building.apiCollection(options)and@cloudflare/nimbus-docs/configare unchanged, and sites built by earlier versions of the recipe keep building with no changes. Upgrade note: inastro dev, that shape silently ignores edits to theapientry innimbus.config.tsuntil a manual restart. To pick up edits automatically, move the Nimbus config back intoastro.config.ts, delete the lookup insrc/content.config.ts, and register the collection withapiCollection().nimbus-docs upgradelists these steps.Also fixes
astro devafter anastro.config.*edit, for every site: collections are re-synced when Astro restarts the dev server, so docs pages keep their partial headings and Markdown routes andllms.txtkeep working, instead of losing prepared data until a manual restart. Spec edits keep re-indexing API pages after that restart. -
#165
05efc7aThanks @MohamedH1998! - Keep more of the OpenAPI document in API reference pages and their Markdown versions:- Request body
requiredanddescription.ApiOperationPagegainsbodyRequired,bodyDescription, andbodyDescriptionHtml, read from the operation’s Request Body Object. Each is present only when the spec states it. - Every response media type. The primary media type is chosen exactly as before and is now exposed as
ApiResponseView.mediaType. Each other media type is listed inApiResponseView.additionalMedia(ApiResponseMediaView:mediaType,anchor,fields, and optionaltruncated,union, andexample), with fields citable at<operation>.response.<status>.<media-token>.<field>. The build no longer warns that it renders only the first media type. A media type whose coordinate token would clash, with a sibling media type (such asapplication/vnd.a+jsonbesideapplication/vnd.a-json) or with a field of the primary body (a property namedtext-csvbesidetext/csv), no longer fails the build, for responses or request bodies: it gets a short hash suffix instead. Media types that don’t clash keep their existing coordinates. - Readable union branch labels. A
oneOf/anyOfbranch without a$refis labeled by itstitle, then by the type of its foldedallOf, then by the type of itsenum/constvalues, thenobjectwhen it has properties, and otherwiseOption N. Branches are never labeledunknown. Field types are unchanged.
The generated Markdown shows the body’s required flag and description, one labeled body per response media type, and the new branch labels. All changes are additive, and
apiSchemaVersionstays1. Pages whose spec uses none of these constructs render the same HTML and Markdown as before. - Request body
-
#164
b8f4d05Thanks @MohamedH1998! - Return each page’s URLs from the page helpers, build OG cards from one path function, and reduce thellms.txtroutes to one factory call each.-
getDocsPage,getCollectionPage,getDocsPageProps, andgetCollectionPagePropsnow returnmarkdownUrl,sourceUrl, andogImageUrlalongsideentry,Content, andheadings.IndexedEntrygainsogImageUrl. All three are site-relative with no base path and come from the same function, so a page route no longer builds them by hand:const { entry, Content, headings, markdownUrl, ogImageUrl } = page; const socialImage = entry.data.socialImage ?? ogImageUrl; -
getOgImagePages()from@cloudflare/nimbus-docs/runtimereturns thepagesmap for astro-og-canvas’sOGImageRoute, one entry per indexed page, keyed so each card is written at the page’sogImageUrl.ogImageUrlis/og/<page>.png, derived from the page’s route, the same rule theapi-referencerecipe uses. This fixes broken OG cards: collection and version root pages, such as/blog/, linked to/og/blog/index.pngwhile the card was written at/og/blog.png, and IDs containing a dot, such asv1.2/guideor the webhookpayment.succeeded, had their card name cut at the last dot, so several pages shared one card. noindex pages linked to/og/<id>.png, but the old OG route skipped them and never wrote that card. Root pages, dotted IDs, and noindex pages now link to cards that exist. -
llmsRoute(),llmsFullRoute(), andllmsSectionRoute()from@cloudflare/nimbus-docs/agent-endpointsreturn the{ GET }behindsrc/pages/llms.txt.tsandllms-full.txt.ts, and the{ GET, getStaticPaths }behindsrc/pages/[section]/llms.txt.ts. EachGETreturns 404 for a missing or unknown index and, on request, a 500 without details when the index can’t be read, as the starter’s routes did:// src/pages/[section]/llms.txt.ts import { llmsSectionRoute } from "@cloudflare/nimbus-docs/agent-endpoints"; export const prerender = true; export const { GET, getStaticPaths } = llmsSectionRoute(); -
The build now warns about every baked Markdown page and every
llms.txtindex that no prerendered route generated, and names the route that serves it. This catches a shared Markdown route that re-exportsmarkdownRoute()from another module and is rendered on request. Sites that serve these pages on request on purpose can ignore the warning.
Hand-built URLs, existing OG routes, and existing
llms.txtroutes keep building with unchanged output. Thepage-urls-and-llms-routesupgrade entry lists the lines each route can drop. -
-
#161
b45ca22Thanks @MohamedH1998! - Serve the Markdown and source versions of every collection from two route files.markdownRoute()andmarkdownSourceRoute()from@cloudflare/nimbus-docs/agent-endpointsreturn{ GET, getStaticPaths }:// src/pages/[...slug]/index.md.ts import { markdownRoute } from "@cloudflare/nimbus-docs/agent-endpoints"; export const prerender = true; export const { GET, getStaticPaths } = markdownRoute();- One shared route serves every collection’s
/<page>/index.md, including docs versions and API reference pages.markdownSourceRoute()serves/<page>/index.mdxfor every authored page. Collections added later need no new route files. - A more specific route file, such as
src/pages/changelog/[...slug]/index.md.ts, takes over its collection. The shared route skips every URL that route matches, so Astro reports no route conflicts. If the more specific route doesn’t generate every page it matches, the build warns and names the missing paths, or fails whenprerenderConflictBehavioris"error". - The shared routes must be prerendered. The build fails if a route using
markdownRoute()ormarkdownSourceRoute()is rendered on request. - API pages now have baked Markdown assets, so
getMarkdownStaticPaths({ collection: "<api>" })returns their entries. Hidden API versions are excluded, like hidden docs versions.
Existing per-collection routes keep working and need no change. Sites that delete the
api-referencerecipe’ssrc/pages/<api>/[...slug]/index.md.tsno longer publish Markdown for hidden API versions. Theshared-markdown-routesupgrade entry explains how to remove unmodified per-collection routes. - One shared route serves every collection’s
Patch Changes
-
#164
c26b52bThanks @MohamedH1998! - Support dotted version slugs such asv1.2. Links to a dotted version root now keep their trailing slash (/v1.2/, not/v1.2) in the sidebar, breadcrumbs, version picker, alternate links, andIndexedEntry.url; before, the last segment was read as a file extension.src/content.config.tskeys such as"docs-v1.2"are now recognized, so Nimbus no longer warns that collections can’t be identified statically and keeps its collection checks on. -
#167
2223c45Thanks @MohamedH1998! - Keep builds running when an upgrade range contains only optional guidance, while surfacing those entries in the build log and upgrade commands. -
#166
9eef696Thanks @MohamedH1998! - When GitHub refuses the template lookup (or rejects the token) innimbus-docs outdatedordiff, the error now explains how to fix it: setGIGET_AUTHto a GitHub token, or skip the lookup with--toor--template-dir. It also says when GitHub’s rate limit resets, or quotes GitHub’s reason. The CLI help now mentionsGIGET_AUTH.
create-nimbus-docs 0.7.7
Patch Changes
-
#165
05efc7aThanks @MohamedH1998! - The API reference components show whether a request body is required, and its description, beside the request body heading. A response with several media types shows one body per media type, each labeled with its type and with its own example, in the same stacked layout as additional request bodies.ApiFieldListaccepts optionalrequiredanddescriptionHtmlprops for this. -
#164
b8f4d05Thanks @MohamedH1998! - The starter’s page route takesmarkdownUrlandogImageUrlfromgetDocsPage(), its OG route builds cards fromgetOgImagePages(), and its threellms.txtroutes callllmsRoute(),llmsFullRoute(), andllmsSectionRoute().src/utils/agent-endpoint-response.tsis removed. Built output is unchanged. -
#161
b45ca22Thanks @MohamedH1998! - The starter’ssrc/pages/[...slug]/index.md.tsandindex.mdx.tsroutes now usemarkdownRoute()andmarkdownSourceRoute(), so they serve the Markdown and source versions of every collection. Generated files are unchanged. -
Updated dependencies [
982a47d,c26b52b,05efc7a,2223c45,9eef696,b8f4d05,b45ca22]:- @cloudflare/nimbus-docs@0.15.0
nimbus-docs 0.14.2
Patch Changes
-
#160
08b963bThanks @MohamedH1998! - Proseapi.ref:citations now resolve correctly in HTML output:- They include the site’s base path. On a site with
base: "/docs",[change status](api.ref:api:changeWidgetStatus)now links to/docs/api/...instead of/api/..., matching the Markdown alternate andllms-full.txt. - Citations in
.mdpages now resolve. Previously they rendered as rawapi.ref:links; only.mdxpages were resolved. - Citations resolve when the project directory is reached through a symlink.
- They include the site’s base path. On a site with
-
#157
cde0751Thanks @MohamedH1998! - Render authored OpenAPI request examples as selectable examples in API reference pages and generated Markdown. -
#158
9f024b0Thanks @MohamedH1998! - Reduce static API reference build memory by storing lightweight collection entries and projecting complete pages during prerendering. Server output continues to use prepared entries so requests do not parse OpenAPI specifications. Keep build-only Markdown parsing out of generated server bundles.
create-nimbus-docs 0.7.6
Patch Changes
-
#157
cde0751Thanks @MohamedH1998! - Render authored OpenAPI request examples as selectable examples in API reference pages and generated Markdown. -
#154
f9aecd8Thanks @sansynx! - Keep footnote targets visible below the sticky header when following note and return links. -
Updated dependencies [
08b963b,cde0751,9f024b0]:- @cloudflare/nimbus-docs@0.14.2