2 views
nashsu/llm_wiki
LLM Wiki is a cross-platform desktop application that turns your documents into an organized, interlinked knowledge base — automatically. Instead of traditional RAG (retrieve-and-answer from scratch every time), the LLM incrementally builds and maintains a persistent wiki from your sources。
TypeScript★ 18,836+647 that day#8 on trending
2.64%duplicated code · 2,550 of 96,531 lines
211clones in code
259code files of 444 scanned
3.69%duplicated over all files · 415 clones
The code number leaves out tests, fixtures, docs, examples, data files, styles, translations and vendored code.
Largest clones in the code
- 15 lines in 3 placestsx150 tokenssrc/components/editor/file-preview.tsx:572–586src/components/editor/wiki-reader.tsx:202–216src/components/layout/research-panel.tsx:225–239
572 <td className="border border-border/60 px-3 py-1.5" {...props}>{children}</td> 573), 574pre: ({ children, ...props }) => { 575 const mermaid = unwrapMermaidPre(children) 576 if (mermaid) return <>{mermaid}</> 577 return <pre dir="ltr" style={{ textAlign: "left" }} {...props}>{children}</pre> 578}, 579code: ({ className, children, ...props }) => { 580 const lang = className?.replace("language-", "") 581 const codeText = String(children).replace(/\n$/, "")First 10 of 15 lines.
- 6 lines in 5 placesrust72 tokenssrc-tauri/src/agent/skills.rs:404–409src-tauri/src/agent/skills.rs:425–430src-tauri/src/agent/skills.rs:605–610src-tauri/src/agent/skills.rs:623–628src-tauri/src/agent/skills.rs:679–684
404fn load_project_skills_reads_frontmatter_skill() { 405 let root = std::env::temp_dir().join(format!("llm-wiki-skills-{}", Uuid::new_v4())); 406 let skills_dir = root.join(".llm-wiki").join("skills"); 407 fs::create_dir_all(&skills_dir).unwrap(); 408 fs::write( 409 skills_dir.join("reviewer.md"), - 17 lines in 3 placesrust128 tokenssrc-tauri/src/agent/provider.rs:334–350src-tauri/src/agent/provider.rs:421–437src-tauri/src/agent/provider.rs:525–541
334 .headers(openai_headers(&self.config, url)?) 335 .json(&body) 336 .send() 337 .await 338 .map_err(|err| format!("LLM request failed: {err}"))?; 339let status = response.status(); 340let text = response 341 .text() 342 .await 343 .map_err(|err| format!("Failed to read LLM response: {err}"))?;First 10 of 17 lines.
7 more
- 45 lines in 2 placestsx249 tokens
- 14 lines in 4 placesrust81 tokens
- 6 lines in 4 placesrust75 tokens
- 46 lines in 2 placesrust207 tokens
- 14 lines in 4 placesrust69 tokens
- 22 lines in 2 placestsx180 tokens
- 14 lines in 3 placestypescript83 tokens
Largest clones over all files, tests and data included
- 15 lines in 3 placestsx150 tokenssrc/components/editor/file-preview.tsx:572–586src/components/editor/wiki-reader.tsx:202–216src/components/layout/research-panel.tsx:225–239
572 <td className="border border-border/60 px-3 py-1.5" {...props}>{children}</td> 573), 574pre: ({ children, ...props }) => { 575 const mermaid = unwrapMermaidPre(children) 576 if (mermaid) return <>{mermaid}</> 577 return <pre dir="ltr" style={{ textAlign: "left" }} {...props}>{children}</pre> 578}, 579code: ({ className, children, ...props }) => { 580 const lang = className?.replace("language-", "") 581 const codeText = String(children).replace(/\n$/, "")First 10 of 15 lines.
- 6 lines in 5 placesrust72 tokenssrc-tauri/src/agent/skills.rs:404–409src-tauri/src/agent/skills.rs:425–430src-tauri/src/agent/skills.rs:605–610src-tauri/src/agent/skills.rs:623–628src-tauri/src/agent/skills.rs:679–684
404fn load_project_skills_reads_frontmatter_skill() { 405 let root = std::env::temp_dir().join(format!("llm-wiki-skills-{}", Uuid::new_v4())); 406 let skills_dir = root.join(".llm-wiki").join("skills"); 407 fs::create_dir_all(&skills_dir).unwrap(); 408 fs::write( 409 skills_dir.join("reviewer.md"), - 7 lines in 6 placestypescripttests57 tokenssrc/lib/lint.test.ts:61–67src/lib/lint.test.ts:126–132src/lib/lint.test.ts:240–246src/lib/lint.test.ts:261–267src/lib/lint.test.ts:280–286and 1 more
61 makeFileNode("b.md", "Page B content here"), 62] 63mockListDirectory.mockResolvedValue(pages.map((p) => p.node)) 64mockReadFile.mockImplementation(async (path) => { 65 const match = pages.find((p) => p.node.path === path) 66 return match?.content ?? "" 67}) - 7 lines in 6 placestypescripttests57 tokens
- 17 lines in 3 placesrust128 tokens
By format, code only
| Format | Files | Lines | Clones | Duplicated lines | Duplication |
|---|---|---|---|---|---|
| rust | 39 | 33,846 | 152 | 1,785 | 5.27% |
| typescript | 143 | 34,434 | 32 | 432 | 1.25% |
| tsx | 60 | 23,119 | 27 | 333 | 1.44% |
| javascript | 5 | 4,079 | 0 | 0 | 0% |
| bash | 9 | 644 | 0 | 0 | 0% |
| python | 1 | 175 | 0 | 0 | 0% |
| perl | 1 | 174 | 0 | 0 | 0% |
| powershell | 1 | 60 | 0 | 0 | 0% |
By format, all files
| Format | Files | Lines | Clones | Duplicated lines | Duplication |
|---|---|---|---|---|---|
| typescript | 289 | 67,661 | 232 | 2,953 | 4.36% |
| rust | 40 | 33,864 | 152 | 1,785 | 5.27% |
| tsx | 61 | 23,144 | 27 | 333 | 1.44% |
| markdown | 7 | 2,582 | 3 | 33 | 1.28% |
| css | 1 | 182 | 1 | 7 | 3.85% |
| json | 14 | 5,069 | 0 | 0 | 0% |
| javascript | 5 | 4,079 | 0 | 0 | 0% |
| bash | 13 | 688 | 0 | 0 | 0% |
| yaml | 2 | 266 | 0 | 0 | 0% |
| markup | 3 | 220 | 0 | 0 | 0% |
Trending appearances
| Day | Rank | Stars | Files | Lines | Clones | All files | Code | Health | Commit |
|---|---|---|---|---|---|---|---|---|---|
| Sep 12, 2026 | #8 | 18,836 (+647) | 444 | 138,458 | 415 | 3.69% | 2.64% | — | e808211 |
| Sep 11, 2026 | #11 | 18,246 (+142) | 444 | 138,458 | 415 | 3.69% | 2.64% | — | e808211 |
Want this for your own project? Install jscpd and run jscpd ., or measure it the way the baselines were measured.