Skip to content

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:

plugins:
  - tags
  - minify:
      minify_html: true

If your project already uses zensical.toml:

[project.plugins.tags]

[project.plugins.minify]
minify_html = true

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_uri must 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:

[project.plugins.mkdocs-audio]
plugins:
  - mkdocs-audio

Use the configured marker as the image's alternative text:

![type:audio](assets/audio.mp3)
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_root must 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_nav setting 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.quotes with callouts: true.
  • Zensical ignores all three plugin settings: aliases, breakless_lists, and title_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.quotes with callouts: true.
  • important and caution use 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, and shadow.

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.copy in the theme's features list, 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_output must be a relative file path inside site_dir, different from llms.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 to env.variables are not carried over to another page. Counters initialized in define_env are 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.page and the Jinja page variable, with url, path, title, and meta. MkDocs attributes such as page.file are not provided. Plain dictionaries are supplied through env.conf and env.config. Empty lists are supplied for navigation and files.
  • Module hooks and APIs: Only define_env is called automatically. on_pre_page_macros, on_post_page_macros, and on_post_build are not called. APIs such as env.markdown, env.render(), env.env, and env.register_variables() are not provided.
  • Generated navigation titles: Titles assigned by awesome-nav, literate-nav, or autoapi are resolved after macros. During macro rendering, env.page.title is 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 for include_yaml. MkDocs Macros' list entries such as - data: data.yaml are not accepted. Existing keys are replaced without recursive merging. Page-level include_yaml is also supported.

For more information, see plugin documentation.


markdown-exec

Since 0.0.47

Execute fenced code blocks and embed their output.

Install with:

pip install "markdown-exec[ansi]"
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/name and !!python/tuple are 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_dir and javascript_dir because 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_js and minify_inline_css are 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:

pip install mkdocstrings-python
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.


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 meta and 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_dir and 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.


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.
  • enabled and separator are the only plugin settings that affect Zensical search.
  • Zensical ignores lang. It takes the search language from theme.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, and prebuild_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_path and all table files must be inside the project directory.
  • Reader call arguments must be Python literals. Names, expressions, and **kwargs expansion 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:

[project.plugins.mkdocs-video]
is_video = true
plugins:
  - mkdocs-video:
      is_video: true

Use the configured marker as the image's alternative text:

![type:video](assets/video.mp4)
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:

uvx --with mkdocs-gen-files python scripts/gen_ref_pages.py

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.