Skip to main content

Fumero

Generate a Fumadocs API reference from a Python module.

Fumero reads an importable module with griffe and writes a Fumadocs API reference: one page per module and one per class, alongside the React components that render them.

The reference is generated from the code. Signatures, type annotations and default values are read from the source, and the prose is taken from the docstrings. Nothing is restated by hand, so the reference cannot fall out of step with the code it documents.

Install

uv add fumero --dev  # or pip install fumero

Quick start

Install the components into the docs app that will render the output:

fumero init src/components/mdx

Register them once, so every generated page knows how to render itself:

// src/mdx-components.tsx
import defaultMdxComponents from 'fumadocs-ui/mdx';
import * as Pdx from '@/components/mdx/pdx-components';

export function getMDXComponents(components?: MDXComponents): MDXComponents {
  return { ...defaultMdxComponents, ...Pdx, ...components };
}

The loader plugin that came with them labels the sidebar entries that lead to a module:

// src/lib/source.ts
import { fumeroPlugin } from '@/components/mdx/pdx-plugin';

export const source = loader({
  plugins: [fumeroPlugin()],
  baseUrl: '/docs',
  source: docs.toFumadocsSource(),
});

A generated page carries its kind under _fumero, and Fumadocs keeps only the frontmatter its schema names, so let the rest through:

// source.config.ts
schema: pageSchema.loose(),

Then document a module:

fumero generate example --output content/docs/api --base-url /api --with-meta

A module is read from its source, not by importing it, so documenting a package does not run it. The exception is a module with no source to read, such as a C extension: that one is imported, and importing it runs whatever its module-level code does. Pass --no-inspect to read the .pyi stubs beside the binary instead, and nothing is imported at all.

Configuration

Every option is a flag on fumero generate and a key in a [tool.fumero] table. Options that do not change between runs belong in pyproject.toml:

[tool.fumero]
output = "content/docs/api"
base-url = "/api"
exclude = ["example.internal", "*.tests"]
with-meta = true

A flag overrides the file, which overrides the defaults.

Documentation

The full documentation lives at here. Fumero documents itself, so the API reference there is a working example of the output as much as it is a reference.

Development

This project uses devenv to manage the development environment. It sets up Python, uv, and everything else you need.

# Install devenv if you haven't already
# https://devenv.sh/getting-started/

# Enter the dev shell - this installs all dependencies automatically
devenv shell

Once you are in the shell, lint, type check, and test with:

uv run ruff check
uv run ty check
uv run pytest

Release files for fumero 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for fumero 0.3.0
File Size Uploaded
fumero-0.3.0.tar.gz 39.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for fumero 0.3.0
File Interpreter ABI Platform
fumero-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 88.3 kB

Release files / fumero-0.3.0.tar.gz

Download URL fumero-0.3.0.tar.gz
Size 39.3 kB
Tags Source
SHA-256 checksum
How to use checksums
03482a6e90a3a46f3b09612d88c4f4bb06a3e09fd4c1b020da316a93268e2f5f
BLAKE2b-256 checksum
How to use checksums
7082e9d411dfc488adbfb4e39e361e6483b33cd80204d18a784f3d8ade61cf34
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / fumero-0.3.0-py3-none-any.whl

Download URL fumero-0.3.0-py3-none-any.whl
Size 49.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
61673fdc074f1d77c13de3ac433595702a960e38f5aeff21962b073affc9db5a
BLAKE2b-256 checksum
How to use checksums
20742fc11fc4cd990ceb63b45d71200bc67c6bc1d55936ce4977911d07bac295
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

This release

0.3.0 This release

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page