Migrating from Mintlify
Most Mintlify pages build in writedocs with no changes: the components, props, code-block syntax, and frontmatter below are accepted under Mintlify’s own names. Copy your MDX files over, then check the known differences.
Converting docs.json
In your Mintlify project’s folder, run:
writedocs convert --mintlifyIt writes writedocs.json from docs.json and lists everything that couldn’t be carried over as-is, then checks your pages - see writedocs convert. Pass --dry-run first to review the result without writing anything.
What it converts:
| docs.json | writedocs.json |
|---|---|
name, description | Same fields. |
colors.primary, colors.light | styles.colors.primary, styles.colors.dark.primary. |
logo, favicon, fonts, background, styling.codeblocks | The matching styles fields. |
navigation - pages, groups, tabs, dropdowns, products, versions, languages | The same structure. A group’s root becomes its page. |
navigation anchors | Tabs. |
A tab’s or product’s menu | Dropdowns inside it. |
navigation.global anchors, tabs and dropdowns | Global dropdowns - or topbar links, when the navigation is a plain list of pages. |
Groups with an openapi spec | OpenAPI groups. A group that listed individual endpoints now shows every endpoint in its spec. |
navbar.links, navbar.primary | Topbar links. |
footer.socials, footer.links | socials, footer.columns. |
banner, errors.404, redirects, variables | banner, notFound, redirects, variables. |
seo.metatags (og:image, og:type, twitter:card, keywords) | seo. |
contextual.options | contextMenu. |
integrations - GA4, Google Tag Manager, Plausible, Fathom, PostHog | integrations. |
api.playground.proxy | api.proxy. |
Everything else is listed in the report, with the field it came from. Hidden tabs and groups are left out of the navigation - their pages still build, reachable by URL. After converting, set domain in writedocs.json to your site’s address: Mintlify sets it in its dashboard, not docs.json.
CLI commands
| Mintlify | writedocs |
|---|---|
mint dev | writedocs dev |
mint broken-links | writedocs broken-links - also checks #anchors. |
mint openapi-check | writedocs validate - checks every spec in the navigation, and every page’s openapi operation, with the rest of the project. |
mint a11y | writedocs a11y |
Components
| Mintlify | In writedocs |
|---|---|
Note, Info, Tip, Warning, Danger, Check | Same names. See Callout. |
Callout with icon / color | Same props. |
Card with icon, img, href, color, horizontal, cta, arrow | Same props. See Card. |
Columns, Column, CardGroup | Same names. |
Tabs / Tab with defaultTabIndex, icon | Same props. See Tabs. |
CodeGroup | Same name. Tab labels come from each block’s title. |
Accordion / AccordionGroup with icon, description, defaultOpen | Same props. See Accordion. |
Steps / Step with icon, stepNumber, titleSize | Same props. See Steps. |
Frame with caption, hint | Same props. See Frame. |
Tooltip with tip, headline, cta, href | Same props. Also available as Hint. See Hint. |
ParamField (path / query / body / header), ResponseField | Same props, including deprecated, pre, post. See Parameter. |
Expandable, RequestExample, ResponseExample, Badge, Icon | Same names. |
Update | Same props. See Update. |
Tree / FileTree, Tree.Folder, Tree.File - component or Markdown-list form | Same props and keyboard navigation. See Tree. |
Tile | Same props. See Tile. |
Panel | Same behavior. See Panel. |
Prompt with description, icon, actions | Same props. See Prompt. |
View with title, icon | Same props, and the table of contents follows the selected view. See View. |
Color, Color.Row, Color.Item | Same props, including light/dark values. See Color. |
GitHub.Repo | Same props. See GitHub repository. |
Visibility | Same behavior on the site and in the page’s Markdown version. See Visibility. |
className on any component | Same - added to the component’s outermost element. |
CodeBlock | Same props. See Code blocks. |
Snippets imported from /snippets/... | Same path. See Snippets. |
| React hooks without imports, components defined in a page | Work as on Mintlify, interactive. See Snippets. |
openapi: "/spec.json GET /path" page frontmatter | Same form - the page shows that operation. See OpenAPI. |
Icons
A bare icon name is looked up in Lucide first, then Font Awesome Solid, then Font Awesome Brands. Mintlify’s default library is Font Awesome, so names like gear, circle-info, or discord work as-is. See Icons.
Code blocks
Mintlify’s code-block options work as written: an inline title (```bash Install), title="...", highlight={1,3-5}, focus={2}, icon="...", lines, wrap, expandable, and nocopy. See Code blocks.
Frontmatter
title, description, and openapi mean the same thing, and a page without a title gets one from its file name, as on Mintlify. A page doesn’t need frontmatter at all if the navigation lists it. These Mintlify fields are also accepted:
sidebarTitle,icon,tag, anddeprecated- how the page appears in the sidebar.hidden- leaves the page out of navigation but keeps its URL working, and noindexes it.url- makes the sidebar entry an external link, and redirects the page’s URL there.hideFooterPaginationandhideApiMarker- hide the previous/next links, or the sidebar’s HTTP method badge.noindex,keywords,og:image,og:type,twitter:card- the same as writedocs’seofields.
See Frontmatter for each one.
mode: wideandmode: custom- the same modes.mode: centerrenders as writedocs’framemode (no sidebar, no table of contents).mode: assistantrenders as a normal page.
Tailwind classes
Tailwind utility classes in your MDX are generated as they are on Mintlify, and dark: follows the site’s light/dark toggle. Mintlify’s light/dark image pair works unchanged:
<img className="block dark:hidden" src="/images/light.png" />
<img className="hidden dark:block" src="/images/dark.png" />Known differences
After copying your pages over, run writedocs validate. It lists everything that needs attention in one pass, with file and line - pages that would fail the build, and components or icons writedocs doesn’t have. Then run writedocs broken-links to find links that don’t lead anywhere.
-
Components writedocs doesn’t have - every component in Mintlify’s documentation is available. Anything else, like a custom React component from your Mintlify project, doesn’t fail the build: it shows only the content inside it, with a warning naming the file and line. Move it into a snippet, or remove it.
-
mode: frame- Mintlify’sframeis a blank canvas that keeps the sidebar. writedocs’framehas no sidebar and keeps the page’s title and normal layout. The page builds, but looks different - a custom landing page with its own hero shows writedocs’ title above it. -
Components inside a page’s own React component - in a page component that uses React hooks or is passed to a snippet,
Card,Calloutand the other writedocs components render just their content,Iconrenders nothing, andCodeBlockrenders unhighlighted.writedocs validatelists each one. A component passed to a snippet as a prop renders, but isn’t interactive. -
Font Awesome Pro and
iconType- only the free Font Awesome Solid and Brands sets are installed.iconTypeis ignored, so the icon renders from whichever set has the name (Lucide first), and a Pro-only icon name is left out, with a warning. -
Frontmatter with no equivalent -
searchable,boost,related,contextual,groups,timestamp,lastUpdatedDate, and SEO keys other than the five above (for example"twitter:image") are ignored for now. -
Updateand RSS - writedocs doesn’t generate an RSS feed fromUpdateentries, so theirrssprop does nothing. The tag filters appear above the first entry, not in a side panel. -
Paneloutside the default mode - on Mintlify, a page mode without a table of contents also hides itsPanel. In writedocs, thePanelstays in the page instead. -
Variables -
{{name}}works for names made of letters, digits and underscores. A name with a hyphen isn’t valid in MDX - write it as[[name]]. -
Relative links - writedocs page URLs end in a slash (
/docs/guides/setup/), so a relative link resolves one level deeper than on Mintlify:[Install](install)on that page points to/docs/guides/setup/install/. Write links from the site root instead (/docs/guides/install/).writedocs broken-linksfinds each one and says what to write. -
Redirects with a pattern - Mintlify’s
/old/:slugand/old/*redirects aren’t supported; writedocs redirects match one exact path.convertleaves them out and says how many. -
noindexand on-site search - on Mintlify,noindex(andhidden) also removes the page from the site’s own search. In writedocs, the page still shows up in on-site search.