CopilotKit/OpenBot
Open-source AI coworkers that each get a computer of their own: a browser, files and tools, with every action decided before it happens and recorded after. Bring any AG-UI agent.
TypeScript★ 8,271+247 that day#4 on trending
C62.3/100
Duplication63
5.6% in typescript, tsx, rust, python, sql, bash, docker, powershell, javascript, nsisDead code93
0.7%Complexity43
61.9% The score is jscpd's own --health model: markup, data and text left out, tests kept. The numbers below are the trending scan's.
1.85%duplicated code · 5,961 of 322,781 lines
445clones in code
1,125code files of 2,378 scanned
37.33%duplicated over all files · 3,972 clones
Most complex files
- desktop/src-tauri/src/main.rs1338 cx
- desktop/src-tauri/src/stack.rs1294 cx
- extension/tests/recording.test.ts858 cx
- extension/src/background/recording.ts849 cx
- server/tests/composio-adapter.test.ts644 cx
- server/tests/plugin-store.integration.test.ts616 cx
- desktop/src/App.test.tsx510 cx
- shared/recorder-masking.ts493 cx
- extension/tests/streamer.test.ts449 cx
- server/tests/browser-routes.integration.test.ts378 cx
Dead code 0.73% unused · 102 findings
- extension/src/main-world/network-hook.tsunused-file
- extension/scripts/agent-traffic/record.tsunused-file
- server/scripts/test-network-guard.tsunused-file
- desktop/scripts/validate-telemetry.tsunused-file
- app/src/components/ui/questionnaire.tsxunused-file
- extension/scripts/store-package.tsunused-file
- extension/scripts/agent-traffic/runtime.tsunused-file
- app/src/components/channels/recipient-field.tsxunused-file
- server/src/passwords/store.ts:createMemoryPasswordStoreunused-export
- app/src/components/computer/needs-you.tsunused-file
The code number leaves out tests, fixtures, docs, examples, data files, styles, translations and vendored code, and 1 generated file: app/src/routeTree.gen.ts.
Largest clones in the code
- 157 lines in 2 placestsx771 tokens
6export function ComputerPlaceholder(props: SVGProps<SVGSVGElement>) { 7 return ( 8 <svg 9 viewBox="0 0 1200 800" 10 preserveAspectRatio="xMidYMin slice" 11 fill="none" 12 aria-hidden="true" 13 focusable="false" 14 xmlns="http://www.w3.org/2000/svg" 15 {...props}First 10 of 157 lines.
- 65 lines in 2 placesrust451 tokens
620use std::io::{Read, Write}; 621let mut request = Vec::new(); 622let mut buffer = [0; 1024]; 623loop { 624 let read = stream.read(&mut buffer).expect("read"); 625 request.extend_from_slice(&buffer[..read]); 626 if request.windows(4).any(|window| window == b"\r\n\r\n") { 627 break; 628 } 629}First 10 of 65 lines.
- 18 lines in 4 placespython134 tokensagent-ag2/src/main.py:46–63agent-claude-sdk/src/main.py:44–61agent-langgraph-agui/src/main.py:235–252agent-microsoft/src/main.py:43–60
46stream = AGUIStream(agent) 47 48app = FastAPI() 49 50 51@app.middleware("http") 52async def refuse_without_the_server_token(request: Request, call_next): 53 if request.url.path != "/health": 54 expected = (os.environ.get("MANAGED_AGENT_TOKEN") or "").strip() 55 offered = (request.headers.get(TOKEN_HEADER) or "").strip()First 10 of 18 lines.
7 more
- 16 lines in 4 placespython133 tokens
- 26 lines in 3 placestypescript183 tokens
- 10 lines in 7 placesrust52 tokens
- 12 lines in 3 placespython148 tokens
- 11 lines in 6 placesrust56 tokens
- 9 lines in 3 placespython138 tokens
- 6 lines in 5 placesrust60 tokens
Largest clones over all files, tests and data included
- 1024 lines in 15 placesjsondata files3,330 tokensserver/drizzle/meta/0045_snapshot.json:794–1817server/drizzle/meta/0047_snapshot.json:794–1817server/drizzle/meta/0048_snapshot.json:794–1817server/drizzle/meta/0049_snapshot.json:794–1817server/drizzle/meta/0050_snapshot.json:794–1817and 10 more
794 "primaryKey": false, 795 "notNull": false 796}, 797"summary_at": { 798 "name": "summary_at", 799 "type": "timestamp with time zone", 800 "primaryKey": false, 801 "notNull": false 802}, 803"last_message": {First 10 of 1024 lines.
- 6251 lines in 3 placesjsondata files19,675 tokensserver/drizzle/meta/0066_snapshot.json:4109–10359server/drizzle/meta/0068_snapshot.json:4109–10359server/drizzle/meta/0069_snapshot.json:4116–10366
4109}, 4110"compositePrimaryKeys": {}, 4111"uniqueConstraints": {}, 4112"policies": {}, 4113"checkConstraints": { 4114 "voice_sessions_duration_check": { 4115 "name": "voice_sessions_duration_check", 4116 "value": "\"voice_sessions\".\"duration_seconds\" >= 0" 4117 }, 4118 "voice_sessions_summary_check": {First 10 of 6251 lines.
- 522 lines in 25 placesjsondata files1,636 tokensserver/drizzle/meta/0033_snapshot.json:287–808server/drizzle/meta/0045_snapshot.json:287–808server/drizzle/meta/0046_snapshot.json:287–808server/drizzle/meta/0047_snapshot.json:287–808server/drizzle/meta/0048_snapshot.json:287–808and 20 more
287"indexes": { 288 "attachments_channel_idx": { 289 "name": "attachments_channel_idx", 290 "columns": [ 291 { 292 "expression": "channel_id", 293 "isExpression": false, 294 "asc": true, 295 "nulls": "last" 296 }First 10 of 522 lines.
- 2747 lines in 4 placesjsondata files8,794 tokens
- 3992 lines in 3 placesjsondata files12,463 tokens
By format, code only
| Format | Files | Lines | Clones | Duplicated lines | Duplication |
|---|---|---|---|---|---|
| rust | 41 | 51,638 | 182 | 1,825 | 3.53% |
| typescript | 696 | 194,326 | 177 | 2,632 | 1.35% |
| tsx | 327 | 71,196 | 70 | 1,278 | 1.8% |
| python | 19 | 2,404 | 15 | 203 | 8.44% |
| sql | 29 | 1,771 | 1 | 23 | 1.3% |
| bash | 8 | 916 | 0 | 0 | 0% |
| powershell | 4 | 500 | 0 | 0 | 0% |
| javascript | 1 | 30 | 0 | 0 | 0% |
By format, all files
| Format | Files | Lines | Clones | Duplicated lines | Duplication |
|---|---|---|---|---|---|
| typescript | 1,441 | 450,270 | 1,690 | 22,353 | 4.96% |
| json | 135 | 404,404 | 1,310 | 361,085 | 89.29% |
| tsx | 500 | 122,266 | 632 | 10,036 | 8.21% |
| rust | 44 | 52,599 | 184 | 1,843 | 3.5% |
| python | 59 | 8,512 | 73 | 1,654 | 19.43% |
| yaml | 58 | 6,448 | 35 | 474 | 7.35% |
| diff | 1 | 1,838 | 30 | 654 | 35.58% |
| txt | 10 | 524 | 7 | 58 | 11.07% |
| docker | 19 | 772 | 3 | 24 | 3.11% |
| markup | 10 | 322 | 3 | 36 | 11.18% |
Trending appearances
| Day | Rank | Stars | Files | Lines | Clones | All files | Code | Health | Commit |
|---|---|---|---|---|---|---|---|---|---|
| Oct 30, 2026 | #4 | 8,271 (+247) | 2,378 | 1,066,917 | 3,972 | 37.33% | 1.85% | C 62.3 | ab9855c |
Want this for your own project? Install jscpd and run jscpd ., or measure it the way the baselines were measured.