Skip to main content

High-performance dead code elimination analysis tool for Python.

Project description

CytoScnPy - High-Performance Python Static Analysis

CI Coverage codecov Security Audit Docs License Version

A fast, lightweight static analyzer for Python codebase. It’s built in Rust with Python integration and detection of dead code, security issues, and code quality issue, along with useful quality metrics.

Why CytoScnPy?

  • Blazing Fast: Faster in dead code detection.
  • Memory Efficient: Uses less memory.
  • Comprehensive: Dead code, secrets, security, taint analysis, quality metrics
  • Framework Aware: Flask, Django, FastAPI, Pydantic, Azure Functions
  • Benchmarked: Continuous benchmarking with 135-item ground truth suite

Installation

Linux / macOS:

# Install
curl -fsSL https://raw.githubusercontent.com/djinn09/CytoScnPy/main/install.sh | bash

Windows (PowerShell):

# Install
irm https://raw.githubusercontent.com/djinn09/CytoScnPy/main/install.ps1 | iex

Via Pip:

pip install cytoscnpy

From Source:

git clone https://github.com/djinn09/CytoScnPy.git
cd CytoScnPy
pip install maturin
maturin develop -m cytoscnpy/Cargo.toml

MCP Server (for AI Assistants)

CytoScnPy includes an MCP server for AI assistant integration:

# Start MCP server (after pip install)
cytoscnpy mcp-server

For Claude Desktop, Cursor, or GitHub Copilot configuration, see the MCP Server Documentation.

Features

  • Dead Code Detection: Unused functions, classes, imports, and variables with cross-module tracking.
    • Cascading Detection: Methods inside unused classes are automatically flagged as unused.
    • Auto-Fix: Remove dead code automatically with --fix (preview by default, use --apply to execute).
  • Clone Detection: Find duplicate code with --clones.
  • Security Analysis: Taint analysis (SQLi, XSS), secret scanning (API keys, suspicious variables), and dangerous code patterns (eval, exec).
  • Code Quality Metrics: Cyclomatic complexity, Halstead metrics, Maintainability Index, and raw metrics (LOC, SLOC).
  • Framework Support: Native understanding of Flask, Django, FastAPI, Pydantic, and Azure Functions v2 patterns.
  • Smart Heuristics: Handles dataclasses, __all__ exports, visitor patterns, and dynamic attributes intelligently.
  • Cross-File Detection: Tracks symbol usage across the entire codebase, including nested packages and complex import chains, to ensure code used in other modules is never incorrectly flagged.

Usage

[!IMPORTANT] Behavioral Change: Starting from version 1.2.2, tests are excluded by default across both the CLI and the library API to reduce noise in production analysis. Use the --include-tests flag or set include_tests = true in your configuration to scan test files.

Command Line

cytoscnpy [PATHS]... [OPTIONS]

Examples:

# Dead code analysis
cytoscnpy .                                     # Analyze current directory
cytoscnpy /path/to/project --json               # JSON output for CI/CD

# Security checks (short flags: -s, -d, -q)
cytoscnpy . --secrets --danger --quality
cytoscnpy . -s -d -q                        # Same with short flags

# Confidence threshold (0-100)
cytoscnpy . --confidence 80

# Path filtering
cytoscnpy . --exclude-folder venv --exclude-folder build
cytoscnpy . --include-folder specific_venv      # Override defaults
cytoscnpy . --include-tests

# Jupyter notebooks
cytoscnpy . --include-ipynb --ipynb-cells

# Clone detection (find duplicate code)
cytoscnpy . --clones --clone-similarity 0.8

# Auto-fix dead code (preview first, then apply)
cytoscnpy . --fix                    # Preview changes (dry-run by default)
cytoscnpy . --fix --apply            # Apply changes
cytoscnpy . --fix -a                 # Apply changes (short flag)

# Generate HTML report (quality auto-enabled; add --secrets --danger for security)
cytoscnpy . --html --secrets --danger

# Pre-commit integration
# See https://djinn09.github.io/CytoScnPy/pre-commit/ for setup

Common Options:

Flag Description
-s, --secrets Scan for API keys and hardcoded credentials
-d, --danger Scan for dangerous code + taint analysis
-q, --quality Scan for code quality issues (complexity, etc.)
--clones Activate duplicate code detection
--fix Preview/dry-run dead code removal
-a, --apply Apply fixes to files (use with --fix)
--json Output results in machine-readable JSON

[!TIP] > View the Full CLI Reference for detailed usage, advanced configuration, and quality gate options.

CI/CD Gate Options:

