Breakproof — merge without fear.
Your PR deleted an endpoint someone still calls. Breakproof tells you before your users do. No OpenAPI spec, no config novel, no noise. Removed contracts fail. Everything else passes.
pipx install breakproof
breakproof scan ./app --out base.json
breakproof diff --base base.json --head-dir ./pr-branch
# verdict=fail, exit 1, and a Markdown receipt of exactly what vanished
Install
pipx install breakproof # CLI, isolated. The good default.
pip install breakproof # library + CLI in your venv.
uvx breakproof --help # no install at all, just vibes.
Python 3.10+. Zero dependencies. No network, no telemetry, no account. It works on a plane.
CLI
# Freeze a directory into a contract
breakproof scan ./app --out contract.json
breakproof scan ./app --service payments --out contract.json
# Diff two frozen contracts
breakproof diff --base base.json --head head.json
# Diff two directories directly (the 10-second demo)
breakproof diff --base-dir ./main --head-dir ./pr
# Save the receipts instead of printing them
breakproof diff --base base.json --head head.json \
--out-gate gate.json --markdown gate.md --radar-markdown radar.md
Exit codes: 0 pass, 1 fail (something vanished), 2 you invoked it wrong.
Contract JSON looks like this. You can hand-write it, generate it, or freeze it in CI — Breakproof doesn't care where it came from:
{
"endpoints": [
{"method": "GET", "path": "/users", "protocol": "http",
"service": "api", "handler": "", "file": "app.py", "line": 12}
],
"edges": []
}
Library (yes, it's importable)
Same gate your CI runs, inside your own Python:
from breakproof.extract import scan_path
from breakproof.prgate import build_gate, render_gate_markdown
base = scan_path("./main")
head = scan_path("./pr")
gate = build_gate(base, head, base_ref="main", head_ref="pr")
print(gate["verdict"]) # "pass" | "fail"
print(render_gate_markdown(gate)) # paste it into a PR comment
Lower level, if you already have contracts:
from breakproof.radar import build_api_diff
diff = build_api_diff(base, head)
print(diff["summary"]) # {"removed": 1, "added": 0, ..., "breaking": 1}
CI
- uses: auditscan-sh/breakproof@v1
with:
base-dir: ./base
head-dir: .
Posts the verdict to the run summary. Set fail-on-breaking: "false" for advisory mode (comments, never red).
Why not a spec diff?
Spec tools need an openapi.yaml you have to write and keep honest, then flag everything including stuff nobody calls. Breakproof reads your code, freezes what it serves, and fails only on removals — plus new CVEs or secret sites if you hand it those lists as JSON. Nothing to maintain, nothing to triage, nothing to argue about in review.
Honest limits
v0.1 recognizes common Flask, FastAPI, Express, Fiber, Go net/http, and Gin route patterns. Anything exotic reports zero endpoints instead of inventing some — run breakproof scan and eyeball the count before you gate on it. Standalone caller lists read none observed; pair it with a scanner that knows your consumers to name names.
Safety
Read-only by design. It never deletes, moves, edits, or executes your code — it reads the directories you point it at and writes exactly the files you name with --out / --markdown. Symlinks skipped, files over 1 MB skipped, scans cap at 50k files / 20k endpoints.
License
MIT. Break things responsibly.
Built by AuditScan.
Metadata
Release files for breakproof 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| breakproof-0.1.1.tar.gz | 15.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| breakproof-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 30.0 kB
Release files / breakproof-0.1.1.tar.gz
| Download URL | breakproof-0.1.1.tar.gz |
|---|---|
| Size | 15.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
03040360b43622bda27a2cf26e7dc9c388c4a067390ae9640a1474c6ce79709c
|
|
BLAKE2b-256 checksum How to use checksums |
a44bf12d832fc06d2fe63a6080475466425f24f25c560a48236703f2766a732d
|
| 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 18, 2026.
Transparency logRelease files / breakproof-0.1.1-py3-none-any.whl
| Download URL | breakproof-0.1.1-py3-none-any.whl |
|---|---|
| Size | 14.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7242a36bb59b37a89cfc0e272c8cf3f5eb30da4a559b536aebc3cb6089840c1e
|
|
BLAKE2b-256 checksum How to use checksums |
b035a1f2d3ed1a151541fb31d0013540928313944490d8af7c5341f41fa68451
|
| 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 18, 2026.
Transparency log