[{"data":1,"prerenderedAt":1174},["ShallowReactive",2],{"navigation_docs":3,"-start-installation":239,"-start-installation-surround":1169},[4,29,94,114,184],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"Start",false,"\u002Fstart","1.start",[10,14,19,24],{"title":11,"path":7,"stem":12,"icon":13},"What jscpd finds","1.start\u002Findex","i-lucide-house",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fstart\u002Finstallation","1.start\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quickstart","\u002Fstart\u002Fquickstart","1.start\u002F3.quickstart","i-lucide-rocket",{"title":25,"path":26,"stem":27,"icon":28},"Configuration basics","\u002Fstart\u002Fconfiguration","1.start\u002F4.configuration","i-lucide-settings-2",{"title":30,"icon":6,"path":31,"stem":32,"children":33,"page":6},"Guides","\u002Fguides","2.guides",[34,39,44,49,54,59,64,69,74,79,84,89],{"title":35,"path":36,"stem":37,"icon":38},"Use jscpd in CI","\u002Fguides\u002Fci","2.guides\u002F01.ci","i-lucide-github",{"title":40,"path":41,"stem":42,"icon":43},"Pre-commit hooks","\u002Fguides\u002Fpre-commit","2.guides\u002F02.pre-commit","i-lucide-git-commit",{"title":45,"path":46,"stem":47,"icon":48},"Fail only on new duplication","\u002Fguides\u002Fbaseline","2.guides\u002F03.baseline","i-lucide-git-compare",{"title":50,"path":51,"stem":52,"icon":53},"Monorepos","\u002Fguides\u002Fmonorepos","2.guides\u002F04.monorepos","i-lucide-folder-tree",{"title":55,"path":56,"stem":57,"icon":58},"Cross-format detection","\u002Fguides\u002Fcross-format","2.guides\u002F05.cross-format","i-lucide-layers",{"title":60,"path":61,"stem":62,"icon":63},"Agents","\u002Fguides\u002Fagents","2.guides\u002F06.agents","i-lucide-cpu",{"title":65,"path":66,"stem":67,"icon":68},"Editors","\u002Fguides\u002Feditors","2.guides\u002F07.editors","i-lucide-code",{"title":70,"path":71,"stem":72,"icon":73},"Duplication over git history","\u002Fguides\u002Fhistory","2.guides\u002F08.history","i-lucide-chart-no-axes-combined",{"title":75,"path":76,"stem":77,"icon":78},"Dashboard and health score","\u002Fguides\u002Fdashboard","2.guides\u002F09.dashboard","i-lucide-layout-dashboard",{"title":80,"path":81,"stem":82,"icon":83},"Dead code","\u002Fguides\u002Fdead-code","2.guides\u002F10.dead-code","i-lucide-ghost",{"title":85,"path":86,"stem":87,"icon":88},"Comparing two codebases","\u002Fguides\u002Fcompare","2.guides\u002F11.compare","i-lucide-git-compare-arrows",{"title":90,"path":91,"stem":92,"icon":93},"Semantic clones","\u002Fguides\u002Fsemantic-clones","2.guides\u002F12.semantic-clones","i-lucide-brain-circuit",{"title":95,"icon":6,"path":96,"stem":97,"children":98,"page":6},"Concepts","\u002Fconcepts","3.concepts",[99,104,109],{"title":100,"path":101,"stem":102,"icon":103},"Types of code clones","\u002Fconcepts\u002Fclone-types","3.concepts\u002F1.clone-types","i-lucide-copy",{"title":105,"path":106,"stem":107,"icon":108},"How detection works","\u002Fconcepts\u002Fhow-detection-works","3.concepts\u002F2.how-detection-works","i-lucide-scan-search",{"title":110,"path":111,"stem":112,"icon":113},"The health score","\u002Fconcepts\u002Fhealth-score","3.concepts\u002F3.health-score","i-lucide-heart-pulse",{"title":115,"icon":6,"path":116,"stem":117,"children":118,"page":6},"Reference","\u002Freference","4.reference",[119,124,129,134,171,176,180],{"title":120,"path":121,"stem":122,"icon":123},"CLI options","\u002Freference\u002Fcli","4.reference\u002F1.cli","i-lucide-terminal",{"title":125,"path":126,"stem":127,"icon":128},"The config file","\u002Freference\u002Fconfig-file","4.reference\u002F2.config-file","i-lucide-settings",{"title":130,"path":131,"stem":132,"icon":133},"Exit codes","\u002Freference\u002Fexit-codes","4.reference\u002F3.exit-codes","i-lucide-log-out",{"title":135,"icon":6,"path":136,"stem":137,"children":138},"Reporters","\u002Freference\u002Freporters","4.reference\u002F4.reporters\u002Findex",[139,141,146,151,156,161,166],{"title":135,"path":136,"stem":137,"icon":140},"i-lucide-file-chart-column",{"title":142,"path":143,"stem":144,"icon":145},"HTML reporter","\u002Freference\u002Freporters\u002Fhtml","4.reference\u002F4.reporters\u002F2.html","i-lucide-file-code",{"title":147,"path":148,"stem":149,"icon":150},"JSON reporter","\u002Freference\u002Freporters\u002Fjson","4.reference\u002F4.reporters\u002F3.json","i-lucide-braces",{"title":152,"path":153,"stem":154,"icon":155},"Badge reporter","\u002Freference\u002Freporters\u002Fbadge","4.reference\u002F4.reporters\u002F4.badge","i-lucide-award",{"title":157,"path":158,"stem":159,"icon":160},"SARIF reporter","\u002Freference\u002Freporters\u002Fsarif","4.reference\u002F4.reporters\u002F5.sarif","i-lucide-shield-check",{"title":162,"path":163,"stem":164,"icon":165},"CodeClimate reporter","\u002Freference\u002Freporters\u002Fcodeclimate","4.reference\u002F4.reporters\u002F6.codeclimate","i-lucide-flag-triangle-right",{"title":167,"path":168,"stem":169,"icon":170},"OpenMetrics reporter","\u002Freference\u002Freporters\u002Fopenmetrics","4.reference\u002F4.reporters\u002F7.openmetrics","i-lucide-activity",{"title":172,"path":173,"stem":174,"icon":175},"Supported formats","\u002Freference\u002Fsupported-formats","4.reference\u002F5.supported-formats","i-lucide-languages",{"title":177,"path":178,"stem":179,"icon":38},"GitHub Action","\u002Freference\u002Fgithub-action","4.reference\u002F6.github-action",{"title":181,"path":182,"stem":183,"icon":68},"Rust crates","\u002Freference\u002Frust-crates","4.reference\u002F7.rust-crates",{"title":185,"icon":6,"path":186,"stem":187,"children":188,"page":6},"Project","\u002Fproject","5.project",[189,194,199,204,229,234],{"title":190,"path":191,"stem":192,"icon":193},"Changelog","\u002Fproject\u002Fchangelog","5.project\u002F1.changelog","i-lucide-scroll-text",{"title":195,"path":196,"stem":197,"icon":198},"Migrating from v4 to v5","\u002Fproject\u002Fmigration","5.project\u002F2.migration","i-lucide-arrow-right-left",{"title":200,"path":201,"stem":202,"icon":203},"jscpd v4 (TypeScript)","\u002Fproject\u002Fv4","5.project\u002F3.v4","i-simple-icons-typescript",{"title":205,"icon":6,"path":206,"stem":207,"children":208},"Benchmarks","\u002Fproject\u002Fbenchmarks","5.project\u002F4.benchmarks\u002Findex",[209,211,216,220,225],{"title":205,"path":206,"stem":207,"icon":210},"i-lucide-gauge",{"title":212,"path":213,"stem":214,"icon":215},"Detection Speed","\u002Fproject\u002Fbenchmarks\u002Fdetection-speed","5.project\u002F4.benchmarks\u002F2.detection-speed","i-lucide-zap",{"title":217,"path":218,"stem":219,"icon":58},"Multi-Format Detection","\u002Fproject\u002Fbenchmarks\u002Fcross-format","5.project\u002F4.benchmarks\u002F3.cross-format",{"title":221,"path":222,"stem":223,"icon":224},"AI Token Efficiency","\u002Fproject\u002Fbenchmarks\u002Fai-token-efficiency","5.project\u002F4.benchmarks\u002F4.ai-token-efficiency","i-lucide-sparkles",{"title":226,"path":227,"stem":228,"icon":93},"Embedding Models","\u002Fproject\u002Fbenchmarks\u002Fembedding-models","5.project\u002F4.benchmarks\u002F5.embedding-models",{"title":230,"path":231,"stem":232,"icon":233},"Research","\u002Fproject\u002Fresearch","5.project\u002F5.research","i-lucide-graduation-cap",{"title":235,"path":236,"stem":237,"icon":238},"Articles","\u002Fproject\u002Farticles","5.project\u002F6.articles","i-lucide-newspaper",{"id":240,"title":15,"body":241,"description":1161,"extension":1162,"links":1163,"meta":1164,"navigation":1165,"path":16,"seo":1166,"stem":17,"__hash__":1168},"docs\u002F1.start\u002F2.installation.md",{"type":242,"value":243,"toc":1142},"minimark",[244,253,280,285,290,293,319,322,350,358,368,372,381,401,406,420,437,457,461,484,505,516,521,528,565,634,641,645,657,677,685,690,693,702,719,723,743,748,766,770,774,777,791,795,812,820,840,844,851,886,920,924,927,945,961,965,986,1080,1084,1094,1099,1125,1129,1138],[245,246,247,248,252],"p",{},"jscpd 5 is one self-contained binary with no runtime behind it, and every channel on this page ships that same binary: the npm package and the PyPI wheels wrap it, crates.io builds it, Homebrew, nix and Docker package it, and two one-line installers download it from GitHub Releases. Pick the channel your project already uses, then run ",[249,250,251],"code",{},"jscpd --version"," to see which build you have.",[254,255,256,257,267,268,271,272,275,276,279],"note",{},"Looking for v4? The TypeScript version lives on the ",[258,259,263,266],"a",{"href":260,"rel":261},"https:\u002F\u002Fgithub.com\u002Fkucherenko\u002Fjscpd\u002Ftree\u002Fmaster-v4",[262],"nofollow",[249,264,265],{},"master-v4"," branch"," and installs with ",[249,269,270],{},"npm install -g jscpd@4",". The ",[258,273,274],{"href":201},"v4 page"," describes its CLI, API and packages, and the ",[258,277,278],{"href":196},"migration guide"," says what changed.",[281,282,284],"h2",{"id":283},"pick-one","Pick one",[286,287,289],"h3",{"id":288},"nodejs-projects","Node.js projects",[245,291,292],{},"The npm package is a small launcher that pulls in the prebuilt binary for your platform as an optional dependency. Node.js 18 or newer runs the launcher; jscpd itself needs nothing else. Without installing anything:",[294,295,301],"pre",{"className":296,"code":297,"filename":298,"language":299,"meta":300,"style":300},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npx jscpd .\n","Terminal","bash","",[249,302,303],{"__ignoreMap":300},[304,305,308,312,316],"span",{"class":306,"line":307},"line",1,[304,309,311],{"class":310},"sBMFI","npx",[304,313,315],{"class":314},"sfazB"," jscpd",[304,317,318],{"class":314}," .\n",[245,320,321],{},"Or install the command once:",[294,323,325],{"className":296,"code":324,"filename":298,"language":299,"meta":300,"style":300},"npm install -g jscpd\njscpd --version\n",[249,326,327,341],{"__ignoreMap":300},[304,328,329,332,335,338],{"class":306,"line":307},[304,330,331],{"class":310},"npm",[304,333,334],{"class":314}," install",[304,336,337],{"class":314}," -g",[304,339,340],{"class":314}," jscpd\n",[304,342,344,347],{"class":306,"line":343},2,[304,345,346],{"class":310},"jscpd",[304,348,349],{"class":314}," --version\n",[294,351,356],{"className":352,"code":354,"language":355,"meta":300},[353],"language-text","jscpd 5.4.0\n","text",[249,357,354],{"__ignoreMap":300},[245,359,360,363,364,367],{},[249,361,362],{},"npm install -g cpd"," installs the same binary under the shorter name ",[249,365,366],{},"cpd",".",[286,369,371],{"id":370},"python-projects","Python projects",[245,373,374,375,380],{},"The ",[258,376,379],{"href":377,"rel":378},"https:\u002F\u002Fpypi.org\u002Fproject\u002Fjscpd\u002F",[262],"PyPI package"," is a set of platform wheels with the same binary, so a Python project gets jscpd without Node.js. Use the installer you use for other tools:",[294,382,384],{"className":296,"code":383,"filename":298,"language":299,"meta":300,"style":300},"pip install jscpd\njscpd --version\n",[249,385,386,395],{"__ignoreMap":300},[304,387,388,391,393],{"class":306,"line":307},[304,389,390],{"class":310},"pip",[304,392,334],{"class":314},[304,394,340],{"class":314},[304,396,397,399],{"class":306,"line":343},[304,398,346],{"class":310},[304,400,349],{"class":314},[294,402,404],{"className":403,"code":354,"language":355,"meta":300},[353],[249,405,354],{"__ignoreMap":300},[294,407,409],{"className":296,"code":408,"filename":298,"language":299,"meta":300,"style":300},"pipx install jscpd\n",[249,410,411],{"__ignoreMap":300},[304,412,413,416,418],{"class":306,"line":307},[304,414,415],{"class":310},"pipx",[304,417,334],{"class":314},[304,419,340],{"class":314},[294,421,423],{"className":296,"code":422,"filename":298,"language":299,"meta":300,"style":300},"uv tool install jscpd\n",[249,424,425],{"__ignoreMap":300},[304,426,427,430,433,435],{"class":306,"line":307},[304,428,429],{"class":310},"uv",[304,431,432],{"class":314}," tool",[304,434,334],{"class":314},[304,436,340],{"class":314},[245,438,439,440,442,443,445,446,449,450,453,454,367],{},"Each of them installs the ",[249,441,346],{}," and ",[249,444,366],{}," commands, and ",[249,447,448],{},"uvx jscpd ."," runs a scan without installing. A ",[258,451,452],{"href":41},"pre-commit hook"," can install from PyPI too, with ",[249,455,456],{},"language: python",[286,458,460],{"id":459},"macos-and-linux-shell","macOS and Linux shell",[294,462,464],{"className":296,"code":463,"filename":298,"language":299,"meta":300,"style":300},"curl -fsSL https:\u002F\u002Fjscpd.dev\u002Finstall.sh | bash\n",[249,465,466],{"__ignoreMap":300},[304,467,468,471,474,477,481],{"class":306,"line":307},[304,469,470],{"class":310},"curl",[304,472,473],{"class":314}," -fsSL",[304,475,476],{"class":314}," https:\u002F\u002Fjscpd.dev\u002Finstall.sh",[304,478,480],{"class":479},"sMK4o"," |",[304,482,483],{"class":310}," bash\n",[245,485,486,487,490,491,493,494,496,497,500,501,504],{},"The script detects your platform, downloads the release archive from GitHub Releases, checks it against the ",[249,488,489],{},"checksums.txt"," published with the release, and puts ",[249,492,346],{}," and the ",[249,495,366],{}," alias in ",[249,498,499],{},"~\u002F.local\u002Fbin",". When that directory is not on your ",[249,502,503],{},"PATH",", it prints the line to add. If GitHub is unreachable, it falls back to the npm registry and checks the tarball against the integrity hash the registry reports; a mismatch of either check aborts the install. Then:",[294,506,508],{"className":296,"code":507,"filename":298,"language":299,"meta":300,"style":300},"jscpd --version\n",[249,509,510],{"__ignoreMap":300},[304,511,512,514],{"class":306,"line":307},[304,513,346],{"class":310},[304,515,349],{"class":314},[294,517,519],{"className":518,"code":354,"language":355,"meta":300},[353],[249,520,354],{"__ignoreMap":300},[245,522,523,524,527],{},"Options go after ",[249,525,526],{},"bash -s --",":",[294,529,531],{"className":296,"code":530,"filename":298,"language":299,"meta":300,"style":300},"curl -fsSL https:\u002F\u002Fjscpd.dev\u002Finstall.sh | bash -s -- --version 5.4.0 --prefix ~\u002Fbin\n",[249,532,533],{"__ignoreMap":300},[304,534,535,537,539,541,543,546,549,552,555,559,562],{"class":306,"line":307},[304,536,470],{"class":310},[304,538,473],{"class":314},[304,540,476],{"class":314},[304,542,480],{"class":479},[304,544,545],{"class":310}," bash",[304,547,548],{"class":314}," -s",[304,550,551],{"class":314}," --",[304,553,554],{"class":314}," --version",[304,556,558],{"class":557},"sbssI"," 5.4.0",[304,560,561],{"class":314}," --prefix",[304,563,564],{"class":314}," ~\u002Fbin\n",[566,567,568,581],"table",{},[569,570,571],"thead",{},[572,573,574,578],"tr",{},[575,576,577],"th",{},"Option",[575,579,580],{},"Effect",[582,583,584,595,614,624],"tbody",{},[572,585,586,592],{},[587,588,589],"td",{},[249,590,591],{},"--version VERSION",[587,593,594],{},"Install this release; without it the newest release is resolved at run time",[572,596,597,607],{},[587,598,599,602,603,606],{},[249,600,601],{},"--prefix DIR"," (or ",[249,604,605],{},"--to DIR",")",[587,608,609,610,613],{},"Install into this directory; ",[249,611,612],{},"CPD_INSTALL_PREFIX"," sets the default",[572,615,616,621],{},[587,617,618],{},[249,619,620],{},"--force",[587,622,623],{},"Overwrite an existing binary, including a downgrade",[572,625,626,631],{},[587,627,628],{},[249,629,630],{},"--dry-run",[587,632,633],{},"Print what would happen without installing",[635,636,637,638,640],"warning",{},"The script needs a POSIX shell, so it is for macOS and Linux. On Windows, ",[249,639,299],{}," is either missing or WSL, and WSL gets the Linux binary inside its own file system. Use the PowerShell installer instead.",[286,642,644],{"id":643},"windows","Windows",[294,646,651],{"className":647,"code":648,"filename":649,"language":650,"meta":300,"style":300},"language-powershell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","irm https:\u002F\u002Fjscpd.dev\u002Finstall.ps1 | iex\n","PowerShell","powershell",[249,652,653],{"__ignoreMap":300},[304,654,655],{"class":306,"line":307},[304,656,648],{},[245,658,659,660,442,663,666,667,670,671,673,674,676],{},"The script installs ",[249,661,662],{},"jscpd.exe",[249,664,665],{},"cpd.exe"," into ",[249,668,669],{},"%USERPROFILE%\\.local\\bin"," (or the directory in ",[249,672,612],{},"), picks the x64 or ARM64 build from the machine's architecture, downloads from GitHub Releases and falls back to the npm registry. It prints the command that adds the directory to your ",[249,675,503],{},"; run it, open a new terminal, then:",[294,678,679],{"className":647,"code":507,"filename":649,"language":650,"meta":300,"style":300},[249,680,681],{"__ignoreMap":300},[304,682,683],{"class":306,"line":307},[304,684,507],{},[294,686,688],{"className":687,"code":354,"language":355,"meta":300},[353],[249,689,354],{"__ignoreMap":300},[245,691,692],{},"To pass options, run the script from a script block:",[294,694,696],{"className":647,"code":695,"filename":649,"language":650,"meta":300,"style":300},"&([scriptblock]::Create((irm https:\u002F\u002Fjscpd.dev\u002Finstall.ps1))) -Version 5.4.0 -Prefix C:\\tools\n",[249,697,698],{"__ignoreMap":300},[304,699,700],{"class":306,"line":307},[304,701,695],{},[245,703,704,705,708,709,708,712,715,716,367],{},"The switches are ",[249,706,707],{},"-Version",", ",[249,710,711],{},"-Prefix",[249,713,714],{},"-Force"," (overwrite an existing binary) and ",[249,717,718],{},"-DryRun",[286,720,722],{"id":721},"rust","Rust",[294,724,726],{"className":296,"code":725,"filename":298,"language":299,"meta":300,"style":300},"cargo install jscpd\njscpd --version\n",[249,727,728,737],{"__ignoreMap":300},[304,729,730,733,735],{"class":306,"line":307},[304,731,732],{"class":310},"cargo",[304,734,334],{"class":314},[304,736,340],{"class":314},[304,738,739,741],{"class":306,"line":343},[304,740,346],{"class":310},[304,742,349],{"class":314},[294,744,746],{"className":745,"code":354,"language":355,"meta":300},[353],[249,747,354],{"__ignoreMap":300},[245,749,750,751,758,759,442,761,763,764,367],{},"Cargo builds the ",[258,752,755,757],{"href":753,"rel":754},"https:\u002F\u002Fcrates.io\u002Fcrates\u002Fjscpd",[262],[249,756,346],{}," crate"," from source and installs both the ",[249,760,346],{},[249,762,366],{}," binaries. To use the detector from your own Rust code, see ",[258,765,181],{"href":182},[281,767,769],{"id":768},"other-ways-to-install","Other ways to install",[286,771,773],{"id":772},"homebrew","Homebrew",[245,775,776],{},"On macOS or Linux:",[294,778,780],{"className":296,"code":779,"filename":298,"language":299,"meta":300,"style":300},"brew install jscpd\n",[249,781,782],{"__ignoreMap":300},[304,783,784,787,789],{"class":306,"line":307},[304,785,786],{"class":310},"brew",[304,788,334],{"class":314},[304,790,340],{"class":314},[286,792,794],{"id":793},"nix","Nix",[294,796,798],{"className":296,"code":797,"filename":298,"language":299,"meta":300,"style":300},"nix profile install github:kucherenko\u002Fjscpd\n",[249,799,800],{"__ignoreMap":300},[304,801,802,804,807,809],{"class":306,"line":307},[304,803,793],{"class":310},[304,805,806],{"class":314}," profile",[304,808,334],{"class":314},[304,810,811],{"class":314}," github:kucherenko\u002Fjscpd\n",[245,813,814,815,442,817,819],{},"The flake builds the CLI crate, so both the ",[249,816,346],{},[249,818,366],{}," commands land in your profile. To run once without installing:",[294,821,823],{"className":296,"code":822,"filename":298,"language":299,"meta":300,"style":300},"nix run github:kucherenko\u002Fjscpd -- \u002Fpath\u002Fto\u002Fsource\n",[249,824,825],{"__ignoreMap":300},[304,826,827,829,832,835,837],{"class":306,"line":307},[304,828,793],{"class":310},[304,830,831],{"class":314}," run",[304,833,834],{"class":314}," github:kucherenko\u002Fjscpd",[304,836,551],{"class":314},[304,838,839],{"class":314}," \u002Fpath\u002Fto\u002Fsource\n",[286,841,843],{"id":842},"docker","Docker",[245,845,846,847,850],{},"A multi-arch (amd64, arm64) distroless image is published to GitHub Container Registry with every release (5.1.2+). The working directory inside the container is ",[249,848,849],{},"\u002Fsrc",", so mount the project there:",[294,852,854],{"className":296,"code":853,"filename":298,"language":299,"meta":300,"style":300},"docker run --rm -v \"$PWD:\u002Fsrc\" ghcr.io\u002Fkucherenko\u002Fjscpd .\n",[249,855,856],{"__ignoreMap":300},[304,857,858,860,862,865,868,871,875,878,881,884],{"class":306,"line":307},[304,859,842],{"class":310},[304,861,831],{"class":314},[304,863,864],{"class":314}," --rm",[304,866,867],{"class":314}," -v",[304,869,870],{"class":479}," \"",[304,872,874],{"class":873},"sTEyZ","$PWD",[304,876,877],{"class":314},":\u002Fsrc",[304,879,880],{"class":479},"\"",[304,882,883],{"class":314}," ghcr.io\u002Fkucherenko\u002Fjscpd",[304,885,318],{"class":314},[245,887,888,889,708,892,708,895,442,898,901,902,442,905,908,909,912,913,916,917,919],{},"The tags are ",[249,890,891],{},"latest",[249,893,894],{},"5",[249,896,897],{},"5.4",[249,899,900],{},"5.4.0",". The image holds the static binary and nothing else: ",[249,903,904],{},"--blame",[249,906,907],{},"--baseline-from-ref"," need ",[249,910,911],{},"git",", which is not in it. On a Linux host, add ",[249,914,915],{},"--user \"$(id -u):$(id -g)\""," so that report files belong to you and not to root. ",[258,918,35],{"href":36}," has the GitLab job built on this image.",[286,921,923],{"id":922},"yarn-and-pnpm","yarn and pnpm",[245,925,926],{},"The same npm package, through another client:",[294,928,930],{"className":296,"code":929,"filename":298,"language":299,"meta":300,"style":300},"yarn global add jscpd\n",[249,931,932],{"__ignoreMap":300},[304,933,934,937,940,943],{"class":306,"line":307},[304,935,936],{"class":310},"yarn",[304,938,939],{"class":314}," global",[304,941,942],{"class":314}," add",[304,944,340],{"class":314},[294,946,948],{"className":296,"code":947,"filename":298,"language":299,"meta":300,"style":300},"pnpm add -g jscpd\n",[249,949,950],{"__ignoreMap":300},[304,951,952,955,957,959],{"class":306,"line":307},[304,953,954],{"class":310},"pnpm",[304,956,942],{"class":314},[304,958,337],{"class":314},[304,960,340],{"class":314},[286,962,964],{"id":963},"platform-binaries","Platform binaries",[245,966,967,968,973,974,977,978,980,981,442,983,985],{},"Every ",[258,969,972],{"href":970,"rel":971},"https:\u002F\u002Fgithub.com\u002Fkucherenko\u002Fjscpd\u002Freleases",[262],"GitHub Release"," carries one archive per platform, ",[249,975,976],{},"\u003Cname>.tar.gz",", with a ",[249,979,489],{},", Sigstore signatures and SLSA provenance. The same builds are the npm platform packages that ",[249,982,346],{},[249,984,366],{}," pull in, and the one the installers download.",[566,987,988,998],{},[569,989,990],{},[572,991,992,995],{},[575,993,994],{},"Platform",[575,996,997],{},"Archive and npm package",[582,999,1000,1010,1020,1030,1040,1050,1060,1070],{},[572,1001,1002,1005],{},[587,1003,1004],{},"macOS Apple Silicon",[587,1006,1007],{},[249,1008,1009],{},"jscpd-darwin-arm64",[572,1011,1012,1015],{},[587,1013,1014],{},"macOS Intel",[587,1016,1017],{},[249,1018,1019],{},"jscpd-darwin-x64",[572,1021,1022,1025],{},[587,1023,1024],{},"Linux x64, glibc",[587,1026,1027],{},[249,1028,1029],{},"jscpd-linux-x64-gnu",[572,1031,1032,1035],{},[587,1033,1034],{},"Linux ARM64, glibc",[587,1036,1037],{},[249,1038,1039],{},"jscpd-linux-arm64-gnu",[572,1041,1042,1045],{},[587,1043,1044],{},"Linux x64, musl (Alpine)",[587,1046,1047],{},[249,1048,1049],{},"jscpd-linux-x64-musl",[572,1051,1052,1055],{},[587,1053,1054],{},"Linux ARM64, musl (Alpine) (5.1.2+)",[587,1056,1057],{},[249,1058,1059],{},"jscpd-linux-arm64-musl",[572,1061,1062,1065],{},[587,1063,1064],{},"Windows x64",[587,1066,1067],{},[249,1068,1069],{},"jscpd-windows-x64-msvc",[572,1071,1072,1075],{},[587,1073,1074],{},"Windows ARM64 (5.1.0+)",[587,1076,1077],{},[249,1078,1079],{},"jscpd-windows-arm64-msvc",[281,1081,1083],{"id":1082},"verify-and-update","Verify and update",[294,1085,1086],{"className":296,"code":507,"filename":298,"language":299,"meta":300,"style":300},[249,1087,1088],{"__ignoreMap":300},[304,1089,1090,1092],{"class":306,"line":307},[304,1091,346],{"class":310},[304,1093,349],{"class":314},[294,1095,1097],{"className":1096,"code":354,"language":355,"meta":300},[353],[249,1098,354],{"__ignoreMap":300},[245,1100,1101,1104,1105,1107,1108,708,1111,708,1114,708,1117,1120,1121,1124],{},[249,1102,1103],{},"jscpd -V"," is the short form. Update the way you installed: run the installer script again (it replaces an older build and refuses a downgrade unless you pass ",[249,1106,620],{},"), ",[249,1109,1110],{},"npm update -g jscpd",[249,1112,1113],{},"pip install --upgrade jscpd",[249,1115,1116],{},"cargo install jscpd",[249,1118,1119],{},"brew upgrade jscpd",", or pull a newer Docker tag. The ",[258,1122,1123],{"href":191},"changelog"," says what each release changed.",[281,1126,1128],{"id":1127},"next","Next",[245,1130,1131,1133,1134,1137],{},[258,1132,20],{"href":21}," scans a repository, reads the report and turns the number into a build step. If you are coming from jscpd 4, read ",[258,1135,1136],{"href":196},"Migration"," first.",[1139,1140,1141],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":300,"searchDepth":343,"depth":343,"links":1143},[1144,1152,1159,1160],{"id":283,"depth":343,"text":284,"children":1145},[1146,1148,1149,1150,1151],{"id":288,"depth":1147,"text":289},3,{"id":370,"depth":1147,"text":371},{"id":459,"depth":1147,"text":460},{"id":643,"depth":1147,"text":644},{"id":721,"depth":1147,"text":722},{"id":768,"depth":343,"text":769,"children":1153},[1154,1155,1156,1157,1158],{"id":772,"depth":1147,"text":773},{"id":793,"depth":1147,"text":794},{"id":842,"depth":1147,"text":843},{"id":922,"depth":1147,"text":923},{"id":963,"depth":1147,"text":964},{"id":1082,"depth":343,"text":1083},{"id":1127,"depth":343,"text":1128},"Every channel installs the same binary; pick the one your project already uses, then check the version.","md",null,{},{"icon":18},{"title":15,"description":1167},"Install jscpd 5 with npx, npm, pip, pipx, uv, cargo, Homebrew, nix, Docker, the shell installer or the PowerShell installer, or download a platform binary.","0YYii76U5l9yQRfRnETivLHdSEIhkmGj-MjvWitE4PM",[1170,1172],{"title":11,"path":7,"stem":12,"description":1171,"icon":13,"children":-1},"What a default run reports, what jscpd finds when you ask for it, what it leaves alone, and where to go first.",{"title":20,"path":21,"stem":22,"description":1173,"icon":23,"children":-1},"Scan a repository, read the clones jscpd found and turn the number into a build step, in about ten minutes.",1791302980348]