Doctor
blume doctor diagnoses configuration and content problems before you build — the config, every page, the Node version, and features that need a server.
blume doctor scans the project exactly as blume build would and reports what it finds, without generating or building anything. It’s the first thing to run when a build fails for a reason that isn’t obvious, and a cheap gate to keep in CI:
blume doctor
blume init also adds it to package.json as a doctor script. With pnpm, run that as pnpm run doctor (pnpm --filter <workspace> run doctor from a monorepo root): a bare pnpm doctor runs pnpm’s own built-in doctor command instead of the script.
What it checks
- The Node version against the range the installed
blumepackage supports, read from its ownenginesfield. A version outside it is a warning: things may work, but it isn’t a combination Blume tests. blume.config.ts, with the same validation a build runs. A removed or renamed key fails with a hint naming its replacement rather than a bare “unrecognized key”.- Every content page and folder meta: the diagnostics
blume devandblume buildprint as they load the project — invalid frontmatter,.mdxthat doesn’t parse, navigation problems, missing include targets, and the rest — collected in one report. - Navigation that leads nowhere: a tab, selector item, featured link, header action, or call to action whose path matches no page, custom
.astropage, generated route, reference,public/file, or file Blume generates: a warning (BLUME_NAV_MISSING_PAGE), the same oneblume devandblume buildprint. A tab is checked where it links: itshrefwhen it has one, else itspath. <Component>examples that don’t exist: apaththat names no file underexamples, which the page would show as a “No example found” box: a warning (BLUME_EXAMPLE_NOT_FOUND) at its line, asblume devandblume buildprint it. Acomponents.tsoverride or island namedComponentreplaces the built-in, and isn’t checked.- Features that need a server on a site configured for static output — the assistant, the MCP server, the Try it playground’s built-in proxy, or server-mode search (Mixedbread): an error naming the feature, with the deployment adapter to switch to (or, when a host adapter is set to
output: "static", telling you to drop that option). - Packages your config needs that aren’t installed — the SDK a search, content source, assistant, or narration adapter imports, a deployment adapter’s
@astrojs/*package, or the renderer for Vue or Svelte islands: an error naming each package, with the install command for your package manager.blume buildstops on the same check. components.tsoverrides Blume can’t plan — an inline or computed entry, or an import whose file doesn’t exist: an error for each, at its line.- A version-shaped folder (
v1.0/) on a site with noversionsconfigured, which would otherwise build as ordinary content: a warning pointing atblume version. - Secrets an enabled feature reads that aren’t set, such as
MIXEDBREAD_API_KEYorOPENROUTER_API_KEY: a warning naming the variable. Doctor loads.envand.env.localfirst, likeblume devandblume build, and checks before any remote content source fetches, so the warning still prints when a source then fails without its token.
The summary
After the diagnostics, doctor prints what the project resolved to, so a mismatch between what you think is configured and what Blume sees is visible at a glance: the page count, the output mode and deployment adapter, the search provider, the configured reference, analytics, and content source adapters, and whether the assistant is on and which backend it uses.
Exit code and JSON
Doctor exits non-zero when there are error diagnostics, so it fails CI on the same problems a build would; warnings are reported and don’t fail. --json emits the diagnostics as JSON on stdout instead of the terminal report, in the same shape blume validate --json uses.