NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #3079 most downloaded on PyPI
API Documentation for Python Projects
Last release 11 months ago
27 Oct 2025
Release timing varies
gaps range from 2 weeks to 5 months
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
13 years old
114 releases · first in 2013
pdoc has a new logo. 🐍 (#838, @mhils)
markdown2 with the official
upstreampydantic.Field(description="...")
(#802, @jinnovation)One column per quarter.
Include included HTML headers in the ToC by default by enabling markdown2's mixed=True option of the header-ids extra (#806, @mrossinek)
mixed=True option of the header-ids extra
(#806, @mrossinek)pdoc . work to document the module in the current directory.
(#813, @mhils)Add missing styles for Github's markdown alerts. (#796, @Steve-Tech)
Fix a bug where type aliases wouldn't be linked. (#798, @mhils)
<img src="./image.png">) in addition to Markdown ()
(#785, @earshinov)Update Mermaid.js version. (#763, @CodeMelted)
Python 3.13: @deprecated decorators are now rendered with visual emphasis. (#750, @mhils)
@deprecated decorators are now rendered with visual emphasis.
(#750, @mhils)sys.stdin, sys.stdout, and sys.stderr to fix runtime errors with some packages.
(#751, @mhils)Do not shorten current_module.func to func in docstrings when linking. This prevents logical errors in code examples with imports. (#740, @mhils)
Fix a bug where entire modules would be excluded by --no-include-undocumented. To exclude modules, see https://pdoc.dev/docs/pdoc.html#exclude-submodu
--no-include-undocumented.
To exclude modules, see https://pdoc.dev/docs/pdoc.html#exclude-submodules-from-being-documented.
(#728, @mhils)If example.data.Data is also exposed as example.Data, pdoc now links to example.Data in documentation. (#670, @nathanthorpe, @mhils)
example.data.Data is also exposed as example.Data, pdoc now links to example.Data in documentation.
(#670, @nathanthorpe, @mhils)__dir__ incorrectly.
(#710, @mhils)@dataclass and ctypes.Structure would crash pdoc.
(#711, @mhils)[CVE-2024-38526](https://github.com/mitmproxy/pdoc/security/advisories/GHSA-5vgj-ggm4-fg62): Documentation generated with math mode (pdoc --math) does…
pdoc --math) does not include scripts
from polyfill.io anymore. Users who produce documentation with math mode should update immediately. All other users are unaffected.
(#703, @adhintz)The .. include: rST directive now supports start-line, end-line, start-after, end-before options. (#684, @frankharkins)
.. include: rST directive now supports start-line, end-line, start-after, end-before options.
(#684, @frankharkins)scipy-stubs
(#671, @erikdesmedt)Private methods can now be included in the documentation by adding @public to the docstring. This complements the existing @private annotation. (#655,
@public to the docstring.
This complements the existing @private annotation.
(#655, @tmeyier)Improve rendering of .pyi type stubs containing @typing.overload. (#652, @mhils)
pdoc now documents PyO3 or pybind11 submodules that are not picked up by Python's builtin pkgutil module. (#633, @mhils)
type statements and has improved TypeAlias rendering.
(#651, @mhils)code-block ReST directives
(#624, @JCGoran)PDOC_DISPLAY_ENV_VARS=1.
(#622, @mhils)Add compatibility with Python 3.12 (#620, @mhils)
mypackage.helpers.foo,
one can now also refer to .helpers.foo within the mypackage module, or ..helpers.foo in a submodule.
(#544, @Crozzers).pyi stub files.
(#619, @mhils)Functions, classes and variables can now be hidden from documentation by adding @private to their docstring. (#578, @mhils)
@private to their docstring.
(#578, @mhils)--no-include-undocumented.
(#578, @mhils)Fix rendering of dynamically modified docstrings. (#537, @mhils)
Add support for rendering Mermaid diagrams by passing --mermaid. (#525, @thearchitector, @mhils)
--mermaid.
(#525, @thearchitector, @mhils)typing_extensions.Literal on Python 3.7.
(#527, @mhils)Add additional Jinja2 blocks to allow a more fine-grained customization of the menu. (#521, @mikkelakromann)
pdoc now skips constructors if they neither have a docstring nor any parameters. This improves display of classes that are not meant to be instantiate
Variable.default_value_str does not include the = prefix anymore. It will now emit a warning and return
an empty string if repr(value) crashes.
(#510, @mhils)Switch from setup.py to pyproject.toml for pdoc itself. Please file an issue if that causes any problems. (#474, @mhils)
setup.py to pyproject.toml for pdoc itself. Please file an issue if that causes any problems.
(#474, @mhils)Docstrings can now include local images which will be embedded into the page, e.g. . (#282, @mhils)
.
(#282, @mhils)pdoc.doc.Doc.members now includes variables without type annotation and docstring.
They continue to not be documented in the default HTML template.
(#107, @mhils)Fix a CSS issue for overflowing math equations. (#456, @mhils)
Fix handling of type annotations in nested classes. (#440, @mhils)
Make documentation of variables more consistent. Variables with a default value and no docstring are now hidden, matching the behavior of variables wi
format argument from pdoc.pdoc(). For the forseeable future, pdoc will only support HTML export.
(#308, @mhils)__main__.py files. __main__ submodules can still be documented
by explicitly passing them when invoking pdoc.
(#438, @mhils)Add compatibility with Python 3.11 (#394, @mhils)
@classmethod @property instances without docstrings. (@mhils)@functools.singledispatchmethod.
(#428, @mhils)Extend auto-linking of URLs in Markdown. (#401, @mhils)
Fix linking of some function return annotations.
__all__.Improve rendering of function signatures. Annotations are now syntax-highlighted! ✨
<details> element. Recent versions
of Chrome started to auto-expand source code blocks on search, which made it difficult to search in docstrings.view_source macro:
This macro has been split into three smaller macros, please check
module.html.jinja2.
This change was necessary to make sure that the button does not overflow function signatures.member, class, function, submodule or variable macros:
Common parts have been combined in the member macro, please check
module.html.jinja2.pdoc now picks up type annotations from .pyi stub files (PEP-561). This greatly improves support for native modules where no Python source code is ava
.pyi stub files (PEP-561).
This greatly improves support for native modules where no Python source code is available,
for example when using PyO3.
(#390, @mhils)typing.TypedDict subclasses.
(#389, @mhils)Display line numbers when viewing source code. (#328, @mhils)
pdoc now picks up reStructuredText syntax in docstrings by default. We still prefer plain Markdown, but this change makes it possible to seamlessly in
.. include:: README.md or admonitions,
which have no Markdown equivalent. reStructuredText processing can be disabled by explicitly setting the docstring
format to Markdown.
(#373, @mhils):param foo: text.
(#275, @mhils)Include typing.TypeVar variables in documentation if they have an explicit docstring. (#361, @ktbarrett)
typing.TypeVar variables in documentation if they have an explicit docstring.
(#361, @ktbarrett)dict[str,str] are rendered like their old-style
typing.Dict[str,str] equivalents.
(#363, @hriebl)Fix linking of modules. (#360, @vlad-nn)
When determining the docstring for a constructor, prefer Class.__init__.__doc__ over Metaclass.__call__.__doc__ over Class.__new__.__doc__. (#352, @de
Class.__init__.__doc__ over Metaclass.__call__.__doc__
over Class.__new__.__doc__.
(#352, @denised)ctypes.util.find_library.
(#358, @bubalis)Fix a bug where pdoc would crash after executing TYPE_CHECKING blocks. (#351, @Dliwk)
The existing Jinja2 blocks style_pdoc, style_theme, style_layout, style_content are being deprecated, see `frame.html.jinja2` for details.
frame.html.jinja2
instead of
module.html.jinja2.
This allows
index.html.jinja2
to cleanly extend frame.html.jinja2 instead of patching module.html.jinja2. See
examples/mkdocs for an updated example.
If you defined a custom {% block nav %} block, you need to remove the outermost <nav> element, which is
now part of the frame around it.module.html.jinja2 into individual CSS files,
namely
theme.css,
layout.css, and
content.css.
You can now either provide replacements for these files, or
specify additional CSS rules in custom.css.
The existing Jinja2 blocks style_pdoc, style_theme, style_layout, style_content are being deprecated, see
frame.html.jinja2
for details.syntax-highlighting.css: pdoc now consistently uses .pdoc-code instead of .pdoc
or .codehilite for syntax highlighting. .codehilite is being deprecated but will continue to work, giving
custom templates time to migrate.--favicon option can be used to specify a favicon. The existing embedded default favicon has been removed
to reduce page size. (#345)__all__ are not listed as part of the module contents anymore. Instead, they
are listed in the navigation. This now matches the behavior as if __all__ were not specified.
If this affects you, please leave feedback in #341.
The old behavior can be temporarily restored by setting PDOC_SUBMODULES=1 as an environment variable while we
gather feedback.pdoc.doc.Module.members
does not contain submodules anymore unless PDOC_SUBMODULES=1 is set. API users are advised to use
pdoc.doc.Module.submodules.X | Y-style type annotations
(PEP 604) on older Python versions which do not support them.repr() calls to also cover customized templates.py.typed file in wheel distributions.Emit a deprecation warning if custom templates attempt to include assets that were removed from or moved within pdoc.
Breaking: For projects that only document a single module (and its submodules), the module index has been removed. index.html now redirects to the top
index.html now redirects to the top-level module instead.
Direct submodules continue to be accessible in the menu.
See #318 for details.resources/ subdirectory in the template folder.all_modules variable now allows templates to access all other module objects.pdoc.doc.Module.from_name to simplify module creation.sys.path.The search functionality now also covers function parameters, annotated types, default values, and base classes.
pdoc foo !foo.bar documents foo and all submodules of foo except foo.bar.Improve rendering of warnings emitted by pdoc.
Add CSS styling for Markdown tables. (@sitic)
__doc__.Fix an edge case where class annotations were not evaluated properly.
search.json -> search.js: Most of pdoc's search-related JavaScript code is now only fetched on demand, which improves page size and performance.
search.json -> search.js: Most of pdoc's search-related JavaScript code is now
only fetched on demand, which improves page size and performance.file:// pages.Display error webpage for template errors.
TYPE_CHECKING
blocks.--no-search to disable search functionality.Fix a bug where an empty footer was incorrectly emitted by the template.
Full compatibility with Python 3.10.
--math--logo--no-show-source--footer-textDon't include variables/attributes that only have a type annotation but no value and no docstring. If one wants to document a variable, a docstring sh
render_docstring is split into to_markdown and to_html to increase customizability.Do not show constructors for abstract base classes unless they have a custom docstring.
Improve documentation of pdoc.extract. pdoc.extract.parse_specs has been renamed to walk_specs, the old API now emits a deprecation warning.
pdoc without any arguments now asks the user to specify module name
instead of starting pdoc with all available modules. The previous implementation
had a poor user experience as building the search index took too long.pdoc.extract. pdoc.extract.parse_specs has been renamed to walk_specs,
the old API now emits a deprecation warning.pdoc.doc.Doc.source_lines to access where in a file an object is defined.asyncio on Windows on Python 3.7.Do not show a search bar on the module page if only one module is documented. If the entire documentation is contained on a single HTML page, the brow
Fix section indentation in Google-style docstrings.
Fix compatibility with older Jinja2 versions.
Add search functionality. pdoc now has a search bar which allows users to quickly find relevant parts in the documentation. See https://pdoc.dev/docs/
inspect.getdoc() raises.Jinja2 templates can now access system environment variables, for example to pass version information.
Add support for .. include:: directives to include external Markdown files.
.. include:: directives to include external Markdown files.Fix a crash when inspect.signature returns incomplete source code.
inspect.signature returns incomplete source code.Fix a bug when dedenting multi-line decorators.
Minor rendering improvements for enums and typing.NamedTuples.
Private function decorators (those starting with "\_") are now hidden by default. (@zmoon)
__doc__ is now not rendered as a variable, even if included in __all__.Your coding agent can read these notes before it upgrades. Set up the MCP server →