Audit GitHub Actions security posture of your Python dependency tree using zizmor
Project description
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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file insecure_tree-0.2.0.tar.gz.
File metadata
- Download URL: insecure_tree-0.2.0.tar.gz
- Upload date:
- Size: 36.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
27607fcd88565fcf99ff6674641310d9c27c4bbf8ce3de24f3e36dd086f53d63
|
|
| MD5 |
bd2d5a39f9898923ab02ed8cfa87c38d
|
|
| BLAKE2b-256 |
46c92cee01a2e1053ee082253dd04735c4a0a4a8a166833915932410ef7aebbd
|
Provenance
The following attestation bundles were made for insecure_tree-0.2.0.tar.gz:
Publisher:
publish_to_pypi.yml on matthewdeanmartin/insecure_tree
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
insecure_tree-0.2.0.tar.gz -
Subject digest:
27607fcd88565fcf99ff6674641310d9c27c4bbf8ce3de24f3e36dd086f53d63 - Sigstore transparency entry: 1435921502
- Sigstore integration time:
-
Permalink:
matthewdeanmartin/insecure_tree@e556d48fc96ee1452f3fa38bd7d942794374e3b1 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/matthewdeanmartin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish_to_pypi.yml@e556d48fc96ee1452f3fa38bd7d942794374e3b1 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file insecure_tree-0.2.0-py3-none-any.whl.
File metadata
- Download URL: insecure_tree-0.2.0-py3-none-any.whl
- Upload date:
- Size: 43.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1ae7e7a488411fc6a5f855f77e04fed243c6d84865b7d05a9a27448b7dd13e8b
|
|
| MD5 |
1238389b870278c6cb0f16aea3e51e26
|
|
| BLAKE2b-256 |
04c4da1a0dcdd897b76381cb080968fa4ebc959ab416552ab0e3df0c646df5d3
|
Provenance
The following attestation bundles were made for insecure_tree-0.2.0-py3-none-any.whl:
Publisher:
publish_to_pypi.yml on matthewdeanmartin/insecure_tree
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
insecure_tree-0.2.0-py3-none-any.whl -
Subject digest:
1ae7e7a488411fc6a5f855f77e04fed243c6d84865b7d05a9a27448b7dd13e8b - Sigstore transparency entry: 1435921507
- Sigstore integration time:
-
Permalink:
matthewdeanmartin/insecure_tree@e556d48fc96ee1452f3fa38bd7d942794374e3b1 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/matthewdeanmartin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish_to_pypi.yml@e556d48fc96ee1452f3fa38bd7d942794374e3b1 -
Trigger Event:
workflow_dispatch
-
Statement type: