This is a build tool.
Project description
ThornForge builds versioned static documentation sites for Python projects. It discovers a repository’s Sphinx documentation, builds one or more versions, adds shared navigation and version-switching assets, and writes a static site tree that can be published directly.
The tool is intended for projects that already keep documentation in Sphinx but want a repeatable site layout with version aliases, shared styling, project metadata pages, and lightweight GitHub Pages-friendly output.
Features
Build documentation from a local repository or a supported GitHub repository URL.
Discover common Sphinx layouts such as docs/ and docs/source/.
Build tagged releases under stable docs/<version>/ paths.
Publish a moving docs/latest alias to the newest build.
Reuse canonical build outputs when different versions produce identical documentation inputs.
Render top-level project files such as README.rst and CHANGELOG.rst as root-level site pages.
Publish an optional info/ subtree as a lightweight project website.
Copy bundled CSS, JavaScript, and templates into generated sites so the output is self-contained.
Project Status
ThornForge is currently alpha-quality software. The package metadata marks it as Development Status :: 3 - Alpha. The public CLI and generated output layout are usable, but they may still change while the project settles.
Requirements
ThornForge requires Python 3.12 or newer.
Runtime dependencies are declared in pyproject.toml and include:
Sphinx
docutils
packaging
rich
requests
id
Installation
Install from a local checkout in editable mode:
python -m pip install -e .
Install the development/build dependencies used by this repository:
python -m pip install -r requirements.txt
Verify that the command is available:
thornforge --version
Quickstart
Build this repository’s documentation site into a temporary output directory:
thornforge buildsite --source . --output /tmp/thornforge-site
Open /tmp/thornforge-site/index.html after the build completes.
Build another local repository:
thornforge buildsite --source ../some-project --output /tmp/some-project-site
Build a GitHub repository:
thornforge buildsite \
--source https://github.com/example/project.git \
--output /tmp/project-site
Remote builds require Git and network access in the environment running the command.
CLI
Top-level command:
thornforge [--version] [--no-color] <command> [args...]
Options:
- --version
Print ThornForge’s version and dependency versions.
- --no-color
Disable rich terminal colors.
Available command:
thornforge buildsite --source . --output /tmp/site
- --source
Local repository path or supported GitHub repository URL.
- --output
Required destination directory. Existing contents are removed before a new site is written.
The build command can also be run as a module:
python -m thornforge.buildsite --source . --output /tmp/site
Source Repository Discovery
ThornForge is designed to build repositories without requiring a ThornForge-specific configuration file.
Documentation source discovery searches for a Sphinx conf.py in this order:
docs/
docs/source/
doc/
doc/source/
documentation/
documentation/source/
If none of those paths contains conf.py, ThornForge recursively searches for the shallowest remaining conf.py while skipping transient directories such as .git, virtual environments, build outputs, and caches.
Project names are discovered from:
[project].name in pyproject.toml
[tool.poetry].name in pyproject.toml
name in package.json
The repository directory name
Version Selection
Git repositories are built from tags matching v* when such tags exist. Tags are sorted using PEP 440 version parsing after the leading v is removed.
Repositories without matching tags get one build using a fallback label:
[project].version in pyproject.toml
git describe --tags --always
current
Generated Output
The output directory is deleted and recreated for every build. A typical output tree looks like this:
site/
|-- .nojekyll
|-- index.html
|-- readme.html
|-- changelog.html
|-- site-nav.json
|-- assets/
| |-- scripts/
| |-- style/
| `-- templates/
`-- docs/
|-- index.html
|-- latest -> <latest-version>
|-- versions.json
|-- _builds/
| `-- <digest>/
`-- <version> -> _builds/<digest>
Each public version path under docs/ is a symlink to a canonical build under docs/_builds. The canonical directory name is a short content digest derived from documentation inputs, project metadata, and ThornForge’s bundled assets.
If multiple versions produce the same digest, their public version paths reuse the same canonical build output.
Publishing
The output directory is a static site tree. For GitHub Pages, publish the full contents of the output directory. ThornForge writes .nojekyll so paths such as docs/_builds are served as normal static files.
Development
Run the regression tests:
python -m unittest tests.test_build_system
Build the Python distributions:
python -m build
Check the generated distributions:
python -m twine check dist/*
Build the Sphinx docs directly:
python -m sphinx -b html docs docs/_build/html
Build the full ThornForge-generated documentation site:
thornforge buildsite --source . --output /tmp/thornforge-site
Package Contents
The Python package includes the build pipeline under thornforge.buildsite and bundled site assets under thornforge/assets. The bundled assets are included in wheels so an installed thornforge buildsite command can copy templates, stylesheets, and scripts into generated sites.
License
ThornForge is distributed under the Apache License 2.0. See LICENSE for the full license text.
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 thornforge-0.1.0.tar.gz.
File metadata
- Download URL: thornforge-0.1.0.tar.gz
- Upload date:
- Size: 50.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
39158f9c7c52a8e3b874f6335a59a42efaa1744684714427bd391e8deac5a145
|
|
| MD5 |
462dddeabdd553fa49820eb6cab2fa13
|
|
| BLAKE2b-256 |
bd152553df6f59892a09ee3fc352633562587cd93af8c1ed712d5c0622895b66
|
Provenance
The following attestation bundles were made for thornforge-0.1.0.tar.gz:
Publisher:
live-publish.yml on Officer-Erik-1K-88/ThornForge
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
thornforge-0.1.0.tar.gz -
Subject digest:
39158f9c7c52a8e3b874f6335a59a42efaa1744684714427bd391e8deac5a145 - Sigstore transparency entry: 1436998345
- Sigstore integration time:
-
Permalink:
Officer-Erik-1K-88/ThornForge@5d57fda6e41d926ccd34b836a1da433db173df57 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Officer-Erik-1K-88
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
live-publish.yml@5d57fda6e41d926ccd34b836a1da433db173df57 -
Trigger Event:
push
-
Statement type:
File details
Details for the file thornforge-0.1.0-py3-none-any.whl.
File metadata
- Download URL: thornforge-0.1.0-py3-none-any.whl
- Upload date:
- Size: 48.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 |
f547e72bceb3e542363aac1a1805d5bed12384d8210f70dd4859bb6880ad1d93
|
|
| MD5 |
076677b04ac0cfbe3537bbf3b30af567
|
|
| BLAKE2b-256 |
ced06d44351b68420022cd10de8d2d6e2b645492e119409bb5812ce0a3883d27
|
Provenance
The following attestation bundles were made for thornforge-0.1.0-py3-none-any.whl:
Publisher:
live-publish.yml on Officer-Erik-1K-88/ThornForge
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
thornforge-0.1.0-py3-none-any.whl -
Subject digest:
f547e72bceb3e542363aac1a1805d5bed12384d8210f70dd4859bb6880ad1d93 - Sigstore transparency entry: 1436998348
- Sigstore integration time:
-
Permalink:
Officer-Erik-1K-88/ThornForge@5d57fda6e41d926ccd34b836a1da433db173df57 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Officer-Erik-1K-88
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
live-publish.yml@5d57fda6e41d926ccd34b836a1da433db173df57 -
Trigger Event:
push
-
Statement type: