blume 0.0.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/blume.mjs +18 -0
- package/dist/cli/index.js +12696 -0
- package/dist/cli/index.js.map +145 -0
- package/dist/types/core/bridge.d.ts +24 -0
- package/dist/types/core/config.d.ts +35 -0
- package/dist/types/core/data.d.ts +129 -0
- package/dist/types/core/define-components.d.ts +27 -0
- package/dist/types/core/define-meta.d.ts +16 -0
- package/dist/types/core/deployment-env.d.ts +9 -0
- package/dist/types/core/diagnostics.d.ts +17 -0
- package/dist/types/core/i18n-ui.d.ts +500 -0
- package/dist/types/core/load-module.d.ts +7 -0
- package/dist/types/core/package-root.d.ts +17 -0
- package/dist/types/core/project.d.ts +9 -0
- package/dist/types/core/schema.d.ts +3451 -0
- package/dist/types/core/sources/types.d.ts +107 -0
- package/dist/types/core/types.d.ts +245 -0
- package/dist/types/core/ui-packs/ar.d.ts +3 -0
- package/dist/types/core/ui-packs/bg.d.ts +3 -0
- package/dist/types/core/ui-packs/bn.d.ts +3 -0
- package/dist/types/core/ui-packs/ca.d.ts +3 -0
- package/dist/types/core/ui-packs/cs.d.ts +3 -0
- package/dist/types/core/ui-packs/da.d.ts +3 -0
- package/dist/types/core/ui-packs/de.d.ts +3 -0
- package/dist/types/core/ui-packs/el.d.ts +3 -0
- package/dist/types/core/ui-packs/es.d.ts +3 -0
- package/dist/types/core/ui-packs/fa.d.ts +3 -0
- package/dist/types/core/ui-packs/fi.d.ts +3 -0
- package/dist/types/core/ui-packs/fr.d.ts +3 -0
- package/dist/types/core/ui-packs/he.d.ts +3 -0
- package/dist/types/core/ui-packs/hi.d.ts +3 -0
- package/dist/types/core/ui-packs/hr.d.ts +3 -0
- package/dist/types/core/ui-packs/hu.d.ts +3 -0
- package/dist/types/core/ui-packs/id.d.ts +3 -0
- package/dist/types/core/ui-packs/index.d.ts +13 -0
- package/dist/types/core/ui-packs/it.d.ts +3 -0
- package/dist/types/core/ui-packs/ja.d.ts +3 -0
- package/dist/types/core/ui-packs/ko.d.ts +3 -0
- package/dist/types/core/ui-packs/nl.d.ts +3 -0
- package/dist/types/core/ui-packs/no.d.ts +3 -0
- package/dist/types/core/ui-packs/pl.d.ts +3 -0
- package/dist/types/core/ui-packs/pt-br.d.ts +3 -0
- package/dist/types/core/ui-packs/pt.d.ts +3 -0
- package/dist/types/core/ui-packs/ro.d.ts +3 -0
- package/dist/types/core/ui-packs/ru.d.ts +3 -0
- package/dist/types/core/ui-packs/sk.d.ts +3 -0
- package/dist/types/core/ui-packs/sr.d.ts +3 -0
- package/dist/types/core/ui-packs/sv.d.ts +3 -0
- package/dist/types/core/ui-packs/th.d.ts +3 -0
- package/dist/types/core/ui-packs/tr.d.ts +3 -0
- package/dist/types/core/ui-packs/uk.d.ts +3 -0
- package/dist/types/core/ui-packs/vi.d.ts +3 -0
- package/dist/types/core/ui-packs/zh-tw.d.ts +3 -0
- package/dist/types/core/ui-packs/zh.d.ts +3 -0
- package/dist/types/core/version.d.ts +8 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/migrate/mintlify/config.d.ts +2 -0
- package/dist/types/migrate/mintlify/i18n.d.ts +7 -0
- package/dist/types/theme/fonts.d.ts +163 -0
- package/docs/01-quickstart.mdx +99 -0
- package/docs/02-deployment.mdx +129 -0
- package/docs/advanced/api-reference.mdx +114 -0
- package/docs/advanced/blog.mdx +121 -0
- package/docs/advanced/changelog.mdx +113 -0
- package/docs/advanced/custom-pages.mdx +268 -0
- package/docs/advanced/meta.ts +7 -0
- package/docs/changelog/v0-1-0.mdx +12 -0
- package/docs/changelog/v0-2-0.mdx +16 -0
- package/docs/configuration/ai.mdx +228 -0
- package/docs/configuration/analytics.mdx +98 -0
- package/docs/configuration/customization.mdx +91 -0
- package/docs/configuration/export.mdx +70 -0
- package/docs/configuration/index.mdx +290 -0
- package/docs/configuration/meta.ts +15 -0
- package/docs/configuration/search.mdx +172 -0
- package/docs/configuration/seo.mdx +196 -0
- package/docs/configuration/theming.mdx +178 -0
- package/docs/content/components.mdx +651 -0
- package/docs/content/i18n.mdx +205 -0
- package/docs/content/index.mdx +161 -0
- package/docs/content/islands.mdx +94 -0
- package/docs/content/meta.mdx +119 -0
- package/docs/content/meta.ts +15 -0
- package/docs/content/navigation.mdx +168 -0
- package/docs/content/sources.mdx +216 -0
- package/docs/content/syntax.mdx +445 -0
- package/docs/index.mdx +112 -0
- package/docs/reference/cli.mdx +43 -0
- package/docs/reference/frontmatter.mdx +74 -0
- package/docs/reference/meta.ts +7 -0
- package/package.json +150 -6
- package/src/ai/ask.ts +93 -0
- package/src/ai/llms.ts +64 -0
- package/src/ai/markdown.ts +31 -0
- package/src/ai/mcp/data.ts +74 -0
- package/src/ai/mcp/discovery.ts +49 -0
- package/src/ai/mcp/server.ts +225 -0
- package/src/ai/mcp/tools.ts +47 -0
- package/src/assets/icon.png +0 -0
- package/src/astro/examples.ts +104 -0
- package/src/astro/generate.ts +1006 -0
- package/src/astro/index.ts +4 -0
- package/src/astro/integration.ts +74 -0
- package/src/astro/islands.ts +131 -0
- package/src/astro/markdown-negotiation.ts +68 -0
- package/src/astro/pages.ts +87 -0
- package/src/astro/templates.ts +1326 -0
- package/src/cli/commands/add.ts +81 -0
- package/src/cli/commands/build.ts +103 -0
- package/src/cli/commands/dev.ts +108 -0
- package/src/cli/commands/doctor.ts +74 -0
- package/src/cli/commands/eject.ts +57 -0
- package/src/cli/commands/init.ts +98 -0
- package/src/cli/commands/migrate.ts +39 -0
- package/src/cli/commands/preview.ts +39 -0
- package/src/cli/commands/sync.ts +52 -0
- package/src/cli/commands/validate.ts +61 -0
- package/src/cli/index.ts +35 -0
- package/src/cli/log.ts +37 -0
- package/src/cli/prepare.ts +80 -0
- package/src/components/Icon.astro +99 -0
- package/src/components/content/Accordion.astro +8 -0
- package/src/components/content/AccordionItem.astro +121 -0
- package/src/components/content/AutoTypeTable.astro +51 -0
- package/src/components/content/Badge.astro +124 -0
- package/src/components/content/Callout.astro +73 -0
- package/src/components/content/Card.astro +104 -0
- package/src/components/content/CardGroup.astro +14 -0
- package/src/components/content/CodeBlock.astro +28 -0
- package/src/components/content/CodeGroup.astro +13 -0
- package/src/components/content/Color.astro +15 -0
- package/src/components/content/ColorItem.astro +87 -0
- package/src/components/content/ColorRow.astro +10 -0
- package/src/components/content/Column.astro +6 -0
- package/src/components/content/Columns.astro +9 -0
- package/src/components/content/Component.astro +65 -0
- package/src/components/content/Diff.astro +44 -0
- package/src/components/content/Expandable.astro +11 -0
- package/src/components/content/FileTree.astro +8 -0
- package/src/components/content/Frame.astro +70 -0
- package/src/components/content/GithubInfo.astro +110 -0
- package/src/components/content/Math.astro +24 -0
- package/src/components/content/Panel.astro +20 -0
- package/src/components/content/Prompt.astro +129 -0
- package/src/components/content/Step.astro +34 -0
- package/src/components/content/Steps.astro +20 -0
- package/src/components/content/Tab.astro +46 -0
- package/src/components/content/Tabs.astro +273 -0
- package/src/components/content/Tile.astro +42 -0
- package/src/components/content/Tooltip.astro +68 -0
- package/src/components/content/Tree.astro +300 -0
- package/src/components/content/TreeFile.astro +15 -0
- package/src/components/content/TreeFolder.astro +62 -0
- package/src/components/content/TypeTable.astro +106 -0
- package/src/components/content/Update.astro +66 -0
- package/src/components/content/Visibility.astro +12 -0
- package/src/components/content/Warning.astro +9 -0
- package/src/components/content/auto-type-table.ts +141 -0
- package/src/components/content/diff.ts +95 -0
- package/src/components/content/github-info.ts +79 -0
- package/src/components/content/mermaid-element.ts +68 -0
- package/src/components/github-mark.ts +9 -0
- package/src/components/index.ts +14 -0
- package/src/components/islands/AskAI.astro +12 -0
- package/src/components/islands/ask-ai.tsx +156 -0
- package/src/components/layout/Analytics.astro +63 -0
- package/src/components/layout/Banner.astro +50 -0
- package/src/components/layout/Breadcrumbs.astro +31 -0
- package/src/components/layout/Favicon.astro +22 -0
- package/src/components/layout/Fonts.astro +14 -0
- package/src/components/layout/Header.astro +188 -0
- package/src/components/layout/LanguageSwitcher.astro +56 -0
- package/src/components/layout/NavTree.astro +462 -0
- package/src/components/layout/PageActions.astro +438 -0
- package/src/components/layout/PageFeedback.astro +58 -0
- package/src/components/layout/PageLayout.astro +173 -0
- package/src/components/layout/Pagination.astro +56 -0
- package/src/components/layout/ReferenceLayout.astro +107 -0
- package/src/components/layout/RootLayout.astro +537 -0
- package/src/components/layout/Search.astro +608 -0
- package/src/components/layout/TableOfContents.astro +68 -0
- package/src/components/layout/analytics-client.ts +38 -0
- package/src/components/layout/head-scripts.ts +19 -0
- package/src/components/layout/nav-utils.ts +87 -0
- package/src/components/layout/overrides.ts +32 -0
- package/src/components/layout/search/algolia.ts +43 -0
- package/src/components/layout/search/endpoint.ts +22 -0
- package/src/components/layout/search/flexsearch.ts +52 -0
- package/src/components/layout/search/orama-cloud.ts +41 -0
- package/src/components/layout/search/orama.ts +26 -0
- package/src/components/layout/search/pagefind.ts +43 -0
- package/src/components/layout/search/types.ts +163 -0
- package/src/components/layout/search/typesense.ts +60 -0
- package/src/components/layout/toc-element.ts +108 -0
- package/src/core/bridge.ts +92 -0
- package/src/core/config.ts +112 -0
- package/src/core/content.ts +50 -0
- package/src/core/data.ts +128 -0
- package/src/core/define-components.ts +34 -0
- package/src/core/define-meta.ts +20 -0
- package/src/core/deployment-env.ts +73 -0
- package/src/core/diagnostics.ts +104 -0
- package/src/core/frontmatter.ts +43 -0
- package/src/core/graph.ts +128 -0
- package/src/core/i18n-ui.ts +171 -0
- package/src/core/i18n.ts +169 -0
- package/src/core/last-modified.ts +88 -0
- package/src/core/links.ts +352 -0
- package/src/core/load-module.ts +15 -0
- package/src/core/manifest.ts +126 -0
- package/src/core/meta.ts +97 -0
- package/src/core/navigation.ts +392 -0
- package/src/core/package-root.ts +37 -0
- package/src/core/project-graph.ts +153 -0
- package/src/core/project.ts +56 -0
- package/src/core/schema.ts +1057 -0
- package/src/core/server-features.ts +23 -0
- package/src/core/sources/assets.ts +77 -0
- package/src/core/sources/cache.ts +122 -0
- package/src/core/sources/filesystem.ts +99 -0
- package/src/core/sources/mdx-remote.ts +215 -0
- package/src/core/sources/mintlify.ts +161 -0
- package/src/core/sources/normalize.ts +243 -0
- package/src/core/sources/notion.ts +440 -0
- package/src/core/sources/portable-text.ts +143 -0
- package/src/core/sources/read.ts +36 -0
- package/src/core/sources/resolve.ts +158 -0
- package/src/core/sources/sanity.ts +218 -0
- package/src/core/sources/types.ts +105 -0
- package/src/core/tsconfig-aliases.ts +201 -0
- package/src/core/types.ts +261 -0
- package/src/core/ui-packs/ar.ts +47 -0
- package/src/core/ui-packs/bg.ts +47 -0
- package/src/core/ui-packs/bn.ts +47 -0
- package/src/core/ui-packs/ca.ts +47 -0
- package/src/core/ui-packs/cs.ts +47 -0
- package/src/core/ui-packs/da.ts +47 -0
- package/src/core/ui-packs/de.ts +47 -0
- package/src/core/ui-packs/el.ts +47 -0
- package/src/core/ui-packs/es.ts +47 -0
- package/src/core/ui-packs/fa.ts +47 -0
- package/src/core/ui-packs/fi.ts +47 -0
- package/src/core/ui-packs/fr.ts +47 -0
- package/src/core/ui-packs/he.ts +47 -0
- package/src/core/ui-packs/hi.ts +47 -0
- package/src/core/ui-packs/hr.ts +47 -0
- package/src/core/ui-packs/hu.ts +47 -0
- package/src/core/ui-packs/id.ts +47 -0
- package/src/core/ui-packs/index.ts +87 -0
- package/src/core/ui-packs/it.ts +47 -0
- package/src/core/ui-packs/ja.ts +47 -0
- package/src/core/ui-packs/ko.ts +47 -0
- package/src/core/ui-packs/nl.ts +47 -0
- package/src/core/ui-packs/no.ts +47 -0
- package/src/core/ui-packs/pl.ts +47 -0
- package/src/core/ui-packs/pt-br.ts +47 -0
- package/src/core/ui-packs/pt.ts +47 -0
- package/src/core/ui-packs/ro.ts +47 -0
- package/src/core/ui-packs/ru.ts +47 -0
- package/src/core/ui-packs/sk.ts +47 -0
- package/src/core/ui-packs/sr.ts +47 -0
- package/src/core/ui-packs/sv.ts +47 -0
- package/src/core/ui-packs/th.ts +47 -0
- package/src/core/ui-packs/tr.ts +47 -0
- package/src/core/ui-packs/uk.ts +47 -0
- package/src/core/ui-packs/vi.ts +47 -0
- package/src/core/ui-packs/zh-tw.ts +47 -0
- package/src/core/ui-packs/zh.ts +47 -0
- package/src/core/version.ts +23 -0
- package/src/deploy/robots.ts +20 -0
- package/src/deploy/rss.ts +128 -0
- package/src/deploy/sitemap.ts +28 -0
- package/src/index.ts +39 -0
- package/src/markdown/code-title.ts +71 -0
- package/src/markdown/directives.ts +83 -0
- package/src/markdown/heading-anchors.ts +137 -0
- package/src/markdown/index.ts +228 -0
- package/src/markdown/inline-code.ts +108 -0
- package/src/markdown/language-icon.ts +172 -0
- package/src/markdown/math.ts +32 -0
- package/src/markdown/mdast.ts +48 -0
- package/src/markdown/mermaid.ts +37 -0
- package/src/markdown/package-commands.ts +159 -0
- package/src/markdown/package-install.ts +40 -0
- package/src/migrate/fumadocs/config.ts +155 -0
- package/src/migrate/fumadocs/content.ts +365 -0
- package/src/migrate/fumadocs/frontmatter.ts +18 -0
- package/src/migrate/fumadocs/groups.ts +230 -0
- package/src/migrate/fumadocs/index.ts +337 -0
- package/src/migrate/fumadocs/meta.ts +244 -0
- package/src/migrate/migrate.ts +53 -0
- package/src/migrate/mintlify/config.ts +1040 -0
- package/src/migrate/mintlify/content.ts +98 -0
- package/src/migrate/mintlify/frontmatter.ts +126 -0
- package/src/migrate/mintlify/i18n.ts +51 -0
- package/src/migrate/mintlify/icons.ts +128 -0
- package/src/migrate/mintlify/index.ts +266 -0
- package/src/migrate/mintlify/snippets.ts +306 -0
- package/src/migrate/mintlify/transform.ts +80 -0
- package/src/migrate/nextra/content.ts +46 -0
- package/src/migrate/nextra/frontmatter.ts +40 -0
- package/src/migrate/nextra/index.ts +374 -0
- package/src/migrate/nextra/meta.ts +266 -0
- package/src/migrate/shared.ts +720 -0
- package/src/migrate/starlight/config.ts +459 -0
- package/src/migrate/starlight/content.ts +78 -0
- package/src/migrate/starlight/frontmatter.ts +111 -0
- package/src/migrate/starlight/i18n.ts +54 -0
- package/src/migrate/starlight/index.ts +131 -0
- package/src/og/card.ts +92 -0
- package/src/og/index.ts +2 -0
- package/src/openapi/scalar.ts +246 -0
- package/src/registry/eject.ts +310 -0
- package/src/registry/registry.ts +100 -0
- package/src/registry/rewrite-imports.ts +39 -0
- package/src/runtime/index.ts +14 -0
- package/src/search/build.ts +23 -0
- package/src/search/documents.ts +164 -0
- package/src/search/orama-index.ts +66 -0
- package/src/search/providers.ts +91 -0
- package/src/search/sync/algolia.ts +30 -0
- package/src/search/sync/index.ts +50 -0
- package/src/search/sync/orama-cloud.ts +40 -0
- package/src/search/sync/typesense.ts +65 -0
- package/src/seo/jsonld.ts +113 -0
- package/src/theme/entry.ts +637 -0
- package/src/theme/fonts.ts +198 -0
- package/src/theme/icons.ts +184 -0
- package/src/theme/palette.ts +143 -0
- package/src/theme/twoslash.ts +81 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Changelog
|
|
3
|
+
description: Author release notes as content, and Blume builds a timeline page and an RSS feed automatically.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Blume ships a changelog out of the box. Write each release as a normal content
|
|
7
|
+
file, mark it `type: changelog`, and Blume collects every entry into a generated
|
|
8
|
+
timeline page and an RSS feed — no layout to build, no list to maintain.
|
|
9
|
+
|
|
10
|
+
## Write an entry
|
|
11
|
+
|
|
12
|
+
A changelog entry is a regular `.md` or `.mdx` page with `type: changelog` in its
|
|
13
|
+
frontmatter. By convention they live under `changelog/`, but the type — not the
|
|
14
|
+
folder — is what matters:
|
|
15
|
+
|
|
16
|
+
```mdx changelog/v1-2-0.mdx lineNumbers
|
|
17
|
+
---
|
|
18
|
+
title: v1.2.0
|
|
19
|
+
type: changelog
|
|
20
|
+
date: 2026-06-20
|
|
21
|
+
changelog:
|
|
22
|
+
version: 1.2.0
|
|
23
|
+
category: Features
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
A big batch of components landed this release — columns, frames, trees, and
|
|
27
|
+
tooltips, plus code groups that render as proper language tabs.
|
|
28
|
+
|
|
29
|
+
- New `Accordion`, `Expandable`, and `Tooltip` components
|
|
30
|
+
- `CodeGroup` tabs with flush code blocks
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Give every entry a `date` so the timeline and feed sort newest-first. An
|
|
34
|
+
unquoted YAML date is fine — Blume normalizes it.
|
|
35
|
+
|
|
36
|
+
### The `changelog` object
|
|
37
|
+
|
|
38
|
+
The optional `changelog` object adds richer metadata for the timeline and feed:
|
|
39
|
+
|
|
40
|
+
<TypeTable
|
|
41
|
+
type={{
|
|
42
|
+
"changelog.version": {
|
|
43
|
+
type: "string",
|
|
44
|
+
description:
|
|
45
|
+
"Release version. Falls back to a v-prefixed label when there's no title.",
|
|
46
|
+
},
|
|
47
|
+
"changelog.category": {
|
|
48
|
+
type: "string",
|
|
49
|
+
description:
|
|
50
|
+
"Shown as a tag beside the entry, e.g. Release, Features, Fixes.",
|
|
51
|
+
},
|
|
52
|
+
"changelog.date": {
|
|
53
|
+
type: "string",
|
|
54
|
+
description:
|
|
55
|
+
"Publish date. May live here or at the top level — both feed the timeline and RSS feed.",
|
|
56
|
+
},
|
|
57
|
+
}}
|
|
58
|
+
/>
|
|
59
|
+
|
|
60
|
+
## The timeline page
|
|
61
|
+
|
|
62
|
+
Once you have at least one `type: changelog` entry, Blume generates a
|
|
63
|
+
**`/changelog`** page automatically. Each entry renders newest-first with its
|
|
64
|
+
date, label, and `category` tag in a left rail beside its content:
|
|
65
|
+
|
|
66
|
+
- The entry **title** becomes its label — or `v{version}` when there's no title.
|
|
67
|
+
- The `category` renders as a tag next to the date.
|
|
68
|
+
- Drafts and `sidebar.hidden` entries are skipped.
|
|
69
|
+
|
|
70
|
+
The page appears only when nothing already occupies the `/changelog` route. To
|
|
71
|
+
replace it with your own design, add a [custom page](/docs/advanced/custom-pages) at
|
|
72
|
+
`pages/changelog.astro` — it takes over and Blume stops generating the default
|
|
73
|
+
timeline.
|
|
74
|
+
|
|
75
|
+
## The RSS feed
|
|
76
|
+
|
|
77
|
+
Blume also builds a changelog feed at **`/changelog/rss.xml`**, sorted
|
|
78
|
+
newest-first by `date`. Feeds need an absolute site URL, so set
|
|
79
|
+
[`deployment.site`](/docs/deployment); Blume then injects a `<link rel="alternate">`
|
|
80
|
+
tag on every page so readers discover it automatically.
|
|
81
|
+
|
|
82
|
+
The feed is on by default. Tune it under [`seo.rss`](/docs/configuration/seo#rss-feeds):
|
|
83
|
+
|
|
84
|
+
```ts blume.config.ts lineNumbers
|
|
85
|
+
seo: {
|
|
86
|
+
rss: {
|
|
87
|
+
enabled: true,
|
|
88
|
+
types: ["blog", "changelog"],
|
|
89
|
+
limit: 50,
|
|
90
|
+
},
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Remove `"changelog"` from `rss.types` to skip the feed while keeping the timeline.
|
|
95
|
+
|
|
96
|
+
## Structured data
|
|
97
|
+
|
|
98
|
+
When [structured data](/docs/configuration/seo#structured-data) is on, each changelog
|
|
99
|
+
entry is emitted as a schema.org **`TechArticle`** with its description and
|
|
100
|
+
publish date, so search engines can index releases as dated articles.
|
|
101
|
+
|
|
102
|
+
<CardGroup cols={2}>
|
|
103
|
+
<Card
|
|
104
|
+
title="Frontmatter"
|
|
105
|
+
href="/docs/reference/frontmatter#changelog"
|
|
106
|
+
icon="file"
|
|
107
|
+
>
|
|
108
|
+
The full changelog frontmatter schema.
|
|
109
|
+
</Card>
|
|
110
|
+
<Card title="Custom Pages" href="/docs/advanced/custom-pages" icon="folder">
|
|
111
|
+
Replace the generated timeline with your own layout.
|
|
112
|
+
</Card>
|
|
113
|
+
</CardGroup>
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Custom Pages
|
|
3
|
+
description: Mount fully custom .astro routes alongside your docs and read your site's config, navigation, and content from the blume:data module.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Most of a Blume site is Markdown, but sometimes you need a route that _isn't_ a
|
|
7
|
+
doc — a landing page, a pricing page, a hand-built blog or changelog index, or an
|
|
8
|
+
interactive dashboard. Drop an `.astro` file under your **pages** folder and
|
|
9
|
+
Blume mounts it as a real route, right alongside your content.
|
|
10
|
+
|
|
11
|
+
## Add a page
|
|
12
|
+
|
|
13
|
+
Create a `pages/` folder at your project root and add an `.astro` file:
|
|
14
|
+
|
|
15
|
+
```astro pages/pricing.astro lineNumbers
|
|
16
|
+
---
|
|
17
|
+
import data from "blume:data";
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
<h1>Pricing for {data.config.title}</h1>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
`blume dev` picks it up immediately and `blume build` prerenders it to static
|
|
24
|
+
HTML. The folder name is configurable with [`content.pages`](/docs/configuration#content)
|
|
25
|
+
(default `"pages"`).
|
|
26
|
+
|
|
27
|
+
Custom pages keep their original location on disk, so relative imports, component
|
|
28
|
+
imports, and [`getStaticPaths`](https://docs.astro.build/en/reference/routing-reference/#getstaticpaths)
|
|
29
|
+
all work exactly as they do in a plain Astro project — Blume mounts each file
|
|
30
|
+
where it sits rather than copying it.
|
|
31
|
+
|
|
32
|
+
## Files and routes
|
|
33
|
+
|
|
34
|
+
Each file's path under the pages folder becomes its route. `index` maps to the
|
|
35
|
+
parent folder, and dynamic `[param]` segments are preserved:
|
|
36
|
+
|
|
37
|
+
| File | Route |
|
|
38
|
+
| ------------------------- | ------------- |
|
|
39
|
+
| `pages/pricing.astro` | `/pricing` |
|
|
40
|
+
| `pages/blog/index.astro` | `/blog` |
|
|
41
|
+
| `pages/blog/[slug].astro` | `/blog/:slug` |
|
|
42
|
+
| `pages/changelog.astro` | `/changelog` |
|
|
43
|
+
|
|
44
|
+
A custom page **wins** over a generated route at the same path. Adding
|
|
45
|
+
`pages/changelog.astro`, for example, replaces Blume's
|
|
46
|
+
[generated changelog timeline](/docs/advanced/changelog) with your own.
|
|
47
|
+
|
|
48
|
+
## Reading site data
|
|
49
|
+
|
|
50
|
+
Import `blume:data` to read the same resolved config, navigation, routes, and
|
|
51
|
+
feeds the rest of the site uses:
|
|
52
|
+
|
|
53
|
+
```astro pages/all-pages.astro lineNumbers
|
|
54
|
+
---
|
|
55
|
+
import data from "blume:data";
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
<h1>All pages</h1>
|
|
59
|
+
<ul>
|
|
60
|
+
{
|
|
61
|
+
data.routes
|
|
62
|
+
.filter((route) => route.indexable)
|
|
63
|
+
.map((route) => (
|
|
64
|
+
<li>
|
|
65
|
+
<a href={route.path}>{route.title}</a>
|
|
66
|
+
</li>
|
|
67
|
+
))
|
|
68
|
+
}
|
|
69
|
+
</ul>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Inside a Blume project the module is typed automatically. You can also pull the
|
|
73
|
+
shape in explicitly — for typed helpers, props, or your own tsconfig — with
|
|
74
|
+
`import type { BlumeData } from "blume"`:
|
|
75
|
+
|
|
76
|
+
```ts
|
|
77
|
+
import type { BlumeData, BlumeRoute } from "blume";
|
|
78
|
+
|
|
79
|
+
const indexable = (data: BlumeData): BlumeRoute[] =>
|
|
80
|
+
data.routes.filter((route) => route.indexable);
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
The module exposes:
|
|
84
|
+
|
|
85
|
+
<TypeTable
|
|
86
|
+
type={{
|
|
87
|
+
config: {
|
|
88
|
+
type: "BlumeDataConfig",
|
|
89
|
+
required: true,
|
|
90
|
+
description:
|
|
91
|
+
"Resolved site settings: title, description, logo, favicon, appleIcon, banner, theme, site, repoUrl, search, i18n, mcp, og, analytics, feedback, structuredData, codeWrap, and imageZoom.",
|
|
92
|
+
},
|
|
93
|
+
navigation: {
|
|
94
|
+
type: "Navigation",
|
|
95
|
+
required: true,
|
|
96
|
+
description:
|
|
97
|
+
"The sidebar, tabs, and selectors inferred from your content (default locale).",
|
|
98
|
+
},
|
|
99
|
+
navigationByLocale: {
|
|
100
|
+
type: "Record<string, Navigation>",
|
|
101
|
+
required: true,
|
|
102
|
+
description:
|
|
103
|
+
"Per-locale navigation trees, keyed by locale code. Empty unless i18n is configured.",
|
|
104
|
+
},
|
|
105
|
+
routes: {
|
|
106
|
+
type: "BlumeRoute[]",
|
|
107
|
+
required: true,
|
|
108
|
+
description:
|
|
109
|
+
"Every content page: { id, path, title, locale, indexable, hidden, draft, fallback, editUrl, lastModified, alternates, collection, entryId }.",
|
|
110
|
+
},
|
|
111
|
+
feeds: {
|
|
112
|
+
type: "BlumeFeed[]",
|
|
113
|
+
required: true,
|
|
114
|
+
description: "Generated RSS feeds: { href, title }.",
|
|
115
|
+
},
|
|
116
|
+
fontCssVars: {
|
|
117
|
+
type: "string[]",
|
|
118
|
+
required: true,
|
|
119
|
+
description:
|
|
120
|
+
"CSS variable names for the configured fonts (Astro <Font> integration).",
|
|
121
|
+
},
|
|
122
|
+
ui: {
|
|
123
|
+
type: "UIStrings",
|
|
124
|
+
required: true,
|
|
125
|
+
description:
|
|
126
|
+
"Resolved UI chrome strings for the default locale (search, sidebar, and footer labels).",
|
|
127
|
+
},
|
|
128
|
+
uiByLocale: {
|
|
129
|
+
type: "Record<string, UIStrings>",
|
|
130
|
+
required: true,
|
|
131
|
+
description:
|
|
132
|
+
"Per-locale UI strings, keyed by locale code. Empty unless i18n is configured.",
|
|
133
|
+
},
|
|
134
|
+
}}
|
|
135
|
+
/>
|
|
136
|
+
|
|
137
|
+
`routes` carries page metadata but not frontmatter like `type` or `date`. To
|
|
138
|
+
build a list filtered by content type — a blog or changelog index — pair it with
|
|
139
|
+
Astro's `docs` content collection, which holds the frontmatter:
|
|
140
|
+
|
|
141
|
+
```astro pages/blog/index.astro lineNumbers
|
|
142
|
+
---
|
|
143
|
+
import { getCollection } from "astro:content";
|
|
144
|
+
import data from "blume:data";
|
|
145
|
+
|
|
146
|
+
// Each route's id matches its collection entry id.
|
|
147
|
+
const routeById = new Map(data.routes.map((route) => [route.id, route.path]));
|
|
148
|
+
|
|
149
|
+
const posts = (await getCollection("docs"))
|
|
150
|
+
.filter((entry) => entry.data.type === "blog" && !entry.data.draft)
|
|
151
|
+
.map((entry) => ({
|
|
152
|
+
description: entry.data.description,
|
|
153
|
+
href: routeById.get(entry.id),
|
|
154
|
+
title: entry.data.title,
|
|
155
|
+
}));
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
<ul>
|
|
159
|
+
{
|
|
160
|
+
posts.map((post) => (
|
|
161
|
+
<li>
|
|
162
|
+
<a href={post.href}>{post.title}</a>
|
|
163
|
+
<p>{post.description}</p>
|
|
164
|
+
</li>
|
|
165
|
+
))
|
|
166
|
+
}
|
|
167
|
+
</ul>
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## Using the site layout
|
|
171
|
+
|
|
172
|
+
`RootLayout` gives a custom page the full docs chrome — header, sidebar, search,
|
|
173
|
+
TOC, and theme — by wrapping it in the same 3-column grid the generated pages
|
|
174
|
+
use. For a landing or marketing page that grid is in the way, so reach for
|
|
175
|
+
**`PageLayout`** instead: it provides the document shell, header, theme, and
|
|
176
|
+
fonts, then a single full-width `<slot />` (no sidebar, no prose, no TOC). An
|
|
177
|
+
optional `footer` slot renders after `<main>`:
|
|
178
|
+
|
|
179
|
+
```astro pages/index.astro lineNumbers
|
|
180
|
+
---
|
|
181
|
+
import PageLayout from "blume/components/layout/PageLayout.astro";
|
|
182
|
+
import data from "blume:data";
|
|
183
|
+
import Footer from "./_home/Footer.astro";
|
|
184
|
+
|
|
185
|
+
const { config } = data;
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
<PageLayout
|
|
189
|
+
site={{ title: config.title, description: config.description }}
|
|
190
|
+
logo={config.logo}
|
|
191
|
+
banner={config.banner}
|
|
192
|
+
analytics={config.analytics}
|
|
193
|
+
navigation={data.navigation}
|
|
194
|
+
favicon={config.favicon}
|
|
195
|
+
fontCssVars={data.fontCssVars}
|
|
196
|
+
themeMode={config.theme.mode}
|
|
197
|
+
searchEnabled={config.search.enabled}
|
|
198
|
+
siteUrl={config.site}
|
|
199
|
+
ogEnabled={config.og.enabled}
|
|
200
|
+
page={{ title: "Acme — the fastest docs", description: config.description }}
|
|
201
|
+
>
|
|
202
|
+
<section class="mx-auto max-w-5xl px-6 py-24">
|
|
203
|
+
<h1>Build docs that fly</h1>
|
|
204
|
+
</section>
|
|
205
|
+
<Footer slot="footer" />
|
|
206
|
+
</PageLayout>
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Passing `siteUrl` (and `ogEnabled`) derives the page's `canonical` and a
|
|
210
|
+
generated `og:image` automatically: Blume renders an Open Graph card for every
|
|
211
|
+
static custom page — the home included, the most-shared URL — served at
|
|
212
|
+
`/og/<route>.png` (`/og/index.png` for `/`). The home card uses the site title
|
|
213
|
+
with the description as its eyebrow; a deeper page is titled from its last path
|
|
214
|
+
segment. Set `ogImage` or `canonical` explicitly to override.
|
|
215
|
+
|
|
216
|
+
`page.title` is used verbatim as the document title (no `- siteTitle` suffix),
|
|
217
|
+
since marketing pages usually set their own. To give a custom page the full docs
|
|
218
|
+
chrome instead — sidebar, TOC, and all — wrap it in `RootLayout`, the layout the
|
|
219
|
+
generated pages use. Pull the required props straight from `blume:data`:
|
|
220
|
+
|
|
221
|
+
```astro pages/pricing.astro lineNumbers
|
|
222
|
+
---
|
|
223
|
+
import RootLayout from "blume/components/layout/RootLayout.astro";
|
|
224
|
+
import data from "blume:data";
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
<RootLayout
|
|
228
|
+
site={{ title: data.config.title, description: data.config.description }}
|
|
229
|
+
logo={data.config.logo}
|
|
230
|
+
banner={data.config.banner}
|
|
231
|
+
navigation={data.navigation}
|
|
232
|
+
page={{ title: "Pricing", route: "/pricing" }}
|
|
233
|
+
headings={[]}
|
|
234
|
+
themeMode={data.config.theme.mode}
|
|
235
|
+
searchEnabled={data.config.search.enabled}
|
|
236
|
+
searchProvider={data.config.search.provider}
|
|
237
|
+
indexable={true}
|
|
238
|
+
>
|
|
239
|
+
<h1>Pricing</h1>
|
|
240
|
+
</RootLayout>
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
:::note
|
|
244
|
+
`RootLayout` is part of the generated runtime, so its props can change between
|
|
245
|
+
releases. When you want a layout that's fully yours,
|
|
246
|
+
[`blume eject`](/docs/configuration/customization#eject) turns `.blume/` into a
|
|
247
|
+
standard Astro project you own outright.
|
|
248
|
+
:::
|
|
249
|
+
|
|
250
|
+
## Interactive pages
|
|
251
|
+
|
|
252
|
+
Custom pages are ordinary Astro, so you can drop in React (or any framework)
|
|
253
|
+
[islands](/docs/configuration/customization#react-islands) with a hydration directive.
|
|
254
|
+
React switches on automatically the moment your project contains a `.tsx` or
|
|
255
|
+
`.jsx` file.
|
|
256
|
+
|
|
257
|
+
<CardGroup cols={2}>
|
|
258
|
+
<Card
|
|
259
|
+
title="Customization"
|
|
260
|
+
href="/docs/configuration/customization"
|
|
261
|
+
icon="file"
|
|
262
|
+
>
|
|
263
|
+
Component overrides, React islands, the registry, and eject.
|
|
264
|
+
</Card>
|
|
265
|
+
<Card title="Blog" href="/docs/advanced/blog" icon="book-open">
|
|
266
|
+
Author posts and build a custom blog index.
|
|
267
|
+
</Card>
|
|
268
|
+
</CardGroup>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: v0.1.0
|
|
3
|
+
type: changelog
|
|
4
|
+
date: 2026-06-01
|
|
5
|
+
changelog:
|
|
6
|
+
version: 0.1.0
|
|
7
|
+
category: Release
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
The first public release of Blume — a markdown-first docs framework on Astro and
|
|
11
|
+
Vite. Drop in Markdown or MDX, run `blume dev`, and ship a production-grade docs
|
|
12
|
+
site with search, theming, and AI-ready output.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: v0.2.0
|
|
3
|
+
type: changelog
|
|
4
|
+
date: 2026-06-24
|
|
5
|
+
changelog:
|
|
6
|
+
version: 0.2.0
|
|
7
|
+
category: Features
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
A big batch of built-in components landed: **columns**, **frames**, **trees**,
|
|
11
|
+
**tooltips**, **code groups**, **panels**, **tiles**, and **fields**. Code groups
|
|
12
|
+
now render as proper language tabs, and the changelog gets this timeline.
|
|
13
|
+
|
|
14
|
+
- New `Accordion` / `AccordionItem`, `Expandable`, `Tooltip`, `Frame`, `Color`
|
|
15
|
+
- `CodeGroup` tabs with flush code blocks
|
|
16
|
+
- Redesigned `Prompt` with a copy-to-clipboard button
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: AI
|
|
3
|
+
description: Machine-readable docs with llms.txt and an optional in-page Ask AI assistant.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Blume has several opt-in AI features: machine-readable docs for external tools
|
|
7
|
+
(`llms.txt`), an in-page **Ask AI** assistant, and a hosted **MCP server** for
|
|
8
|
+
coding agents. Everything is off by default, and static docs stay fully static
|
|
9
|
+
until you turn a feature on.
|
|
10
|
+
|
|
11
|
+
## llms.txt
|
|
12
|
+
|
|
13
|
+
Emit machine-readable versions of your docs that coding agents and chat
|
|
14
|
+
assistants can consume:
|
|
15
|
+
|
|
16
|
+
```ts blume.config.ts lineNumbers
|
|
17
|
+
ai: {
|
|
18
|
+
llmsTxt: true,
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
With this on, `blume build` writes two files to the root of your site:
|
|
23
|
+
|
|
24
|
+
- **`/llms.txt`** — a compact index: your site title and description, then a
|
|
25
|
+
linked list of every page with its summary.
|
|
26
|
+
- **`/llms-full.txt`** — the entire corpus: each page's full Markdown body, with
|
|
27
|
+
its source URL, in one file.
|
|
28
|
+
|
|
29
|
+
Draft pages are excluded. Set [`deployment.site`](/docs/deployment) so the links and
|
|
30
|
+
source URLs resolve to absolute addresses.
|
|
31
|
+
|
|
32
|
+
## Raw Markdown
|
|
33
|
+
|
|
34
|
+
Append `.md` or `.mdx` to any page's URL to fetch its raw Markdown source —
|
|
35
|
+
perfect for LLMs, coding agents, and "copy as Markdown" workflows. It's available
|
|
36
|
+
for every page, in dev and production, with no configuration.
|
|
37
|
+
|
|
38
|
+
| URL | Returns |
|
|
39
|
+
| ----------------- | ----------------------- |
|
|
40
|
+
| `/quickstart` | The rendered page |
|
|
41
|
+
| `/quickstart.md` | The raw Markdown source |
|
|
42
|
+
| `/quickstart.mdx` | The raw Markdown source |
|
|
43
|
+
|
|
44
|
+
Nested routes work the same way (`/content/syntax.md`), and the home page is
|
|
45
|
+
served at `/index.md`.
|
|
46
|
+
|
|
47
|
+
## Copy as Markdown
|
|
48
|
+
|
|
49
|
+
Every page carries a **Copy as Markdown** action — in the [page
|
|
50
|
+
actions](/docs/content/navigation#page-actions) beneath the table of contents — that copies the
|
|
51
|
+
page's raw Markdown to the clipboard. It's the same source served at the [`.md`
|
|
52
|
+
URL](#raw-markdown) above, ready to paste into an LLM, an issue, or your notes.
|
|
53
|
+
It's available on every page, in dev and production, with no configuration.
|
|
54
|
+
|
|
55
|
+
## Open in chat
|
|
56
|
+
|
|
57
|
+
The **Open in chat** action opens the current page in an AI assistant — v0,
|
|
58
|
+
ChatGPT, Claude, T3 Chat, Scira, or Cursor — pre-filled with a prompt that points
|
|
59
|
+
it at the page's raw Markdown so it can answer questions about what you're
|
|
60
|
+
reading:
|
|
61
|
+
|
|
62
|
+
> Read `https://your-site/this-page.md` so I can ask you questions about this
|
|
63
|
+
> page.
|
|
64
|
+
|
|
65
|
+
Like Copy as Markdown, it needs no setup. The assistant fetches the page over its
|
|
66
|
+
public URL, so it works as soon as the page is deployed.
|
|
67
|
+
|
|
68
|
+
To embed a ready-to-copy prompt inline in your content — rather than a whole-page
|
|
69
|
+
action — use the [Prompt component](/docs/content/components#prompt), which renders
|
|
70
|
+
a labelled row with a **Copy prompt** button and an optional open-in-Cursor link.
|
|
71
|
+
|
|
72
|
+
## Ask AI
|
|
73
|
+
|
|
74
|
+
Add an assistant that answers reader questions in an in-page chat panel, backed
|
|
75
|
+
by a streaming server endpoint and the [AI SDK](https://ai-sdk.dev):
|
|
76
|
+
|
|
77
|
+
```ts blume.config.ts lineNumbers
|
|
78
|
+
ai: {
|
|
79
|
+
ask: {
|
|
80
|
+
enabled: true,
|
|
81
|
+
provider: "gateway", // default
|
|
82
|
+
model: "openai/gpt-5.5",
|
|
83
|
+
},
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Server output required
|
|
88
|
+
|
|
89
|
+
Ask AI is a server route (`POST /api/ask`), so it can't run on a static build.
|
|
90
|
+
Switch to server output and pick an adapter:
|
|
91
|
+
|
|
92
|
+
```ts blume.config.ts lineNumbers
|
|
93
|
+
deployment: {
|
|
94
|
+
output: "server",
|
|
95
|
+
adapter: "vercel",
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
A static build with Ask AI enabled fails fast with a message telling you to set
|
|
100
|
+
`deployment.output` to `server`. See [Deployment](/docs/deployment) for the adapters.
|
|
101
|
+
|
|
102
|
+
### Backends
|
|
103
|
+
|
|
104
|
+
By default Ask AI routes through the **Vercel AI Gateway**: `model` is a
|
|
105
|
+
`provider/model` string, so you switch models by changing it (`openai/gpt-5.5`,
|
|
106
|
+
`anthropic/claude-sonnet-4-5`, and so on) with no provider SDK to install. The
|
|
107
|
+
gateway reads `AI_GATEWAY_API_KEY` from your environment and is wired up
|
|
108
|
+
automatically when you deploy on Vercel.
|
|
109
|
+
|
|
110
|
+
Set `provider` to point Ask AI somewhere else. Each backend reads its API key
|
|
111
|
+
from an environment variable, and the matching provider SDK is added to your
|
|
112
|
+
project's runtime automatically when you build — only the one you use:
|
|
113
|
+
|
|
114
|
+
| `provider` | `model` | API key env var |
|
|
115
|
+
| ------------------- | --------------------------------------------- | -------------------- |
|
|
116
|
+
| `gateway` (default) | a `provider/model` string via the AI Gateway | `AI_GATEWAY_API_KEY` |
|
|
117
|
+
| `openrouter` | any [OpenRouter](https://openrouter.ai) model | `OPENROUTER_API_KEY` |
|
|
118
|
+
| `llmgateway` | any [LLMGateway](https://llmgateway.io) model | `LLMGATEWAY_API_KEY` |
|
|
119
|
+
| `inkeep` | an [Inkeep](https://inkeep.com) QA model | `INKEEP_API_KEY` |
|
|
120
|
+
| `openai-compatible` | whatever your endpoint serves | set with `apiKeyEnv` |
|
|
121
|
+
|
|
122
|
+
For example, to use OpenRouter:
|
|
123
|
+
|
|
124
|
+
```ts blume.config.ts lineNumbers
|
|
125
|
+
ai: {
|
|
126
|
+
ask: {
|
|
127
|
+
enabled: true,
|
|
128
|
+
provider: "openrouter",
|
|
129
|
+
model: "anthropic/claude-sonnet-4-5",
|
|
130
|
+
},
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Any OpenAI-compatible endpoint works through `openai-compatible` — supply the
|
|
135
|
+
`baseUrl` and the env var holding its key:
|
|
136
|
+
|
|
137
|
+
```ts blume.config.ts lineNumbers
|
|
138
|
+
ai: {
|
|
139
|
+
ask: {
|
|
140
|
+
enabled: true,
|
|
141
|
+
provider: "openai-compatible",
|
|
142
|
+
baseUrl: "https://my-gateway.example.com/v1",
|
|
143
|
+
apiKeyEnv: "MY_GATEWAY_API_KEY",
|
|
144
|
+
model: "gpt-4o",
|
|
145
|
+
},
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Set `apiKeyEnv` (and, for the named providers, `baseUrl`) on any backend to point
|
|
150
|
+
at a different env var or proxy.
|
|
151
|
+
|
|
152
|
+
:::note
|
|
153
|
+
**Inkeep** answers from the content you've indexed in the Inkeep dashboard — it
|
|
154
|
+
runs its own retrieval — rather than from this site's pages. The other backends
|
|
155
|
+
are plain model passthroughs: the endpoint streams the reader's messages straight
|
|
156
|
+
to the model.
|
|
157
|
+
:::
|
|
158
|
+
|
|
159
|
+
Keys are read with `process.env`, which covers the Node, Vercel, and Netlify
|
|
160
|
+
adapters. On Cloudflare, expose the key through the platform's [runtime
|
|
161
|
+
binding](https://docs.astro.build/en/guides/integrations-guide/cloudflare/#environment-variables-and-secrets).
|
|
162
|
+
Enabling Ask AI also turns on React for the in-page island — see
|
|
163
|
+
[Customization](/docs/configuration/customization#react-islands).
|
|
164
|
+
|
|
165
|
+
## MCP server
|
|
166
|
+
|
|
167
|
+
Host a [Model Context Protocol](https://modelcontextprotocol.io) server so coding
|
|
168
|
+
agents (Claude Code, Cursor, VS Code, claude.ai connectors) can search and read
|
|
169
|
+
your docs directly — no scraping:
|
|
170
|
+
|
|
171
|
+
```ts blume.config.ts lineNumbers
|
|
172
|
+
mcp: {
|
|
173
|
+
enabled: true,
|
|
174
|
+
route: "/mcp", // where the server is mounted
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
| Option | Default | Description |
|
|
179
|
+
| -------------- | ------- | ------------------------------------------------- |
|
|
180
|
+
| `enabled` | `false` | Generate and host the MCP server. |
|
|
181
|
+
| `route` | `/mcp` | Path the Streamable-HTTP endpoint is mounted on. |
|
|
182
|
+
| `name` | title | Server name shown to clients (defaults to title). |
|
|
183
|
+
| `instructions` | — | Optional system hint passed to connecting agents. |
|
|
184
|
+
|
|
185
|
+
The server exposes four read-only tools — `search_docs`, `get_page`,
|
|
186
|
+
`list_pages`, and `get_navigation` — and publishes discovery documents at
|
|
187
|
+
`/.well-known/mcp.json` and `/.well-known/mcp/server-card.json`. Each page's
|
|
188
|
+
**Connect to MCP** menu offers copy-and-go install for Claude Code, Cursor, and
|
|
189
|
+
VS Code (shown once [`deployment.site`](/docs/deployment) is set).
|
|
190
|
+
|
|
191
|
+
`search_docs` runs its own full-text index, so it works regardless of your
|
|
192
|
+
[search](/docs/configuration/search) provider — and even when search is set to
|
|
193
|
+
`none`. The MCP server is a separate feature from on-page search.
|
|
194
|
+
|
|
195
|
+
### Server output required
|
|
196
|
+
|
|
197
|
+
The MCP server is a live endpoint (`/mcp`), so it can't run on a static build.
|
|
198
|
+
Switch to server output and pick an adapter:
|
|
199
|
+
|
|
200
|
+
```ts blume.config.ts lineNumbers
|
|
201
|
+
deployment: {
|
|
202
|
+
output: "server",
|
|
203
|
+
adapter: "node", // or "vercel" | "netlify" | "cloudflare"
|
|
204
|
+
site: "https://docs.example.com",
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
A static build with `mcp.enabled` fails fast with a message telling you to set
|
|
209
|
+
`deployment.output` to `server`. See [Deployment](/docs/deployment) for the
|
|
210
|
+
adapters. Once deployed, connect from Claude Code with:
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
claude mcp add --transport http my-docs https://docs.example.com/mcp
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## Agent skill
|
|
217
|
+
|
|
218
|
+
Building a Blume site with the help of a coding agent? Install the Blume
|
|
219
|
+
[agent skill](https://docs.claude.com/en/docs/claude-code/skills) so it knows
|
|
220
|
+
how Blume works without you explaining it:
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
npx skills add haydenbleasel/blume
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
The skill teaches the agent what Blume is and how to scaffold, write, and
|
|
227
|
+
configure a site, and points it at the full docs bundled in the installed
|
|
228
|
+
package (`node_modules/blume/docs`).
|