Flag Description
--fail-threshold <N> Exit code 1 if unused code % > N
--max-complexity <N> Exit code 1 if any function complexity > N
--min-mi <N> Exit code 1 if maintainability index < N
--fail-on-quality Exit code 1 if any quality issues found
--max-nesting <N> Exit code 1 if any block nesting > N
--max-args <N> Exit code 1 if any function has > N args
--max-lines <N> Exit code 1 if any function has > N lines

Full CLI Reference: See docs/CLI.md for complete command documentation.

Metric Subcommands

cytoscnpy raw .                    # Raw Metrics (LOC, SLOC, Comments)
cytoscnpy cc .                     # Cyclomatic Complexity
cytoscnpy hal .                    # Halstead Metrics
cytoscnpy mi .                     # Maintainability Index
cytoscnpy stats . --all            # Full project report (secrets, danger, quality)
cytoscnpy stats . --all -o report.md  # Save report to file
cytoscnpy files .                  # Per-file metrics table

Tip: Add --json for machine-readable output, --exclude-folder <DIR> to skip directories globally, or --ignore <PATTERN> for subcommand-specific glob filtering.

⚙️ Configuration

Create .cytoscnpy.toml (uses [cytoscnpy]) or add to pyproject.toml (uses [tool.cytoscnpy]):

.cytoscnpy.toml example:

[cytoscnpy]
# General Settings
confidence = 60  # Minimum confidence threshold (0-100)
exclude_folders = ["venv", ".tox", "build", "node_modules", ".git"]
include_folders = ["src", "tests"]  # Optional: whitelist folders
include_tests = false  # Note: include_ipynb and ipynb_cells are CLI-only (use flags)

# Analysis Features
secrets = true
danger = true
quality = true

# Fail Threshold (exit code 1 if exceeded)
fail_threshold = 10.0  # Fail if >10% of code is unused
# fail_threshold = 0.0  # Zero tolerance: fail on any unused code

# Code Quality Thresholds
max_lines = 100       # Max lines per function
max_args = 5          # Max arguments per function
max_complexity = 10   # Max cyclomatic complexity
max_nesting = 4       # Max indentation depth
min_mi = 65.0         # Minimum Maintainability Index
ignore = ["R001"]     # Ignore specific rule IDs

# Advanced Secret Scanning
[cytoscnpy.secrets_config]
entropy_enabled = true
entropy_threshold = 4.5  # Higher = more random (API keys usually >4.0)
min_length = 16          # Min length to check for entropy
scan_comments = true     # Scan comments for secrets
skip_docstrings = false  # Skip docstrings in entropy scanning
min_score = 50           # Minimum confidence score (0-100)
suspicious_names = ["db_config", "oauth_token"] # Add custom suspicious variable names

# Custom Secret Patterns
[[cytoscnpy.secrets_config.patterns]]
name = "Slack Token"
regex = "xox[baprs]-([0-9a-zA-Z]{10,48})"
severity = "HIGH"

Note: Notebook options (include_ipynb, ipynb_cells) are currently CLI-only but will be added to the configuration file in a future release.

CI/CD Quality Gates

Configure quality gates for CI/CD pipelines. Set thresholds and the CLI exits with code 1 if exceeded.

CLI Flags:

# Unused code percentage gate
cytoscnpy . --fail-threshold 5  # Fail if >5% unused

# Complexity gate
cytoscnpy . --max-complexity 10  # Fail if any function >10

# Maintainability Index gate
cytoscnpy . --min-mi 40  # Fail if MI <40

# Quiet mode for clean CI output
cytoscnpy . --fail-threshold 5 --quiet

Priority: CLI flag > config file > environment variable > default

Environment Variable: CYTOSCNPY_FAIL_THRESHOLD=5.0

Performance

Accuracy (Benchmark Suite: 135 items)

Detection Type Precision Recall F1 Score
Classes 0.73 0.79 0.76
Functions 0.71 0.74 0.73
Methods 0.86 0.93 0.89
Imports 0.67 0.40 0.50
Variables 0.30 0.15 0.20
Overall 0.71 0.64 0.68

See benchmark/README.md for detailed comparison against Vulture, Flake8, Pylint, Ruff, and others.

Testing

See CONTRIBUTING.md for testing instructions.

Contributing

See CONTRIBUTING.md for development setup and guidelines.

License

Apache-2.0 License - see License file for details.

Links

References

CytoScnPy's design and implementation are inspired by:

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

cytoscnpy-1.2.8-cp313-cp313-win_amd64.whl (2.1 MB view details)

Uploaded CPython 3.13Windows x86-64

cytoscnpy-1.2.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

