Hovering a call shows that call's own resolved signature again. Repeated calls of the same function, such as two z.enum([...]) calls with different values, all showed the first call's signature, since the hover cache did not tell call sites apart.
Shiki stays the default, and isn't loaded when you highlight code with another highlighter.
fumadocs-core/highlight exports a Highlighter interface, created with createHighlights() from fumadocs-core/highlight/highlights (@pierre/highlights) or createShikiHighlighter() from fumadocs-core/highlight/shiki, override() creates one with other options.
rehypeCodeFromHighlighter from fumadocs-core/mdx-plugins/rehype-code.core highlights code blocks with a highlighter, or a function creating one with the transformers of Fumadocs. createRehypeCode is deprecated, Sätteri has rehypeCodeFromHighlighter in @fumadocs/satteri/rehype-code. Pass transformerTwoslash() in its transformers option to analyze Twoslash blocks in batches.
createServerCodeBlock() and createDynamicCodeBlock() in Fumadocs UI create code blocks from a highlighter. Dynamic code blocks are highlighted on the server too.
toJsx() from fumadocs-core/utils/hast-to-jsx converts hast into React elements like toJsxRuntime() of hast-util-to-jsx-runtime, MDX nodes through an evaluator, over 10x faster on highlighted code, whose spans render as one HTML string. Every Fumadocs renderer uses it, hast-util-to-jsx-runtime is no longer a dependency.
Twoslash loads the languages of code blocks in popups before highlighting, an unknown language there no longer fails the code block.
OpenAPI Standalone highlights code blocks with Highlights, in its server-rendered pages too.
The page factories of OpenAPI, GraphQL and AsyncAPI, type tables, createPython(), createPythonComponents(), localHtml() and the shadcn createSnippet() take a highlighter.
Deprecated shiki and shikiOptions of the API pages and shiki of type tables, pass a highlighter instead.
Integrations require fumadocs-core 16.17.8, the API pages and shadcn also require fumadocs-ui 16.17.8.
TypeScript 7.1
Twoslash, type tables and story controls run on the stable API of TypeScript 7.1 (typescript@7.1.0-beta), with code loaded as in-memory files.
Twoslash no longer writes code blocks to the .twoslash directory, you can remove it from .gitignore.
Twoslash completions work in the global scope, relative paths in compiler options (like paths) resolve from cwd.
No tsconfig.fumadocs-typescript.json or tsconfig.fumadocs-story.json is generated.
Type tables are 2.4x faster on large API references, each from a program of its file and the files it imports.
The transform option of type tables gets the checker of TypeScript 7.1, typeToString() takes TypeFormatFlags.
Bring your own highlighter
Shiki stays the default, and isn't loaded when you highlight code with another highlighter.
fumadocs-core/highlight exports a Highlighter interface, created with createHighlights() from fumadocs-core/highlight/highlights (@pierre/highlights) or createShikiHighlighter() from fumadocs-core/highlight/shiki, override() creates one with other options.
rehypeCodeFromHighlighter from fumadocs-core/mdx-plugins/rehype-code.core highlights code blocks with a highlighter, or a function creating one with the transformers of Fumadocs. createRehypeCode is deprecated, Sätteri has rehypeCodeFromHighlighter in @fumadocs/satteri/rehype-code. Pass transformerTwoslash() in its transformers option to analyze Twoslash blocks in batches.
createServerCodeBlock() and createDynamicCodeBlock() in Fumadocs UI create code blocks from a highlighter. Dynamic code blocks are highlighted on the server too.
toJsx() from fumadocs-core/utils/hast-to-jsx converts hast into React elements like toJsxRuntime() of hast-util-to-jsx-runtime, MDX nodes through an evaluator, over 10x faster on highlighted code, whose spans render as one HTML string. Every Fumadocs renderer uses it, hast-util-to-jsx-runtime is no longer a dependency.
Twoslash loads the languages of code blocks in popups before highlighting, an unknown language there no longer fails the code block.
OpenAPI Standalone highlights code blocks with Highlights, in its server-rendered pages too.
The page factories of OpenAPI, GraphQL and AsyncAPI, type tables, createPython(), createPythonComponents(), localHtml() and the shadcn createSnippet() take a highlighter.
Deprecated shiki and shikiOptions of the API pages and shiki of type tables, pass a highlighter instead.
Integrations require fumadocs-core 16.17.8, the API pages and shadcn also require fumadocs-ui 16.17.8.
TypeScript 7.1
Twoslash, type tables and story controls run on the stable API of TypeScript 7.1 (typescript@7.1.0-beta), with code loaded as in-memory files.
Twoslash no longer writes code blocks to the .twoslash directory, you can remove it from .gitignore.
Twoslash completions work in the global scope, relative paths in compiler options (like paths) resolve from cwd.
No tsconfig.fumadocs-typescript.json or tsconfig.fumadocs-story.json is generated.
Type tables are 2.4x faster on large API references, each from a program of its file and the files it imports.
The transform option of type tables gets the checker of TypeScript 7.1, typeToString() takes TypeFormatFlags.
Faster story controls in dev servers
Story files requested together share one TypeScript program, and Vite environments share their results. A cold start with 300 story files takes 4s instead of 30s, without blocking the Vite dev server.
Twoslash, type tables and story controls run on the stable API of TypeScript 7.1 (typescript@7.1.0-beta), with code loaded as in-memory files.
Twoslash no longer writes code blocks to the .twoslash directory, you can remove it from .gitignore.
Twoslash completions work in the global scope, relative paths in compiler options (like paths) resolve from cwd.
No tsconfig.fumadocs-typescript.json or tsconfig.fumadocs-story.json is generated.
Type tables are 2.4x faster on large API references, each from a program of its file and the files it imports.
The transform option of type tables gets the checker of TypeScript 7.1, typeToString() takes TypeFormatFlags.
Bring your own highlighter
Shiki stays the default, and isn't loaded when you highlight code with another highlighter.
fumadocs-core/highlight exports a Highlighter interface, created with createHighlights() from fumadocs-core/highlight/highlights (@pierre/highlights) or createShikiHighlighter() from fumadocs-core/highlight/shiki, override() creates one with other options.
rehypeCodeFromHighlighter from fumadocs-core/mdx-plugins/rehype-code.core highlights code blocks with a highlighter, or a function creating one with the transformers of Fumadocs. createRehypeCode is deprecated, Sätteri has rehypeCodeFromHighlighter in @fumadocs/satteri/rehype-code. Pass transformerTwoslash() in its transformers option to analyze Twoslash blocks in batches.
createServerCodeBlock() and createDynamicCodeBlock() in Fumadocs UI create code blocks from a highlighter. Dynamic code blocks are highlighted on the server too.
toJsx() from fumadocs-core/utils/hast-to-jsx converts hast into React elements like toJsxRuntime() of hast-util-to-jsx-runtime, MDX nodes through an evaluator, over 10x faster on highlighted code, whose spans render as one HTML string. Every Fumadocs renderer uses it, hast-util-to-jsx-runtime is no longer a dependency.
Twoslash loads the languages of code blocks in popups before highlighting, an unknown language there no longer fails the code block.
OpenAPI Standalone highlights code blocks with Highlights, in its server-rendered pages too.
The page factories of OpenAPI, GraphQL and AsyncAPI, type tables, createPython(), createPythonComponents(), localHtml() and the shadcn createSnippet() take a highlighter.
Deprecated shiki and shikiOptions of the API pages and shiki of type tables, pass a highlighter instead.
Integrations require fumadocs-core 16.17.8, the API pages and shadcn also require fumadocs-ui 16.17.8.
Processed Markdown links page-relative images at their served URLs
Images imported by Remark Image get the URLs bundlers serve them at in Remark LLMs, instead of their relative paths
Stringifiers output JS expressions with s.expression(), for Markdown only known at runtime
Search records of included content with images are no longer cut
The Sätteri preset only imports images in bundlers, at runtime it resolves their sizes like the MDX preset
<include> in Local Markdown
<include> is enabled by default in @fumadocs/local-md and @fumadocs/satteri/local-md, and pages reload when the files they include change, with both the Vite and dev server watchers.
invalidateFile() returns whether the source uses the file.
Both require fumadocs-core 16.17.8.
Bring your own highlighter
Shiki stays the default, and isn't loaded when you highlight code with another highlighter.
fumadocs-core/highlight exports a Highlighter interface, created with createHighlights() from fumadocs-core/highlight/highlights (@pierre/highlights) or createShikiHighlighter() from fumadocs-core/highlight/shiki, override() creates one with other options.
rehypeCodeFromHighlighter from fumadocs-core/mdx-plugins/rehype-code.core highlights code blocks with a highlighter, or a function creating one with the transformers of Fumadocs. createRehypeCode is deprecated, Sätteri has rehypeCodeFromHighlighter in @fumadocs/satteri/rehype-code. Pass transformerTwoslash() in its transformers option to analyze Twoslash blocks in batches.
createServerCodeBlock() and createDynamicCodeBlock() in Fumadocs UI create code blocks from a highlighter. Dynamic code blocks are highlighted on the server too.
toJsx() from fumadocs-core/utils/hast-to-jsx converts hast into React elements like toJsxRuntime() of hast-util-to-jsx-runtime, MDX nodes through an evaluator, over 10x faster on highlighted code, whose spans render as one HTML string. Every Fumadocs renderer uses it, hast-util-to-jsx-runtime is no longer a dependency.
Twoslash loads the languages of code blocks in popups before highlighting, an unknown language there no longer fails the code block.
OpenAPI Standalone highlights code blocks with Highlights, in its server-rendered pages too.
The page factories of OpenAPI, GraphQL and AsyncAPI, type tables, createPython(), createPythonComponents(), localHtml() and the shadcn createSnippet() take a highlighter.
Deprecated shiki and shikiOptions of the API pages and shiki of type tables, pass a highlighter instead.
Integrations require fumadocs-core 16.17.8, the API pages and shadcn also require fumadocs-ui 16.17.8.
Bring your own highlighter
Shiki stays the default, and isn't loaded when you highlight code with another highlighter.
fumadocs-core/highlight exports a Highlighter interface, created with createHighlights() from fumadocs-core/highlight/highlights (@pierre/highlights) or createShikiHighlighter() from fumadocs-core/highlight/shiki, override() creates one with other options.
rehypeCodeFromHighlighter from fumadocs-core/mdx-plugins/rehype-code.core highlights code blocks with a highlighter, or a function creating one with the transformers of Fumadocs. createRehypeCode is deprecated, Sätteri has rehypeCodeFromHighlighter in @fumadocs/satteri/rehype-code. Pass transformerTwoslash() in its transformers option to analyze Twoslash blocks in batches.
createServerCodeBlock() and createDynamicCodeBlock() in Fumadocs UI create code blocks from a highlighter. Dynamic code blocks are highlighted on the server too.
toJsx() from fumadocs-core/utils/hast-to-jsx converts hast into React elements like toJsxRuntime() of hast-util-to-jsx-runtime, MDX nodes through an evaluator, over 10x faster on highlighted code, whose spans render as one HTML string. Every Fumadocs renderer uses it, hast-util-to-jsx-runtime is no longer a dependency.
Twoslash loads the languages of code blocks in popups before highlighting, an unknown language there no longer fails the code block.
OpenAPI Standalone highlights code blocks with Highlights, in its server-rendered pages too.
The page factories of OpenAPI, GraphQL and AsyncAPI, type tables, createPython(), createPythonComponents(), localHtml() and the shadcn createSnippet() take a highlighter.
Deprecated shiki and shikiOptions of the API pages and shiki of type tables, pass a highlighter instead.
Integrations require fumadocs-core 16.17.8, the API pages and shadcn also require fumadocs-ui 16.17.8.
Bring your own highlighter
Shiki stays the default, and isn't loaded when you highlight code with another highlighter.
fumadocs-core/highlight exports a Highlighter interface, created with createHighlights() from fumadocs-core/highlight/highlights (@pierre/highlights) or createShikiHighlighter() from fumadocs-core/highlight/shiki, override() creates one with other options.
rehypeCodeFromHighlighter from fumadocs-core/mdx-plugins/rehype-code.core highlights code blocks with a highlighter, or a function creating one with the transformers of Fumadocs. createRehypeCode is deprecated, Sätteri has rehypeCodeFromHighlighter in @fumadocs/satteri/rehype-code. Pass transformerTwoslash() in its transformers option to analyze Twoslash blocks in batches.
createServerCodeBlock() and createDynamicCodeBlock() in Fumadocs UI create code blocks from a highlighter. Dynamic code blocks are highlighted on the server too.
toJsx() from fumadocs-core/utils/hast-to-jsx converts hast into React elements like toJsxRuntime() of hast-util-to-jsx-runtime, MDX nodes through an evaluator, over 10x faster on highlighted code, whose spans render as one HTML string. Every Fumadocs renderer uses it, hast-util-to-jsx-runtime is no longer a dependency.
Twoslash loads the languages of code blocks in popups before highlighting, an unknown language there no longer fails the code block.
OpenAPI Standalone highlights code blocks with Highlights, in its server-rendered pages too.
The page factories of OpenAPI, GraphQL and AsyncAPI, type tables, createPython(), createPythonComponents(), localHtml() and the shadcn createSnippet() take a highlighter.
Deprecated shiki and shikiOptions of the API pages and shiki of type tables, pass a highlighter instead.
Integrations require fumadocs-core 16.17.8, the API pages and shadcn also require fumadocs-ui 16.17.8.
Value rows of auth providers accept end
The Value row an auth provider renders can take end, which shows after the input, like a button that fills the value. The playground already rendered it, now its type has it.
Parameter examples follow the selected request example
When a parameter has an example under the same key as a request body example, that example's request uses it, so each example can show its own path, query, header or cookie values. Without a matching key, a parameter still uses its first example.
renderParameterField can keep the default input
When renderParameterField returns undefined for a parameter, the playground renders its default input, so you can customize a few parameters without re-implementing the rest. Return null to render nothing.
Bring your own highlighter
Shiki stays the default, and isn't loaded when you highlight code with another highlighter.
fumadocs-core/highlight exports a Highlighter interface, created with createHighlights() from fumadocs-core/highlight/highlights (@pierre/highlights) or createShikiHighlighter() from fumadocs-core/highlight/shiki, override() creates one with other options.
rehypeCodeFromHighlighter from fumadocs-core/mdx-plugins/rehype-code.core highlights code blocks with a highlighter, or a function creating one with the transformers of Fumadocs. createRehypeCode is deprecated, Sätteri has rehypeCodeFromHighlighter in @fumadocs/satteri/rehype-code. Pass transformerTwoslash() in its transformers option to analyze Twoslash blocks in batches.
createServerCodeBlock() and createDynamicCodeBlock() in Fumadocs UI create code blocks from a highlighter. Dynamic code blocks are highlighted on the server too.
toJsx() from fumadocs-core/utils/hast-to-jsx converts hast into React elements like toJsxRuntime() of hast-util-to-jsx-runtime, MDX nodes through an evaluator, over 10x faster on highlighted code, whose spans render as one HTML string. Every Fumadocs renderer uses it, hast-util-to-jsx-runtime is no longer a dependency.
Twoslash loads the languages of code blocks in popups before highlighting, an unknown language there no longer fails the code block.
OpenAPI Standalone highlights code blocks with Highlights, in its server-rendered pages too.
The page factories of OpenAPI, GraphQL and AsyncAPI, type tables, createPython(), createPythonComponents(), localHtml() and the shadcn createSnippet() take a highlighter.
Deprecated shiki and shikiOptions of the API pages and shiki of type tables, pass a highlighter instead.
Integrations require fumadocs-core 16.17.8, the API pages and shadcn also require fumadocs-ui 16.17.8.
Watch the dependencies of local content
Integrations call file.addDependency(path) for the files a parsed file depends on, like included files. A change to them invalidates the file, and the Vite & dev server watchers watch them, even outside the content directory.
invalidateFile() returns whether the source uses the file, onDependency() listens to the dependencies. Custom sources passed to the watchers need both.
watchWithVite() called after the Vite server started now watches content directories outside of Vite's root.
Bring your own highlighter
Shiki stays the default, and isn't loaded when you highlight code with another highlighter.
fumadocs-core/highlight exports a Highlighter interface, created with createHighlights() from fumadocs-core/highlight/highlights (@pierre/highlights) or createShikiHighlighter() from fumadocs-core/highlight/shiki, override() creates one with other options.
rehypeCodeFromHighlighter from fumadocs-core/mdx-plugins/rehype-code.core highlights code blocks with a highlighter, or a function creating one with the transformers of Fumadocs. createRehypeCode is deprecated, Sätteri has rehypeCodeFromHighlighter in @fumadocs/satteri/rehype-code. Pass transformerTwoslash() in its transformers option to analyze Twoslash blocks in batches.
createServerCodeBlock() and createDynamicCodeBlock() in Fumadocs UI create code blocks from a highlighter. Dynamic code blocks are highlighted on the server too.
toJsx() from fumadocs-core/utils/hast-to-jsx converts hast into React elements like toJsxRuntime() of hast-util-to-jsx-runtime, MDX nodes through an evaluator, over 10x faster on highlighted code, whose spans render as one HTML string. Every Fumadocs renderer uses it, hast-util-to-jsx-runtime is no longer a dependency.
Twoslash loads the languages of code blocks in popups before highlighting, an unknown language there no longer fails the code block.
OpenAPI Standalone highlights code blocks with Highlights, in its server-rendered pages too.
The page factories of OpenAPI, GraphQL and AsyncAPI, type tables, createPython(), createPythonComponents(), localHtml() and the shadcn createSnippet() take a highlighter.
Deprecated shiki and shikiOptions of the API pages and shiki of type tables, pass a highlighter instead.
Integrations require fumadocs-core 16.17.8, the API pages and shadcn also require fumadocs-ui 16.17.8.
Bring your own highlighter
Shiki stays the default, and isn't loaded when you highlight code with another highlighter.
fumadocs-core/highlight exports a Highlighter interface, created with createHighlights() from fumadocs-core/highlight/highlights (@pierre/highlights) or createShikiHighlighter() from fumadocs-core/highlight/shiki, override() creates one with other options.
rehypeCodeFromHighlighter from fumadocs-core/mdx-plugins/rehype-code.core highlights code blocks with a highlighter, or a function creating one with the transformers of Fumadocs. createRehypeCode is deprecated, Sätteri has rehypeCodeFromHighlighter in @fumadocs/satteri/rehype-code. Pass transformerTwoslash() in its transformers option to analyze Twoslash blocks in batches.
createServerCodeBlock() and createDynamicCodeBlock() in Fumadocs UI create code blocks from a highlighter. Dynamic code blocks are highlighted on the server too.
toJsx() from fumadocs-core/utils/hast-to-jsx converts hast into React elements like toJsxRuntime() of hast-util-to-jsx-runtime, MDX nodes through an evaluator, over 10x faster on highlighted code, whose spans render as one HTML string. Every Fumadocs renderer uses it, hast-util-to-jsx-runtime is no longer a dependency.
Twoslash loads the languages of code blocks in popups before highlighting, an unknown language there no longer fails the code block.
OpenAPI Standalone highlights code blocks with Highlights, in its server-rendered pages too.
The page factories of OpenAPI, GraphQL and AsyncAPI, type tables, createPython(), createPythonComponents(), localHtml() and the shadcn createSnippet() take a highlighter.
Deprecated shiki and shikiOptions of the API pages and shiki of type tables, pass a highlighter instead.
Integrations require fumadocs-core 16.17.8, the API pages and shadcn also require fumadocs-ui 16.17.8.
@fumadocs/base-ui@16.17.8
fumadocs-core@16.17.8
fumadocs-ui@16.17.8
Bring your own highlighter
Shiki stays the default, and isn't loaded when you highlight code with another highlighter.
fumadocs-core/highlight exports a Highlighter interface, created with createHighlights() from fumadocs-core/highlight/highlights (@pierre/highlights) or createShikiHighlighter() from fumadocs-core/highlight/shiki, override() creates one with other options.
rehypeCodeFromHighlighter from fumadocs-core/mdx-plugins/rehype-code.core highlights code blocks with a highlighter, or a function creating one with the transformers of Fumadocs. createRehypeCode is deprecated, Sätteri has rehypeCodeFromHighlighter in @fumadocs/satteri/rehype-code. Pass transformerTwoslash() in its transformers option to analyze Twoslash blocks in batches.
createServerCodeBlock() and createDynamicCodeBlock() in Fumadocs UI create code blocks from a highlighter. Dynamic code blocks are highlighted on the server too.
toJsx() from fumadocs-core/utils/hast-to-jsx converts hast into React elements like toJsxRuntime() of hast-util-to-jsx-runtime, MDX nodes through an evaluator, over 10x faster on highlighted code, whose spans render as one HTML string. Every Fumadocs renderer uses it, hast-util-to-jsx-runtime is no longer a dependency.
Twoslash loads the languages of code blocks in popups before highlighting, an unknown language there no longer fails the code block.
OpenAPI Standalone highlights code blocks with Highlights, in its server-rendered pages too.
The page factories of OpenAPI, GraphQL and AsyncAPI, type tables, createPython(), createPythonComponents(), localHtml() and the shadcn createSnippet() take a highlighter.
Deprecated shiki and shikiOptions of the API pages and shiki of type tables, pass a highlighter instead.
Integrations require fumadocs-core 16.17.8, the API pages and shadcn also require fumadocs-ui 16.17.8.
remarkInclude in fumadocs-core
<include> moved from Fumadocs MDX to fumadocs-core/mdx-plugins/remark-include, a unified plugin for any MDX or Markdown pipeline.
fumadocs-mdx/config still exports remarkInclude, forwarded from fumadocs-core.
getProcessor parses included files by their format, like a .md file included in an .mdx page.
Headings in an included section get IDs unique among the page's own headings.
Circular includes throw instead of hanging, and included code files no longer end with an empty line.
fumadocs-mdx requires fumadocs-core 16.17.8.
Processed Markdown links page-relative images at their served URLs
Images imported by Remark Image get the URLs bundlers serve them at in Remark LLMs, instead of their relative paths
Stringifiers output JS expressions with s.expression(), for Markdown only known at runtime
Search records of included content with images are no longer cut
The Sätteri preset only imports images in bundlers, at runtime it resolves their sizes like the MDX preset
remarkInclude in fumadocs-core
<include> moved from Fumadocs MDX to fumadocs-core/mdx-plugins/remark-include, a unified plugin for any MDX or Markdown pipeline.
fumadocs-mdx/config still exports remarkInclude, forwarded from fumadocs-core.
getProcessor parses included files by their format, like a .md file included in an .mdx page.
Headings in an included section get IDs unique among the page's own headings.
Circular includes throw instead of hanging, and included code files no longer end with an empty line.
fumadocs-mdx requires fumadocs-core 16.17.8.
<include> in Local Markdown
<include> is enabled by default in @fumadocs/local-md and @fumadocs/satteri/local-md, and pages reload when the files they include change, with both the Vite and dev server watchers.
invalidateFile() returns whether the source uses the file.
Both require fumadocs-core 16.17.8.
Bring your own highlighter
Shiki stays the default, and isn't loaded when you highlight code with another highlighter.
fumadocs-core/highlight exports a Highlighter interface, created with createHighlights() from fumadocs-core/highlight/highlights (@pierre/highlights) or createShikiHighlighter() from fumadocs-core/highlight/shiki, override() creates one with other options.
rehypeCodeFromHighlighter from fumadocs-core/mdx-plugins/rehype-code.core highlights code blocks with a highlighter, or a function creating one with the transformers of Fumadocs. createRehypeCode is deprecated, Sätteri has rehypeCodeFromHighlighter in @fumadocs/satteri/rehype-code. Pass transformerTwoslash() in its transformers option to analyze Twoslash blocks in batches.
createServerCodeBlock() and createDynamicCodeBlock() in Fumadocs UI create code blocks from a highlighter. Dynamic code blocks are highlighted on the server too.
toJsx() from fumadocs-core/utils/hast-to-jsx converts hast into React elements like toJsxRuntime() of hast-util-to-jsx-runtime, MDX nodes through an evaluator, over 10x faster on highlighted code, whose spans render as one HTML string. Every Fumadocs renderer uses it, hast-util-to-jsx-runtime is no longer a dependency.
Twoslash loads the languages of code blocks in popups before highlighting, an unknown language there no longer fails the code block.
OpenAPI Standalone highlights code blocks with Highlights, in its server-rendered pages too.
The page factories of OpenAPI, GraphQL and AsyncAPI, type tables, createPython(), createPythonComponents(), localHtml() and the shadcn createSnippet() take a highlighter.
Deprecated shiki and shikiOptions of the API pages and shiki of type tables, pass a highlighter instead.
Integrations require fumadocs-core 16.17.8, the API pages and shadcn also require fumadocs-ui 16.17.8.
Watch the dependencies of local content
Integrations call file.addDependency(path) for the files a parsed file depends on, like included files. A change to them invalidates the file, and the Vite & dev server watchers watch them, even outside the content directory.
invalidateFile() returns whether the source uses the file, onDependency() listens to the dependencies. Custom sources passed to the watchers need both.
watchWithVite() called after the Vite server started now watches content directories outside of Vite's root.
Unknown languages in Local HTML
Code blocks in languages Shiki doesn't know render as plain text, instead of failing the page.
Bring your own highlighter
Shiki stays the default, and isn't loaded when you highlight code with another highlighter.
fumadocs-core/highlight exports a Highlighter interface, created with createHighlights() from fumadocs-core/highlight/highlights (@pierre/highlights) or createShikiHighlighter() from fumadocs-core/highlight/shiki, override() creates one with other options.
rehypeCodeFromHighlighter from fumadocs-core/mdx-plugins/rehype-code.core highlights code blocks with a highlighter, or a function creating one with the transformers of Fumadocs. createRehypeCode is deprecated, Sätteri has rehypeCodeFromHighlighter in @fumadocs/satteri/rehype-code. Pass transformerTwoslash() in its transformers option to analyze Twoslash blocks in batches.
createServerCodeBlock() and createDynamicCodeBlock() in Fumadocs UI create code blocks from a highlighter. Dynamic code blocks are highlighted on the server too.
toJsx() from fumadocs-core/utils/hast-to-jsx converts hast into React elements like toJsxRuntime() of hast-util-to-jsx-runtime, MDX nodes through an evaluator, over 10x faster on highlighted code, whose spans render as one HTML string. Every Fumadocs renderer uses it, hast-util-to-jsx-runtime is no longer a dependency.
Twoslash loads the languages of code blocks in popups before highlighting, an unknown language there no longer fails the code block.
OpenAPI Standalone highlights code blocks with Highlights, in its server-rendered pages too.
The page factories of OpenAPI, GraphQL and AsyncAPI, type tables, createPython(), createPythonComponents(), localHtml() and the shadcn createSnippet() take a highlighter.
Deprecated shiki and shikiOptions of the API pages and shiki of type tables, pass a highlighter instead.
Integrations require fumadocs-core 16.17.8, the API pages and shadcn also require fumadocs-ui 16.17.8.
Watch the dependencies of local content
Integrations call file.addDependency(path) for the files a parsed file depends on, like included files. A change to them invalidates the file, and the Vite & dev server watchers watch them, even outside the content directory.
invalidateFile() returns whether the source uses the file, onDependency() listens to the dependencies. Custom sources passed to the watchers need both.
watchWithVite() called after the Vite server started now watches content directories outside of Vite's root.
Bring your own highlighter
Shiki stays the default, and isn't loaded when you highlight code with another highlighter.
fumadocs-core/highlight exports a Highlighter interface, created with createHighlights() from fumadocs-core/highlight/highlights (@pierre/highlights) or createShikiHighlighter() from fumadocs-core/highlight/shiki, override() creates one with other options.
rehypeCodeFromHighlighter from fumadocs-core/mdx-plugins/rehype-code.core highlights code blocks with a highlighter, or a function creating one with the transformers of Fumadocs. createRehypeCode is deprecated, Sätteri has rehypeCodeFromHighlighter in @fumadocs/satteri/rehype-code. Pass transformerTwoslash() in its transformers option to analyze Twoslash blocks in batches.
createServerCodeBlock() and createDynamicCodeBlock() in Fumadocs UI create code blocks from a highlighter. Dynamic code blocks are highlighted on the server too.
toJsx() from fumadocs-core/utils/hast-to-jsx converts hast into React elements like toJsxRuntime() of hast-util-to-jsx-runtime, MDX nodes through an evaluator, over 10x faster on highlighted code, whose spans render as one HTML string. Every Fumadocs renderer uses it, hast-util-to-jsx-runtime is no longer a dependency.
Twoslash loads the languages of code blocks in popups before highlighting, an unknown language there no longer fails the code block.
OpenAPI Standalone highlights code blocks with Highlights, in its server-rendered pages too.
The page factories of OpenAPI, GraphQL and AsyncAPI, type tables, createPython(), createPythonComponents(), localHtml() and the shadcn createSnippet() take a highlighter.
Deprecated shiki and shikiOptions of the API pages and shiki of type tables, pass a highlighter instead.
Integrations require fumadocs-core 16.17.8, the API pages and shadcn also require fumadocs-ui 16.17.8.
Bring your own highlighter
Shiki stays the default, and isn't loaded when you highlight code with another highlighter.
fumadocs-core/highlight exports a Highlighter interface, created with createHighlights() from fumadocs-core/highlight/highlights (@pierre/highlights) or createShikiHighlighter() from fumadocs-core/highlight/shiki, override() creates one with other options.
rehypeCodeFromHighlighter from fumadocs-core/mdx-plugins/rehype-code.core highlights code blocks with a highlighter, or a function creating one with the transformers of Fumadocs. createRehypeCode is deprecated, Sätteri has rehypeCodeFromHighlighter in @fumadocs/satteri/rehype-code. Pass transformerTwoslash() in its transformers option to analyze Twoslash blocks in batches.
createServerCodeBlock() and createDynamicCodeBlock() in Fumadocs UI create code blocks from a highlighter. Dynamic code blocks are highlighted on the server too.
toJsx() from fumadocs-core/utils/hast-to-jsx converts hast into React elements like toJsxRuntime() of hast-util-to-jsx-runtime, MDX nodes through an evaluator, over 10x faster on highlighted code, whose spans render as one HTML string. Every Fumadocs renderer uses it, hast-util-to-jsx-runtime is no longer a dependency.
Twoslash loads the languages of code blocks in popups before highlighting, an unknown language there no longer fails the code block.
OpenAPI Standalone highlights code blocks with Highlights, in its server-rendered pages too.
The page factories of OpenAPI, GraphQL and AsyncAPI, type tables, createPython(), createPythonComponents(), localHtml() and the shadcn createSnippet() take a highlighter.
Deprecated shiki and shikiOptions of the API pages and shiki of type tables, pass a highlighter instead.
Integrations require fumadocs-core 16.17.8, the API pages and shadcn also require fumadocs-ui 16.17.8.
Bring your own highlighter
Shiki stays the default, and isn't loaded when you highlight code with another highlighter.
fumadocs-core/highlight exports a Highlighter interface, created with createHighlights() from fumadocs-core/highlight/highlights (@pierre/highlights) or createShikiHighlighter() from fumadocs-core/highlight/shiki, override() creates one with other options.
rehypeCodeFromHighlighter from fumadocs-core/mdx-plugins/rehype-code.core highlights code blocks with a highlighter, or a function creating one with the transformers of Fumadocs. createRehypeCode is deprecated, Sätteri has rehypeCodeFromHighlighter in @fumadocs/satteri/rehype-code. Pass transformerTwoslash() in its transformers option to analyze Twoslash blocks in batches.
createServerCodeBlock() and createDynamicCodeBlock() in Fumadocs UI create code blocks from a highlighter. Dynamic code blocks are highlighted on the server too.
toJsx() from fumadocs-core/utils/hast-to-jsx converts hast into React elements like toJsxRuntime() of hast-util-to-jsx-runtime, MDX nodes through an evaluator, over 10x faster on highlighted code, whose spans render as one HTML string. Every Fumadocs renderer uses it, hast-util-to-jsx-runtime is no longer a dependency.
Twoslash loads the languages of code blocks in popups before highlighting, an unknown language there no longer fails the code block.
OpenAPI Standalone highlights code blocks with Highlights, in its server-rendered pages too.
The page factories of OpenAPI, GraphQL and AsyncAPI, type tables, createPython(), createPythonComponents(), localHtml() and the shadcn createSnippet() take a highlighter.
Deprecated shiki and shikiOptions of the API pages and shiki of type tables, pass a highlighter instead.
Integrations require fumadocs-core 16.17.8, the API pages and shadcn also require fumadocs-ui 16.17.8.
Load documents once
includeDocument: false of createOpenAPI() and createAsyncAPI() leaves documents out of page props, pages load each one once per browser session with loadDocument of createOpenAPIPage() and createAsyncAPIPage().
Same for GraphQL schemas: includeSchema: false of createGraphQL() with loadSchema of createGraphQLPage().
Load documents once
includeDocument: false of createOpenAPI() and createAsyncAPI() leaves documents out of page props, pages load each one once per browser session with loadDocument of createOpenAPIPage() and createAsyncAPIPage().
Same for GraphQL schemas: includeSchema: false of createGraphQL() with loadSchema of createGraphQLPage().
Load documents once
includeDocument: false of createOpenAPI() and createAsyncAPI() leaves documents out of page props, pages load each one once per browser session with loadDocument of createOpenAPIPage() and createAsyncAPIPage().
Same for GraphQL schemas: includeSchema: false of createGraphQL() with loadSchema of createGraphQLPage().
@fumadocs/base-ui@16.17.7
fumadocs-core@16.17.7
fumadocs-ui@16.17.7
Imports across Windows drives
remarkImage and generated .source files import files on another drive or a UNC path by their absolute path.
Generated imports of files in dot-folders are prefixed with ./.
Bodies with quotes, line breaks, NUL, BOM or bidi characters produce valid Python, Java, Go, Rust, JavaScript and C# samples that send them exactly.
Go and Rust samples no longer indent the lines of multi-line bodies.
text/plain bodies are sent as written, in samples and the playground.
cURL samples send JSON bodies of +json and ; charset= media types as JSON.
Example cards with code block title bars
Example cards put their controls in the title bar of their code block, next to its copy button, so code no longer runs under the button on narrow screens.
Selects with a single option, like one status code, show a plain label.
The playground button follows the corner radius of the bar around it.
Tag hierarchy in per: 'tag'
Pages follow the OpenAPI 3.2 tag hierarchy, in the folder of their parent tag.
Tags without operations or with a kind other than nav get no page.
Undeclared tags get pages too, untagged operations are listed in unknown.
Index cards of generateFiles() include pages in folders.