Skip to main content

Docusaurus Convert Command

Converts a Docusaurus docs folder to Mintlify-ready MDX files. Applies all known structural and syntax transformations automatically, and copies non-Markdown files (images, etc.) as-is.

Usage​

writechoice docusaurus convert <folder> [options]

Arguments​

ArgumentDescription
<folder>Path to the Docusaurus project root (contains a docs/ subfolder) or directly to a docs folder

Options​

OptionDescriptionDefault
-o, --output <dir>Output directory for converted filesmintlify
--dry-runPreview conversions without writing filesfalse
--quietSuppress terminal outputfalse

headingAnchors (config-only, no CLI flag — see Config File below): when enabled, converts an explicit Docusaurus heading ID (### Text {#id}) into a Mintlify <Heading> component so old #anchor links keep resolving.

What Gets Converted​

Admonitions → Mintlify callout components​

Docusaurus :::type blocks are converted to Mintlify JSX components:

DocusaurusMintlify
:::note<Note>
:::tip<Tip>
:::info<Info>
:::warning<Warning>
:::caution<Warning>
:::danger<Danger>
:::success<Check>
<!-- Before -->
:::note
This is a note.
:::

<!-- After -->
<Note>
This is a note.
</Note>

Titled admonitions (:::note[My Title]) have the title rendered as bold text inside the component.

Tabs → Mintlify Tabs​

<!-- Before -->
<Tabs groupId="os">
<TabItem value="mac" label="macOS">macOS steps</TabItem>
<TabItem value="win" label="Windows">Windows steps</TabItem>
</Tabs>

<!-- After -->
<Tabs>
<Tab title="macOS">macOS steps</Tab>
<Tab title="Windows">Windows steps</Tab>
</Tabs>

Accordions → Mintlify Accordion​

<!-- Before -->
<details>
<summary>Click to expand</summary>
Hidden content here.
</details>

<!-- After -->
<Accordion title="Click to expand">
Hidden content here.
</Accordion>

H1 reconciliation with frontmatter​

Handles all combinations of H1 heading and title frontmatter:

SituationResult
H1 equals titleH1 removed (duplicate)
H1 differs from titleH1 becomes new title; old title moves to sidebarTitle
No title in frontmatterH1 becomes title, H1 removed from body
No frontmatter at allFrontmatter created with title from H1

Frontmatter key renames​

Docusaurus keyMintlify key
sidebar_labelsidebarTitle

All other frontmatter keys are preserved as-is.

Theme imports removed​

<!-- Removed automatically -->
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
import Admonition from '@docusaurus/Admonition';
<!-- Before -->
[See setup](./installation.md)
[API reference](../api/index.mdx#authentication)

<!-- After -->
[See setup](./installation)
[API reference](../api/index#authentication)

Images — paths converted and wrapped in <Frame>​

  • Absolute Docusaurus paths (/img/foo.png) → /static/img/foo.png
  • Relative paths are resolved and converted where possible
  • All standalone images are wrapped in <Frame>
<!-- Before -->
![Dashboard](/img/dashboard.png)

<!-- After -->
<Frame>![Dashboard](/static/img/dashboard.png)</Frame>

The static/ folder from the Docusaurus project root is also copied to <output>/static/.

Snippets — _-prefixed files routed to snippets/​

Files whose names start with _ or that live inside a _snippets/ directory are moved into the snippets/ output folder. Import paths in other files are rewritten to use the Mintlify absolute /snippets/... path.

HTML comments → JSX comments​

<!-- Before -->
<!-- This is a comment -->

<!-- After -->
{/* This is a comment */}

Void tags — self-closed for JSX​

Raw HTML void elements surviving from Docusaurus source (<img>, <br>, <hr>, ...) are self-closed, since MDX compiles as JSX and requires them to be — same fixer as wcc fix void-tags, skipping code fences and inline code.

<!-- Before -->
<img src="/img/logo.png">

<!-- After -->
<img src="/img/logo.png" />

Examples​

# Convert a Docusaurus project root
writechoice docusaurus convert ./my-docusaurus-site

# Convert just a docs subfolder
writechoice docusaurus convert ./my-docusaurus-site/docs

# Preview without writing
writechoice docusaurus convert ./my-docusaurus-site --dry-run

# Write to a custom output directory
writechoice docusaurus convert ./my-docusaurus-site --output ./converted

Output Structure​

Given a Docusaurus project at ./my-site:

my-site/
├── docs/
│ ├── intro.md
│ ├── tutorial/
│ │ └── basics.mdx
│ └── _shared/
│ └── _note.mdx ← snippet
└── static/
└── img/
└── logo.png

Running writechoice docusaurus convert ./my-site produces:

mintlify/
├── intro.mdx
├── tutorial/
│ └── basics.mdx
├── snippets/
│ └── _shared/
│ └── _note.mdx
└── static/
└── img/
└── logo.png

Typical Workflow​

This command is step 1 of a three-step Docusaurus → Mintlify migration:

# 1. Convert all files
writechoice docusaurus convert ./my-docusaurus-site

# 2. Rename files to match their frontmatter slug/id
writechoice docusaurus slugify ./mintlify

# 3. Generate Mintlify navigation from sidebars.js
writechoice docusaurus nav ./my-docusaurus-site/sidebars.js --prefix mintlify

Config File​

{
"docusaurus": {
"output": "mintlify",
"headingAnchors": false,
"dry-run": false,
"quiet": false
}
}