Overview
treepeat is a tool that finds similarities in your codebase.
- Find duplicate code blocks meaningful to the language (classes/functions), not just lines (
--ruleset none) - Find near-duplicates, ignore whitespace, strings, high level AST nodes such as function and names (
--ruleset default) - Find structurally similar code, anonymizing identifiers, constants, etc (
--ruleset loose)
Pull requests welcome: This is very much an proof of concept - I'm happy with it, but I haven't supported very many languages at present. PRs welcome!
Languages supported: astro, bash, css, go, html, javascript, lua, markdown, python, sql, typescript, java, kotlin, rust, yaml
Usage
Installation
pip install treepeat
detect
Scan a codebase for similar or duplicate code blocks using tree-sitter AST analysis and locality-sensitive hashing.
Key flags:
--ruleset: Normalization ruleset to use (none,default,loose) - controls how code is normalized before comparison--similarity: Percent similarity from 1-100 (default: 100 for exact duplicates)--min-lines: Minimum number of lines for a match (default: 5)--diff: Show side-by-side comparisons of similar blocks--format: Output format -console(default) orsariffor CI integration--verbose: Show additional run metrics, including per-stage timing when available--progress: Show progress bars for long-running pipeline stages
# Find exact duplicates
treepeat detect /path/to/codebase
# Find near-duplicates with 80% similarity threshold
treepeat detect --similarity 80 /path/to/codebase
# Show diffs between similar blocks and use loose ruleset
treepeat --ruleset loose detect --diff --min-lines 10 /path/to/codebase
# Show parse progress and verbose stage timing
treepeat detect --progress --verbose /path/to/codebase
# Output results in SARIF format for CI tools
treepeat detect --format sarif -o results.sarif /path/to/codebase
--progress is intended primarily as interactive CLI feedback. The current implementation writes tqdm progress bars to stderr, leaving normal command output on stdout or --output.
Other sub commands
list-ruleset
List all rules in a ruleset, along with their descriptions. Use --language to see which rules apply to a specific language.
treesitter
Display how treepeat normalizes source code into tree-sitter tokens for similarity detection -- helpful for debugging why a certain section of a file might be similar to another. Shows the original source code side-by-side with the normalized token representation.
Dev setup
make setup
make test
Performance harness for benchmarking real repositories: tools/perf/harness.py (docs).
ADRs
Architecture Decision Records live in docs/adr.
Release files for treepeat 0.9.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 | |
|---|---|---|---|
| treepeat-0.9.0.tar.gz | 62.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| treepeat-0.9.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 140.9 kB
Release files / treepeat-0.9.0.tar.gz
| Download URL | treepeat-0.9.0.tar.gz |
|---|---|
| Size | 62.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9128ebfabcff88ee928281c31e2f4f3b91a708f42f8b82fb2b5b70ddaf1b96bb
|
|
BLAKE2b-256 checksum How to use checksums |
7be815168d647719d0e5db0556ffffe7fa59df3f19b298d4396db38a9f6d1a58
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.11 {"installer":{"name":"uv","version":"0.9.11"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / treepeat-0.9.0-py3-none-any.whl
| Download URL | treepeat-0.9.0-py3-none-any.whl |
|---|---|
| Size | 78.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e087d30fb14e5d96028005f7809e36cb21e9b463a1c70a0b029325e9034de5c4
|
|
BLAKE2b-256 checksum How to use checksums |
ed0e7abc5441385c5b3471496e6c00647991a721d059dd75e6872435a022247b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.11 {"installer":{"name":"uv","version":"0.9.11"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|