insecure-tree
Audit the GitHub Actions security posture of your entire Python dependency tree.
insecure-tree discovers your transitive dependencies, resolves their PyPI metadata, identifies claimed GitHub repositories, downloads workflow files, and runs zizmor against each one — then produces a unified text, HTML, and JSON report showing every finding and which package it came from.
Demo page
Demo of scan against insecure-tree's own dependencies (including development dependencies)
Installation
# Install zizmor first (required)
pip install zizmor
# Install insecure-tree
pipx install insecure_tree
Or with pip:
pip install insecure_tree
Quick start
# Scan a uv project
insecure-tree scan --source uv --project .
# Scan the active virtualenv
insecure-tree scan --source pip-inspect
# Auto-detect the best source
insecure-tree scan
Reports land in ./insecure-tree-report/ as insecure-tree.txt, insecure-tree.html, and insecure-tree.json.
GitHub Pages self-scan
The checked-in GitHub Pages report lives in pages/, not docs/, so it does not interfere with the MkDocs / Read the
Docs site.
Regenerate it with:
uv run make build-pages-report
The Publish GitHub Pages workflow rebuilds that self-scan report and deploys pages/index.html.
CI usage
insecure-tree scan \
--source auto \
--format text \
--format html \
--fail-on error \
--output-dir artifacts/insecure-tree
Exit codes: 0 clean, 1 findings above threshold, 2 config error, 3 infrastructure error, 4 partial scan
failure.
All commands
| Command | Description |
|---|---|
insecure-tree scan |
Run the full audit pipeline |
insecure-tree graph |
Emit the dependency graph as JSON or text |
insecure-tree metadata PACKAGE |
Inspect PyPI metadata and GitHub candidates for one package |
insecure-tree report --input FILE |
Re-render a report from a saved JSON file |
insecure-tree cache dir |
Print the cache directory path |
insecure-tree cache clean |
Remove expired cache entries |
Configuration
Configuration is read from pyproject.toml under [tool.insecure-tree] or from insecure-tree.toml:
[tool.insecure-tree]
source = "auto"
fail_on = "never"
report_min_severity = "note"
[tool.insecure-tree.github]
token_env = "GITHUB_TOKEN"
[tool.insecure-tree.repo_overrides]
"Pillow" = "https://github.com/python-pillow/Pillow"
[[tool.insecure-tree.ignore]]
package = "some-package"
rule = "excessive-permissions"
reason = "Accepted risk — only runs on release branches."
expires = "2026-12-01"
Documentation
Full documentation is at insecure-tree.readthedocs.io.
Contributing
See CONTRIBUTING.md.
License
MIT — see LICENSE.
Changelog
See CHANGELOG.md.
Metadata
Release files for insecure-tree 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 | |
|---|---|---|---|
| insecure_tree-0.2.0.tar.gz | 36.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| insecure_tree-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 80.0 kB
Release files / insecure_tree-0.2.0.tar.gz
| Download URL | insecure_tree-0.2.0.tar.gz |
|---|---|
| Size | 36.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
27607fcd88565fcf99ff6674641310d9c27c4bbf8ce3de24f3e36dd086f53d63
|
|
BLAKE2b-256 checksum How to use checksums |
46c92cee01a2e1053ee082253dd04735c4a0a4a8a166833915932410ef7aebbd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
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 May 3, 2026.
Transparency logRelease files / insecure_tree-0.2.0-py3-none-any.whl
| Download URL | insecure_tree-0.2.0-py3-none-any.whl |
|---|---|
| Size | 43.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1ae7e7a488411fc6a5f855f77e04fed243c6d84865b7d05a9a27448b7dd13e8b
|
|
BLAKE2b-256 checksum How to use checksums |
04c4da1a0dcdd897b76381cb080968fa4ebc959ab416552ab0e3df0c646df5d3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
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 May 3, 2026.
Transparency log