HKUDS/DeepTutor
DeepTutor: Lifelong Personalized Tutoring. https://deeptutor.info/.
Python★ 46,410+1,598 that day#4 on trending
C64.3/100
Duplication81
2.6% in python, tsx, typescript, javascript, docker, bash, batchDead code72
3.6%Complexity46
56.8% 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.89%duplicated code · 9,552 of 504,739 lines
727clones in code
1,855code files of 3,477 scanned
2.63%duplicated over all files · 1,713 clones
Most complex files
- web/features/chat/ChatStateAdapter.tsx996 cx
- deeptutor/learning/service.py905 cx
- deeptutor/api/routers/knowledge.py849 cx
- deeptutor/services/session/sqlite_store.py830 cx
- deeptutor/capabilities/mastery/tools.py631 cx
- web/features/chat/components/ChatWorkspace.tsx613 cx
- web/features/chat/messages/ChatMessageList.tsx580 cx
- deeptutor/knowledge/manager.py536 cx
- deeptutor/partners/channels/feishu.py515 cx
- deeptutor/agents/research/pipeline.py507 cx
Dead code 3.57% unused · 319 findings
- deeptutor/agents/research/pipeline.pyunused-file
- deeptutor/partners/channels/feishu.pyunused-file
- web/components/settings/ServiceConfigEditor.tsxunused-file
- deeptutor/partners/channels/telegram.pyunused-file
- deeptutor/partners/channels/mochat.pyunused-file
- deeptutor/partners/channels/zulip.pyunused-file
- deeptutor/partners/channels/msteams.pyunused-file
- deeptutor/partners/channels/matrix.pyunused-file
- web/components/settings/ConnectionsEditor.tsxunused-file
- deeptutor/partners/channels/napcat.pyunused-file
The code number leaves out tests, fixtures, docs, examples, data files, styles, translations and vendored code, and 3 generated files: web/contracts/generated/api.ts, web/contracts/generated/turn-protocol.ts, web/lib/brand-icons.generated.ts.
Largest clones in the code
- 7 lines in 7 placespython83 tokensdeeptutor/book/blocks/code.py:64–70deeptutor/book/blocks/figure.py:31–37deeptutor/book/blocks/flash_cards.py:22–28deeptutor/book/blocks/interactive.py:31–37deeptutor/book/blocks/quiz.py:17–23and 2 more
64async def _generate( 65 self, ctx: BlockContext 66) -> tuple[dict[str, Any], list[SourceAnchor], dict[str, Any]]: 67 params = ctx.block.params 68 chapter_title = params.get("chapter_title", ctx.chapter.title) 69 chapter_summary = params.get("chapter_summary", ctx.chapter.summary) 70 objectives = params.get("objectives") or ctx.chapter.learning_objectives - 60 lines in 2 placestsx446 tokensweb/components/common/RichMarkdownRenderer.tsx:224–283web/components/common/SimpleMarkdownRenderer.tsx:86–145
224 <code className="rounded bg-[var(--muted)] px-1 py-0.5 font-mono text-[0.95em] text-[var(--foreground)]/90"> 225 {String(children).replace(/\n$/, "")} 226 </code> 227), 228img: () => null, 229hr: () => <div className="my-1 h-px bg-current opacity-10" />, 230ul: ({ node, ...props }: any) => ( 231 <ul className="my-1 ml-4 list-disc" {...props} /> 232), 233ol: ({ node, ...props }: any) => (First 10 of 60 lines.
- 78 lines in 2 placespython369 tokensdeeptutor/agents/math_animator/capability.py:243–320deeptutor/agents/visualize/capability.py:501–578
243stage = str(update.get("phase") or update.get("stage") or "concept_analysis") 244base_metadata = { 245 key: value 246 for key, value in update.items() 247 if key 248 not in {"event", "state", "response", "chunk", "result", "tool_name", "tool_args"} 249} 250 251if event != "llm_call": 252 returnFirst 10 of 78 lines.
7 more
- 41 lines in 2 placestsx362 tokens
- 65 lines in 2 placespython294 tokens
- 8 lines in 6 placespython58 tokens
- 53 lines in 2 placestsx272 tokens
- 52 lines in 2 placestsx270 tokens
- 22 lines in 3 placespython118 tokens
- 22 lines in 2 placestypescript235 tokens
Largest clones over all files, tests and data included
- 830 lines in 12 placesbashdocs and examples774 tokensREADME.md:278–1107assets/README/README_AR.md:99–830assets/README/README_CN.md:99–834assets/README/README_ES.md:99–843assets/README/README_FR.md:99–845and 7 more
278docker run --rm --name deeptutor \ 279 -p 127.0.0.1:3782:3782 \ 280 -v deeptutor-data:/app/data \ 281 ghcr.io/hkuds/deeptutor:latest 282``` 283 284Open [http://127.0.0.1:3782](http://127.0.0.1:3782), configure model providers in **Settings → Providers**, and press `Ctrl+C` when you are done. The named `de… 285 286### Content Workspace 28799docker run --rm --name deeptutor \ 100 -p 127.0.0.1:3782:3782 \ 101 -v deeptutor-data:/app/data \ 102 ghcr.io/hkuds/deeptutor:latest 103``` 104 105افتح [http://127.0.0.1:3782](http://127.0.0.1:3782)، وهيّئ مزودي النماذج في **الإعدادات ← المزودون**، واضغط `Ctrl+C` عند الانتهاء. تحتفظ وحدة التخزين المسماة `… 106 107### مساحة عمل المحتوى 108First 10 of 830 lines, the second copy on the right.
- 685 lines in 12 placestextdocs and examples210 tokensREADME.md:260–944assets/README/README_AR.md:81–672assets/README/README_CN.md:81–671assets/README/README_ES.md:81–680assets/README/README_FR.md:81–682and 7 more
260Help me install and configure DeepTutor locally from https://github.com/HKUDS/DeepTutor. 261Clone the repository, or reuse my existing checkout, and read SKILL.md and 262docs-for-user/AGENT_SETUP.md first. Follow that guide to prepare the environment, 263configure my model provider, verify the setup, and start the Web app. 264Ask me for any missing provider, model, or credential-source information; 265do not print API keys. Preserve my existing files and settings, and finish 266with the access URL and the results of your checks. 267``` 268 269The [Agent Setup guide](docs-for-user/AGENT_SETUP.md) covers the full flow, including non-interactive CLI configuration. To install it yourself, choose one of …81Help me install and configure DeepTutor locally from https://github.com/HKUDS/DeepTutor. 82Clone the repository, or reuse my existing checkout, and read SKILL.md and 83docs-for-user/AGENT_SETUP.md first. Follow that guide to prepare the environment, 84configure my model provider, verify the setup, and start the Web app. 85Ask me for any missing provider, model, or credential-source information; 86do not print API keys. Preserve my existing files and settings, and finish 87with the access URL and the results of your checks. 88``` 89 90يغطي [دليل إعداد الوكيل](../../docs-for-user/AGENT_SETUP.md) التدفق كاملاً، بما فيه التهيئة غير التفاعلية عبر CLI. لتثبيته بنفسك، اختر أحد المسارات أدناه.First 10 of 685 lines, the second copy on the right.
- 9 lines in 10 placesmarkdowndocs and examples159 tokensREADME.md:1137–1145assets/README/README_AR.md:859–867assets/README/README_CN.md:863–871assets/README/README_ES.md:872–880assets/README/README_HI.md:863–871and 5 more
1137<table> 1138 <tr> 1139 <td align="center"><a href="https://github.com/pancacake"><img src="https://avatars.githubusercontent.com/u/150592536?v=4&s=80" width="80" height="80" alt=… 1140 <td align="center"><a href="https://github.com/TyrionH-is-coding"><img src="https://avatars.githubusercontent.com/u/275607548?v=4&s=80" width="80" height="… 1141 <td align="center"><a href="https://github.com/zzhtx258"><img src="https://avatars.githubusercontent.com/u/175302980?v=4&s=80" width="80" height="80" alt="… 1142 </tr> 1143</table> 1144 1145### 📮 Contact859<table> 860 <tr> 861 <td align="center"><a href="https://github.com/pancacake"><img src="https://avatars.githubusercontent.com/u/150592536?v=4&s=80" width="80" height="80" alt=… 862 <td align="center"><a href="https://github.com/TyrionH-is-coding"><img src="https://avatars.githubusercontent.com/u/275607548?v=4&s=80" width="80" height="… 863 <td align="center"><a href="https://github.com/zzhtx258"><img src="https://avatars.githubusercontent.com/u/175302980?v=4&s=80" width="80" height="80" alt="… 864 </tr> 865</table> 866 867### 📮 التواصل - 17 lines in 4 placesmarkdowndocs and examples466 tokens
- 100 lines in 2 placespythontests799 tokens
By format, code only
| Format | Files | Lines | Clones | Duplicated lines | Duplication |
|---|---|---|---|---|---|
| python | 1,020 | 304,480 | 458 | 5,453 | 1.79% |
| tsx | 494 | 149,532 | 243 | 3,760 | 2.51% |
| typescript | 322 | 49,101 | 26 | 339 | 0.69% |
| javascript | 18 | 1,582 | 0 | 0 | 0% |
| bash | 1 | 44 | 0 | 0 | 0% |
By format, all files
| Format | Files | Lines | Clones | Duplicated lines | Duplication |
|---|---|---|---|---|---|
| python | 1,880 | 522,955 | 1,179 | 14,030 | 2.68% |
| tsx | 649 | 172,571 | 327 | 4,651 | 2.7% |
| typescript | 568 | 79,085 | 92 | 1,225 | 1.55% |
| markdown | 154 | 22,641 | 70 | 710 | 3.14% |
| text | 16 | 284 | 13 | 186 | 65.49% |
| bash | 20 | 1,464 | 12 | 1,044 | 71.31% |
| yaml | 105 | 7,911 | 8 | 133 | 1.68% |
| json | 30 | 37,447 | 5 | 339 | 0.91% |
| css | 4 | 1,993 | 3 | 27 | 1.35% |
| markup | 16 | 497 | 3 | 23 | 4.63% |
Trending appearances
| Day | Rank | Stars | Files | Lines | Clones | All files | Code | Health | Commit |
|---|---|---|---|---|---|---|---|---|---|
| Oct 28, 2026 | #4 | 46,410 (+1,598) | 3,477 | 850,057 | 1,713 | 2.63% | 1.89% | C 64.3 | a31d826 |
Want this for your own project? Install jscpd and run jscpd ., or measure it the way the baselines were measured.