cytoscnpy-1.2.8-cp313-cp313-macosx_11_0_arm64.whl (2.1 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

cytoscnpy-1.2.8-cp312-cp312-win_amd64.whl (2.1 MB view details)

Uploaded CPython 3.12Windows x86-64

cytoscnpy-1.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

cytoscnpy-1.2.8-cp312-cp312-macosx_11_0_arm64.whl (2.1 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

cytoscnpy-1.2.8-cp311-cp311-win_amd64.whl (2.1 MB view details)

Uploaded CPython 3.11Windows x86-64

cytoscnpy-1.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

cytoscnpy-1.2.8-cp311-cp311-macosx_11_0_arm64.whl (2.1 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

cytoscnpy-1.2.8-cp310-cp310-win_amd64.whl (2.1 MB view details)

Uploaded CPython 3.10Windows x86-64

cytoscnpy-1.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

cytoscnpy-1.2.8-cp310-cp310-macosx_11_0_arm64.whl (2.1 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

cytoscnpy-1.2.8-cp39-cp39-win_amd64.whl (2.1 MB view details)

Uploaded CPython 3.9Windows x86-64

cytoscnpy-1.2.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

cytoscnpy-1.2.8-cp39-cp39-macosx_11_0_arm64.whl (2.1 MB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

cytoscnpy-1.2.8-cp38-cp38-win_amd64.whl (2.1 MB view details)

Uploaded CPython 3.8Windows x86-64

cytoscnpy-1.2.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

cytoscnpy-1.2.8-cp38-cp38-macosx_11_0_arm64.whl (2.1 MB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

File details

Details for the file cytoscnpy-1.2.8-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: cytoscnpy-1.2.8-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for cytoscnpy-1.2.8-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 83293bcf072fd46881230de6b6e1d9ad0c76d47c8eac5ef91b93a5df6196d931
MD5 bdeca70f365353f46c0134d1fd9b655f
BLAKE2b-256 d0e1396174d2790860c90eb8137b08af0cb8325a717665eade127e785d2c1edf

See more details on using hashes here.

File details

Details for the file cytoscnpy-1.2.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cytoscnpy-1.2.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 977eee736a43905665bd85aa7be8fced153388b7a0f4ac8a4f95b4855d4a8357
MD5 a7ee2e95029c23acb65bd1ad4562867c
BLAKE2b-256 2c3733d527d4b718f8f6cc7e8df037ad3518ec571b55b3ccd98aada5a26cf5c0

See more details on using hashes here.

File details

Details for the file cytoscnpy-1.2.8-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cytoscnpy-1.2.8-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a1125f766507a2dce95c4abd79cc42bd019171792f5663ff24f7b5f12328fc20
MD5 753db13ff6893b6ac56aa42d515de007
BLAKE2b-256 7cfad4fc687bc64e029a498b71e47031c30f816343ff4f9d9293aa9a7011bd05

See more details on using hashes here.

File details

Details for the file cytoscnpy-1.2.8-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: cytoscnpy-1.2.8-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for cytoscnpy-1.2.8-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 e73bea06bca5b89cffd199dca3716a36dd3e362eba335ac7f80163a6366984ac
MD5 57d50d40a4dd24da926f8fe6506a9631
BLAKE2b-256 90a96a0cb4e2eff8a0a4f23648e4a272a771632a26a5bde0b37edbdbe527c24a

See more details on using hashes here.

File details

Details for the file cytoscnpy-1.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cytoscnpy-1.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bfcd3a9fd254bddee1af019ec217af29a4af496c19a22e146205118ae19e3de4
MD5 c2f9792bdcacfd1472b0ff3c3bc4fda2
BLAKE2b-256 b0ab835784f4133c83be06ba07e578ee1ca0c6c77c12fade357ff1058aca627f

See more details on using hashes here.

File details

Details for the file cytoscnpy-1.2.8-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cytoscnpy-1.2.8-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9b014df419779731fb5651c4d39f556d2d7a7dbf85c950c04d820f4ba914f092
MD5 800415e22902fe631f4af1f6f72b9afc
BLAKE2b-256 ab5f7f5e604cee5b4da8f8f8590a5335903659280a2a9ec13cc5ae51dc3c815a

See more details on using hashes here.

File details

Details for the file cytoscnpy-1.2.8-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: cytoscnpy-1.2.8-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for cytoscnpy-1.2.8-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 881070b418484a701dd3a687ef6bbaa499478de2f501b896ff9e887770a80e54
MD5 15a87f21382ecd344abc4cb82e9c8dd9
BLAKE2b-256 4d9d6ca6f1635276574e7518e8bef552c362193582e4dc25cb96f2937b4683c0

See more details on using hashes here.

File details

Details for the file cytoscnpy-1.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cytoscnpy-1.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 15fe99740616819678cd4bae849cf175464daffc075cda454f79bac35a4c7a28
MD5 c32b481e246f6e6fd0fe12e27ef64402
BLAKE2b-256 c00e32e189fce464184b3cd1dc9e1d0550f6987d285106819ea1164045539081

See more details on using hashes here.

File details

Details for the file cytoscnpy-1.2.8-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cytoscnpy-1.2.8-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7a8bd6d2d17cd399f542be628e6502d662f9ee667ceb32bfd7e8e265adbfa2b9
MD5 a501be759872eaf8d279f8dd476b7dcd
BLAKE2b-256 61be461d61072a9ae5434838307ce9051e1e874bc4b1b700764aa53b83c040ec

See more details on using hashes here.

File details

Details for the file cytoscnpy-1.2.8-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: cytoscnpy-1.2.8-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for cytoscnpy-1.2.8-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 177475914a3cb2b9d2485365a5fe3db8427df504cb744fd4755a62700fa45d6c
MD5 076c691a68efb2523ff827d689b1590f
BLAKE2b-256 6d7ab2c50468c79be72e6ae10f588842b50590a9e69ae31789c847eb68ce4099

See more details on using hashes here.

File details

Details for the file cytoscnpy-1.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cytoscnpy-1.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5de533aa408ba5218dd02ee0cb4dd55ca12c2a2765bc9ebdca5211e3e715e60f
MD5 1d409b002a76f0dc00078bea0ebab458
BLAKE2b-256 454fbc5b8850c6b3f6053665218ebdf46ec79143093fcc63bcf519d6aa3353d1

See more details on using hashes here.

File details

Details for the file cytoscnpy-1.2.8-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cytoscnpy-1.2.8-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dccf7704f67a92afd8a614688eaae14254ec78254f28ed30591c81939cb3a44c
MD5 12493a7e6387c53decff4640aec0ef2b
BLAKE2b-256 342410ac0de3ff3da4afd4255c54c971fabb830cba784f3587d5ff3aea116743

See more details on using hashes here.

File details

Details for the file cytoscnpy-1.2.8-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: cytoscnpy-1.2.8-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for cytoscnpy-1.2.8-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 ac838d7b3a33cc856fbf55bcf899e2aa425839c52086fa0a43706814478dae31
MD5 1cbb19436eb0304647c17406375952b4
BLAKE2b-256 54f5b63a9f3d717aa26da284de7818fd35a0edceaa6589546a32cce8cd0bbfb4

See more details on using hashes here.

File details

Details for the file cytoscnpy-1.2.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cytoscnpy-1.2.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cdf436c8b6f9c676054636729c0c9426fdba4a6d42d299e22e0391e787e71c7e
MD5 be35e131514c3fe58e48b185e7d599eb
BLAKE2b-256 065126dcea93618c231c176de68c916d3cb16b773d7fc5146f1062bfe5154e4e

See more details on using hashes here.

File details

Details for the file cytoscnpy-1.2.8-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cytoscnpy-1.2.8-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 243449cb4294317534475851e612c6cadcafef4ecadd72eaaa3e9f2cccfff899
MD5 1d162a57f504500b0e3ae3fb3b430b31
BLAKE2b-256 f57113b0a22a5a62595cf2162fda8416787cc6f158cc738750920e4c59a4870f

See more details on using hashes here.

File details

Details for the file cytoscnpy-1.2.8-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: cytoscnpy-1.2.8-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for cytoscnpy-1.2.8-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 e652ea3374ca0819661c6cb4088b65d995fb0b6dc429bedbc2c5edd38b569890
MD5 dc607c073aff0fc0c37e2e774811c933
BLAKE2b-256 fb0356cf78d5c08ce6051a062584e1a3b396356588536749c452b857179ddcfd

See more details on using hashes here.

File details

Details for the file cytoscnpy-1.2.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cytoscnpy-1.2.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 26c45dc9ee86d14e4f191d1b09370a908045a99c7fa9efe4e2f9d814c6cea9ba
MD5 32489ce0fe3b817f923cb61a5ba75cee
BLAKE2b-256 dfa6046cda31c9bdfce9bc50b8904eeab181b5eb8e81930f5b617ee2fc7e1b03

See more details on using hashes here.

File details

Details for the file cytoscnpy-1.2.8-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cytoscnpy-1.2.8-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e19474ea98540c820dff9d6cc22a8cbda2c5f5796ba0e917e5223aa99e7267df
MD5 0020c336a6f0e0f28b73169b12e4169f
BLAKE2b-256 30b3d6d139554243913066146281d47eea35a7865929643083c58b45c37d2058

See more details on using hashes here.

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