reachgraph
An endpoint-rooted call graph for a repository, emitted as a static artifact.
reachgraph starts from the endpoints a service actually exposes — a gRPC method, an HTTP route — and walks the call graph outwards from each one. What it produces is not "every function and who calls it" but an answer to a narrower and more useful question: which code is reachable from which endpoint version, and which code is reachable from none of them.
It is one binary. It installs from PyPI, links its analysis engine in-process, downloads nothing at run time, and runs no subprocess of its own beyond the target language's own build toolchain (ADR-0001).
Install
$ pip install reachgraph
$ reachgraph --version
The wheel contains an executable and no Python. Nothing is importable; nothing is compiled at install time.
Use
$ reachgraph ./some-repo -o ./out
$ reachgraph serve ./out
./out is a static directory: index.html, one shard per root under graph/, a
single-file overview.html, and the machine-readable endpoints.json,
unreachable.json and run.json beside them. serve exists only because file://
blocks fetch() for the sharded pages — overview.html opens straight from disk
(ADR-0006).
The artifact is a structural map of your repository. It carries file paths, function and method names, doc comment text and service topology. Treat it with the same care as the source, and read the warning the binary prints before publishing one anywhere.
Runtime
reachgraph analyses a whole repository in one pass. It is a CI-generated artefact, not an interactive tool: run it in a workflow and read the output, rather than expecting it to answer a question while you wait.
MEASURED 2026-09-19, the shipped release profile, warm page cache, against one small
Rust workspace — 8 units, 227 symbols, 364 edges: 4.86 s wall and 900 MB peak resident.
Three runs of command time -v ./target/release/reachgraph … gave 4.86 / 4.63 / 4.91 s
and 900 224 / 898 248 / 901 044 kB; the medians are the numbers above. The binary's own
run.json accounts for 4.53 / 4.30 / 4.60 s of those, nearly all of it analysis.
That figure is one repository and it is small. It does not establish what reachgraph
costs on a large one. docs/design.md §8's "minutes, not seconds" was measured against
the LSP round-trip architecture ADR-0001 rejected, and it has never been re-measured
against the linked engine at scale. Peak resident memory is the number to watch: 900 MB
on 227 symbols is rust-analyzer's own working set, and it grows with the repository
rather than with the graph.
What it does not claim
An absent edge is not a proven absence. reachgraph reports the limits of each run — in the terminal, and inside the artifact — and the wording is deliberate throughout: code is described as not reachable from any endpoint version in this index, never as dead (ADR-0007). Proc-macro expansion is off in v0.1 (ADR-0728) and generated code is not loaded, so calls crossing either are unmeasured rather than absent.
Licence
MIT OR Apache-2.0, at your option. See LICENSE-MIT and LICENSE-APACHE.
The binary statically links its dependencies and the emitted artifact carries vendored
JavaScript, so both redistribute third-party code:
THIRD-PARTY-LICENSES.md covers the crates and the bundles, and
every emitted artifact carries its own vendor/LICENSES.txt.
The four-layer architecture is derived from crabviz, which is AGPL-3.0. Ideas are not copyrightable and the credit belongs in prose; not one line of its code is here, and CI asserts that.
Contributing
docs/adr/ holds the decisions and docs/plans/ the per-module implementation plans.
Every factual claim in either is labelled MEASURED or INFERRED; keep that up.
$ cargo test --workspace --all-features
$ pre-commit run --all-files
Release files for reachgraph 0.1.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 | |
|---|---|---|---|
| reachgraph-0.1.0.tar.gz | 36.4 MB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| reachgraph-0.1.0-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| reachgraph-0.1.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | Python 3 | none | Linux glibc 2.17+ x86-64 | Details |
| reachgraph-0.1.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | Python 3 | none | Linux glibc 2.17+ ARM64 | Details |
| reachgraph-0.1.0-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details |
| reachgraph-0.1.0-py3-none-macosx_10_12_x86_64.whl | Python 3 | none | macOS 10.12+ x86-64 | Details |
Total release size: 69.1 MB
Release files / reachgraph-0.1.0.tar.gz
| Download URL | reachgraph-0.1.0.tar.gz |
|---|---|
| Size | 36.4 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e708e1e50a194f5a7c5a068aa96d9e3c4177f1e5418bbd32cd6e28f9d93f5834
|
|
BLAKE2b-256 checksum How to use checksums |
39ee6c75216c20bdc0d90e71745cc093e55d6dc497a9ae68623872b77699450d
|
| 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 Sep 19, 2026.
Transparency logRelease files / reachgraph-0.1.0-py3-none-win_amd64.whl
| Download URL | reachgraph-0.1.0-py3-none-win_amd64.whl |
|---|---|
| Size | 6.9 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
3d89d06281415f34b4bb504d8b852e692a2abf4d0a831d2104f9656fe38aa463
|
|
BLAKE2b-256 checksum How to use checksums |
a499fb7a223100a24833827833e4dadd6c05fe258956f581b2360c8e8b54a4ec
|
| 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 Sep 19, 2026.
Transparency logRelease files / reachgraph-0.1.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | reachgraph-0.1.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 6.7 MB |
| Tags | Linux glibc 2.17+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
b5ff13b84f340a075ac667701999d0e47a5b38d80623f0954a88495ddb06aabd
|
|
BLAKE2b-256 checksum How to use checksums |
2d2a19832bea8a24f8b61439ade28c3c1a90c13fcd26680b33ee43f95227c1ae
|
| 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 Sep 19, 2026.
Transparency logRelease files / reachgraph-0.1.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | reachgraph-0.1.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 6.4 MB |
| Tags | Linux glibc 2.17+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
0bd0919623967645dd6d79c700833107b990903e600ef71735b9b88bf51e8992
|
|
BLAKE2b-256 checksum How to use checksums |
4c2c0003ad5dfc29b5d4c3a61978bf92a26107c144cd596ffaed9d38e32bd929
|
| 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 Sep 19, 2026.
Transparency logRelease files / reachgraph-0.1.0-py3-none-macosx_11_0_arm64.whl
| Download URL | reachgraph-0.1.0-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 6.2 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
727c35cc04ee037ae1a2e04d0b1239ebae615ae0daaaf2b2d2b6e474c64e8ecc
|
|
BLAKE2b-256 checksum How to use checksums |
91ec84352c66cbe588e636b76ff3b13cd7949fb052f9ed4c6d9d9fecc349bad7
|
| 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 Sep 19, 2026.
Transparency logRelease files / reachgraph-0.1.0-py3-none-macosx_10_12_x86_64.whl
| Download URL | reachgraph-0.1.0-py3-none-macosx_10_12_x86_64.whl |
|---|---|
| Size | 6.5 MB |
| Tags | Python 3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
0cbb50045018af52b75d6be6b72f8bf2757217f61fb63e710aba44501d965205
|
|
BLAKE2b-256 checksum How to use checksums |
0c352a4e5a79fd262f3d852ecdb173617b4fc6968a870a07db08aa37e0e3c911
|
| 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 Sep 19, 2026.
Transparency log