- 16 cross-shell utilities converted to sh/bash chezmoi executables: ai c2p cp-appid extract_agents fab gdc gh-sonr-org-migrate ghg-clone ghn gho git-summary launch_omp_livediff_overlay lc-elir mdcp mdp pj (ghg-clone not named ghg: unrelated cargo binary owns that name) - cwd/history helpers stay per-shell: yy c cd clip-last + ghg/ghn/gho cd-wrappers in bash/functions/ and zsh/functions/, loaded by rc files - fish keeps only shell-state functions; converted ones now hit PATH - cp-appid ignore gating moved to .local/bin path - dot_agents/skills: 82 skills materialized from dotstate storage so dot_claude skill symlinks resolve on fresh bootstrap; dotstate profile/symlinks.json released .agents/skills .bashrc .zshrc
10 KiB
Docusaurus → Blume
Docusaurus is a React site; navigation comes from sidebars.js (explicit or autogenerated) plus per-folder _category_.json. Admonitions are already directive syntax, which eases the content transform — but note the source major version: v2 (MDX v1) and v3 (MDX v3) have different content hazards, called out below.
Detect
docusaurus.config.{js,ts}at the root; asidebars.{js,ts}file and per-folder_category_.jsonfiles.- Content under
docs/(often plusblog/,src/pages/,static/,versioned_docs/);@docusaurus/*deps. - v2 vs v3: check the
@docusaurus/coremajor inpackage.json.
Config: docusaurus.config → blume.config.ts
Read themeConfig, presets, and plugins:
| Docusaurus | Blume |
|---|---|
title |
title |
tagline |
description |
themeConfig.navbar.title / .logo |
title / logo (move the image into public/) |
themeConfig.navbar.items (doc items) |
navigation.tabs (for section links) |
themeConfig.navbar.items (external/utility links — Blog, GitHub, Discord…) |
navigation.featured ({ label, href, icon? }, pinned above the sidebar on every route); the GitHub link → the github config instead |
themeConfig.colorMode.defaultMode |
theme.mode (respectPrefersColorScheme: true → "system") |
themeConfig.prism.theme / .darkTheme |
markdown.codeBlocks.theme: { light, dark } (map Prism theme names to Shiki themes, e.g. github/github-dark) |
themeConfig.metadata / themeConfig.image |
per-page seo frontmatter / seo.og; report what doesn't fit |
url + baseUrl |
url → drop (deployment.site auto-detects); baseUrl (when not /) → deployment.base |
preset docs.routeBasePath — including the default! |
Docusaurus serves docs at /docs/… by default; the "map only declared fields" rule does not apply here because the URLs are load-bearing. Either keep them with top-level basePath: "/docs" (invisible to the sidebar), or intentionally move to root and emit a redirects entry per page. Decide explicitly and say which. (routeBasePath: '/' = docs-only mode — nothing to do.) |
preset docs.editUrl |
github (owner/repo/branch; a path after the branch → github.dir) |
themeConfig.footer |
drop → Footer override (defineComponents layout slot) |
themeConfig.announcementBar |
banner ({ content, dismissible, id } — isCloseable → dismissible; colors drop) |
i18n.locales / defaultLocale |
i18n — translated files live at i18n/<locale>/docusaurus-plugin-content-docs/current/…; move them to <locale>/… under content.root |
themeConfig.algolia |
drop — Blume ships built-in search (Orama); remove the Algolia dep |
@docusaurus/plugin-client-redirects |
static redirects: [{from, to}] arrays convert 1:1 to Blume redirects (a from array = one entry per item); only createRedirects functions are truly dynamic → host rules |
@docusaurus/theme-mermaid |
delete the dep — ```mermaid renders natively (in .mdx) |
remark-math + rehype-katex |
delete — block $$…$$ renders in .mdx with no config (no markdown.math field exists); inline $…$ is not supported — convert or drop (report) |
Multi-instance docs plugins (plugin-content-docs with id) |
one folder (and usually one navigation.tabs entry) per instance |
Static assets — required move
Every Docusaurus repo serves static/ at the site root (static/img/foo.png → /img/foo.png). Blume serves public/. Move static/* (and any extra staticDirectories) into public/ — all root-relative references then keep resolving unchanged. Without this, every image and download 404s.
Navigation: sidebars.js + _category_.json
- Autogenerated sidebar (
{ type: 'autogenerated', dirName: '...' }) → Blume's default filesystem navigation. Docusaurus strips numeric prefixes (01-) exactly like Blume, so the convention round-trips; no config needed. - Explicit sidebar (arrays of doc IDs, categories, links) → restructure into folders where possible; use
navigation.sidebaronly for shapes files can't express. A category{ type: 'category', label, items }→ a folder (label →meta.tstitle);collapsed→meta.tscollapsed(nodisplayfield inmeta.ts— if collapse matters, set the globalnavigation.sidebar.display: "group"once in config). _category_.json(also.yml) ({ label, position, collapsed, collapsible, link, className, customProps }) → a foldermeta.ts:label→title,position→order,collapsed→collapsed.link.type: 'generated-index'→ anindexpage in the folder — and the old URL was/docs/category/<slug>, so add a redirect and rewrite inbound links.link.type: 'doc'→ make that doc the folder'sindex.collapsible/className/customProps→ drop (report).src/pages/— inventory, don't nuke. Nearly every repo has a React landing page (src/pages/index.tsx) and often extra Markdown pages. Markdown pages → content pages; the React home page → rebuild as a docs index or a custom.astropage undercontent.pages— report either way.
Versioned docs
Docusaurus versioned_docs/version-X/ + versions.json (+ versioned_sidebars/) → recommend migrating the latest released version only. Mind the URL scheme: by default the latest release serves at /docs/ and the work-in-progress docs/ folder serves at /docs/next (lastVersion: 'current' flips this) — pick the folder that matches what users see at /docs/. If older versions must stay, put each under its own folder and wire a navigation.selectors entry of kind: "version".
Blog
A Docusaurus blog/ → Blume type: blog pages. Dates come from filenames/folders (2024-01-31-foo.md) — extract each into date frontmatter and strip the date from the filename (the old dated URLs /blog/2024/01/31/foo need redirects). Strip <!-- truncate --> / {/* truncate */} markers. authors.yml refs → inline author objects in each post's authors frontmatter. RSS stays at /blog/rss.xml on both sides.
Content & components
.mdvs.mdx— both majors need renames, for opposite reasons. Blume parses.mdas plain Markdown: no directives, no JSX, no$$math, no mermaid/package-install fences. v3 treats.mdas MDX (so a.mdwith imports/JSX/{}renders them as literal text in Blume); v2 content is looser MDX v1. Rule: rename any.mdthat contains admonitions, JSX, imports, or math to.mdx— for typical Docusaurus repos that is most files.- Admonitions are directives — but check the version. v3:
:::note,:::tip,:::info,:::warning,:::dangerpass through;:::caution→:::warning(or rely on Blume's alias); titles:::note[Title]work. v2: titles are space-separated (:::note Your Title) — rewrite to brackets or the title is silently lost; and v2's:::warningrendered red/danger — audit whether it should become:::danger. - Tabs:
<Tabs>/<TabItem label="…" value="…">→<Tabs>/<Tab title="…">. DropgroupId/queryString/value; strip the@theme/Tabsimports. - Theme JSX in content:
<DocCardList/>(standard on category index pages) → hand-writeCard/CardGrouplinks or delete (a Blume group page lists its children);<TOCInline/>→ drop (report);<CodeBlock>JSX → a fenced code block;<Admonition>→ the matching directive;<details>/<summary>→<Accordion>/<AccordionItem>or leave as raw HTML. @theme/*/@site/*imports — strip@theme/*(Blume injects components globally); rewrite@site/asset/module paths to/publicURLs or inline. MDX partials (_partial.mdximports) → inline the partial's body (Blume's default**/_*exclude already hides the partial files themselves).- Code blocks:
title="file.js"→ works as-is;showLineNumbers→lineNumbers; magic comments (// highlight-next-line,highlight-start/end) →{ranges}or// [!code highlight]— unconverted they ship as literal comments in every sample;```bash npm2yarn→```package-install. - MDX v1 (v2 sources) pitfalls: unescaped
</{in prose, HTML comments<!-- -->(→{/* */}), stringstyle="…"attributes (→ objects). Fix as build errors surface.
Frontmatter
| Docusaurus | Blume |
|---|---|
title / description |
pass through |
id |
usually drop (routing is filesystem-based); use slug to pin a route |
slug |
slug |
sidebar_label |
sidebar.label |
sidebar_position |
sidebar.order |
unlisted |
hidden: true + noindex: true |
last_update.date |
lastModified |
draft |
draft |
tags |
search.tags (or drop if only used for the blog tag index) |
image |
seo.image |
keywords |
drop → use seo |
sidebar_class_name / sidebar_custom_props / pagination_next / pagination_prev / pagination_label / hide_title / hide_table_of_contents / toc_min_heading_level / toc_max_heading_level / displayed_sidebar / custom_edit_url |
drop (report) |
Remove any duplicated H1 in the body — title renders the H1.
Icons
Docusaurus has no built-in icon-name system (icons are usually inline SVG/emoji/CSS). Where you add sidebar/tab icons, use Lucide names. Convert any FontAwesome/react-icons usage in content to Lucide <Icon> or drop it.
Teardown
Remove @docusaurus/* and Algolia deps; delete docusaurus.config.*, sidebars.*, babel.config.js, and src/ theme customizations (after the src/pages/ inventory above; re-implement what matters via defineComponents layout slots or blume eject). Repoint start/build/serve scripts → blume dev/blume build/blume preview; add blume.
Dropped — report these
Custom/swizzled theme components (layout slots or blume eject), footer columns, Algolia config, sidebar_custom_props and the other dropped frontmatter keys, createRedirects functions (→ host rules), React pages under src/pages/, <TOCInline>, per-category className/customProps, and any @theme/* component with no Blume equivalent.