Skip to main content

Publish multiple Sphinx documentation projects as one Jekyll site, PDF, or EPUB.

Project description

sphinxpress

sphinxpress publishes multiple independent Sphinx documentation projects as one documentation product: generated Jekyll/GitHub Pages pages, a combined EPUB, and a combined PDF.

It stays Sphinx-first. Each source project keeps its own conf.py and documentation tree. sphinxpress runs Sphinx builders, reads their output, and writes deterministic site and book artifacts for a larger publishing pipeline.

Release status: early alpha. Pin versions and validate generated output before using in production documentation pipelines.

Features

  • Build Jekyll pages from Sphinx JSON output.
  • Preserve readable Sphinx autodoc/API presentation in generated Jekyll pages with scoped, self-contained styling.
  • Write per-project navigation data for site layouts.
  • Build aggregate EPUB and PDF projects from selected Sphinx docs projects.
  • Resolve release metadata from manual tags, git tags, or project metadata.
  • Optionally create a shared managed virtual environment for Sphinx and documentation dependencies.

Install

python -m pip install sphinxpress

For local development and documentation builds:

python -m pip install -e ".[dev,docs,pdf]"
python -m pytest -q

Minimal configuration

Create sphinxpress.toml at the repository root:

[site]
root = "site"
base_url = "https://docs.example.com"
tools_dir = "tools"
nav_data_dir = "_data/tool_nav"
layout = "tool-doc"
title = "Example Docs"

[build]
work_dir = ".sphinxpress"
sphinx_build = "sphinx-build"
fail_on_warning = true
keep_build_dir = false
parallel = "auto"

[book]
title = "Example Documentation"
author = "Example Team"
language = "en"
version = "0.1.0"
copyright = "2026, Example Team"
project_order = ["tool-a"]

[pdf]
builder = "weasyprint"
output = "dist/example-documentation.pdf"

[epub]
builder = "epub"
output = "dist/example-documentation.epub"

[release]
tag_prefix = "v"
release_url_template = "{repo_url}/releases/tag/{tag}"

[[projects]]
name = "tool-a"
title = "Tool A"
docs_root = "../tool-a/docs"
conf_dir = "../tool-a/docs"
root_doc = "index"
repo_url = "https://github.com/example/tool-a"
release_strategy = "manual"
release_tag = "v0.1.0"

Commands

sphinxpress check
sphinxpress list
sphinxpress build-site --all
sphinxpress build-epub --all
sphinxpress build-pdf --all
sphinxpress validate

build-pdf uses sphinxpress's internal WeasyPrint backend by default. It builds the aggregate docs as single HTML and renders that HTML to PDF, so LaTeX is not required for the default path. Install the optional pdf extra or include weasyprint>=67 in the managed build environment. The legacy latexpdf builder remains available when [pdf].builder = "latexpdf" is set explicitly.

build-pdf preflights the configured WeasyPrint executable before the aggregate singlehtml build and reports the actionable sphinxpress[pdf] or weasyprint>=67 guidance if it is missing, avoiding a wasted singlehtml run.

Build diagnostics

Every Sphinx, WeasyPrint, and managed-environment pip run writes a log file under [build].log_dir (default <work_dir>/logs). The latest run for each stage is mirrored to latest-<stem>.log, and failure messages include the relevant Log: path. Use [build].log_dir = "custom-logs" in sphinxpress.toml to override the default location.

Managed build environment

sphinxpress can create one shared virtual environment for Sphinx and documentation dependencies:

[build.env]
enabled = true
scope = "shared"
python = "python3"
path = ".sphinxpress/venv"
upgrade_pip = true
packages = [
  "sphinx>=7",
  "myst-parser",
  "sphinx-rtd-theme",
  "weasyprint>=67",
  "tool-a==0.1.0",
]

For v0.1, only scope = "shared" is supported. scope = "project" is reserved for a future release and is rejected with a configuration error.

Use exact package requirements for project packages, for example tool-a==0.1.0. Legacy editable entries that match a configured project path are converted to project-name==release-version using the project release tag with [release].tag_prefix stripped. Unmatched editable paths are rejected. Package path arguments after -r, --requirement, -c, and --constraint are resolved relative to sphinxpress.toml.

Documentation

Build the project documentation with:

python -m pip install -e ".[dev,docs,pdf]"
python -m sphinx -b html docs docs/_build/html

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sphinxpress-0.1.2.tar.gz (55.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sphinxpress-0.1.2-py3-none-any.whl (32.6 kB view details)

Uploaded Python 3

File details

Details for the file sphinxpress-0.1.2.tar.gz.

File metadata

  • Download URL: sphinxpress-0.1.2.tar.gz
  • Upload date:
  • Size: 55.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for sphinxpress-0.1.2.tar.gz
Algorithm Hash digest
SHA256 233c52fb4ba5eca1f7ad5e058f45e5d57be3b9d58cb8919f948042473f7f5330
MD5 4caa03895f9c327608d2a6a1eb293d3d
BLAKE2b-256 dc29845e9941ba2758e090d9b7344fa15ec84b3a22bdb1d3ef31af5ce0448003

See more details on using hashes here.

File details

Details for the file sphinxpress-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: sphinxpress-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 32.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for sphinxpress-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 5dcde23594a3e4deb29874d553fa6ba3588295b4272e0945c027993d44aad9f8
MD5 355cd0814ff69f8b4f3f84c506bf084c
BLAKE2b-256 cdb62056c76d494fb9c363d79423e2d58ddac02bd12f2fda384a0934bbd007b0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page