Skip to main content

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

insecure_tree-0.2.0.tar.gz (36.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

insecure_tree-0.2.0-py3-none-any.whl (43.5 kB view details)

Uploaded Python 3

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

Hashes for insecure_tree-0.2.0.tar.gz
Algorithm Hash digest
SHA256 27607fcd88565fcf99ff6674641310d9c27c4bbf8ce3de24f3e36dd086f53d63
MD5 bd2d5a39f9898923ab02ed8cfa87c38d
BLAKE2b-256 46c92cee01a2e1053ee082253dd04735c4a0a4a8a166833915932410ef7aebbd

See more details on using hashes here.

Provenance

The following attestation bundles were made for insecure_tree-0.2.0.tar.gz:

Publisher: publish_to_pypi.yml on matthewdeanmartin/insecure_tree

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for insecure_tree-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1ae7e7a488411fc6a5f855f77e04fed243c6d84865b7d05a9a27448b7dd13e8b
MD5 1238389b870278c6cb0f16aea3e51e26
BLAKE2b-256 04c4da1a0dcdd897b76381cb080968fa4ebc959ab416552ab0e3df0c646df5d3

See more details on using hashes here.

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

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page