A multi-language code performance analyser with static analysis and AI-powered fix generation.
Project description
๐ง codewrench
Point it at your code. Get back what's slow and how to fix it.
Codewrench is a multi-language performance analyser that combines static analysis with AI-powered explanations. It finds real performance issues in your code โ nested loops, inefficient patterns, bad practices โ then explains exactly why they're a problem and shows you the fix.
No cloud, no setup hell, no enterprise pricing. Just run it on a file.
Installation
pip install codewrench
Create a .env file in your project root:
GROQ_API_KEY=your_key_here
Get a free Groq API key at console.groq.com
Usage
codewrench yourfile.py
codewrench app.js
codewrench main.go
codewrench ./myproject
Codewrench detects the language from the file extension automatically. Point it at a folder and it walks the entire project.
Example output
========================================
CODEWRENCH REPORT
========================================
Files Scanned : 1
Languages : python
Issues Found : 8 across 1 files
========================================
--- Warnings ---
Nested loop at line 19 โ potential O(nยฒ)
String concatenation at line 22 โ use ''.join() instead
re.compile() inside loop at line 31 โ move it outside, compile once and reuse
Bare except at line 40 โ catches everything, be specific
Top 5 slowest functions BEFORE fix:
process_data cumtime: 2.341s
build_string cumtime: 0.812s
Top 5 slowest functions AFTER fix:
process_data cumtime: 0.421s
build_string cumtime: 0.109s
Want AI analysis? (y/n): y
--- AI Analysis ---
1. Nested loop at line 19
Problem: Two nested loops over the same data gives you O(nยฒ) complexity.
For 1000 items that's 1,000,000 iterations instead of 1,000.
Want to apply fixes to files? (y/n): y
Original saved as yourfile.py.bak
Fixes applied to yourfile.py
Save report? (y/n): y
Report saved to codewrench_report.md
What it catches
High priority
- Nested loops โ O(nยฒ) and worse
- Expensive I/O calls inside loops (
open,requests, etc.) re.compile()inside loops โ compile once, reuseprint()/ logging inside loops โ I/O on every iterationawaitinside loops โ useasyncio.gather()orPromise.all()- Repeated attribute access that should be cached
- String concatenation with
+=in loops - String concatenation in nested loops โ quadratic complexity
- Unnecessary object creation in loops (
dict(),list(), etc.)
Medium priority
- List concat with
+instead of.extend() - List appends inside nested loops
- Unnecessary
list(range(n))creation - Bare
except:and overly broadexcept Exception try/exceptinside loops- Global variable access inside loops
- Mutable default arguments
- Import inside functions
len()calls inside loops
Supported languages
| Language | Extension |
|---|---|
| Python | .py |
| JavaScript | .js |
| TypeScript | .ts |
| Go | .go |
| C | .c |
| C++ | .cpp, .cc |
.wrenchignore
Create a .wrenchignore file in your project root to skip files or folders:
migrations/
tests/
legacy_code.py
*.min.js
Works like .gitignore โ supports wildcards and directory patterns.
How it works
your file
โ
Tree-sitter parses it into a syntax tree
โ
IR translator converts to language-agnostic representation
โ
20 detectors run static analysis on the IR
โ
Before/after profiling (Python, Node.js, go)
โ
Findings sent to Groq (Llama 3.3 70B)
โ
Plain English explanation + fix
The static analysis layer is deterministic โ it either finds a nested loop or it doesn't. No hallucination. The AI layer explains what the detectors already confirmed exists.
Roadmap
- Static analysis (Python, JS, TS, Go, C, C++)
- AI-powered explanations and fixes
- Multi-language IR architecture
- Runtime profiling โ before/after benchmark (Python)
- 20 detectors across high and medium priority
- Folder support with recursive analysis
-
.wrenchignoresupport - Smart API batching โ one call per folder, not per file
-
pip install codewrench - Multi-language profiling (Node, Go)
- Language-specific detectors
- Git diff integration โ analyse only what changed
- VS Code extension
- Web UI
Project structure
codewrench/
โโโ detectors/
โ โโโ base.py โ depth tracking, core visitor
โ โโโ high.py โ high priority detectors
โ โโโ medium.py โ medium priority detectors
โโโ languages/
โ โโโ python_rules.py โ Tree-sitter node mappings per language
โ โโโ js_rules.py
โ โโโ ts_rules.py
โ โโโ go_rules.py
โ โโโ c_rules.py
โ โโโ cpp_rules.py
โโโ profilers/
โ โโโ profiler.py โ cProfile integration
โโโ ir.py โ language-agnostic IR node
โโโ ir_translator.py โ Tree-sitter โ IR translation
โโโ parser_engine.py โ language detection + parser setup
โโโ ai_engine.py โ Groq integration
โโโ report.py โ Layer 5 report and output
โโโ errors.py โ error handling
โโโ wrenchignore.py โ .wrenchignore support
โโโ main.py โ entry point
Contributing
Pull requests welcome. If you want to add a new language, add a rules file in languages/ mapping Tree-sitter node types to the generic IR types. That's it โ the detectors work on all languages automatically.
Open an issue first for anything major.
Built by Vishad Jain
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
Built Distribution
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 codewrench-0.1.3.tar.gz.
File metadata
- Download URL: codewrench-0.1.3.tar.gz
- Upload date:
- Size: 17.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8313ca4260d49b0c004bc2216e02b99db73ec938c7a13224d6aab8df1a682b76
|
|
| MD5 |
3f837ff8313d551d8138ecca86d8c195
|
|
| BLAKE2b-256 |
e0c5cb67401a903d2c63a133b1e98ace0e026991268bda33e15bac0f417c9c57
|
File details
Details for the file codewrench-0.1.3-py3-none-any.whl.
File metadata
- Download URL: codewrench-0.1.3-py3-none-any.whl
- Upload date:
- Size: 20.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e2175d1cc5bff1dfeddcde3661e4b4bde73174303cd7d88cc3457ba35c7ad067
|
|
| MD5 |
99ea9631d214c28d64cd02f8a804c6e1
|
|
| BLAKE2b-256 |
2d93e16b01c90bdabfbdeab71a604e9794c60c3e905c12a13740e16805d0ace2
|