Fast copy/paste detector for programming source code. 24-37x faster than Node.js. Rust rewrite of jscpd, supports 223 language formats.
Also available as an npm package: jscpd@5 (installs the jscpd command) or cpd (installs the cpd command). The crates.io install exposes both jscpd and cpd binaries.
| Codebase | Files | Size | jscpd v4 (Node.js) | cpd v5 (Rust) | Speedup |
|---|---|---|---|---|---|
| Multi-format fixtures | 548 | 1.5 MB | 1.03 s | 0.03 s | 34.3× |
| Svelte source | 9K | 38 MB | 15.80 s | 0.43 s | 36.9× |
| CopilotKit | 17K | 159 MB | 82.89 s | 3.44 s | 24.1× |
See performance-comparison.md for full methodology and raw data.
# npm — installs the jscpd command
npm install -g jscpd
# npm — installs only the cpd command
npm install -g cpdPrebuilt binaries for 6 platforms — no Node.js runtime required.
cargo install jscpdInstalls both jscpd and cpd binaries.
# Run without installing
nix run github:kucherenko/jscpd -- /path/to/code
# Install permanently
nix profile install github:kucherenko/jscpdbrew install jscpdgit clone https://github.com/kucherenko/jscpd.git
cd jscpd/rust
cargo build --release
# binaries at target/release/jscpd and target/release/cpdcpd .
cpd ./src ./lib
cpd . --blame --reporters console-full
cpd . --reporters json,html
cpd . --threshold 10
cpd --listjscpd/cpd (CLI binary)
├── cpd-core — Detection algorithm (Rabin-Karp rolling hash)
├── cpd-tokenizer — Language tokenization (223 formats)
├── cpd-finder — File walking, orchestration, git blame
└── cpd-reporter — Output formatting (13 reporters)
| Crate | Version | Purpose |
|---|---|---|
cpd-core |
0.1.3 | Detection algorithm, rolling hash, models |
cpd-tokenizer |
0.1.3 | Language tokenization (223 formats) |
cpd-finder |
0.1.4 | File walking, orchestration, git blame |
cpd-reporter |
0.1.4 | Output formatting (13 reporters) |
jscpd |
5.0.4 | CLI binary and entry point |
use cpd_finder::orchestrate::{RunConfig, run};
let config = RunConfig {
paths: vec!["./src".into()],
min_tokens: 50,
..Default::default()
};
let result = run(&config).unwrap();
println!("Found {} clones", result.clones.len());
println!("Analyzed {} files", result.statistics.total.sources);Requires Rust 1.87+ (see rust-toolchain.toml).
cargo build --release
cargo test- docs/rust.md — Full CLI reference, all options, reporters, config file, differences from v4
- docs/typescript.md — TypeScript/Node.js engine (v4.x) documentation
- docs/ai-ready.md — AI reporter, agent skills, MCP server
- docs/api.md — Programming APIs (TypeScript and Rust)
| Feature | jscpd v4 (Node.js) | cpd v5 (Rust) |
|---|---|---|
--store (LevelDB) |
Persistent store for large repos | Not supported |
| Programming API | jscpd() Promise, detectClones() |
Rust crate API; no Node.js API |
--reporters |
All v4 reporters | All except full (use console-full) |
See docs/rust.md for the full differences table.
MIT