blume 0.0.0 → 0.1.0

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.
Files changed (263) hide show
  1. package/bin/blume.mjs +18 -0
  2. package/dist/cli/index.js +11989 -0
  3. package/dist/cli/index.js.map +141 -0
  4. package/docs/01-quickstart.mdx +99 -0
  5. package/docs/02-deployment.mdx +129 -0
  6. package/docs/advanced/api-reference.mdx +114 -0
  7. package/docs/advanced/blog.mdx +121 -0
  8. package/docs/advanced/changelog.mdx +113 -0
  9. package/docs/advanced/custom-pages.mdx +187 -0
  10. package/docs/advanced/meta.ts +7 -0
  11. package/docs/changelog/v0-1-0.mdx +12 -0
  12. package/docs/changelog/v0-2-0.mdx +16 -0
  13. package/docs/configuration/ai.mdx +228 -0
  14. package/docs/configuration/analytics.mdx +98 -0
  15. package/docs/configuration/customization.mdx +91 -0
  16. package/docs/configuration/export.mdx +70 -0
  17. package/docs/configuration/index.mdx +271 -0
  18. package/docs/configuration/meta.ts +15 -0
  19. package/docs/configuration/search.mdx +172 -0
  20. package/docs/configuration/seo.mdx +196 -0
  21. package/docs/configuration/theming.mdx +178 -0
  22. package/docs/content/components.mdx +565 -0
  23. package/docs/content/i18n.mdx +205 -0
  24. package/docs/content/index.mdx +161 -0
  25. package/docs/content/islands.mdx +94 -0
  26. package/docs/content/meta.mdx +119 -0
  27. package/docs/content/meta.ts +15 -0
  28. package/docs/content/navigation.mdx +168 -0
  29. package/docs/content/sources.mdx +216 -0
  30. package/docs/content/syntax.mdx +445 -0
  31. package/docs/index.mdx +112 -0
  32. package/docs/reference/cli.mdx +43 -0
  33. package/docs/reference/frontmatter.mdx +74 -0
  34. package/docs/reference/meta.ts +7 -0
  35. package/package.json +140 -6
  36. package/src/ai/ask.ts +93 -0
  37. package/src/ai/llms.ts +65 -0
  38. package/src/ai/markdown.ts +31 -0
  39. package/src/ai/mcp/data.ts +74 -0
  40. package/src/ai/mcp/discovery.ts +49 -0
  41. package/src/ai/mcp/server.ts +225 -0
  42. package/src/ai/mcp/tools.ts +47 -0
  43. package/src/assets/icon.png +0 -0
  44. package/src/astro/generate.ts +878 -0
  45. package/src/astro/index.ts +4 -0
  46. package/src/astro/integration.ts +74 -0
  47. package/src/astro/islands.ts +131 -0
  48. package/src/astro/markdown-negotiation.ts +68 -0
  49. package/src/astro/pages.ts +28 -0
  50. package/src/astro/templates.ts +1199 -0
  51. package/src/cli/commands/add.ts +81 -0
  52. package/src/cli/commands/build.ts +103 -0
  53. package/src/cli/commands/dev.ts +108 -0
  54. package/src/cli/commands/doctor.ts +74 -0
  55. package/src/cli/commands/eject.ts +57 -0
  56. package/src/cli/commands/init.ts +98 -0
  57. package/src/cli/commands/migrate.ts +39 -0
  58. package/src/cli/commands/preview.ts +39 -0
  59. package/src/cli/commands/sync.ts +52 -0
  60. package/src/cli/commands/validate.ts +60 -0
  61. package/src/cli/index.ts +35 -0
  62. package/src/cli/log.ts +37 -0
  63. package/src/cli/prepare.ts +80 -0
  64. package/src/components/Icon.astro +99 -0
  65. package/src/components/content/Accordion.astro +8 -0
  66. package/src/components/content/AccordionItem.astro +121 -0
  67. package/src/components/content/AutoTypeTable.astro +51 -0
  68. package/src/components/content/Badge.astro +124 -0
  69. package/src/components/content/Callout.astro +73 -0
  70. package/src/components/content/Card.astro +104 -0
  71. package/src/components/content/CardGroup.astro +14 -0
  72. package/src/components/content/CodeGroup.astro +13 -0
  73. package/src/components/content/Color.astro +15 -0
  74. package/src/components/content/ColorItem.astro +87 -0
  75. package/src/components/content/ColorRow.astro +10 -0
  76. package/src/components/content/Column.astro +6 -0
  77. package/src/components/content/Columns.astro +9 -0
  78. package/src/components/content/Expandable.astro +11 -0
  79. package/src/components/content/FileTree.astro +8 -0
  80. package/src/components/content/Frame.astro +70 -0
  81. package/src/components/content/GithubInfo.astro +110 -0
  82. package/src/components/content/Math.astro +24 -0
  83. package/src/components/content/Panel.astro +20 -0
  84. package/src/components/content/Prompt.astro +129 -0
  85. package/src/components/content/Step.astro +34 -0
  86. package/src/components/content/Steps.astro +20 -0
  87. package/src/components/content/Tab.astro +40 -0
  88. package/src/components/content/Tabs.astro +273 -0
  89. package/src/components/content/Tile.astro +42 -0
  90. package/src/components/content/Tooltip.astro +68 -0
  91. package/src/components/content/Tree.astro +300 -0
  92. package/src/components/content/TreeFile.astro +15 -0
  93. package/src/components/content/TreeFolder.astro +62 -0
  94. package/src/components/content/TypeTable.astro +106 -0
  95. package/src/components/content/Update.astro +66 -0
  96. package/src/components/content/Visibility.astro +12 -0
  97. package/src/components/content/Warning.astro +9 -0
  98. package/src/components/content/auto-type-table.ts +141 -0
  99. package/src/components/content/github-info.ts +79 -0
  100. package/src/components/content/mermaid-element.ts +68 -0
  101. package/src/components/github-mark.ts +9 -0
  102. package/src/components/index.ts +14 -0
  103. package/src/components/islands/AskAI.astro +12 -0
  104. package/src/components/islands/ask-ai.tsx +156 -0
  105. package/src/components/layout/Analytics.astro +63 -0
  106. package/src/components/layout/Banner.astro +50 -0
  107. package/src/components/layout/Breadcrumbs.astro +31 -0
  108. package/src/components/layout/Favicon.astro +15 -0
  109. package/src/components/layout/Fonts.astro +14 -0
  110. package/src/components/layout/Header.astro +188 -0
  111. package/src/components/layout/LanguageSwitcher.astro +56 -0
  112. package/src/components/layout/NavTree.astro +462 -0
  113. package/src/components/layout/PageActions.astro +438 -0
  114. package/src/components/layout/PageFeedback.astro +58 -0
  115. package/src/components/layout/Pagination.astro +56 -0
  116. package/src/components/layout/ReferenceLayout.astro +102 -0
  117. package/src/components/layout/RootLayout.astro +533 -0
  118. package/src/components/layout/Search.astro +608 -0
  119. package/src/components/layout/TableOfContents.astro +68 -0
  120. package/src/components/layout/analytics-client.ts +38 -0
  121. package/src/components/layout/nav-utils.ts +87 -0
  122. package/src/components/layout/overrides.ts +32 -0
  123. package/src/components/layout/search/algolia.ts +43 -0
  124. package/src/components/layout/search/endpoint.ts +22 -0
  125. package/src/components/layout/search/flexsearch.ts +52 -0
  126. package/src/components/layout/search/orama-cloud.ts +41 -0
  127. package/src/components/layout/search/orama.ts +26 -0
  128. package/src/components/layout/search/pagefind.ts +43 -0
  129. package/src/components/layout/search/types.ts +163 -0
  130. package/src/components/layout/search/typesense.ts +60 -0
  131. package/src/components/layout/toc-element.ts +108 -0
  132. package/src/core/bridge.ts +92 -0
  133. package/src/core/config.ts +112 -0
  134. package/src/core/content.ts +50 -0
  135. package/src/core/define-components.ts +34 -0
  136. package/src/core/define-meta.ts +20 -0
  137. package/src/core/deployment-env.ts +73 -0
  138. package/src/core/diagnostics.ts +104 -0
  139. package/src/core/graph.ts +128 -0
  140. package/src/core/i18n-ui.ts +171 -0
  141. package/src/core/i18n.ts +169 -0
  142. package/src/core/last-modified.ts +88 -0
  143. package/src/core/links.ts +336 -0
  144. package/src/core/load-module.ts +15 -0
  145. package/src/core/manifest.ts +126 -0
  146. package/src/core/meta.ts +97 -0
  147. package/src/core/navigation.ts +392 -0
  148. package/src/core/package-root.ts +37 -0
  149. package/src/core/project-graph.ts +153 -0
  150. package/src/core/project.ts +56 -0
  151. package/src/core/schema.ts +1057 -0
  152. package/src/core/server-features.ts +23 -0
  153. package/src/core/sources/assets.ts +77 -0
  154. package/src/core/sources/cache.ts +122 -0
  155. package/src/core/sources/filesystem.ts +99 -0
  156. package/src/core/sources/mdx-remote.ts +216 -0
  157. package/src/core/sources/mintlify.ts +161 -0
  158. package/src/core/sources/normalize.ts +227 -0
  159. package/src/core/sources/notion.ts +440 -0
  160. package/src/core/sources/portable-text.ts +143 -0
  161. package/src/core/sources/read.ts +36 -0
  162. package/src/core/sources/resolve.ts +158 -0
  163. package/src/core/sources/sanity.ts +218 -0
  164. package/src/core/sources/types.ts +105 -0
  165. package/src/core/types.ts +261 -0
  166. package/src/core/ui-packs/ar.ts +47 -0
  167. package/src/core/ui-packs/bg.ts +47 -0
  168. package/src/core/ui-packs/bn.ts +47 -0
  169. package/src/core/ui-packs/ca.ts +47 -0
  170. package/src/core/ui-packs/cs.ts +47 -0
  171. package/src/core/ui-packs/da.ts +47 -0
  172. package/src/core/ui-packs/de.ts +47 -0
  173. package/src/core/ui-packs/el.ts +47 -0
  174. package/src/core/ui-packs/es.ts +47 -0
  175. package/src/core/ui-packs/fa.ts +47 -0
  176. package/src/core/ui-packs/fi.ts +47 -0
  177. package/src/core/ui-packs/fr.ts +47 -0
  178. package/src/core/ui-packs/he.ts +47 -0
  179. package/src/core/ui-packs/hi.ts +47 -0
  180. package/src/core/ui-packs/hr.ts +47 -0
  181. package/src/core/ui-packs/hu.ts +47 -0
  182. package/src/core/ui-packs/id.ts +47 -0
  183. package/src/core/ui-packs/index.ts +87 -0
  184. package/src/core/ui-packs/it.ts +47 -0
  185. package/src/core/ui-packs/ja.ts +47 -0
  186. package/src/core/ui-packs/ko.ts +47 -0
  187. package/src/core/ui-packs/nl.ts +47 -0
  188. package/src/core/ui-packs/no.ts +47 -0
  189. package/src/core/ui-packs/pl.ts +47 -0
  190. package/src/core/ui-packs/pt-br.ts +47 -0
  191. package/src/core/ui-packs/pt.ts +47 -0
  192. package/src/core/ui-packs/ro.ts +47 -0
  193. package/src/core/ui-packs/ru.ts +47 -0
  194. package/src/core/ui-packs/sk.ts +47 -0
  195. package/src/core/ui-packs/sr.ts +47 -0
  196. package/src/core/ui-packs/sv.ts +47 -0
  197. package/src/core/ui-packs/th.ts +47 -0
  198. package/src/core/ui-packs/tr.ts +47 -0
  199. package/src/core/ui-packs/uk.ts +47 -0
  200. package/src/core/ui-packs/vi.ts +47 -0
  201. package/src/core/ui-packs/zh-tw.ts +47 -0
  202. package/src/core/ui-packs/zh.ts +47 -0
  203. package/src/core/version.ts +23 -0
  204. package/src/deploy/robots.ts +20 -0
  205. package/src/deploy/rss.ts +128 -0
  206. package/src/deploy/sitemap.ts +28 -0
  207. package/src/index.ts +27 -0
  208. package/src/markdown/code-title.ts +71 -0
  209. package/src/markdown/directives.ts +83 -0
  210. package/src/markdown/heading-anchors.ts +137 -0
  211. package/src/markdown/index.ts +159 -0
  212. package/src/markdown/inline-code.ts +108 -0
  213. package/src/markdown/language-icon.ts +172 -0
  214. package/src/markdown/math.ts +32 -0
  215. package/src/markdown/mdast.ts +48 -0
  216. package/src/markdown/mermaid.ts +37 -0
  217. package/src/markdown/package-commands.ts +159 -0
  218. package/src/markdown/package-install.ts +40 -0
  219. package/src/migrate/fumadocs/config.ts +106 -0
  220. package/src/migrate/fumadocs/content.ts +365 -0
  221. package/src/migrate/fumadocs/frontmatter.ts +18 -0
  222. package/src/migrate/fumadocs/index.ts +252 -0
  223. package/src/migrate/fumadocs/meta.ts +114 -0
  224. package/src/migrate/migrate.ts +53 -0
  225. package/src/migrate/mintlify/config.ts +1040 -0
  226. package/src/migrate/mintlify/content.ts +98 -0
  227. package/src/migrate/mintlify/frontmatter.ts +126 -0
  228. package/src/migrate/mintlify/i18n.ts +51 -0
  229. package/src/migrate/mintlify/icons.ts +128 -0
  230. package/src/migrate/mintlify/index.ts +266 -0
  231. package/src/migrate/mintlify/snippets.ts +305 -0
  232. package/src/migrate/mintlify/transform.ts +81 -0
  233. package/src/migrate/nextra/content.ts +46 -0
  234. package/src/migrate/nextra/frontmatter.ts +40 -0
  235. package/src/migrate/nextra/index.ts +374 -0
  236. package/src/migrate/nextra/meta.ts +266 -0
  237. package/src/migrate/shared.ts +623 -0
  238. package/src/migrate/starlight/config.ts +459 -0
  239. package/src/migrate/starlight/content.ts +78 -0
  240. package/src/migrate/starlight/frontmatter.ts +111 -0
  241. package/src/migrate/starlight/i18n.ts +54 -0
  242. package/src/migrate/starlight/index.ts +131 -0
  243. package/src/og/card.ts +92 -0
  244. package/src/og/index.ts +2 -0
  245. package/src/openapi/scalar.ts +246 -0
  246. package/src/registry/eject.ts +263 -0
  247. package/src/registry/registry.ts +100 -0
  248. package/src/registry/rewrite-imports.ts +39 -0
  249. package/src/runtime/index.ts +14 -0
  250. package/src/search/build.ts +23 -0
  251. package/src/search/documents.ts +165 -0
  252. package/src/search/orama-index.ts +66 -0
  253. package/src/search/providers.ts +91 -0
  254. package/src/search/sync/algolia.ts +30 -0
  255. package/src/search/sync/index.ts +50 -0
  256. package/src/search/sync/orama-cloud.ts +40 -0
  257. package/src/search/sync/typesense.ts +65 -0
  258. package/src/seo/jsonld.ts +113 -0
  259. package/src/theme/entry.ts +608 -0
  260. package/src/theme/fonts.ts +198 -0
  261. package/src/theme/icons.ts +184 -0
  262. package/src/theme/palette.ts +143 -0
  263. package/src/theme/twoslash.ts +81 -0
