nightly-labs/openbot
A local-first desktop workspace for persistent AI teammates. Run Codex, Claude, and Grok with dedicated workspaces, task queues, file sharing, browser control, and agent-to-agent collaboration.
The score is jscpd's own --health model: markup, data and text left out, tests kept. The numbers below are the trending scan's.
Most complex files
- packages/contracts/src/team-protocol/provider-aware-codec.ts1360 cx
- packages/contracts/src/team-protocol/v1.ts1347 cx
- src/backend/agent-service.ts1216 cx
- packages/ui/src/features/workflows/WorkflowCanvas.tsx1045 cx
- src/renderer/src/preview/mock-openbot.ts1035 cx
- src/backend/agent/provider-runtime.ts1016 cx
- src/backend/mailbox-store.ts995 cx
- scripts/browser-smoke-electron.ts945 cx
- src/backend/channel-service.ts945 cx
- src/backend/browser-host.ts915 cx
Dead code 4.55% unused · 209 findings
- scripts/browser-smoke-electron.tsunused-file
- scripts/workflow-team-api-e2e.tsunused-file
- src/renderer/src/features/team/team-webrtc.tsunused-file
- scripts/browser-fill-fields-electron.tsunused-file
- scripts/stuck-running-deliveries-e2e.tsunused-file
- scripts/channel-notifications-e2e.tsunused-file
- scripts/routine-cron-syntax-e2e.tsunused-file
- scripts/agent-access-e2e.tsunused-file
- scripts/instance-backup-e2e.tsunused-file
- scripts/codex-code-mode-mcp-e2e.tsunused-file
The code number leaves out tests, fixtures, docs, examples, data files, styles, translations and vendored code, and 10 generated files: apps/auth-api/src/lib/plugin-catalog.generated.ts, apps/auth-api/src/routeTree.gen.ts, apps/mobile/src/features/marketplace/model/plugin-catalog.generated.ts, apps/mobile/src/uniwind-types.d.ts, packages/brand/src/wordmark-shape.ts, src/backend/released-schemas/v0.1.12.sql, src/backend/released-schemas/v0.1.15.sql, src/backend/released-schemas/v0.1.18.sql, src/backend/released-schemas/v0.2.1.sql, src/renderer/src/features/settings/marketplace-plugin-catalog.ts.
Largest clones in the code
- 80 lines in 4 placestypescript484 tokensscripts/browser-agent-session-e2e.ts:47–126scripts/browser-card-smoke.ts:47–126scripts/browser-sign-in-e2e.ts:47–126scripts/browser-user-control-e2e.ts:47–126
47 cases: z.array(z.string()).length(16), 48 runId: z.literal(runId), 49 sourceSha: z.literal(sourceSha), 50 }) 51 .parse(JSON.parse(await readFile(reportPath, "utf8"))); 52 // Machine-readable summary of the completed case count. 53 process.stdout.write( 54 `${JSON.stringify({ status: report.status, cases: report.cases.length, report: reportPath })}\n`, 55 ); 56} catch (error) {First 10 of 80 lines.
- 237 lines in 2 placestypescript1,386 tokens
37 "scripts/live-activity-autolink-e2e.ts", 38 "src/main/live-activity-push.ts", 39 "packages/team-client/src/dynamic-island-coordinator.ts", 40 "packages/team-client/src/dynamic-island-presentation.ts", 41 "packages/team-client/src/agent-message-text.ts", 42 "packages/team-client/src/live-activity-props.ts", 43 "packages/team-client/src/live-activity-text.ts", 44 "packages/team-client/src/live-activity-seal.ts", 45 "apps/mobile/src/features/live-activity/model/live-activity-open.ts", 46];First 10 of 237 lines.
- 196 lines in 2 placestypescript1,126 tokens
37 "scripts/live-activity-autolink-e2e.ts", 38 "src/main/live-activity-push.ts", 39 "packages/team-client/src/dynamic-island-coordinator.ts", 40 "packages/team-client/src/dynamic-island-presentation.ts", 41 "packages/team-client/src/agent-message-text.ts", 42 "packages/team-client/src/live-activity-props.ts", 43 "packages/team-client/src/live-activity-text.ts", 44 "packages/team-client/src/live-activity-seal.ts", 45 "apps/mobile/src/features/live-activity/model/live-activity-open.ts", 46];First 10 of 196 lines.
7 more
- 24 lines in 5 placestypescript262 tokens
- 72 lines in 3 placestypescript488 tokens
- 16 lines in 5 placestypescript233 tokens
- 70 lines in 2 placestypescript826 tokens
- 24 lines in 5 placestsx182 tokens
- 15 lines in 5 placestypescript182 tokens
- 29 lines in 4 placestypescript242 tokens
Largest clones over all files, tests and data included
- 55 lines in 11 placestypescripttranslations473 tokenspackages/i18n/src/messages/de/index.ts:1–55packages/i18n/src/messages/es/index.ts:1–55packages/i18n/src/messages/fr/index.ts:1–67packages/i18n/src/messages/it/index.ts:1–67packages/i18n/src/messages/ja/index.ts:1–66and 6 more
1import type { PartialTranslation } from "../../message"; 2import type { AppMessages } from "../en/index"; 3import { messages as account } from "./account"; 4import { messages as agent } from "./agent"; 5import { messages as agentSettings } from "./agentSettings"; 6import { messages as agentTemplate } from "./agentTemplate"; 7import { messages as app } from "./app"; 8import { messages as attachment } from "./attachment"; 9import { messages as billing } from "./billing"; 10import { messages as browser } from "./browser";First 10 of 55 lines.
- 67 lines in 9 placestypescripttranslations393 tokenspackages/i18n/src/messages/de/source.ts:1–67packages/i18n/src/messages/es/source.ts:1–67packages/i18n/src/messages/fr/source.ts:1–68packages/i18n/src/messages/it/source.ts:1–68packages/i18n/src/messages/ja/source.ts:1–68and 4 more
1import { messages as errorAgent } from "./error/agent"; 2import { messages as errorApp } from "./error/app"; 3import { messages as errorAttachment } from "./error/attachment"; 4import { messages as errorAuth } from "./error/auth"; 5import { messages as errorBackend } from "./error/backend"; 6import { messages as errorBilling } from "./error/billing"; 7import { messages as errorComputerUse } from "./error/computerUse"; 8import { messages as errorConnector } from "./error/connector"; 9import { messages as errorHost } from "./error/host"; 10import { messages as errorImport } from "./error/import";First 10 of 67 lines.
- 23 lines in 11 placestypescripttranslations185 tokenspackages/i18n/src/messages/de/mobile.ts:1–23packages/i18n/src/messages/es/mobile.ts:1–23packages/i18n/src/messages/fr/mobile.ts:1–24packages/i18n/src/messages/it/mobile.ts:1–24packages/i18n/src/messages/ja/mobile.ts:1–24and 6 more
1import type { PartialTranslation } from "../../message"; 2import type { AppMobileMessages } from "../en/mobile"; 3import { messages as mobileAgent } from "./mobile/agent"; 4import { messages as mobileApp } from "./mobile/app"; 5import { messages as mobileAppLock } from "./mobile/appLock"; 6import { messages as mobileAuth } from "./mobile/auth"; 7import { messages as mobileBrowser } from "./mobile/browser"; 8import { messages as mobileChannel } from "./mobile/channel"; 9import { messages as mobileChat } from "./mobile/chat"; 10import { messages as mobileLink } from "./mobile/link";First 10 of 23 lines.
- 150 lines in 4 placesjsondata files594 tokens
- 53 lines in 12 placestypescripttranslations159 tokens
By format, code only
| Format | Files | Lines | Clones | Duplicated lines | Duplication |
|---|---|---|---|---|---|
| typescript | 2,332 | 505,453 | 1,506 | 18,730 | 3.71% |
| tsx | 1,104 | 238,147 | 326 | 3,805 | 1.6% |
| bash | 23 | 2,995 | 2 | 18 | 0.6% |
| ruby | 4 | 112 | 2 | 32 | 28.57% |
| swift | 6 | 997 | 1 | 6 | 0.6% |
| javascript | 14 | 1,477 | 0 | 0 | 0% |
| kotlin | 5 | 609 | 0 | 0 | 0% |
| groovy | 1 | 38 | 0 | 0 | 0% |
By format, all files
| Format | Files | Lines | Clones | Duplicated lines | Duplication |
|---|---|---|---|---|---|
| typescript | 3,617 | 671,355 | 1,864 | 26,126 | 3.89% |
| tsx | 1,123 | 238,882 | 326 | 3,805 | 1.59% |
| css | 142 | 65,095 | 259 | 2,034 | 3.12% |
| diff | 11 | 6,258 | 132 | 1,256 | 20.07% |
| json | 123 | 10,450 | 45 | 1,965 | 18.8% |
| yaml | 42 | 6,288 | 21 | 258 | 4.1% |
| markdown | 261 | 36,103 | 19 | 144 | 0.4% |
| sql | 34 | 1,863 | 11 | 652 | 35% |
| bash | 43 | 3,226 | 3 | 23 | 0.71% |
| markup | 12 | 184 | 3 | 42 | 22.83% |
Trending appearances
| Day | Rank | Stars | Files | Lines | Clones | All files | Code | Health | Commit |
|---|---|---|---|---|---|---|---|---|---|
| Oct 27, 2026 | #6 | 1,641 (+176) | 5,466 | 1,043,738 | 2,686 | 3.48% | 3.01% | C 61.5 | f91535f |
Want this for your own project? Install jscpd and run jscpd ., or measure it the way the baselines were measured.