Ignyt
The fastest Python code quality engine in the world.
One binary. Zero config. Replaces mypy, flake8, bandit, vulture, radon, black, and isort.
Ignyt is a standalone Python code quality engine written in Rust. It performs type checking, security scanning, dead code detection, complexity analysis, format checking, auto-fixing, and project cleanup — all in a single binary that runs 10-100x faster than the tools it replaces.
Why Ignyt?
| Problem | Before (multiple tools) | After (Ignyt) |
|---|---|---|
| Type checking | mypy |
ignyt types |
| Security scanning | bandit |
ignyt security |
| Dead code detection | vulture |
ignyt dead |
| Complexity analysis | radon |
ignyt complexity |
| Import sorting | isort |
ignyt fmt |
| Linting | flake8 |
ignyt check |
| Auto-fixing | black + manual |
ignyt fix |
| Cleanup | pyclean |
ignyt clean |
| .gitignore validation | manual review | ignyt gitignore |
| Install | pip install mypy flake8 bandit vulture radon black isort |
pip install ignyt |
| Config files | 7 config files | 1 ignyt.toml (optional) |
| Speed | 30-60 seconds on large projects | < 1 second |
Installation
pip install ignyt
Works on Linux, macOS, and Windows. No Python dependencies. No compilation. Just install and run.
Quick Start
# Run all checks on your project
ignyt check src/
# Check a single file
ignyt check app/main.py
# Check everything in current directory
ignyt check .
# Run specific engines
ignyt types src/ # Type checking only
ignyt security src/ # Security scanning only
ignyt dead src/ # Dead code detection only
ignyt complexity src/ # Complexity analysis only
# Auto-fix safe issues
ignyt fix src/
# Get help on a specific rule
ignyt explain SEC001
# Watch mode — re-runs on file changes
ignyt watch src/
# JSON output for CI/CD integration
ignyt check --format json src/
# Remove Python debris (__pycache__, .pyc, .egg-info, etc.)
ignyt clean
ignyt clean --dry-run # Preview what would be removed
# Validate .gitignore
ignyt gitignore # Check for issues
ignyt gitignore --init # Generate a Python .gitignore
What It Catches
Security (SEC001-SEC012)
Catches vulnerabilities before they reach production.
| Code | Name | Description |
|---|---|---|
| SEC001 | hardcoded-password | Hardcoded credentials in source code |
| SEC002 | sql-injection | SQL query built via string interpolation |
| SEC003 | shell-injection | subprocess with shell=True |
| SEC004 | pickle-usage | pickle.loads/load can execute arbitrary code |
| SEC005 | yaml-unsafe-load | yaml.load() without SafeLoader |
| SEC006 | xml-bomb | XML parsing vulnerable to XXE attacks |
| SEC007 | assert-used | assert removed under -O mode |
| SEC008 | weak-crypto | MD5/SHA1 hash algorithms |
| SEC009 | hardcoded-token | Hardcoded API tokens/keys |
| SEC010 | debug-enabled | DEBUG = True in production |
| SEC011 | eval-usage | eval()/exec() usage |
| SEC012 | path-traversal | File path from unsanitized input |
Type Checking (TYPE001-TYPE007)
Finds type errors without running your code.
| Code | Name | Description |
|---|---|---|
| TYPE001 | missing-return | Function with return annotation but no return |
| TYPE002 | incompatible-default | Default value type conflicts with annotation |
| TYPE003 | missing-annotation | Public function missing return type annotation |
| TYPE004 | redundant-cast | Redundant type cast on already-typed parameter |
| TYPE005 | mutable-default | Mutable default argument (list, dict, set) |
| TYPE006 | redundant-isinstance | Redundant isinstance check on typed parameter |
| TYPE007 | none-not-checked | Optional parameter used without None check |
Dead Code (DEAD001-DEAD006)
Eliminates unused code that bloats your project.
| Code | Name | Description |
|---|---|---|
| DEAD001 | unused-function | Private function never called |
| DEAD002 | unused-class | Private class never referenced |
| DEAD003 | unused-variable | Variable assigned but never used |
| DEAD004 | unused-import | Import never used |
| DEAD005 | unused-argument | Function argument never used |
| DEAD006 | unreachable-code | Code after return/raise/break/continue |
Complexity (CMPLX001-CMPLX003)
Keeps functions simple and maintainable.
| Code | Name | Description |
|---|---|---|
| CMPLX001 | high-cyclomatic | Too many decision branches |
| CMPLX003 | too-many-arguments | Too many function parameters |
Format (FMT001-FMT002)
Enforces consistent code style.
| Code | Name | Description |
|---|---|---|
| FMT001 | unsorted-imports | Imports not sorted alphabetically |
| FMT002 | line-too-long | Line exceeds max length |
Gitignore (GIT001-GIT006)
Validates your .gitignore for Python best practices.
| Code | Name | Description |
|---|---|---|
| GIT001 | missing-gitignore | No .gitignore file found |
| GIT002 | missing-python-patterns | Missing essential Python ignore patterns |
| GIT003 | duplicate-entry | Same pattern appears multiple times |
| GIT004 | invalid-pattern | Trailing whitespace, invalid globs, etc. |
| GIT005 | overly-broad-pattern | Pattern too broad (e.g., *.py, src/) |
| GIT006 | missing-secrets-pattern | Missing .env, *.pem, *.key patterns |
Auto-Fix
Ignyt can automatically fix safe issues:
ignyt fix src/
What it fixes:
- Removes unused imports (
DEAD004) - Converts
yaml.load()toyaml.safe_load()(SEC005) - Sorts imports alphabetically (
FMT001)
Project Cleanup
Remove Python build debris instantly:
ignyt clean # Remove all debris
ignyt clean --dry-run # Preview what would be removed
ignyt clean src/ # Clean specific directory
What it removes: __pycache__, .pyc, .pyo, .egg-info, .pytest_cache, .mypy_cache, .ruff_cache, .tox, .nox, .eggs, .pytype, .hypothesis
Gitignore Validation
Validate your .gitignore follows Python best practices:
ignyt gitignore # Check for issues
ignyt gitignore --init # Generate a Python .gitignore
ignyt gitignore ./myapp # Check a specific project
What it checks: missing essential patterns, duplicate entries, trailing whitespace, overly broad rules (*.py, src/), missing secrets patterns (.env, *.pem)
Configuration
Zero configuration required. Optionally create an ignyt.toml in your project root:
[ignyt]
python = "3.12"
src = ["src/", "tests/"]
exclude = ["migrations/", "*_pb2.py"]
[ignyt.fmt]
line-length = 120
quote-style = "single"
[ignyt.types]
strict = true
check-untyped-defs = true
[ignyt.security]
level = "high"
ignore = ["SEC007"]
[ignyt.complexity]
max-cyclomatic = 15
max-args = 8
[ignyt.rules]
error = ["SEC001", "TYPE001"]
warn = ["DEAD001"]
skip = ["FMT002"]
CI/CD Integration
GitHub Actions
- name: Install Ignyt
run: pip install ignyt
- name: Run code quality checks
run: ignyt check --format json src/
Pre-commit Hook
#!/bin/sh
ignyt check . && ignyt clean --dry-run
Performance
Ignyt is built for speed:
- Rayon — parallel file analysis across all CPU cores
- rustpython-parser — zero-copy Python AST parsing
- LTO + single codegen unit — maximum binary optimization
- Zero dependencies — no Python runtime overhead
Architecture
crates/
ignyt-cli/ # CLI entry point, command dispatch, output rendering
ignyt-ast/ # Python AST parsing (via rustpython-parser)
ignyt-types/ # Type inference and checking engine
ignyt-security/ # Security pattern matching (bandit replacement)
ignyt-dead/ # Dead code and unused symbol detection
ignyt-complexity/ # Cyclomatic and cognitive complexity analysis
ignyt-fmt/ # Import sorting and format checking
ignyt-diagnostics/ # Shared diagnostic types and error handling
ignyt-config/ # TOML configuration parsing
ignyt-fix/ # Auto-fix engine
License
MIT
Metadata
Release files for ignyt 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 | |
|---|---|---|---|
| ignyt-0.2.0.tar.gz | 74.7 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| ignyt-0.2.0-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| ignyt-0.2.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | Python 3 | none | Linux glibc 2.17+ x86-64 | Details |
| ignyt-0.2.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | Python 3 | none | Linux glibc 2.17+ ARM64 | Details |
| ignyt-0.2.0-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.whl | Python 3 | none | Linux glibc 2.5+ x86-64 | Details |
| ignyt-0.2.0-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details |
| ignyt-0.2.0-py3-none-macosx_10_12_x86_64.whl | Python 3 | none | macOS 10.12+ x86-64 | Details |
Total release size: 13.2 MB
Release files / ignyt-0.2.0.tar.gz
| Download URL | ignyt-0.2.0.tar.gz |
|---|---|
| Size | 74.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
cb68c62cc67a1792b2c8fc05e4d3d809b1113c6e9aeab18331cdf2469ed052e7
|
|
BLAKE2b-256 checksum How to use checksums |
19d5cc4c934343bda5afc18e66cc155f41212c31d1be1c986e0f86b24a4f6a50
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
maturin/1.12.6
|
Release files / ignyt-0.2.0-py3-none-win_amd64.whl
| Download URL | ignyt-0.2.0-py3-none-win_amd64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
38a882100e2ef6f9442b90a5f0c069dee5c88d876bff4b5eb97f039dbb846005
|
|
BLAKE2b-256 checksum How to use checksums |
833e31546463c9623c69c5fde1b2ab2147b45fedfce665a1f5c313dafba472ab
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
maturin/1.12.6
|
Release files / ignyt-0.2.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | ignyt-0.2.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 2.3 MB |
| Tags | Linux glibc 2.17+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
06f4b269e68e676729d67ae861ff019c6c8e96779eb2da9d38bd564450908af4
|
|
BLAKE2b-256 checksum How to use checksums |
d32252f5ada3a6432170bf85fbd1c36266c26dcee52ff8417d0ba584e7891254
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
maturin/1.12.6
|
Release files / ignyt-0.2.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | ignyt-0.2.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 2.2 MB |
| Tags | Linux glibc 2.17+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
1f6df31338a175f1be5777a99bdbbccb67a16daa8b707c1e3fd20d27ce113c5c
|
|
BLAKE2b-256 checksum How to use checksums |
dfcead80c529f71209c597ce0de864457b48e1d8967033de48eef52947e47877
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
maturin/1.12.6
|
Release files / ignyt-0.2.0-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.whl
| Download URL | ignyt-0.2.0-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.whl |
|---|---|
| Size | 2.3 MB |
| Tags | Linux glibc 2.5+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
6a6be693f293e53446e555d907717bc5fc8497e08b7c0ab9b6908ddabe0fd4d3
|
|
BLAKE2b-256 checksum How to use checksums |
1e938911e8f209a0463a9379d96f28c81f48f92d23e54b04de58275ed5043b31
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
maturin/1.12.6
|
Release files / ignyt-0.2.0-py3-none-macosx_11_0_arm64.whl
| Download URL | ignyt-0.2.0-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.0 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
0a4d38f1103ea7cacdca41c547e3c3a3ec23b70fd11f90e94be71d32bc03e56a
|
|
BLAKE2b-256 checksum How to use checksums |
b578755265633817249fe9a0e05d94a0dbb17dcd16a032f4e7da4cc0480b192d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
maturin/1.12.6
|
Release files / ignyt-0.2.0-py3-none-macosx_10_12_x86_64.whl
| Download URL | ignyt-0.2.0-py3-none-macosx_10_12_x86_64.whl |
|---|---|
| Size | 2.2 MB |
| Tags | Python 3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
35258cc7d9f370b15da7eab916d64caffdcce9bdb8b7d1e9504e81709f53f82f
|
|
BLAKE2b-256 checksum How to use checksums |
1906154edb89559cbbde0f611001385daab58098767c4fd0a7575eb4cad0b602
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
maturin/1.12.6
|