Fumadocs

Markdown

How to write documents

Introduction

Fumadocs provides many useful extensions to MDX, a markup language. Here is a brief introduction to the default MDX syntax of Fumadocs UI.

MDX is not the only supported format of Fumadocs. In fact, you can use any renderers such as next-mdx-remote or CMS.

MDX

We recommend MDX, a superset of Markdown with support of JSX syntax. It allows you to import components, and use them right in the document, or even export values.

See:

---
title: This is a document
---
 
import { Component } from './component';
 
<Component name="Hello" />
 
# Heading
 
## Heading
 
### Heading
 
#### Heading
 
Hello World, **Bold**, _Italic_, ~~Hidden~~
 
```js
console.log('Hello World');
```
 
1. First
2. Second
3. Third
 
- Item 1
- Item 2
 
> Quote here
 
![alt](/image.png)
 
| Table | Description |
| ----- | ----------- |
| Hello | World       |

Images

Images are automatically optimized for next/image.

![Image](/image.png)

Internal links use the next/link component to allow prefetching and avoid hard-reload.

External links will get the default rel="noreferrer noopener" target="_blank" attributes for security.

[My Link](https://github.github.com/gfm)
 
This also works: https://github.github.com/gfm.

Cards

Useful for adding links, it is included by default.

<Cards>
  <Card
    href="https://nextjs.org/docs/app/building-your-application/data-fetching/fetching-caching-and-revalidating"
    title="Fetching, Caching, and Revalidating"
  >
    Learn more about caching in Next.js
  </Card>
  <Card title="href is optional">Learn more about `fetch` in Next.js.</Card>
</Cards>

Fetching, Caching, and Revalidating

Learn more about caching in Next.js

href is optional

Learn more about fetch in Next.js.

Icon

You can specify an icon to cards.

import { HomeIcon } from 'lucide-react';
 
<Cards>
  <Card icon={<HomeIcon />} href="/" title="Home">
    Go back to home
  </Card>
</Cards>

"Further Reading" Section

You can do something like:

page.tsx
import { getPageTreePeers } from 'fumadocs-core/server';
import { source } from '@/lib/source';
 
<Cards>
  {getPageTreePeers(source.pageTree, '/docs/my-page').map((peer) => (
    <Card key={peer.url} title={peer.name} href={peer.url}>
      {peer.description}
    </Card>
  ))}
</Cards>;

This will show the other pages in the same folder as cards.

Callouts

Useful for adding tips/warnings, it is included by default. You can specify the type of callout:

  • info (default)
  • warn
  • error
<Callout>Hello World</Callout>
 
<Callout title="Title">Hello World</Callout>
 
<Callout title="Title" type="error">
  Hello World
</Callout>
Hello World

Title

Hello World

Title

Hello World

Headings

An anchor is automatically applied to each heading, it sanitizes invalid characters like spaces. (e.g. Hello World to hello-world)

# Hello `World`

TOC Settings

The table of contents (TOC) will be generated based on headings, you can also customise the effects of headings:

# Heading [!toc]
 
This heading will be hidden from TOC.
 
# Another Heading [toc]
 
This heading will **only** be visible in TOC, you can use it to add additional TOC items.
Like headings rendered in a React component:
 
<MyComp />

Custom Anchor

You can add [#slug] to customise heading anchors.

# heading [#my-heading-id]

You can also chain it with TOC settings like:

# heading [toc] [#my-heading-id]

To link people to a specific heading, add the heading id to hash fragment: /page#my-heading-id.

Codeblock

Syntax Highlighting is supported by default using Rehype Code.

```js
console.log('Hello World');
```

You can add a title to the codeblock.

```js title="My Title"
console.log('Hello World');
```

Shiki Transformers

We support some of the Shiki Transformers, allowing you to highlight/style specific lines.

```tsx
// highlight a line
<div>Hello World</div>  // [!code highlight]
 
// highlight a word
// [\!code word:Fumadocs]
<div>Fumadocs</div>
 
// diff styles
console.log('hewwo'); // [\!code --]
console.log('hello'); // [\!code ++]
```
// highlight a line
<div>Hello World</div>
 
// highlight a word
<div>Fumadocs</div>
 
// diff styles:
console.log('hewwo');
console.log('hello');

Tab Groups

You can use code blocks with the <Tab /> component.

import { Tab, Tabs } from 'fumadocs-ui/components/tabs';
 
```ts tab="Tab 1"
console.log('A');
```
 
```ts tab="Tab 2"
console.log('B');
```

Note that you can add MDX components instead of importing them in MDX files.

console.log('A');

Using Typescript Twoslash

Write Typescript codeblocks with hover type information and detected types errors.

Not enabled by default. See Twoslash.

Include

This is only available on Fumadocs MDX.

Reference another Markdown/MDX or code example file. Specify the target file path in <include> tag (relative to the MDX file itself).

page.mdx
<include>./another.mdx</include>

See Include.

Optional

You can see a list of plugins provided by Fumadocs.

Math Equations

Write math equations with TeX.

```math
f(x) = x * e^{2 pi i \xi x}
```
f(x)=xe2piiξxf(x) = x * e^{2 pi i \xi x}

To enable, see Math Integration.

Package Install

Generate code blocks for installing packages via package managers (JS/Node.js).

```package-install
npm i next -D
```
npm i next -D

To enable, see Remark Install.

How is this guide?

On this page