You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Description: The built-in mkdocs and readthedocs themes load fonts (e.g. Lato, Roboto Slab) and CSS from Google Fonts / CDNs. Users who self-host documentation want full offline / privacy-respecting operation without third-party requests. Some fonts are already bundled, but base.html still references external URLs.
Description: Opened by the maintainer of Material for MkDocs. Proposes collaborative improvements to mkdocs serve: faster rebuilds, smarter watcher, better error messages, and lowering the friction of the write-build-check loop. Concrete ideas include incremental builds, file-system-level caching, and a plugin-friendly architecture for serve hooks.
Status in mkdocs-ng: 🚧 Not yet optimized. A CodSpeed continuous-benchmarking suite was added (Add CodSpeed continuous benchmarking #88, Add scaling and serve-loop benchmarks to the CodSpeed suite #89) to establish a measured baseline before changing the build/serve pipeline; a local scaling study showed superlinear cost growth (7.8 → 9.3 → 22.1 ms/page at 100/400/1600 pages), confirming the O(N²) navigation-rendering issue this ticket describes. Optimization work is next.
Description: There is no officially supported way to invoke MkDocs from Python code. Users currently call internal functions (e.g. build_command(), serve_command()) or shell out via subprocess. A documented, stable API (e.g. mkdocs.build(), mkdocs.serve()) is needed for build-system integrations, CI scripts, and programmatic usage.
Description: The mkdocs theme hardcodes a Google Analytics snippet via the analytics template tag block. This is out of place in a privacy-conscious static site generator. Proposal: drop the built-in GA support entirely and document how to add analytics via extrahead template overrides instead.
Description: INHERIT currently accepts only a single file path. Users with complex setups want to compose configuration from multiple files (e.g. one for markdown extensions, one for plugins, one for extra settings). Proposal: allow INHERIT to accept a list of paths.
Labels: Configuration
6. Fix mkdocs serve --livereload not triggering automatically ✅ Done
Description: In recent versions, livereload no longer works unless --livereload is passed explicitly. mkdocs-ng partially addresses this through PRs restoring --livereload, but some users still report it not working by default. This may intersect with the Click version issue (#4032) and WSL-specific problems (#4081).
Description: Starting with Click 8.3.0, file watching breaks entirely — changes no longer trigger a rebuild. Workaround is pinning click<=8.2.1. This is the highest-reaction open issue by far.
Description: Editors like Vim create swap files (.foo.md.swp) and hidden files that cause mkdocs serve to constantly rebuild even though those files aren't included in the output. The watcher should ignore dot-files and editor temp files by default, with an opt-in mechanism for directories like .well-known/.
Labels: Command - serve, Configuration
Status in mkdocs-ng: ✅ Fixed in 1.7.3 (Fix/livereload ignore temp files #55) — vim swap files, ~ backups and Emacs auto-save files no longer trigger rebuilds.
Description: External (absolute URL) links should be automatically annotated with rel="external" so theme authors and users can style them differently (e.g. add an external-link icon). This became more important after Material for MkDocs switched to always using absolute URLs for navigation.
Description: MkDocs has no built-in mechanism to append content hashes to CSS/JS filenames for cache busting. After a documentation site update, returning visitors may get stale cached assets. Implementation could be via a plugin (preferred by maintainers) or core feature.
Description: The search plugin (based on lunr.js) is bundled with core MkDocs. lunr.js is unmaintained (last commit ~4 years ago) with known bugs. Proposal: extract search into a standalone installable package, decouple it from the core release cycle, and pave the way for a modern replacement.
Description: The core maintainers agreed to move the readthedocs theme (and possibly mkdocs theme) into separate repos and installable packages. This simplifies core, allows themes to be versioned independently, and opens the door for new default themes.
Description: MkDocs currently forbids placing mkdocs.yml inside the docs_dir. Users who want to use the project root as docs_dir (e.g. monorepos, projects with README.md as homepage) need to work around this restriction. The PR #3519 removes the validation check and auto-excludes config/site files from the docs.
Labels: Navigation
📋 P2 – Nice to Have
14. Support text fragment links (ignore them during validation)
Description: Text fragment links (#:~:text=…) are a modern web standard for linking to specific text on a page. MkDocs' anchor validator incorrectly reports them as broken anchors. The validator should recognize and skip #:~:text= fragments.
Labels: Validation
15. Auto-switch port when the default port is busy
Description: If port 8000 is already in use, mkdocs serve should automatically try the next available port (8001, 8002, …) instead of failing. A related PR (#3498) adds a manual port override flag, but automatic fallback is the desired UX.
Labels: Command - serve
16. Smart section titles when no nav is configured ✅ Done
Description: When no nav is defined in mkdocs.yml, section titles for sub-directories should be derived from the index page's title metadata or first heading, rather than displaying raw directory names. This is already a feature in Material for MkDocs (navigation.smart-section-titles), but should be available in core.
Description: GitHub-flavored markdown alert blocks (> [!NOTE], > [!TIP], > [!IMPORTANT], > [!WARNING], > [!CAUTION]) should render as styled callouts in MkDocs. This would improve portability of docs authored on GitHub to MkDocs sites.
18. Extend on_page_context with Jinja2 Environment reference
Description: The on_page_context plugin event should expose the Jinja2 Environment object so plugins can apply per-page template filters and globals. This is needed for multi-instance plugins (e.g. Material for MkDocs blog plugin) where each plugin instance needs to register its own template functions per page.
19. Deprecated options should emit INFO, not WARNING
Description: The Deprecated config helper emits WARNING messages, which break --strict mode. Since deprecated options are still functional (just discouraged), they should emit INFO-level messages so strict builds don't fail on deprecation notices alone.
Description: Users who write small project-specific Markdown extensions need a way to add the extension's directory to sys.path from within mkdocs.yml, without requiring PYTHONPATH hacks or pip-installable packages. A config option like markdown_extensions_path: ["extensions/"] would suffice.
21. Respect display text when the same .md file appears in nav multiple times
Description: When a file is referenced multiple times in nav with different display names (e.g. - 'French Main Dishes': 'French Cuisine.md' and - 'French Desserts': 'French Cuisine.md'), MkDocs now overrides both entries with the first title encountered. Previously, each entry kept its set display text.
Description: The default mkdocs theme is dated (Bootstrap 3). A new, modern, optionally installable default theme should be designed and shipped separately, as part of the theme decoupling effort (#3636).
Description: When a page has both a YAML title meta field and an H1 heading, the precedence between them (and the nav display name) can be surprising. Users want more control over which source wins, ideally configurable per page or globally.
24. Fix use_directory_urls: true with Click ≥ 8.2.2 ✅ Done
Description: Click 8.2.2 changed path behavior that broke use_directory_urls: true — generated links become page/index.html instead of page/. This is related to #4032 and may require pinning or fixing the Click integration.
Description: On WSL with ext4 filesystem, file-watching doesn't trigger livereload. May be related to the Click watcher regression (#4032) or filesystem notification limitations in WSL.
Status in mkdocs-ng: ✅ Fixed in 1.7.0 (Fix CLI livereload option and CI failures in tests #4) / 1.7.3 (Fix Click default option handling #60) — investigated directly: the reporter's own diagnosis (ext4, inotifywait sees events fine, explicit --livereload works) matches the Click default-handling regression, not a WSL/filesystem-specific bug. The bundled PollingObserver file watcher doesn't depend on inotify anyway. Verified end-to-end with Click 8.4.2: a bare mkdocs serve watches, rebuilds and reloads the browser.
Last updated: 2026-08-12 — 9 items marked done, 1 in progress Sources: mkdocs/mkdocs open issues, sorted by reactions
Curated from mkdocs/mkdocs issues and
discussions, sorted by user demand
(reactions 👍 + comments). Items already addressed by mkdocs-ng are excluded.
See also the Fixed Upstream Issues doc page for the full list of resolved upstream issues (including ones not originally tracked here).
🔥 P0 – High Demand / Urgent Bugs
1. Remove CDNs from built-in themes✅ Donemkdocsandreadthedocsthemes load fonts (e.g. Lato, Roboto Slab) and CSS from Google Fonts / CDNs. Users who self-host documentation want full offline / privacy-respecting operation without third-party requests. Some fonts are already bundled, butbase.htmlstill references external URLs.Theme-mkdocs,Theme-readthedocs2. Improve
mkdocs serveperformance & authoring experience 🚧 In progressmkdocs serve: faster rebuilds, smarter watcher, better error messages, and lowering the friction of the write-build-check loop. Concrete ideas include incremental builds, file-system-level caching, and a plugin-friendly architecture for serve hooks.3. Stable public Python API✅ Donebuild_command(),serve_command()) or shell out viasubprocess. A documented, stable API (e.g.mkdocs.build(),mkdocs.serve()) is needed for build-system integrations, CI scripts, and programmatic usage.Enhancement,Needs design decisionmkdocs.build()andmkdocs.serve()are now the documented public API.4. Remove hardcoded Google Analytics from theme✅ Donemkdocstheme hardcodes a Google Analytics snippet via theanalyticstemplate tag block. This is out of place in a privacy-conscious static site generator. Proposal: drop the built-in GA support entirely and document how to add analytics viaextraheadtemplate overrides instead.Cleanuptheme.analytics.gtag(GA4) or override theanalyticstemplate block.5. Support multiple
INHERITconfigsINHERITcurrently accepts only a single file path. Users with complex setups want to compose configuration from multiple files (e.g. one for markdown extensions, one for plugins, one for extra settings). Proposal: allowINHERITto accept a list of paths.Configuration6. Fix✅ Donemkdocs serve --livereloadnot triggering automatically--livereloadis passed explicitly. mkdocs-ng partially addresses this through PRs restoring--livereload, but some users still report it not working by default. This may intersect with the Click version issue (#4032) and WSL-specific problems (#4081).mkdocs serve(no flags) now watches, rebuilds and reloads the browser by default.7.✅ Donemkdocs servedoes not watch files (Click ≥ 8.3.0 regression)click<=8.2.1. This is the highest-reaction open issue by far.clickis needed. Verified against Click 8.4.2 (latest at time of writing).⚡ P1 – Important Features & Fixes
8. Live reload triggers on editor temp / hidden files✅ Done.foo.md.swp) and hidden files that causemkdocs serveto constantly rebuild even though those files aren't included in the output. The watcher should ignore dot-files and editor temp files by default, with an opt-in mechanism for directories like.well-known/.Command - serve,Configuration~backups and Emacs auto-save files no longer trigger rebuilds.9. Add
rel="external"to outbound linksrel="external"so theme authors and users can style them differently (e.g. add an external-link icon). This became more important after Material for MkDocs switched to always using absolute URLs for navigation.Enhancement10. Cache busting for static assets
Enhancement,Plugins11. Decouple built-in search from core
Search12. Decouple built-in themes from core
readthedocstheme (and possiblymkdocstheme) into separate repos and installable packages. This simplifies core, allows themes to be versioned independently, and opens the door for new default themes.Cleanup13. Support root directory as
docs_dirmkdocs.ymlinside thedocs_dir. Users who want to use the project root asdocs_dir(e.g. monorepos, projects withREADME.mdas homepage) need to work around this restriction. The PR #3519 removes the validation check and auto-excludes config/site files from the docs.Navigation📋 P2 – Nice to Have
14. Support text fragment links (ignore them during validation)
#:~:text=…) are a modern web standard for linking to specific text on a page. MkDocs' anchor validator incorrectly reports them as broken anchors. The validator should recognize and skip#:~:text=fragments.Validation15. Auto-switch port when the default port is busy
mkdocs serveshould automatically try the next available port (8001, 8002, …) instead of failing. A related PR (#3498) adds a manual port override flag, but automatic fallback is the desired UX.Command - serve16. Smart section titles when no nav is configured✅ Donenavis defined inmkdocs.yml, section titles for sub-directories should be derived from the index page's title metadata or first heading, rather than displaying raw directory names. This is already a feature in Material for MkDocs (navigation.smart-section-titles), but should be available in core.Navigation,Titles17. Support GitHub-style Markdown Alerts
> [!NOTE],> [!TIP],> [!IMPORTANT],> [!WARNING],> [!CAUTION]) should render as styled callouts in MkDocs. This would improve portability of docs authored on GitHub to MkDocs sites.18. Extend
on_page_contextwith Jinja2 Environment referenceon_page_contextplugin event should expose the Jinja2Environmentobject so plugins can apply per-page template filters and globals. This is needed for multi-instance plugins (e.g. Material for MkDocs blog plugin) where each plugin instance needs to register its own template functions per page.19. Deprecated options should emit
INFO, notWARNINGDeprecatedconfig helper emitsWARNINGmessages, which break--strictmode. Since deprecated options are still functional (just discouraged), they should emitINFO-level messages so strict builds don't fail on deprecation notices alone.20. Custom import paths for
markdown_extensionssys.pathfrom withinmkdocs.yml, without requiringPYTHONPATHhacks or pip-installable packages. A config option likemarkdown_extensions_path: ["extensions/"]would suffice.21. Respect display text when the same
.mdfile appears in nav multiple timesnavwith different display names (e.g.- 'French Main Dishes': 'French Cuisine.md'and- 'French Desserts': 'French Cuisine.md'), MkDocs now overrides both entries with the first title encountered. Previously, each entry kept its set display text.🔧 P3 – Maintenance & Infrastructure
22. New default theme
mkdocstheme is dated (Bootstrap 3). A new, modern, optionally installable default theme should be designed and shipped separately, as part of the theme decoupling effort (#3636).23. Title source precedence controls
titlemeta field and an H1 heading, the precedence between them (and thenavdisplay name) can be surprising. Users want more control over which source wins, ideally configurable per page or globally.24. Fix✅ Doneuse_directory_urls: truewith Click ≥ 8.2.2use_directory_urls: true— generated links becomepage/index.htmlinstead ofpage/. This is related to #4032 and may require pinning or fixing the Click integration.25. WSL:✅ Donemkdocs servefails to live reloadinotifywaitsees events fine, explicit--livereloadworks) matches the Click default-handling regression, not a WSL/filesystem-specific bug. The bundledPollingObserverfile watcher doesn't depend on inotify anyway. Verified end-to-end with Click 8.4.2: a baremkdocs servewatches, rebuilds and reloads the browser.Last updated: 2026-08-12 — 9 items marked done, 1 in progress
Sources: mkdocs/mkdocs open issues, sorted by reactions