MkDocs plugins¶
Zensical provides native implementations of the MkDocs plugins listed below, meaning they continue to work with your existing configuration and project structure. In most cases, no additional packages are required as our implementations are behavior-preserving rewrites.
We aim to match their behavior as closely as possible and document the remaining differences. See the compatibility roadmap for work in progress and planned support.
Configuration¶
Most existing mkdocs.yml plugin configuration can remain unchanged. Review the differences below before migration. For example:
If your project already uses zensical.toml:
Validation and ignored settings¶
- Unsupported plugins: Configuration for plugins not listed under Supported plugins is silently ignored. Zensical does not import or run them.
- Ignored settings: Settings marked as ignored in a plugin's differences are silently ignored, without value validation or warnings.
- Unknown settings: Supported plugins reject other unknown settings with a configuration error.
Review each plugin's differences before migrating. Ignored settings can remain in a shared MkDocs configuration, but have no effect in Zensical.
The tables below cover common settings; follow the documentation links for details. Zensical Studio provides completions and validation for supported plugins in both zensical.toml and mkdocs.yml.
Supported plugins¶
Plugins are listed alphabetically. Most implementations require no additional installation. Each entry summarizes common settings, links to further documentation, and links to the Zensical release in which support was added.
The plugin I need isn't listed. What can I do?
Check our compatibility roadmap and public backlog to see whether support is already planned. If it isn't, create a change request for the missing plugin in Zensical's issue tracker.
Report issues to Zensical
Zensical reimplements MkDocs plugin behavior natively or integrates the original package where installation is required. If you encounter an issue when using these plugins with Zensical, report it to us.
api-autonav¶
Since 0.0.66
Generate API reference pages and navigation for Python modules with mkdocstrings.
| Setting | Default | Description |
|---|---|---|
enabled | true | Enable API reference generation. |
modules | [] | Python files or package directories, relative to the project root. |
module_options | {} | Handler options for modules matched by regular expressions. |
exclude | [] | Module names or patterns to exclude; prefix regular expressions with re:. |
nav_section_title | API Reference | Title of the generated navigation section. |
api_root_uri | reference | Directory for generated API reference pages. |
exclude_private | true | Exclude modules whose names start with an underscore. |
show_full_namespace | false | Show full module names in navigation. |
Differences:
api_root_urimust name a nonempty relative subdirectory. Empty strings,.,./api, absolute paths, and paths with..components are not supported.- Source discovery skips child symlinks. It always excludes
.git,.venv,venv,__pycache__, and the output and cache directories, regardless of include settings.
For more information, see the plugin documentation.
audio¶
Since 0.0.68
Embed audio files with native browser playback controls. Configure the plugin as mkdocs-audio:
Use the configured marker as the image's alternative text:
| Setting | Default | Description |
|---|---|---|
enabled | true | Enable audio embeds. |
mark | type:audio | Image alternative text that identifies an audio embed. |
audio_type | mp3 | Audio MIME subtype, such as mp3, wav, or ogg. |
audio_controls | true | Show playback controls. |
audio_autoplay | false | Request automatic playback, subject to browser policies. |
audio_loop | false | Repeat playback. |
css_style | {"width": "100%"} | CSS properties applied to the audio element. |
For more information, see the plugin documentation.
autoapi¶
Since 0.0.66
Discover source files and generate API reference pages with mkdocstrings.
| Setting | Default | Description |
|---|---|---|
enabled | true | Enable automatic API documentation. |
autoapi_dir | . | Source directory, relative to the project root. |
autoapi_file_patterns | ["*.py", "*.pyi"] | File patterns to include. |
autoapi_ignore | [] | File patterns to exclude. |
autoapi_root | autoapi | Directory for generated API reference pages. |
autoapi_add_nav_entry | true | Add generated pages to navigation; a string sets the section title. |
autoapi_generate_api_docs | true | Generate API reference pages. |
autoapi_keep_files | false | Keep generated Markdown files in the documentation directory. |
Differences:
autoapi_rootmust name a nonempty relative subdirectory. Empty strings,.,./api, absolute paths, and paths with..components are not supported.- Source discovery skips child symlinks. It always excludes
.git,.venv,venv,__pycache__, and the output and cache directories, regardless of include settings.
For more information, see the plugin documentation.
autorefs¶
Since 0.0.22
Link to headings and API objects across pages with [text][identifier].
| Setting | Default | Description |
|---|---|---|
enabled | true | Enable automatic cross-references. |
resolve_closest | false | Resolve duplicate identifiers to the closest page. |
link_titles | auto | Link tooltips: true, false, external, or auto. With auto, only external links get tooltips when navigation.instant.preview is enabled; otherwise all links do. |
strip_title_tags | auto | Strip HTML from tooltips: true, false, or auto. With auto, HTML is preserved when content.tooltips is enabled and stripped otherwise. |
For more information, see the plugin documentation.
awesome-nav¶
Since 0.0.58
Customize navigation with a .nav.yml file in each documentation directory.
| Setting | Default | Description |
|---|---|---|
enabled | true | Enable directory-based navigation. |
filename | .nav.yml | Name of the navigation configuration files. |
logs | {} | Override message levels: info, warning, or error. Dotted settings below are nested here. |
logs.nav_override | warning | Message when generated navigation replaces nav. |
logs.root_title | warning | Message when title is set in the root navigation file. |
logs.root_hide | warning | Message when hide is set in the root navigation file. |
logs.no_matches | warning | Message when a glob pattern matches nothing. |
Differences:
- Extglob expressions are not supported; regular glob patterns are supported.
- MkDocs'
not_in_navsetting is not supported.
For more information, see the plugin documentation.
blog¶
Since 0.0.64
Publish posts with archives, categories, author profiles, and pagination. See Blog for setup and post metadata.
| Setting | Default | Description |
|---|---|---|
enabled | true | Enable the blog. |
blog_dir | blog | Blog directory, relative to docs_dir. |
post_dir | {blog}/posts | Posts directory, relative to docs_dir. |
post_url_format | {date}/{slug} | Post URL template: {date}, {slug}, {categories}, {file}. |
post_excerpt_separator | <!-- more --> | Marker separating the excerpt from the rest of a post. |
authors_profiles | false | Generate author profile pages. |
pagination_per_page | 10 | Posts per page. |
draft_on_serve | true | Include drafts during preview. |
Differences:
- Custom Python callables aren't supported; built-in strategies are.
For more information, see the plugin documentation.
callouts¶
Since 0.0.62
Render Obsidian-style callouts as admonitions.
| Setting | Default | Description |
|---|---|---|
enabled | true | Enable callouts. |
Differences:
- The plugin entry enables
pymdownx.quoteswithcallouts: true. - Zensical ignores all three plugin settings:
aliases,breakless_lists, andtitle_from_first_bold.
For more information, see plugin documentation.
exclude¶
Since 0.0.67
Exclude files from the generated site by path pattern.
Patterns match source paths relative to docs_dir. Exclusion also applies to generated API pages and theme assets. Regular expressions match from the start of each path.
| Setting | Default | Description |
|---|---|---|
enabled | true | Enable file exclusion. |
glob | [] | Glob patterns for paths to exclude. |
regex | [] | Regular expressions for paths to exclude. |
Differences:
- Globs use glob patterns syntax, as in
awesome-nav.**matches directories recursively, and{a,b}selects alternatives. As in the original exclude plugin,*also matches directory separators. - Backslashes escape glob characters. Use
/as the directory separator. - Invalid glob patterns are rejected.
For more information, see plugin documentation.
gh-admonitions¶
Since 0.0.67
Render GitHub-style alerts as admonitions. See GitHub callouts for the supported syntax.
| Setting | Default | Description |
|---|---|---|
enabled | true | Enable GitHub-style admonitions. |
Differences:
- The plugin entry enables
pymdownx.quoteswithcallouts: true. importantandcautionuse the default admonition style. See GitHub callouts for custom styling.
For more information, see plugin documentation.
glightbox¶
Since 0.0.35
Open images in a lightbox.
| Setting | Default | Description |
|---|---|---|
enabled | true | Enable the lightbox. |
auto | true | Enable the lightbox for images automatically. |
manual | null | When true, only enable images marked with on-glb; overrides auto. |
auto_themed | false | Group images by their light or dark theme variant. |
auto_caption | false | Use image alt text as the caption. |
caption_position | bottom | Caption position: bottom, top, left, or right. |
skip_classes | [] | Additional image classes to exclude from the lightbox. |
Differences:
- Zensical ignores
touchNavigation,loop,effect,slide_effect,zoomable,draggable,background, andshadow.
For more information, see plugin documentation.
literate-nav¶
Since 0.0.58
Define navigation with Markdown lists of links.
| Setting | Default | Description |
|---|---|---|
enabled | true | Enable Markdown-based navigation. |
nav_file | SUMMARY.md | Name of the navigation file. |
implicit_index | false | Include each directory's index page automatically. |
tab_length | 4 | Spaces per indentation level in navigation lists. |
markdown_extensions | [] | Additional Markdown extensions for parsing navigation files. |
For more information, see plugin documentation.
llmstxt¶
Since 0.0.67
An llms.txt index and Markdown copies of selected pages are generated.
| Setting | Default | Description |
|---|---|---|
enabled | true | Enable llms.txt generation. |
sections | Required | Named sections and source pages to include; page paths can contain glob patterns. |
markdown_description | null | Markdown description added after the site description. |
base_url | site_url | Base URL used for links to generated Markdown pages. |
full_output | null | Path of an optional file containing the full text of selected pages. |
autoclean | true | Clean generated HTML before conversion to Markdown. |
Differences:
- With
content.action.copyin the theme'sfeatureslist, a "Copy as Markdown" button is shown on pages with a Markdown equivalent. - Zensical silently ignores
preprocess. Custom Python preprocessing functions are not run. - mkdocstrings source listings and empty code elements are omitted, even with
autoclean: false. full_outputmust be a relative file path insidesite_dir, different fromllms.txt. Absolute paths and empty,.or..path components are rejected.
For more information, see plugin documentation.
macros¶
Since 0.0.40
Jinja variables, filters, and Python macros are supported in Markdown.
| Setting | Default | Description |
|---|---|---|
enabled | true | Enable macros. |
module_name | main | Local Python module, loaded after modules. Its definitions are given precedence. |
modules | [] | Importable packages, loaded in order. Failed imports are reported as errors. |
include_yaml | [] | YAML files providing variables. |
include_dir | "" | Directory for Jinja includes and imports, relative to the project root. If empty, docs_dir is used. |
render_by_default | true | Render Jinja on all pages unless their metadata overrides it. |
on_error_fail | false | With true, the build is stopped on rendering errors. With false, error diagnostics are inserted into the page. |
on_undefined | keep | With keep, simple undefined expressions are preserved. With silent, undefined values are rendered as empty strings. With strict, errors are raised. With lax, missing attributes are also rendered as empty strings. |
Differences:
- Environment lifetime: A new macro environment is created for each page rendered, and
define_env(env)is called for that page. Updates toenv.variablesare not carried over to another page. Counters initialized indefine_envare reset for the next rendered page. In MkDocs Macros, the environment is initialized once per build. - Macro context: Limited page objects are provided through
env.pageand the Jinjapagevariable, withurl,path,title, andmeta. MkDocs attributes such aspage.fileare not provided. Plain dictionaries are supplied throughenv.confandenv.config. Empty lists are supplied fornavigationandfiles. - Module hooks and APIs: Only
define_envis called automatically.on_pre_page_macros,on_post_page_macros, andon_post_buildare not called. APIs such asenv.markdown,env.render(),env.env, andenv.register_variables()are not provided. - Generated navigation titles: Titles assigned by
awesome-nav,literate-nav, orautoapiare resolved after macros. During macro rendering,env.page.titleis derived from metadata, the source heading, or the filename. - External files: Local Python modules are resolved from the project directory. Included YAML files must be inside that directory and contain a mapping. Missing YAML files are silently ignored.
- YAML variables: A list of file paths or a mapping such as
{data: data.yaml}is accepted forinclude_yaml. MkDocs Macros' list entries such as- data: data.yamlare not accepted. Existing keys are replaced without recursive merging. Page-levelinclude_yamlis also supported.
For more information, see plugin documentation.
markdown-exec¶
Since 0.0.47
Execute fenced code blocks and embed their output.
Install with:
| Setting | Default | Description |
|---|---|---|
enabled | true | Enable code block execution. |
ansi | false | ANSI output support: true, false, auto, off, or required; enabled modes require pygments-ansi-color. |
languages | null | Languages to execute; unset enables all supported languages, [] disables execution. |
For more information, see plugin documentation.
markdownextradata¶
Since 0.0.69
Jinja templates are rendered in Markdown and page titles with project settings and extra variables.
| Setting | Default | Description |
|---|---|---|
enabled | true | Jinja rendering and data loading are enabled. |
data | null | Comma-separated data directories, relative to the project root. When unset or empty, _data and <docs_dir>/_data are searched. |
jinja_options | {} | Options passed to the Jinja environment, including template delimiters. |
Differences:
- Data directories and files that resolve outside the project root are silently skipped, including symlink targets.
- YAML data is loaded with
SafeLoader. Python-specific tags such as!!python/nameand!!python/tupleare rejected. - YAML dates are converted to strings for theme templates. Their original Python types are retained during Markdown rendering.
For more information, see plugin documentation.
meta¶
Since 0.0.58
Apply shared front matter to pages in a directory and its subdirectories.
| Setting | Default | Description |
|---|---|---|
enabled | true | Enable shared metadata. |
meta_file | .meta.yml | Metadata file name. |
Differences:
- Custom YAML tags are not supported in metadata files.
For more information, see plugin documentation.
mike¶
Since 0.0.30
Publish and switch between documentation versions.
| Setting | Default | Description |
|---|---|---|
enabled | true | Enable mike integration. |
version_selector | true | Show the version selector. |
alias_type | symlink | Alias type: symlink, redirect, or copy. |
deploy_prefix | "" | Directory prefix for versioned deployments. |
canonical_version | null | Version used for canonical URLs. |
redirect_template | null | Custom template for redirect aliases. |
Differences:
- Zensical requires the compatible fork described in the versioning guide.
- Zensical ignores
css_dirandjavascript_dirbecause it provides the version selector assets.
For more information, see Versioning with mike for installation and usage.
minify¶
Since 0.0.58
Reduce the size of generated HTML, JavaScript, and CSS.
| Setting | Default | Description |
|---|---|---|
enabled | true | Enable minification. |
minify_html | false | Minify generated HTML. |
minify_js | false | Minify files listed in js_files. |
minify_css | false | Minify files listed in css_files. |
js_files | [] | JavaScript files to minify. |
css_files | [] | CSS files to minify. |
minify_inline_js | false | Minify JavaScript inside <script> elements. |
minify_inline_css | false | Minify CSS inside <style> elements. |
Differences:
- Assets that cannot be parsed retain their original content instead of crashing the build.
minify_inline_jsandminify_inline_cssare Zensical-only options. They minify JavaScript in<script>elements and CSS in<style>elements.
For more information, see plugin documentation.
mkdocstrings¶
Since 0.0.11
Generate API documentation from source code.
Install the Python handler with:
| Setting | Default | Description |
|---|---|---|
enabled | true | Enable API documentation. |
default_handler | python | Handler used when a directive does not specify one. |
handlers | {} | Handler configuration. |
custom_templates | null | Directory containing custom handler templates. |
enable_inventory | null | Generate objects.inv; unset follows the handlers' inventory settings. |
locale | en | Language used by handlers. |
Differences:
- Sources outside the project directory are not watched during preview.
- Zensical ignores
watch.
For more information, see plugin documentation.
nav-weight¶
Since 0.0.69
Navigation order, section titles, and visibility are controlled through page metadata.
| Setting | Default | Description |
|---|---|---|
enabled | true | Weighted navigation is enabled. |
section_renamed | false | Section names are replaced with their index page titles. |
index_weight | -10 | Weight assigned to index pages within their section. |
default_page_weight | 0 | Weight assigned to pages with missing or invalid weight metadata. |
reverse | false | Items are sorted from highest to lowest weight. |
headless_included | false | Hidden pages are included in nav.pages. Empty index pages remain excluded. |
warning | true | Warnings are emitted for invalid metadata values. |
Differences:
- Weights are applied after other navigation plugins, regardless of their order in
plugins. - Resolved page metadata is used, including values inherited through
metaand changes made during Markdown rendering. - Previous and next page links within hidden sections are rebuilt after hidden children are removed.
For more information, see plugin documentation.
offline¶
Since 0.0.3
Make the site searchable when opened directly from the file system.
| Setting | Default | Description |
|---|---|---|
enabled | true | Enable offline search support. |
For more information, see plugin documentation.
redirects¶
Since 0.0.58
Keep old links working when pages or sections move.
| Setting | Default | Description |
|---|---|---|
enabled | true | Enable redirects. |
redirect_maps | {} | Map old paths to new paths or URLs. |
Differences:
- Zensical supports anchor-based redirects for moving sections and splitting pages.
For more information, see Redirects for examples.
rss¶
Since 0.0.65
Generate RSS and JSON feeds for new and updated pages.
| Setting | Default | Description |
|---|---|---|
enabled | true | Enable feed generation. |
feed_title | site_name | Feed title; defaults to the site name. |
length | 20 | Maximum entries in each feed. |
match_path | .* | Regular expression selecting page paths to include. |
abstract_chars_count | 160 | Maximum summary length; -1 includes the full content. |
date_from_meta | Git dates | Metadata fields and formats for creation and update dates. |
Differences:
- Zensical ignores
cache_dirand does not fetch remote images for RSS enclosures. - Zensical ignores
use_material_social_cards; generated social cards are not used.
For more information, see plugin documentation.
social¶
Since 0.0.67
Generate social cards and Open Graph metadata for pages. Set site_url to link the generated cards in page metadata. Page front matter can override cards, cards_layout, and cards_layout_options under social.
| Setting | Default | Description |
|---|---|---|
enabled | true | Enable social card generation. |
cards | true | Generate cards for pages by default. |
cards_dir | assets/images/social | Site directory for generated cards. |
cards_layout | default | Card layout to render. |
cards_layout_dir | layouts | Project directory for custom layouts. |
cards_layout_options | {} | Values passed to card layouts. |
cards_include | [] | Source path patterns selecting pages for cards. |
cards_exclude | [] | Source path patterns excluding pages from cards. |
cache | true | Cache generated cards between builds. |
cache_dir | .cache/plugin/social | Project directory for cached cards. |
For more information, see plugin documentation.
search¶
Since 0.0.3
Add full-text search to your documentation.
| Setting | Default | Description |
|---|---|---|
enabled | true | Enable search. |
separator | Built-in pattern | Regular expression splitting text at whitespace and punctuation. |
Differences:
- Search is enabled by default, even when it isn't listed under
plugins. enabledandseparatorare the only plugin settings that affect Zensical search.- Zensical ignores
lang. It takes the search language fromtheme.language. - Zensical ignores
pipeline. It has no equivalent because Zensical's search engine does not use the Lunr pipeline. - Zensical ignores
fields,indexing,jieba_dict,jieba_dict_user,min_search_length, andprebuild_index.
For more information, see site search.
section-index¶
Since 0.0.3
Zensical provides section-index behavior natively. You can keep the section-index plugin entry in a shared configuration, but Zensical ignores the entry.
| Setting | Default | Description |
|---|---|---|
| Configuration | — | No plugin settings are required. |
For more information, see Section index pages.
table-reader¶
Since 0.0.41
Embed data files as Markdown tables with reader calls such as {{ read_csv('table.csv') }}.
| Setting | Default | Description |
|---|---|---|
enabled | true | Enable table readers. |
data_path | . | Base directory for data files. |
allow_missing_files | false | Continue building when a table file is missing. |
select_readers | All supported readers | Readers to enable. |
Differences:
data_pathand all table files must be inside the project directory.- Reader call arguments must be Python literals. Names, expressions, and
**kwargsexpansion are not supported.
For more information, see plugin documentation.
tags¶
Since 0.0.58
Categorize pages and generate tag listings.
| Setting | Default | Description |
|---|---|---|
enabled | true | Enable tags. |
tags | true | Show tags on pages. |
tags_allowed | [] | Allowed tags; an empty list allows all. |
tags_hierarchy | false | Enable hierarchical tags. |
tags_sort_by | tag_name | Tag sorting strategy. |
listings | true | Generate listings where <!-- material/tags --> is placed. |
listings_sort_by | item_title | Sort pages within listings. |
listings_toc | true | Add listing tags to the table of contents. |
Differences:
Zensical silently ignores the legacy settings below. Rename or replace them so that their behavior applies to a Zensical build.
| Ignored setting | Migration |
|---|---|
tags_compare | Use tags_sort_by. |
tags_compare_reverse | Use tags_sort_reverse. |
tags_pages_compare | Use listings_sort_by. |
tags_pages_compare_reverse | Use listings_sort_reverse. |
tags_file | Add <!-- material/tags --> to the tag index page. |
tags_extra_files | Add a <!-- material/tags --> directive to each extra tag index page. |
export | No replacement. Native tags do not export JSON. |
export_file | No replacement. Native tags do not export JSON. |
export_only | No replacement. Native tags do not export JSON. |
Custom Python callables for tags_slugify, tags_sort_by, listings_sort_by, and listings_tags_sort_by are not supported. Use one of the built-in callables documented by Material for MkDocs.
For more information, see Tags configuration and the plugin documentation.
video¶
Since 0.0.68
Embed remote players using an iframe or video files with native browser playback controls. Configure the plugin as mkdocs-video; set is_video to true for native video playback:
Use the configured marker as the image's alternative text:
| Setting | Default | Description |
|---|---|---|
enabled | true | Enable video embeds. |
mark | type:video | Image alternative text that identifies a video embed. |
is_video | false | Use a native video element instead of an iframe. |
video_type | mp4 | Native video MIME subtype, such as mp4, webm, or ogg. |
video_controls | true | Show native video playback controls. |
video_autoplay | false | Request automatic native video playback, subject to browser policies. |
video_loop | false | Repeat native video playback. |
video_muted | false | Mute native video playback. |
css_style | {"position": "relative", "width": "100%", "height": "22.172vw"} | CSS properties applied to the iframe or video element. |
For more information, see the plugin documentation.
Unsupported plugins¶
gen-files¶
Zensical does not currently support gen-files.
To create API reference pages automatically, use autoapi or api-autonav. Both generate API reference pages and navigation with mkdocstrings.
For other uses, run the generation scripts separately from the Zensical build. You can run them once or regularly. Track the generated files in version control.
You do not need to add mkdocs-gen-files to your project dependencies. Use uvx to run a script:
This method requires a mkdocs.yml file. It does not work with zensical.toml.
open-in-new-tab¶
The open-in-new-tab plugin is not supported by Zensical.
Its JavaScript code can simply be added to your project with extra_javascript.
Compatibility roadmap¶
We are closing the remaining compatibility gaps for widely used MkDocs and Material for MkDocs plugins. These statuses reflect our current priorities and do not imply release dates.
In progress¶
Planned¶
Review our public backlog for additional plugins we may support later.
Acknowledgements¶
We thank all plugin authors and contributors for building and maintaining the MkDocs plugin ecosystem. Where Zensical provides native implementations, they are bottom-up rewrites that reproduce the plugins' configuration and behavior without using their original codebases.