Code-aware static site generator with directive-based content extraction
Project description
selfdoc
Code-aware static site generator that resolves :::directive blocks in Markdown templates into live content extracted from your source code.
Supports Python, Go, and TypeScript/JavaScript. Zero runtime dependencies -- pure Python stdlib.
Install
pip install selfdoc
or via npm (delegates to Python under the hood):
npm install -g selfdoc
Requires Python 3.11+.
Quick start
# Initialize in an existing project (auto-detects language)
selfdoc init
# Edit docs/index.md -- add directives referencing your code
# (see Directive syntax below)
# Build HTML output
selfdoc build
# Serve locally with live reload
selfdoc serve
Directive syntax
Directives are fenced blocks in your Markdown templates. They get replaced with content extracted from your source code at build time.
:::name arg
:::
Everything between :::name arg and the closing ::: is the directive body (optional, depends on the directive). Directives inside fenced code blocks are ignored.
Built-in directives
| Directive | Arg | Description |
|---|---|---|
module |
dotted.path or file path | Extract module/package docstrings, exported functions, classes |
schema |
file.json or module ClassName | Extract dataclass fields or JSON keys as a table |
test |
file_path [TestName] | Embed test source code (whole file or specific function/class) |
cli |
module path | Extract CLI help/usage text and flag definitions |
config |
file path | Render JSON/TOML config files as key-value tables |
Example -- embed the API docs for a Python module:
## API Reference
:::module selfdoc.config
:::
Example -- show a JSON schema as a table:
:::schema selfdoc.json
:::
Custom directives
Register custom directives in selfdoc.json under the directives key. Each entry maps a directive name to a Python script (relative to project root) that exports a resolve(arg, config) function returning a Markdown string.
{
"directives": {
"changelog": "scripts/changelog_directive.py"
}
}
Script interface:
def resolve(arg: str, config: dict) -> str:
"""Return Markdown string to replace the directive block."""
...
Use in templates:
:::changelog v1.0.0
:::
Custom directives take priority over built-in names.
Configuration
selfdoc.json at the project root:
{
"language": "python",
"source": ["selfdoc/"],
"docs": "docs/",
"output": "docs/_build/",
"deploy": {
"provider": "cloudflare-pages",
"project": "my-docs"
},
"directives": {}
}
| Field | Required | Default | Description |
|---|---|---|---|
language |
yes | -- | python, go, typescript, or javascript |
source |
yes | -- | List of source directories to scan |
docs |
no | docs/ |
Directory containing Markdown templates |
output |
no | docs/_build/ |
Directory for generated HTML output |
deploy |
no | -- | Deploy provider config (see Deploy below) |
directives |
no | {} |
Custom directive script mappings |
selfdoc init auto-detects language and source paths from project files (pyproject.toml, go.mod, tsconfig.json, package.json).
Commands
| Command | Description |
|---|---|
selfdoc init |
Initialize selfdoc in the current project (creates selfdoc.json + starter template) |
selfdoc build |
Resolve directives and generate HTML to the output directory |
selfdoc serve [--port PORT] |
Serve built docs locally with SSE-based live reload (default port 8000) |
selfdoc deploy |
Deploy docs to the configured provider |
selfdoc check |
Validate all directives resolve successfully; report documentation coverage |
Deploy
Cloudflare Pages
Requires the Wrangler CLI installed and authenticated.
{
"deploy": {
"provider": "cloudflare-pages",
"project": "my-docs-project"
}
}
selfdoc build && selfdoc deploy
GitHub Pages
Pushes the output directory to the gh-pages branch via force-push.
{
"deploy": {
"provider": "github-pages"
}
}
Enable GitHub Pages in your repo settings (source: gh-pages branch).
Integration with rlsbl
When rlsbl detects a selfdoc.json in the project, it can trigger selfdoc build and selfdoc deploy as part of the release lifecycle via the .rlsbl/hooks/post-release.sh hook.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file selfdoc-0.3.1.tar.gz.
File metadata
- Download URL: selfdoc-0.3.1.tar.gz
- Upload date:
- Size: 222.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2f644ad4aa766b919224b5b0df88d05c216d62f25d5be01fe261cfb8cd96def8
|
|
| MD5 |
41913e5d97e3c3a30de58ad50fcac48a
|
|
| BLAKE2b-256 |
69a41437477caddbd5bb3ae5c56b9f86123e6cca63943f86c751e94990d77386
|
Provenance
The following attestation bundles were made for selfdoc-0.3.1.tar.gz:
Publisher:
publish.yml on smm-h/selfdoc
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
selfdoc-0.3.1.tar.gz -
Subject digest:
2f644ad4aa766b919224b5b0df88d05c216d62f25d5be01fe261cfb8cd96def8 - Sigstore transparency entry: 1520534930
- Sigstore integration time:
-
Permalink:
smm-h/selfdoc@a726c122b4c388fee93cfd3f66cf721cbe85fed8 -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/smm-h
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a726c122b4c388fee93cfd3f66cf721cbe85fed8 -
Trigger Event:
release
-
Statement type:
File details
Details for the file selfdoc-0.3.1-py3-none-any.whl.
File metadata
- Download URL: selfdoc-0.3.1-py3-none-any.whl
- Upload date:
- Size: 91.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
69632e034d952afc9561922f649dca8735205119c51220309288822c30915026
|
|
| MD5 |
1683f7a990c0d4bccc823f068b220227
|
|
| BLAKE2b-256 |
0211a22d5bebeaa1fafa7dbcaa6ac16a74851b53f46a746afa8565abe7accc81
|
Provenance
The following attestation bundles were made for selfdoc-0.3.1-py3-none-any.whl:
Publisher:
publish.yml on smm-h/selfdoc
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
selfdoc-0.3.1-py3-none-any.whl -
Subject digest:
69632e034d952afc9561922f649dca8735205119c51220309288822c30915026 - Sigstore transparency entry: 1520534934
- Sigstore integration time:
-
Permalink:
smm-h/selfdoc@a726c122b4c388fee93cfd3f66cf721cbe85fed8 -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/smm-h
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a726c122b4c388fee93cfd3f66cf721cbe85fed8 -
Trigger Event:
release
-
Statement type: