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, php, 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.
Metadata
Release files for treepeat 0.10.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 | Provenance | |
|---|---|---|---|---|
| treepeat-0.10.0.tar.gz | 62.6 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| treepeat-0.10.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 142.2 kB
Release files / treepeat-0.10.0.tar.gz
| Download URL | treepeat-0.10.0.tar.gz |
|---|---|
| Size | 62.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
336dbbb2958d12a7af8e9f3dd2cb0547d6368d0426277a8aeab82b31852e7dd4
|
|
BLAKE2b-256 checksum How to use checksums |
f92b4c8c7470c0747a19ac104498fb503a9e81b1866857821cc4c0751a4ff17c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.0 {"installer":{"name":"uv","version":"0.13.0","subcommand":["publish"]},"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.10.0-py3-none-any.whl
| Download URL | treepeat-0.10.0-py3-none-any.whl |
|---|---|
| Size | 79.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6740d977a1bb5bb632d8aeef56fc8f0f0e96d658d6be981f364e1077a6f1adf8
|
|
BLAKE2b-256 checksum How to use checksums |
99a9fb846afed7da04e73877629383800d0405a345c94e65b88074b3851fca7e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.0 {"installer":{"name":"uv","version":"0.13.0","subcommand":["publish"]},"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}
|
Security for treepeat 0.10.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.