Skip to main content

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)

Source distribution for insecure-tree 0.2.0
File Size Uploaded
insecure_tree-0.2.0.tar.gz 36.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for insecure-tree 0.2.0
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page