jscpd 5.4.0 released, plus what 5.3.2 and 5.3.3 brought
Published on September 30, 2026 by Andrey Kucherenko

jscpd 5.4.0 is out. This update also covers 5.3.2 and 5.3.3, which had no post here.

5.4.0
  • jscpd --lsp runs jscpd as a language server. Clones, similar functions, semantic clones, dead code and complexity show up as diagnostics in Neovim, Helix, Sublime Text, Emacs and JetBrains IDEs, and they follow the text as you type.
  • --compare (experimental) pairs the functions of two folders and shows what is left to port to another language, or what one of two implementations lacks, with an HTML migration map.
  • Two agent skills for ports: compare-codebases and code-migration.
  • Pairs from --similarity have their own SARIF rule, jscpd/similar-function.
5.3.3
  • --semantic (experimental) finds functions that do the same job with different code, within one language or across 19 languages. The embedding model runs inside jscpd on the CPU.
  • Fixes: a scan path inside another no longer scans its files twice, positions in files with Windows line endings are exact, and two kinds of use in Svelte components no longer count as dead code.
5.3.2
  • --dead-code reads Rust dead code from the compiler: pipe the JSON output of cargo check in with --rust-diagnostics.
  • Fixes: text around embedded code blocks (Markdown fences, component scripts) no longer counts as code, and a clone's line count includes its last line.

Install: npm i -g jscpd, pip install jscpd or cargo binstall jscpd

Thank you to everyone backing jscpd.