@@ -0,0 +1,99 @@
1
+ ---
2
+ title: Quickstart
3
+ description: Install Blume, scaffold a project, and ship your first page in minutes.
4
+ sidebar:
5
+ label: Quickstart
6
+ order: 1
7
+ ---
8
+
9
+ Go from an empty folder to a running docs site in a few commands. Blume needs
10
+ **Node.js 22 or newer** and a `docs/` folder with at least one `.md` or `.mdx`
11
+ file — there's nothing else to set up.
12
+
13
+ ## Install and run
14
+
15
+ <Steps>
16
+ <Step title="Install Blume">
17
+ Add the package to a new or existing project.
18
+
19
+ ```package-install
20
+ npm i blume
21
+ ```
22
+
23
+ </Step>
24
+ <Step title="Scaffold a project">
25
+ `blume init` creates the minimum surface: a content folder and a config file.
26
+
27
+ ```bash
28
+ blume init
29
+ ```
30
+
31
+ ```txt
32
+ docs/
33
+ index.mdx
34
+ blume.config.ts
35
+ ```
36
+
37
+ </Step>
38
+ <Step title="Start the dev server">
39
+ Blume generates the runtime and serves your docs with hot reload.
40
+
41
+ ```bash
42
+ blume dev
43
+ ```
44
+
45
+ </Step>
46
+ <Step title="Build for production">
47
+ Static HTML is written to `dist/`, with a local search index built over it.
48
+
49
+ ```bash
50
+ blume build
51
+ ```
52
+
53
+ </Step>
54
+ </Steps>
55
+
56
+ :::tip
57
+ Blume works with any package manager and never requires you to set up Astro or
58
+ Tailwind yourself.
59
+ :::
60
+
61
+ ## Write your first page
62
+
63
+ Every page is Markdown or MDX with a little frontmatter — the `title` and
64
+ `description` render as the page heading and intro automatically. Drop this into
65
+ `docs/index.mdx`:
66
+
67
+ ```mdx docs/index.mdx lineNumbers
68
+ ---
69
+ title: Introduction
70
+ description: Welcome to my docs.
71
+ ---
72
+
73
+ Welcome! Use **Markdown** and built-in components — no imports required:
74
+
75
+ :::note
76
+ Blume ships callouts, cards, tabs, steps, and more.
77
+ :::
78
+ ```
79
+
80
+ Save it, and the dev server reloads instantly. Navigation, search, and page
81
+ metadata are inferred from your files as you add them — keep writing, and the
82
+ site keeps up.
83
+
84
+ ## Next steps
85
+
86
+ <CardGroup cols={2}>
87
+ <Card title="Configuration" href="/docs/configuration" icon="file">
88
+ Tune the title, theme, search, and deployment.
89
+ </Card>
90
+ <Card title="Components" href="/docs/content/components" icon="folder">
91
+ Explore the built-in component library.
92
+ </Card>
93
+ <Card title="AI" href="/docs/configuration/ai" icon="lightbulb">
94
+ Ship `llms.txt` and an Ask AI assistant.
95
+ </Card>
96
+ <Card title="Deployment" href="/docs/deployment" icon="rocket">
97
+ Go live on any static host.
98
+ </Card>
99
+ </CardGroup>
@@ -0,0 +1,129 @@
1
+ ---
2
+ title: Deployment
3
+ description: Deploy static docs to any host, or switch to server rendering with an adapter.
4
+ sidebar:
5
+ label: Deployment
6
+ order: 2
7
+ ---
8
+
9
+ ## Deploy anywhere (static)
10
+
11
+ `blume build` compiles your docs to plain HTML, CSS, and a local search index in
12
+ `dist/`. There's no server to run — point any static host at the folder.
13
+
14
+ | Setting | Value |
15
+ | ---------------- | ------------- |
16
+ | Build command | `blume build` |
17
+ | Output directory | `dist` |
18
+ | Node version | 22 or newer |
19
+
20
+ These settings work on Vercel, Netlify, Cloudflare Pages, GitHub Pages, Amazon
21
+ S3 + CloudFront, or any bucket or CDN. Make sure `blume` is a dependency so the
22
+ host can run the build.
23
+
24
+ A static build includes:
25
+
26
+ - every docs and custom page as static HTML
27
+ - a local search index (Orama by default, Pagefind opt-in)
28
+ - a [`sitemap.xml`](/docs/configuration/seo#sitemap) and [`robots.txt`](/docs/configuration/seo#robots) when `deployment.site` is set
29
+ - `llms.txt` and `llms-full.txt` for AI tools
30
+ - redirect pages
31
+ - prerendered [Open Graph images](/docs/configuration/seo#open-graph-images) when `seo.og.enabled` is on
32
+
33
+ ### Set your site URL
34
+
35
+ Sitemaps, canonical tags, RSS, and Open Graph images need an absolute origin. On
36
+ **Vercel**, **Netlify**, and **Cloudflare Pages**, Blume detects it from the
37
+ platform's environment at build time — no config required.
38
+
39
+ Set `deployment.site` to override the detected value, or to provide one on hosts
40
+ that don't expose it (GitHub Pages, S3, a custom CDN):
41
+
42
+ ```ts blume.config.ts lineNumbers
43
+ deployment: {
44
+ site: "https://docs.example.com",
45
+ }
46
+ ```
47
+
48
+ When detecting automatically, Blume prefers your stable production domain over
49
+ per-deploy preview URLs, so the canonical origin stays put across deploys.
50
+
51
+ During `blume dev`, the site URL falls back to your local dev server (e.g.
52
+ `http://localhost:4321`) when none is set, so site-gated features — Open Graph
53
+ images, canonicals, the sitemap — work out of the box. Builds never use this
54
+ fallback, so production output is never pointed at localhost.
55
+
56
+ ## Preview locally
57
+
58
+ Before you ship, preview the production build exactly as a static host would
59
+ serve it:
60
+
61
+ ```bash
62
+ blume build
63
+ blume preview
64
+ ```
65
+
66
+ ## Subpath deploys
67
+
68
+ Serving docs under a path like `example.com/docs`? Set `deployment.base` — common
69
+ for GitHub Pages project sites. Internal links and assets are rewritten to
70
+ include the base path.
71
+
72
+ ```ts blume.config.ts lineNumbers
73
+ deployment: {
74
+ base: "/docs",
75
+ }
76
+ ```
77
+
78
+ ## Server rendering
79
+
80
+ Static output covers most docs. Switch to server output when you need
81
+ request-time features — most notably the [Ask AI](/docs/configuration/ai) endpoint:
82
+
83
+ ```ts blume.config.ts lineNumbers
84
+ deployment: {
85
+ output: "server",
86
+ adapter: "vercel",
87
+ }
88
+ ```
89
+
90
+ Choosing an adapter pulls in the matching Astro adapter automatically:
91
+
92
+ | Adapter | Package | Use for |
93
+ | ------------ | --------------------- | ------------------------------------ |
94
+ | `vercel` | `@astrojs/vercel` | Vercel — the most polished path |
95
+ | `netlify` | `@astrojs/netlify` | Netlify Functions |
96
+ | `node` | `@astrojs/node` | Self-hosted Node servers, containers |
97
+ | `cloudflare` | `@astrojs/cloudflare` | Cloudflare Workers and Pages |
98
+
99
+ On **Vercel**, **Netlify**, and **Cloudflare Pages**, Blume picks the matching
100
+ adapter automatically for server output — set `output: "server"` and deploy. Set
101
+ `adapter` explicitly to override the detected value, or when self-hosting with
102
+ `node`.
103
+
104
+ A server build includes everything a static build does, plus any Astro endpoints
105
+ or middleware you add. The `node` adapter produces a standalone server you can
106
+ run directly.
107
+
108
+ :::note
109
+ Server features have their own configuration — for example, Ask AI needs a model
110
+ API key. See the [AI guide](/docs/configuration/ai) for setup.
111
+ :::
112
+
113
+ ## Redirects
114
+
115
+ Map old URLs to new ones in `blume.config.ts`:
116
+
117
+ ```ts blume.config.ts
118
+ redirects: [{ from: "/old", to: "/new", status: 301 }];
119
+ ```
120
+
121
+ `status` accepts `301`, `302`, `307`, or `308` (default `301`). Static builds
122
+ emit redirect pages; server builds handle redirects at request time.
123
+
124
+ ## Build summary
125
+
126
+ Every build prints a summary — output mode, adapter, resolved site URL, search
127
+ provider, redirect count, sitemap and `llms.txt` status, and any enabled server
128
+ features — so you can confirm what shipped (including anything auto-detected)
129
+ before you deploy.
@@ -0,0 +1,114 @@
1
+ ---
2
+ title: OpenAPI / AsyncAPI
3
+ description: Drop in an OpenAPI or AsyncAPI spec and get an interactive reference, rendered by Scalar.
4
+ ---
5
+
6
+ Point Blume at an OpenAPI or AsyncAPI spec and it generates an interactive API
7
+ reference — schemas, authentication, examples, and a request playground — on its
8
+ own route. The reference is rendered by [Scalar](https://scalar.com), not by
9
+ Blume: API reference isn't core to Blume, so the whole surface is delegated to a
10
+ tool that has already solved its large edge-case space.
11
+
12
+ ```ts blume.config.ts lineNumbers
13
+ openapi: {
14
+ enabled: true,
15
+ spec: "https://petstore3.swagger.io/api/v3/openapi.json",
16
+ }
17
+ ```
18
+
19
+ That mounts the reference at `/reference` and adds a header link to it. The
20
+ `spec` is either an `http(s)` URL or a path to a local file in your project.
21
+
22
+ :::note
23
+ The reference mounts inside Blume's shell — your navbar stays on top — but the
24
+ body is a **self-contained Scalar embed** with its own sidebar, search, and
25
+ theme. By design it doesn't weave into Blume's content sidebar, site search, or
26
+ `llms.txt`.
27
+ :::
28
+
29
+ ## A local spec
30
+
31
+ A relative path is resolved from your project root and inlined at build time, so
32
+ nothing is copied into your source tree and the page works offline:
33
+
34
+ ```ts blume.config.ts lineNumbers
35
+ openapi: {
36
+ enabled: true,
37
+ spec: "./openapi.yaml",
38
+ }
39
+ ```
40
+
41
+ Both JSON and YAML specs work; Scalar auto-detects the format.
42
+
43
+ ## Route
44
+
45
+ `route` controls where the reference mounts (and the header link's target):
46
+
47
+ ```ts blume.config.ts lineNumbers
48
+ openapi: {
49
+ enabled: true,
50
+ route: "/api",
51
+ spec: "./openapi.yaml",
52
+ }
53
+ ```
54
+
55
+ ## Multiple specs
56
+
57
+ Use `sources` to publish more than one spec. Each source gets its own route and
58
+ header link. Give each a `label` (used for the link and to derive its route), or
59
+ set an explicit `route`:
60
+
61
+ ```ts blume.config.ts lineNumbers
62
+ openapi: {
63
+ enabled: true,
64
+ sources: [
65
+ { label: "Public API", spec: "./public.json" }, // → /reference/public-api
66
+ { label: "Admin API", route: "/admin", spec: "./admin.json" },
67
+ ],
68
+ }
69
+ ```
70
+
71
+ `spec` is shorthand for a single-entry `sources`, so you only reach for `sources`
72
+ when you have more than one.
73
+
74
+ ## AsyncAPI
75
+
76
+ Event-driven APIs use a sibling `asyncapi` block with the **same shape** — Scalar
77
+ renders AsyncAPI through the same component. Only the default route differs
78
+ (`/events`):
79
+
80
+ ```ts blume.config.ts lineNumbers
81
+ asyncapi: {
82
+ enabled: true,
83
+ spec: "./asyncapi.yaml",
84
+ }
85
+ ```
86
+
87
+ :::warning
88
+ Scalar's AsyncAPI support is still a work in progress — it renders channels,
89
+ operations, messages, and a Models section, but there's **no interactive
90
+ playground** for events yet. It improves upstream over time.
91
+ :::
92
+
93
+ ## Theming
94
+
95
+ By default Blume layers your [accent and radius](/docs/configuration/theming) onto
96
+ Scalar's theme so the reference doesn't feel jarring. It's best-effort, not
97
+ pixel-identical — Scalar carries its own design system. To pick a specific
98
+ [Scalar theme](https://github.com/scalar/scalar) instead, set `theme`:
99
+
100
+ ```ts blume.config.ts lineNumbers
101
+ openapi: {
102
+ enabled: true,
103
+ spec: "./openapi.yaml",
104
+ theme: "purple",
105
+ }
106
+ ```
107
+
108
+ ## The playground and CORS
109
+
110
+ Scalar's "Try it" playground calls your **target API directly from the
111
+ browser** — Blume doesn't proxy the request. For it to succeed, the API must
112
+ allow cross-origin requests from the docs site (send the appropriate
113
+ `Access-Control-Allow-Origin` headers). This is a property of the API being
114
+ documented, not of Blume.
@@ -0,0 +1,121 @@
1
+ ---
2
+ title: Blog
3
+ description: Publish posts as content, get an RSS feed and article structured data for free, and build a custom index page.
4
+ ---
5
+
6
+ A blog in Blume is just content with a type. Mark a page `type: blog` and Blume
7
+ gives it an RSS feed and richer article metadata automatically. Unlike the
8
+ [changelog](/docs/advanced/changelog), there's no generated index page — you compose
9
+ the landing page yourself, which keeps the design entirely in your hands.
10
+
11
+ ## Write a post
12
+
13
+ A post is a regular `.md` or `.mdx` page with `type: blog` in its frontmatter. By
14
+ convention posts live under `blog/`, but the type — not the folder — is what
15
+ matters:
16
+
17
+ ```mdx blog/introducing-blume.mdx lineNumbers
18
+ ---
19
+ title: Introducing Blume
20
+ type: blog
21
+ date: 2026-06-22
22
+ description: Why we built a markdown-first docs framework.
23
+ ---
24
+
25
+ Documentation should be fast, AI-ready, and zero-config — down to not needing a
26
+ starter template at all. Here's the thinking behind Blume.
27
+ ```
28
+
29
+ Give every post a `date` so feed items sort newest-first and carry a `pubDate`,
30
+ and a `description` — it's used for both the feed summary and SEO.
31
+
32
+ ## The RSS feed
33
+
34
+ Blume builds a blog feed at **`/blog/rss.xml`**, sorted newest-first by `date`.
35
+ Feeds need an absolute site URL, so set [`deployment.site`](/docs/deployment); Blume
36
+ then injects a `<link rel="alternate">` tag on every page so readers discover it
37
+ automatically.
38
+
39
+ The feed is on by default. Tune it under [`seo.rss`](/docs/configuration/seo#rss-feeds):
40
+
41
+ ```ts blume.config.ts lineNumbers
42
+ seo: {
43
+ rss: {
44
+ enabled: true,
45
+ types: ["blog", "changelog"],
46
+ limit: 50,
47
+ },
48
+ }
49
+ ```
50
+
51
+ Remove `"blog"` from `rss.types` to skip the feed.
52
+
53
+ ## Structured data
54
+
55
+ When [structured data](/docs/configuration/seo#structured-data) is on, each post is
56
+ emitted as a schema.org **`BlogPosting`** with its description and publish date —
57
+ the richer article type search engines expect for blog content.
58
+
59
+ ## Building an index
60
+
61
+ Blume doesn't generate a `/blog` landing page, so you build one. The simplest
62
+ option is a content page that links to each post by hand:
63
+
64
+ ```mdx blog/index.mdx lineNumbers
65
+ ---
66
+ title: Blog
67
+ description: News and writing from the team.
68
+ ---
69
+
70
+ <CardGroup cols={2}>
71
+ <Card title="Introducing Blume" href="/blog/introducing-blume">
72
+ Why we built a markdown-first docs framework.
73
+ </Card>
74
+ </CardGroup>
75
+ ```
76
+
77
+ To list posts automatically instead, add a [custom page](/docs/advanced/custom-pages)
78
+ at `pages/blog/index.astro` that reads from Astro's `docs` content collection and
79
+ pairs each entry with its route from `blume:data`:
80
+
81
+ ```astro pages/blog/index.astro lineNumbers
82
+ ---
83
+ import { getCollection } from "astro:content";
84
+ import data from "blume:data";
85
+
86
+ const routeById = new Map(data.routes.map((route) => [route.id, route.path]));
87
+
88
+ const posts = (await getCollection("docs"))
89
+ .filter((entry) => entry.data.type === "blog" && !entry.data.draft)
90
+ .map((entry) => ({
91
+ date: entry.data.date,
92
+ description: entry.data.description,
93
+ href: routeById.get(entry.id),
94
+ title: entry.data.title,
95
+ }))
96
+ .toSorted((a, b) => Number(new Date(b.date)) - Number(new Date(a.date)));
97
+ ---
98
+
99
+ <ul>
100
+ {
101
+ posts.map((post) => (
102
+ <li>
103
+ <a href={post.href}>{post.title}</a>
104
+ <p>{post.description}</p>
105
+ </li>
106
+ ))
107
+ }
108
+ </ul>
109
+ ```
110
+
111
+ See [Custom Pages](/docs/advanced/custom-pages#using-the-site-layout) for wrapping this
112
+ in the full site layout.
113
+
114
+ <CardGroup cols={2}>
115
+ <Card title="Custom Pages" href="/docs/advanced/custom-pages" icon="folder">
116
+ Mount the blog index and read from blume:data.
117
+ </Card>
118
+ <Card title="SEO" href="/docs/configuration/seo" icon="file">
119
+ Feeds, Open Graph images, and structured data.
120
+ </Card>
121
+ </CardGroup>
@@ -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>