The fastest Python code quality engine — type checking, security scanning, dead code detection, complexity analysis & auto-fix in one Rust binary. Replaces mypy, flake8, bandit, vulture, radon, black & isort.
Project description
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
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 Distributions
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 ignyt-0.2.0.tar.gz.
File metadata
- Download URL: ignyt-0.2.0.tar.gz
- Upload date:
- Size: 74.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.12.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cb68c62cc67a1792b2c8fc05e4d3d809b1113c6e9aeab18331cdf2469ed052e7
|
|
| MD5 |
b331992116b7daed134bbf05f939d099
|
|
| BLAKE2b-256 |
19d5cc4c934343bda5afc18e66cc155f41212c31d1be1c986e0f86b24a4f6a50
|
File details
Details for the file ignyt-0.2.0-py3-none-win_amd64.whl.
File metadata
- Download URL: ignyt-0.2.0-py3-none-win_amd64.whl
- Upload date:
- Size: 2.1 MB
- Tags: Python 3, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.12.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
38a882100e2ef6f9442b90a5f0c069dee5c88d876bff4b5eb97f039dbb846005
|
|
| MD5 |
5d8c420f16c338ff3075744fb246610e
|
|
| BLAKE2b-256 |
833e31546463c9623c69c5fde1b2ab2147b45fedfce665a1f5c313dafba472ab
|
File details
Details for the file ignyt-0.2.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: ignyt-0.2.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 2.3 MB
- Tags: Python 3, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.12.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
06f4b269e68e676729d67ae861ff019c6c8e96779eb2da9d38bd564450908af4
|
|
| MD5 |
356eeda00d79c8deb10bdd723265fec1
|
|
| BLAKE2b-256 |
d32252f5ada3a6432170bf85fbd1c36266c26dcee52ff8417d0ba584e7891254
|
File details
Details for the file ignyt-0.2.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: ignyt-0.2.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 2.2 MB
- Tags: Python 3, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.12.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1f6df31338a175f1be5777a99bdbbccb67a16daa8b707c1e3fd20d27ce113c5c
|
|
| MD5 |
9fa36bbf8afeea7904ae6b191bc95943
|
|
| BLAKE2b-256 |
dfcead80c529f71209c597ce0de864457b48e1d8967033de48eef52947e47877
|
File details
Details for the file ignyt-0.2.0-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.whl.
File metadata
- Download URL: ignyt-0.2.0-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.whl
- Upload date:
- Size: 2.3 MB
- Tags: Python 3, manylinux: glibc 2.5+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.12.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6a6be693f293e53446e555d907717bc5fc8497e08b7c0ab9b6908ddabe0fd4d3
|
|
| MD5 |
71930648e4c65b5b869bdf663632fedb
|
|
| BLAKE2b-256 |
1e938911e8f209a0463a9379d96f28c81f48f92d23e54b04de58275ed5043b31
|
File details
Details for the file ignyt-0.2.0-py3-none-macosx_11_0_arm64.whl.
File metadata
- Download URL: ignyt-0.2.0-py3-none-macosx_11_0_arm64.whl
- Upload date:
- Size: 2.0 MB
- Tags: Python 3, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.12.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0a4d38f1103ea7cacdca41c547e3c3a3ec23b70fd11f90e94be71d32bc03e56a
|
|
| MD5 |
ac4ea3958d0eb1b8343007040cec97eb
|
|
| BLAKE2b-256 |
b578755265633817249fe9a0e05d94a0dbb17dcd16a032f4e7da4cc0480b192d
|
File details
Details for the file ignyt-0.2.0-py3-none-macosx_10_12_x86_64.whl.
File metadata
- Download URL: ignyt-0.2.0-py3-none-macosx_10_12_x86_64.whl
- Upload date:
- Size: 2.2 MB
- Tags: Python 3, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.12.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
35258cc7d9f370b15da7eab916d64caffdcce9bdb8b7d1e9504e81709f53f82f
|
|
| MD5 |
58d31d8fbef95cf2df206d8ae3f1c7ed
|
|
| BLAKE2b-256 |
1906154edb89559cbbde0f611001385daab58098767c4fd0a7575eb4cad0b602
|