jo-inc/camofox-browser

Stealth headless browser for AI agents — bypass Cloudflare, bot detection, and anti-scraping. Drop-in Puppeteer/Playwright replacement.

JavaScript★ 10,643+871 that day#6 on trending

Analyzed September 9, 2026 at e5a36f5 (master) with jscpd 5.4.0 in 0.2s. Code duplication stayed at 3.56% across 2 appearances since Sep 8.

3.56%duplicated code · 566 of 15,909 lines
58clones in code
68code files of 195 scanned
13.52%duplicated over all files · 231 clones

The code number leaves out tests, fixtures, docs, examples, data files, styles, translations and vendored code, and 1 generated file: tests/unit/openapi.test.js.

Largest clones in the code

  • 26 lines in 2 placesjavascript257 tokens
    23const proc = spawn(process.execPath, [SERVER], {
    24  cwd: ROOT,
    25  env: {
    26    PATH: process.env.PATH, HOME: process.env.HOME, USER: process.env.USER,
    27    NODE_OPTIONS: process.env.NODE_OPTIONS || "",
    28    CAMOFOX_BASE_URL: process.env.CAMOFOX_BASE_URL || "http://localhost:9377",
    29  },
    30  stdio: ["pipe", "pipe", "pipe"],
    31});
    32
    

    First 10 of 26 lines.

  • 14 lines in 3 placesjavascript124 tokens
    4330app.post('/tabs/:tabId/back', async (req, res) => {
    4331  const tabId = req.params.tabId;
    4332
    4333  try {
    4334    const { userId } = req.body;
    4335    const session = sessions.get(normalizeUserId(userId));
    4336    const found = session && findTab(session, tabId);
    4337    if (!found) return tabNotFoundResponse(res, req.params.tabId || req.body?.tabId);
    4338    session.lastAccess = Date.now();
    4339
    

    First 10 of 14 lines.

  • 8 lines in 4 placesjavascript75 tokens
    3240const offset = parseInt(req.query.offset) || 0;
    3241const session = sessions.get(normalizeUserId(userId));
    3242const found = session && findTab(session, req.params.tabId);
    3243if (!found) return tabNotFoundResponse(res, req.params.tabId || req.body?.tabId);
    3244session.lastAccess = Date.now();
    3245
    3246const { tabState } = found;
    3247tabState.toolCalls++; tabState.consecutiveTimeouts = 0; tabState.consecutiveFailures = 0;
    
    4641const maxBytes = Number.isFinite(maxBytesRaw) && maxBytesRaw > 0 ? maxBytesRaw : MAX_DOWNLOAD_INLINE_BYTES;
    4642const session = sessions.get(normalizeUserId(userId));
    4643const found = session && findTab(session, req.params.tabId);
    4644if (!found) return tabNotFoundResponse(res, req.params.tabId || req.body?.tabId);
    4645session.lastAccess = Date.now();
    4646
    4647const { tabState } = found;
    4648tabState.toolCalls++;
    
7 more
Largest clones over all files, tests and data included
By format, code only
FormatFilesLinesClonesDuplicated linesDuplication
javascript4913,793585664.1%
bash151,013000%
typescript2758000%
perl1174000%
powershell1171000%
By format, all files
FormatFilesLinesClonesDuplicated linesDuplication
javascript14128,5341731,6795.88%
json96,214493,72059.86%
yaml757878414.53%
bash191,287140.31%
markup1837160.72%
markdown102,000000%
typescript3769000%
powershell2184000%
perl1174000%
text253000%

Trending appearances

DayRankStarsFilesLinesClonesAll filesCodeHealthCommit
Sep 9, 2026#610,643 (+871)19540,63023113.52%3.56%—e5a36f5
Sep 8, 2026#29,918 (+135)19540,63023113.52%3.56%—e5a36f5

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