4 views

paperclipai/paperclip

The open-source app everyone uses to manage agents at work

TypeScript★ 94,702+2,458 that day#3 on trending

Analyzed September 30, 2026 at a027f76 (master) with jscpd 5.4.0 in 9.4s. Code duplication went from 6.76% on Sep 26 to 6.66% on Sep 30.

D48.3/100
Project health2,248,976 lines of code (XL)
Duplication40
11.2% in typescript, tsx, rust, javascript, bash, sql, python, perl, go, hcl, c
Dead code77
2.9%
Complexity37
71.2%

The score is jscpd's own --health model: markup, data and text left out, tests kept. The numbers below are the trending scan's.

6.66%duplicated code · 81,775 of 1,228,355 lines
4,717clones in code
3,403code files of 7,560 scanned
11.04%duplicated over all files · 17,754 clones

The code number leaves out tests, fixtures, docs, examples, data files, styles, translations and vendored code, and 8 generated files: packages/paperclip-runner/runner/crates/runner-core/src/generated_acpx_sidecar_contract.rs, packages/paperclip-runner/src/drivers/acpx/generated-sidecar-contract.ts, packages/paperclip-runner/src/generated/capability-contract.ts, packages/paperclip-runner/src/mock-core/skill-frontmatter.generated.ts, packages/paperclip-runner/src/protocol/generated/schema-bundle.ts, packages/paperclip-runner/src/protocol/generated/standalone-validators.ts, packages/shared/src/cliplab/character.ts, packages/shared/src/telemetry/generated/paperclip-telemetry.ts.

Largest clones in the code

  • 1048 lines in 2 placestsx6,783 tokens
    2319emptyMessage={eligible.length === 0 ? "No agents in this company support skills yet." : "No agents yet."}
    2320isAgentDisabled={(agent) => {
    2321  const option = agent as AttachAgentOption;
    2322  return option.required || !option.supportsSkills;
    2323}}
    2324getDescription={(agent) => {
    2325  const option = agent as AttachAgentOption;
    2326  return `${option.adapterType}${option.required ? " · required" : ""}${!option.supportsSkills ? " · skills not supported" : ""}`;
    2327}}
    2328renderNameSuffix={(agent) => (agent as AttachAgentOption).paused ? (
    

    First 10 of 1048 lines.

  • 657 lines in 2 placestsx4,344 tokens
    3714      <ScrollToBottom />
    3715    </div>
    3716  );
    3717}
    3718
    3719/* ---- Log Viewer ---- */
    3720
    3721export function LogViewer({ run, adapterType }: { run: HeartbeatRun; adapterType: string }) {
    3722  const { visible } = usePageVisibility();
    3723  const [events, setEvents] = useState<HeartbeatRunEvent[]>([]);
    

    First 10 of 657 lines.

  • 622 lines in 2 placestsx4,223 tokens
    1710  [selectedCompanyId, visibleIssueColumns],
    1711);
    1712const updateIssueFilters = useCallback((patch: Partial<IssueFilterState>) => {
    1713  updateFilterPreferences((previous) => ({
    1714    ...previous,
    1715    issueFilters: { ...previous.issueFilters, ...patch },
    1716  }));
    1717}, [updateFilterPreferences]);
    1718useEffect(() => {
    1719  if (!experimentalSettingsLoaded || externalObjectsEnabled || issueFilters.externalObjectStatuses.length === 0) return;
    

    First 10 of 622 lines.

7 more
Largest clones over all files, tests and data included
By format, code only
FormatFilesLinesClonesDuplicated linesDuplication
typescript2,254779,7043,33143,6845.6%
tsx873350,1931,03033,1449.46%
rust3453,9322603,0215.6%
javascript18131,979608032.51%
bash5612,144361,1239.25%
perl1174000%
python196000%
go269000%
c164000%
By format, all files
FormatFilesLinesClonesDuplicated linesDuplication
typescript4,3741,594,11213,011181,11511.36%
tsx1,284504,7203,20861,36512.16%
rust5669,1424605,4107.82%
json28341,4623138,51220.53%
markdown594138,8142289,1436.59%
javascript31958,8151521,9563.33%
diff137,2991021,30617.89%
yaml7420,218931,6818.31%
bash18316,340601,6229.93%
css129,796443513.58%

Trending appearances

DayRankStarsFilesLinesClonesAll filesCodeHealthCommit
Sep 30, 2026#394,702 (+2,458)7,5602,479,64917,75411.04%6.66%D 48.3a027f76
Sep 29, 2026#293,243 (+3,197)7,4742,457,53317,68611.11%6.7%D 48.253aad90
Sep 28, 2026#190,561 (+2,401)7,3632,435,91917,60911.19%6.75%D 48.10f14d26
Sep 27, 2026#187,754 (+2,608)7,3612,435,02317,60511.19%6.75%D 48.1640dee1
Sep 26, 2026#185,320 (+2,109)7,3562,433,97517,58611.2%6.76%D 48.14ca404b

Want this for your own project? Install jscpd and run jscpd ., or measure it the way the baselines were measured.