2026
nimbus-docs 0.11.0
Minor Changes
-
#86
b4b0dc3Thanks @MohamedH1998! -makeDisclosurenow marks closed contentinertso collapsed regions leave the tab order, keeping keyboard focus out of hidden disclosure panels. Add amanageInertoption (defaulttrue) to opt out for consumers that manage their own focus. -
#90
74702e0Thanks @mvvmm! -getDocsStaticPathsandgetCollectionStaticPathsnow include acacheKey(derived from the entry’sdigest) on each returned path. This enables Astro’s experimental incremental build cache to skip re-rendering unchanged pages. No-op whenexperimental.incrementalBuildis not enabled inastro.config.ts.
Patch Changes
nimbus-docs 0.10.0
Minor Changes
-
#71
e5d74f9Thanks @MohamedH1998! - Enable MDX optimization by default to reduce large-site build memory usage. Sites can opt out withmdx: { optimize: false }.Verified the generated starter with optimization on and with
mdx: { optimize: false }forced; the rendered HTML is structurally equivalent for element names, attributes, and non-whitespace text. Render parity is semantic and structural rather than byte-identical: raw bytes differ due to serializer escaping and inter-block whitespace, but the rendered document is lossless.Spot-checked the starter
componentspage, which includes JSX tags in prose, inline code with<...>, quoted code, and package names. The optimized and opt-out renders preserve those special-character text probes and match structurally.Constrain the supported Astro peer range to
>=7.0.0 <7.1.0 || >=7.2.0 <8.0.0: the 7.1.x line is excluded while its static-build regression is open upstream, but 7.2.x is admitted (verified against a sub-path build). Generated templates and the dev pin stay on the verified 7.0.x line. -
#76
acfac20Thanks @mvvmm! - Replaceastro-iconwith a built-in icon system. This is a breaking change for any project usingastro-icondirectly.Why:
astro-iconstamped a generatedlastModifiedtimestamp into its virtual module on every build, invalidating thousands of cached pages in Astro’s incremental build cache. The package is unmaintained so an upstream fix isn’t coming.What’s new: Nimbus now provides
virtual:nimbus/icons(a Vite plugin) and@cloudflare/nimbus-docs/components/Icon.astro. The plugin auto-detects installed@iconify-json/*packages and loads local SVGs fromsrc/icons/. The component API is compatible withastro-icon(name,size,width,height,is:inline,title,desc, and all<svg>attributes). SVG bodies are passed throughreplaceIDsso internal IDs (clipPath, mask, gradient defs) are unique per render — preventing collisions when the same icon appears more than once on a page.Breaking changes:
- Remove
astro-iconfrom yourpackage.jsonandastro.config.ts - Replace
import { Icon } from "astro-icon/components"withimport Icon from "@cloudflare/nimbus-docs/components/Icon.astro" - SVG output structure changed: SVGs are always inlined; the previous
<symbol>/<use>pattern produced duplicate DOM IDs when the same icon was used more than once on a page, so it has been removed. Any CSS or JS targetingsymboloruseelements will need updating.
Migration:
- import { Icon } from "astro-icon/components"; + import Icon from "@cloudflare/nimbus-docs/components/Icon.astro";Starter templates updated: removed
astro-icondependency andicon()integration fromastro.config.ts; all component imports updated to the new path. - Remove
Patch Changes
-
#77
1c49268Thanks @MohamedH1998! - FixNimbusHeademitting base-less SEO URLs on sub-path deployments (e.g.base: '/docs').new URL(path, Astro.site)resolves against the origin only and drops the configuredbase, so therel=sitemaplink, the LLM-indexrel=alternate,og:image/twitter:image, the JSON-LDisPartOf.url, the versionedcanonical, and the cross-versionrel=alternateall pointed at the origin root and 404’d under a sub-path. Every internal path handed tonew URL(..., Astro.site)is nowbase-prefixed via awithBasehelper, matching the existingBASE_URLhandling for the favicon and Shiki stylesheet.Root deployments (
base: '/') are unaffected: the helper is a no-op when no base is configured, and already-based paths pass through unchanged (idempotent). -
#80
ec71a7bThanks @MohamedH1998! - Fix syntax-highlighted code rendering uncoloured in dev on sites with a non-rootbase(e.g.base: "/docs"). The dev middleware that serves_nimbus/shiki.csscompared the request path exactly against the based asset path, but Vite stripsbasefromreq.urlat a non-root base, so the request 404’d and tokens fell back to their inherited colour. It now matches by suffix, serving the stylesheet regardless of how Vite presentsbase. Production was unaffected — the stylesheet is written statically at build time.
create-nimbus-docs 0.6.5
Patch Changes
-
#76
acfac20Thanks @mvvmm! - Replaceastro-iconwith a built-in icon system. This is a breaking change for any project usingastro-icondirectly.Why:
astro-iconstamped a generatedlastModifiedtimestamp into its virtual module on every build, invalidating thousands of cached pages in Astro’s incremental build cache. The package is unmaintained so an upstream fix isn’t coming.What’s new: Nimbus now provides
virtual:nimbus/icons(a Vite plugin) and@cloudflare/nimbus-docs/components/Icon.astro. The plugin auto-detects installed@iconify-json/*packages and loads local SVGs fromsrc/icons/. The component API is compatible withastro-icon(name,size,width,height,is:inline,title,desc, and all<svg>attributes). SVG bodies are passed throughreplaceIDsso internal IDs (clipPath, mask, gradient defs) are unique per render — preventing collisions when the same icon appears more than once on a page.Breaking changes:
- Remove
astro-iconfrom yourpackage.jsonandastro.config.ts - Replace
import { Icon } from "astro-icon/components"withimport Icon from "@cloudflare/nimbus-docs/components/Icon.astro" - SVG output structure changed: SVGs are always inlined; the previous
<symbol>/<use>pattern produced duplicate DOM IDs when the same icon was used more than once on a page, so it has been removed. Any CSS or JS targetingsymboloruseelements will need updating.
Migration:
- import { Icon } from "astro-icon/components"; + import Icon from "@cloudflare/nimbus-docs/components/Icon.astro";Starter templates updated: removed
astro-icondependency andicon()integration fromastro.config.ts; all component imports updated to the new path. - Remove
-
#70
b9620bcThanks @MohamedH1998! - Fix search dialog results not scrolling. The results wrapper now lays out as a flex column, so the results list gets a bounded height and itsoverflow-y-autoengages — long result sets scroll within the dialog instead of being clipped, while the search input stays in view above the scroll region. -
#71
4d6815fThanks @MohamedH1998! - Make pkg.pr.new preview builds scaffold from bundled PR templates and pin generated projects to the matching@cloudflare/nimbus-docspreview.Generated starters are now pinned to the verified Astro 7.0.x line while the upstream Astro 7.1.x static build regression is open.
nimbus-docs 0.9.0
Minor Changes
-
#64
e1e4e8dThanks @MohamedH1998! - Addnimbus-docs check— a build-free preflight that reports readiness honestlyOne command a human, CI, or agent runs to catch setup, structural, authoring, and type problems before a build. It runs four categories — environment (Node floor, config locatable,
sitenot a placeholder, pagefind, wrangler), structure (config Zod, duplicate routes, MDX component resolution — the same validators the build gates on), authoring (the shipped lint rules), and types (a build-free type-check) — and normalizes every result into one envelope.The types category type-checks your TypeScript with your project’s own
tsc, build-free — noastro build, noastro sync, nothing spawned (your TypeScript is resolved from your project, never bundled into the CLI). Astro transpiles rather than type-checks, so a type error never fails the build on its own; catching it in the preflight is the point. Becausetsccan’t parse.astroSFCs, their internals and prop types are out of scope (that needsastro check); an injected ambientdeclare module "*.astro"keeps.tsfiles that import.astrocomponents from being false-flagged.The report separates two axes that a naive error count fuses: buildability vs. correctness, and evaluated vs. not-evaluated.
--jsoncarries three top-level signals:status(passed|failed|partial) — the whole-run verdict across every scope that ran.readiness(buildable|blocked|unknown) — derived from env + structure only: does the project clear Nimbus’ buildability checks? A type error isstatus: failedbutreadiness: buildable(the site still builds — Astro strips types); a placeholdersiteisblocked.ok— kept for back-compat, still exactlyerrors === 0.
Exit is
1only whenstatus === "failed"(ok === false);partialandreadinessnever move it. Usage errors are2.Coverage is a first-class channel, not a fake warning. A sub-check that can’t run yet — opt-in authoring rules or link-checking before
astro buildmaterializes.nimbus/lint.json/.nimbus/routes.json, or the type-check before.astro/types.d.tsexists — is reported as a note underscopes[].notes[{ code, reason, requiresBuild?, requiresInput? }], counted insummary.notes. A note is never afinding, never carries afix, and never affects the exit code; it resolves by making the missing thing exist (a build), not by--fix. A run that skipped types or authoring rules therefore never declares itself build-ready on an unverified scope. The headline is earned: “Buildable” on a scaffold whose correctness scopes are still notes, “Ready” only when every scope that ran evaluated clean with zero notes.--jsonemits{ ok, status, readiness, summary{errors,warnings,notes,fixable,durationMs}, scopes[{scope,status,reason?,notes[]}], findings[{scope,code,severity,file,line,message,fixable,fix}] }. An agent’s fix loop terminates onstatus !== "failed" && summary.fixable === 0— apartialrun with nothing left to fix is a stop (optionally build, then re-check), not a--fixretry.--fixapplies safe fixes (installs, config rewrites via a static parse ofastro.config.ts), prompting on a TTY for values it can’t invent (e.g. the productionsiteURL) and skipping them headless.--env/--structure/--lint/--typesrun a single category.initnow ends with the env readiness pass — using the same scope-status vocabulary — so a fresh scaffold hears about a placeholdersiteat setup time.
lintis preserved as a first-class command with its own “zero.mdx→ exit 1” guard;check --lintruns the same rules inside the preflight envelope. (Unlikelint, a config-only project with no.mdxis not an error forcheck.)Config validation for
siteis now stricter: it must be an absolutehttp(s)://URL with a host. Previously a value missing the//(e.g.https:example.com) slipped throughnew URL()and shipped a broken canonical origin; it is now rejected both build-free bycheckand at build time by the config gate.
create-nimbus-docs 0.6.4
Patch Changes
-
#64
d551fa2Thanks @MohamedH1998! - Stop shipping the.nimbus/build directory into scaffolded projects.nimbus/holds build artifacts materialized byastro build(routes.json,lint.json). It had leaked into the starter source and was being copied into new projects, so a freshly scaffolded app carried stale route and lint truth from the template rather than its own..nimbusis now excluded by both the template-copy script and the runtime scaffolder, and removed from the starter source; a new project starts with no build artifacts and generates its own on first build. -
#64
e1e4e8dThanks @MohamedH1998! - Point the scaffolded AGENT.md atnimbus-docs checkThe generated
AGENT.mdnow documents the one-command model: a “Check it builds” row in the actions table (env + structure + authoring + types), and an “Audit this site” section that leads withnimbus-docs check --jsonbefore the manual walk of whatcheckdoesn’t cover yet (route-file existence, registry hygiene, AI surface, post-build search, Cloudflare config).It teaches an agent the honest result contract: the primary signals are
status(passed|failed|partial) andreadiness(buildable|blocked|unknown), withokkept only for back-compat; a check that couldn’t be evaluated yet (e.g. types before a build) is anoteunderscopes[].notes[]— never a finding, never afix— so the fix loop terminates onstatus !== "failed" && summary.fixable === 0rather than spinning on a coverage gap it cannot repair.
nimbus-docs 0.8.2
Patch Changes
-
#59
01a5d23Thanks @MohamedH1998! - Fix overview-leaf reordering a flat top-level sidebar per pageIn
indexDisplay: "overview-leaf"mode, the section-root pin relabelled and moved any top-level link whose slug matched the current section — including standalone top-level pages with no content beneath them. On a flat top-level of single pages, that pulled the current page to the front and renamed it “Overview” on every page. Pinning now requires the section to actually have content under it, so standalone pages stay put and keep their label.
nimbus-docs 0.8.1
Patch Changes
- #55
a590ebdThanks @MohamedH1998! - CLI hints now print a runnable, scoped invocation instead of the barenimbus-docsbinary. Error messages, install hints, and--helpreferencepnpm dlx @cloudflare/nimbus-docs …(matched to your package manager —npx/yarn dlx/bunx), so a first-rundlx/npxuser can copy-paste them, and they never resolve the unrelated legacy unscopednimbus-docspackage on npm. For example, an unknown slug now suggestspnpm dlx @cloudflare/nimbus-docs listrather thannimbus-docs list. Once@cloudflare/nimbus-docsis a project dependency you can still call thenimbus-docsbin directly (viapnpm execor an npm script) —--helpdocuments both. The “framework is behind” nudge fromoutdatednow suggests your package manager’s update command instead of a hardcodednpm update.
create-nimbus-docs 0.6.3
Patch Changes
-
#55
a986d61Thanks @MohamedH1998! - The scaffolded starter’s header now matches the Nimbus site. The mobile menu (hamburger) button moved from the left of the header to the right, alongside the theme toggle. The search trigger stays reachable on mobile: it previously usedhidden sm:flexand disappeared entirely below thesmbreakpoint, leaving phones with no way to search — it now renders as a compact magnifying-glass icon button on small screens and expands to the full “Search ⌘K” control fromsmup (the ⌘K hint is hidden on mobile). -
#55
6881e4eThanks @MohamedH1998! - Markdown tables in the scaffolded starter now round their outer corner cells to match the table’s0.75remborder-radius. Because the table usesborder-collapse: separate, the corner cell backgrounds — most visibly the muted<thead>fill — previously kept square corners that poked past the rounded table border. The first/last<th>in the header and the first/last<td>in the last body row now carry the matchingborder-top-left/border-top-right/border-bottom-left/border-bottom-rightradius, so the fill clips cleanly to the border. Scoped to:not([class])authored markdown tables, so component-owned tables are untouched.
nimbus-docs 0.8.0
Minor Changes
-
#42
8e4e210Thanks @MohamedH1998! - Add the ownership + upgrade loop to thenimbus-docsCLI:nimbus-docs init— reconstruct animbus.jsonfor a project that lacks one (scaffolded before this record existed, an existing Astro site adopting Nimbus, or a deleted record), matching installed components against the registry and marking what it can’t recover.nimbus-docs outdated— a read-only check across both tiers: starter files behind theirtemplates-v*tag (whichgit diffcan’t show) and registry components whose recorded bytes differ from the registry.nimbus-docs diff [file]/diff --apply <file>— review upstream/your changes to starter files, and pull a clean upstream change per file (never a merge).nimbus-docs add <slug> --overwrite— re-install a component over your copy (review withgit diff).addalso records each install innimbus.json.
Also adds a
getRouteFlagslayout-flag helper and a CI guard for the registry tier invariants.Migration —
add --yesno longer overwrites files you own. It now assents to prompts (dependency installs, etc.) but keeps existing files on conflict, so a bare-yin CI never clobbers your code. Use--overwriteto replace files.# before — --yes overwrote conflicting files nimbus-docs add card --yes # after — replace files explicitly nimbus-docs add card --overwrite -
#34
73bbecfThanks @mvvmm! -nimbus/internal-linkandnimbus/image-refnow match theirignore: string[]option against full glob syntax (**,*,{a,b}, extglobs, …) viapicomatch, not just an exact match or aprefiximmediately followed by/**. In particular, a leading any-depth wildcard like**/llms.txtis now supported — the previous hand-rolled matcher had no way to express that.Existing
ignorelists using only exact paths orprefix/**patterns keep working unchanged.
create-nimbus-docs 0.6.2
Patch Changes
-
#42
8e4e210Thanks @MohamedH1998! - Scaffolded projects now include a committednimbus.json— a CLI-managed record of thecreate-nimbus-docsversion, thetemplates-v*tag, the install root, and (as younimbus-docs add) each installed component’s provenance. Starter components also get an API-consistency pass:type→varianton Banner/Callout,VersionPicker→VersionSwitcher, hydration moved out of inline scripts into.client.tsfiles via themount()primitive, and a singlegetRouteFlagslayout-flag helper. The scaffoldedAGENT.mdnow documents theoutdated/diff/add --overwriteupgrade flow. -
#34
b8a1235Thanks @mvvmm! - Bump for the@cloudflare/nimbus-docsminor in this release (full glob support forignoreininternal-link/image-ref) — no starter-source changes.