Sphinx Mounts
Mount external source trees into a Sphinx build without copying or
symlinking. Sources stay where they live — for example, a Bazel bazel-bin/
output tree, a sibling repository, or a generated cache directory — and are
made visible to Sphinx at a configured docname prefix. RST works out of the
box; Markdown works as soon as myst-parser is loaded in the host project;
any other format a Sphinx parser extension registers is picked up the same
way.
Features
- No materialization: sources are read directly from their original location. No copy, no symlink, no staging step.
- Declarative TOML config: the mount mapping lives in
ubproject.toml(or any TOML file you name viasources_from_toml).conf.pyonly references it. - Language-agnostic & toolable: because the config is static TOML, IDE
plugins, language servers, indexers, and build-system integrations
written in any language can read the same mount mapping that
sphinx-buildreads — without having to evaluateconf.py. - Variant-gated source selection: sphinx-mounts is also the Sphinx-side
reader for the shared
ubproject.tomlkeys that decide which files are in the build for the current variant —[[source.variant_sources]], which narrows a file set by glob, andifon a[[source.mounts]]entry, which gates a whole mounted bundle. A project with no mounts at all can install it purely for the first, to havesphinx-buildnarrow its document set the way ubCode already does. - Toctree auto-wiring: an optional
attach_toper mount injects the bundle's entry doc into a host toctree at build time, so the host stays buildable when a mount is absent (a developer hasn't run the upstream build, CI hasn't fetched the bundle). - Self-contained bundles: each mount is intended to be a
self-contained tree of
.rstfiles with relative links only, so it can be reused across host projects. A linter is on the roadmap; the convention is not currently enforced.
Quick Start
pip install sphinx-mounts
Add to your conf.py:
extensions = ["sphinx_mounts"]
Describe your mounts in ubproject.toml next to conf.py:
[[source.mounts]]
dir = "/abs/path/to/bazel-bin/docs/api-foo"
mount_at = "_generated/api-foo"
Reference mounted documents from your host project just like any other doc:
.. toctree::
_generated/api-foo/index
Why TOML?
A conf.py is executable Python — only a Python interpreter can read it
correctly. A TOML file is static data, parseable by every common language.
Putting the mount mapping in ubproject.toml means that any external tool
(an IDE extension, a documentation indexer, a CI gate, a non-Python build
system) can resolve cross-references without running Sphinx. The same file
can also carry sections owned by sibling tools such as Sphinx-Needs
([needs]) and sphinx-codelinks ([codelinks]), keeping the project's
documentation configuration in one place.
If TOML isn't an option for your setup, the legacy mounts = [...] list in
conf.py is still honored as a fallback — see the docs for details.
Related projects
- bazel-drives-sphinx — a heavier take on Bazel-driven Sphinx
documentation: Bazel rules declare every RST file (and
needs.jsonartifact) as a label, and generated per-project targets invokesphinx-buildon the assembled tree.sphinx-mountsis the lightweight alternative — Bazel drops generated files underbazel-bin/, the extension mounts that directory, and Sphinx reads in place. Pick the former for fine-grained multi-project rule collection and tag-driven variants; pick the latter when "Bazel build, then Sphinx" is enough. Seedocs/source/bazel.rstfor a side-by-side comparison.
Documentation
See docs/source/ for the full configuration reference and the Bazel
integration walkthrough. The "Related projects" section in
docs/source/index.rst lists sibling tools (Sphinx-Needs,
sphinx-codelinks, ubCode, bazel-drives-sphinx) that share the
ubproject.toml convention.
License
MIT — see LICENSE.
Metadata
Release files for sphinx-mounts 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sphinx_mounts-0.2.0.tar.gz | 98.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sphinx_mounts-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 198.6 kB
Release files / sphinx_mounts-0.2.0.tar.gz
| Download URL | sphinx_mounts-0.2.0.tar.gz |
|---|---|
| Size | 98.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7c19e867b463bccbff35281e2c6c20dfaa75d4fa88eef6abe97c9c371df6914b
|
|
BLAKE2b-256 checksum How to use checksums |
ed0685e09e90824dbf9b81c4f60fe156855d13249c1f1f7b208452b75d8fdc34
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 27, 2026.
Transparency logRelease files / sphinx_mounts-0.2.0-py3-none-any.whl
| Download URL | sphinx_mounts-0.2.0-py3-none-any.whl |
|---|---|
| Size | 100.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9e43cba60834bb648a7d3f0f43bb3fbbf9743e69933a89081a90a30d6d42d230
|
|
BLAKE2b-256 checksum How to use checksums |
c44cc92fe023dec5204dae85690fc110b47d0c6a0fe9e57c2f8b8d82228ef168
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 27, 2026.
Transparency log