<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    
    <title>GitHub Python Monthly Trending Repositories</title>
    <description>Monthly Trending Repositories of Python on GitHub</description>
    
    <pubDate>Mon, 10 Aug 2026 07:33:40 GMT</pubDate>
    <link>https://mshibanami.github.io/GitHubTrendingRSS</link>
    
    <item>
      <title>HKUDS/DeepTutor</title>
      <link>https://github.com/HKUDS/DeepTutor</link>
      <description>&lt;p&gt;DeepTutor: Lifelong Personalized Tutoring. https://deeptutor.info/.&lt;/p&gt;&lt;hr&gt;&lt;div align=&quot;center&quot;&gt; 
 &lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/figs/logo/logo.png&quot; alt=&quot;DeepTutor logo&quot; height=&quot;56&quot; style=&quot;vertical-align: middle;&quot; /&gt;&amp;nbsp;&lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/figs/logo/banner.png&quot; alt=&quot;DeepTutor&quot; height=&quot;48&quot; style=&quot;vertical-align: middle;&quot; /&gt;&lt;/p&gt; 
 &lt;h1&gt;DeepTutor: Lifelong Personalized Tutoring&lt;/h1&gt; 
 &lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://deeptutor.info&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;Docs — deeptutor.info&quot; src=&quot;https://img.shields.io/badge/Docs-deeptutor.info%20%E2%86%97-0A0A0A?style=for-the-badge&amp;amp;labelColor=F5F5F4&quot; height=&quot;36&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
 &lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://trendshift.io/repositories/17099?utm_source=repository-badge&amp;amp;utm_medium=badge&amp;amp;utm_campaign=badge-repository-17099&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;img src=&quot;https://trendshift.io/api/badge/repositories/17099&quot; alt=&quot;HKUDS%2FDeepTutor | Trendshift&quot; width=&quot;250&quot; height=&quot;55&quot; /&gt;&lt;/a&gt;&amp;nbsp; &lt;a href=&quot;https://trendshift.io/repositories/17099?utm_source=trendshift-badge&amp;amp;utm_medium=badge&amp;amp;utm_campaign=badge-trendshift-17099&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;img src=&quot;https://trendshift.io/api/badge/trendshift/repositories/17099/daily&quot; alt=&quot;HKUDS%2FDeepTutor | Trendshift&quot; width=&quot;250&quot; height=&quot;55&quot; /&gt;&lt;/a&gt;&amp;nbsp; &lt;a href=&quot;https://trendshift.io/repositories/17099?utm_source=trendshift-badge&amp;amp;utm_medium=badge&amp;amp;utm_campaign=badge-trendshift-17099&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;img src=&quot;https://trendshift.io/api/badge/trendshift/repositories/17099/weekly?language=Python&quot; alt=&quot;HKUDS%2FDeepTutor | Trendshift&quot; width=&quot;250&quot; height=&quot;55&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
 &lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/README.md&quot;&gt;&lt;img alt=&quot;English&quot; height=&quot;40&quot; src=&quot;https://img.shields.io/badge/English-BCDCF7&quot; /&gt;&lt;/a&gt;&amp;nbsp; &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/README/README_CN.md&quot;&gt;&lt;img alt=&quot;简体中文&quot; height=&quot;40&quot; src=&quot;https://img.shields.io/badge/%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87-CDCFD4&quot; /&gt;&lt;/a&gt;&amp;nbsp; &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/README/README_JA.md&quot;&gt;&lt;img alt=&quot;日本語&quot; height=&quot;40&quot; src=&quot;https://img.shields.io/badge/%E6%97%A5%E6%9C%AC%E8%AA%9E-CDCFD4&quot; /&gt;&lt;/a&gt;&amp;nbsp; &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/README/README_ES.md&quot;&gt;&lt;img alt=&quot;Español&quot; height=&quot;40&quot; src=&quot;https://img.shields.io/badge/Espa%C3%B1ol-CDCFD4&quot; /&gt;&lt;/a&gt;&amp;nbsp; &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/README/README_FR.md&quot;&gt;&lt;img alt=&quot;Français&quot; height=&quot;40&quot; src=&quot;https://img.shields.io/badge/Fran%C3%A7ais-CDCFD4&quot; /&gt;&lt;/a&gt;&amp;nbsp; &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/README/README_AR.md&quot;&gt;&lt;img alt=&quot;Arabic&quot; height=&quot;40&quot; src=&quot;https://img.shields.io/badge/Arabic-CDCFD4&quot; /&gt;&lt;/a&gt;&amp;nbsp; &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/README/README_RU.md&quot;&gt;&lt;img alt=&quot;Русский&quot; height=&quot;40&quot; src=&quot;https://img.shields.io/badge/%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9-CDCFD4&quot; /&gt;&lt;/a&gt;&amp;nbsp; &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/README/README_HI.md&quot;&gt;&lt;img alt=&quot;Hindi&quot; height=&quot;40&quot; src=&quot;https://img.shields.io/badge/Hindi-CDCFD4&quot; /&gt;&lt;/a&gt;&amp;nbsp; &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/README/README_PT.md&quot;&gt;&lt;img alt=&quot;Português&quot; height=&quot;40&quot; src=&quot;https://img.shields.io/badge/Portugu%C3%AAs-CDCFD4&quot; /&gt;&lt;/a&gt;&amp;nbsp; &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/README/README_TH.md&quot;&gt;&lt;img alt=&quot;Thai&quot; height=&quot;40&quot; src=&quot;https://img.shields.io/badge/Thai-CDCFD4&quot; /&gt;&lt;/a&gt;&amp;nbsp; &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/README/README_PL.md&quot;&gt;&lt;img alt=&quot;Polski&quot; height=&quot;40&quot; src=&quot;https://img.shields.io/badge/Polski-CDCFD4&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
 &lt;p&gt;&lt;a href=&quot;https://www.python.org/downloads/&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Python-3.11%2B-3776AB?style=flat-square&amp;amp;logo=python&amp;amp;logoColor=white&quot; alt=&quot;Python 3.11+&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://nextjs.org/&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Next.js-16-000000?style=flat-square&amp;amp;logo=next.js&amp;amp;logoColor=white&quot; alt=&quot;Next.js 16&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/LICENSE&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/License-Apache_2.0-blue?style=flat-square&quot; alt=&quot;License&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/v/release/HKUDS/DeepTutor?style=flat-square&amp;amp;color=brightgreen&quot; alt=&quot;GitHub release&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://arxiv.org/abs/2604.26962&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/arXiv-2604.26962-b31b1b?style=flat-square&amp;amp;logo=arxiv&amp;amp;logoColor=white&quot; alt=&quot;arXiv&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;a href=&quot;https://discord.gg/eRsjPgMU4t&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Discord-Community-5865F2?style=flat-square&amp;amp;logo=discord&amp;amp;logoColor=white&quot; alt=&quot;Discord&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/Communication.md&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Feishu-Group-00D4AA?style=flat-square&amp;amp;logo=feishu&amp;amp;logoColor=white&quot; alt=&quot;Feishu&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/issues/78&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/WeChat-Group-07C160?style=flat-square&amp;amp;logo=wechat&amp;amp;logoColor=white&quot; alt=&quot;WeChat&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/#-key-features&quot;&gt;Features&lt;/a&gt; · &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/#-get-started&quot;&gt;Get Started&lt;/a&gt; · &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/#-explore-deeptutor&quot;&gt;Explore&lt;/a&gt; · &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/#%EF%B8%8F-deeptutor-cli--agent-native-interface&quot;&gt;CLI&lt;/a&gt; · &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/#-ecosystem--eduhub--the-skills-community&quot;&gt;Ecosystem&lt;/a&gt; · &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/#-community&quot;&gt;Community&lt;/a&gt;&lt;/p&gt; 
&lt;/div&gt; 
&lt;hr /&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;🤝 &lt;strong&gt;We welcome any kinds of contributing!&lt;/strong&gt; Vote on roadmap items or propose new ones at &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/issues/498&quot;&gt;&lt;code&gt;Roadmap&lt;/code&gt;&lt;/a&gt;, and see our &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/CONTRIBUTING.md&quot;&gt;Contributing Guide&lt;/a&gt; for branching strategy, coding standards, and how to get started.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h3&gt;📦 Releases&lt;/h3&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;[2026.8.10]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.5.11&quot;&gt;v1.5.11&lt;/a&gt; — Prose around a DSML tool call stops vanishing, a truncated reply continues instead of ending, live memory usage in Settings, and LightRAG indexing off the event loop.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;[2026.8.7]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.5.10&quot;&gt;v1.5.10&lt;/a&gt; — Every account signs in to its own &lt;strong&gt;Codex&lt;/strong&gt;, model output language becomes its own setting, empty tool calls are rejected instead of retried, and uploads stop blocking the loop.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;[2026.8.4]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.5.9&quot;&gt;v1.5.9&lt;/a&gt; — Gemini &lt;strong&gt;Embedding 2&lt;/strong&gt; on its native endpoint, a per-model &lt;strong&gt;reasoning effort&lt;/strong&gt; control, a &lt;strong&gt;Novita AI&lt;/strong&gt; gateway, retrieval roles for queries, and Compose deployments that keep all of &lt;code&gt;data/&lt;/code&gt;.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;Past releases (more than 1 week ago)&lt;/b&gt;&lt;/summary&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.8.2]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.5.8&quot;&gt;v1.5.8&lt;/a&gt; — Memory: a real heap ceiling for the dev server, source installs serve a production build, bounded LLM client and index caches, and a keep-alive fix for stray 500s.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.7.31]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.5.7&quot;&gt;v1.5.7&lt;/a&gt; — A per-account &lt;strong&gt;MCP Services&lt;/strong&gt; store, 101 &lt;strong&gt;CLI Apps&lt;/strong&gt; the tutor can run, credentials moved out of the sandbox&#39;s reach, and a mobile layout.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.7.29]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.5.6&quot;&gt;v1.5.6&lt;/a&gt; — Remote &lt;strong&gt;Codex&lt;/strong&gt; sign-in completes behind an SSH tunnel, generated files get their own card in Activity, non-English languages stop collapsing to Chinese, and book creation no longer times out.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.7.26]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.5.5&quot;&gt;v1.5.5&lt;/a&gt; — Sign in with your ChatGPT plan via &lt;strong&gt;OpenAI Codex&lt;/strong&gt; OAuth, an &lt;strong&gt;Eden AI&lt;/strong&gt; provider, knowledge bases that report what they hold, traceable &lt;code&gt;rag&lt;/code&gt; citations, and GraphRAG indexing without a workaround.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.7.24]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.5.4&quot;&gt;v1.5.4&lt;/a&gt; — Maintenance sweep: the post-answer &quot;generating&quot; stall is gone, IM partners render Markdown tables faithfully, LLM JSON parsing is sturdier, plus quiz, create-KB form, and Math Animator fixes.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.7.24]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.5.3&quot;&gt;v1.5.3&lt;/a&gt; — Themeable code blocks, four more coding CLIs in My Agents (Gemini, Kimi, opencode, MiMo), an Atlas Cloud LLM provider, and a broad chat, memory, embedding, and parsing reliability sweep.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.7.19]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.5.2&quot;&gt;v1.5.2&lt;/a&gt; — Configurable chat attachment limits, PageIndex retrieval that reasons across your documents via agentic tool calls, broader Anthropic/OpenAI model support, and steadier Book, Knowledge Base, and chat UI.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.7.9]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.5.1&quot;&gt;v1.5.1&lt;/a&gt; — Remove a single failed document from a knowledge base — even one stuck in an &lt;strong&gt;error&lt;/strong&gt; state — instead of deleting and rebuilding the whole base.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.7.4]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.5.0&quot;&gt;v1.5.0&lt;/a&gt; — LlamaIndex ingestion now honors your &lt;strong&gt;Document Parsing&lt;/strong&gt; engine with multimodal image extraction, Partner &amp;amp; Soul ids stay URL-safe for non-Latin names, and optional RAG extras install cleanly on Python 3.14+.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.6.30]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.4.15&quot;&gt;v1.4.15&lt;/a&gt; — A native &lt;strong&gt;Mattermost&lt;/strong&gt; channel for Partners, plus fixes so Guided Learning multiple-choice questions grade correctly and a configured zero chunk overlap is honored.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.6.29]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.4.14&quot;&gt;v1.4.14&lt;/a&gt; — Click an assigned partner to chat in one step, Deep Research flags partial reports, LightRAG indexes without MinerU, FAISS handles non-ASCII paths, and PocketBase sessions are isolated per user.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.6.27]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.4.13&quot;&gt;v1.4.13&lt;/a&gt; — Partners support non-Latin names and become assignable to users, logos render after login (#599), tiny knowledge bases retrieve reliably, and containers start cleanly under rootless Podman.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.6.24]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.4.12&quot;&gt;v1.4.12&lt;/a&gt; — A new &lt;strong&gt;LightRAG Server&lt;/strong&gt; retrieval engine, a lightweight &lt;strong&gt;PyMuPDF4LLM&lt;/strong&gt; parsing engine, and a FAISS vector backend that makes large knowledge-base retrieval dramatically faster.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.6.23]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.4.11&quot;&gt;v1.4.11&lt;/a&gt; — Native tool calling on every cloud OpenAI-compatible provider, a redesigned admin Users page, LaTeX in quiz options, an honest session-loading spinner, and configurable container host binding.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.6.21]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.4.10&quot;&gt;v1.4.10&lt;/a&gt; — A self-service &lt;strong&gt;Profile&lt;/strong&gt; page with avatars, a rootless-ready container guide with a single-port request-time proxy, and deny-by-default MCP tools for non-admin users.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.6.19]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.4.9&quot;&gt;v1.4.9&lt;/a&gt; — Settings polish: Search shows only the fields your provider needs, connection profiles can be renamed and auto-named by provider, and graded Mastery Path questions flow into your Question Bank.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.6.18]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.4.8&quot;&gt;v1.4.8&lt;/a&gt; — Connect your own &lt;strong&gt;Partners&lt;/strong&gt; under &lt;strong&gt;My Agents&lt;/strong&gt; and consult them live in chat — answering through their own persona, library and skills — each with its own private memory.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.6.18]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.4.7&quot;&gt;v1.4.7&lt;/a&gt; — Connect your local &lt;strong&gt;Claude Code / Codex&lt;/strong&gt; and consult it live mid-turn, &lt;strong&gt;My Agents&lt;/strong&gt; graduates to a top-level &lt;code&gt;/agents&lt;/code&gt;, and Partner conversations gain branch / resume / delete with a replayable trace.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.6.17]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.4.6&quot;&gt;v1.4.6&lt;/a&gt; — Four-surface consolidation: a Space learning dashboard with importable &lt;strong&gt;My Agents&lt;/strong&gt; and top-level Memory, a &lt;strong&gt;Knowledge Center&lt;/strong&gt; with GraphRAG / PageIndex / LightRAG / linked-KB / Obsidian, opened-up Settings, and per-model capability gating.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.6.14]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.4.5&quot;&gt;v1.4.5&lt;/a&gt; — Guided Learning rebuilt on the chat agent loop with a hard per-type mastery gate and a &lt;code&gt;/learning&lt;/code&gt; dashboard, a new loop-plugin framework, plus Markdown export / save-to-notebook for Partner conversations.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.6.13]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.4.4&quot;&gt;v1.4.4&lt;/a&gt; — Install community skills from &lt;a href=&quot;https://clawhub.ai/&quot;&gt;ClawHub&lt;/a&gt; with &lt;code&gt;deeptutor skill install&lt;/code&gt; behind a security gate, plus real in-browser DOCX/XLSX previews for knowledge-base files.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.6.12]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.4.3&quot;&gt;v1.4.3&lt;/a&gt; — TutorBot becomes &lt;strong&gt;Partners&lt;/strong&gt; on a production-grade IM pipeline (15 channels, live streaming), Chat moves to a single agent loop, real per-user isolation, and a rebuilt Visualize.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.5.28]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.4.2&quot;&gt;v1.4.2&lt;/a&gt; — Stability + polish: Gemini 2.5+ unblocked across Visualize and Chat, auth-routing fix (#485), smooth-streaming chat UX, a Recents sidebar, and Lemonade local-provider support.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.5.27]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.4.1&quot;&gt;v1.4.1&lt;/a&gt; — Security + stability: TutorBot tool sandbox locked down, per-user resource isolation, multimodal image fallback, an HTTP/SSE API for TutorBots, and a v1.4.0 chat regression fix.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.5.22]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.4.0&quot;&gt;v1.4.0&lt;/a&gt; — GA cut of v1.4: Auto Mode, three-layer Memory, agentic Deep Research / Solve / Question, LlamaIndex RAG refactor, Visualize/Animator merge, and restart-safe turn runtime.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.5.21]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.4.0-beta&quot;&gt;v1.4.0-beta&lt;/a&gt; — Three-layer Memory workbench (L1/L2/L3), every chat capability rebuilt on a single agentic engine, LlamaIndex-only RAG, and a unified Settings + Capabilities surface.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.5.10]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.3.10&quot;&gt;v1.3.10&lt;/a&gt; — Remote Docker CORS recovery, &lt;code&gt;DISABLE_SSL_VERIFY&lt;/code&gt; across SDK providers, safer code-block citations, and optional Matrix E2EE add-on.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.5.9]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.3.9&quot;&gt;v1.3.9&lt;/a&gt; — TutorBot Zulip and NVIDIA NIM support, safer thinking-model routing, &lt;code&gt;deeptutor start&lt;/code&gt;, sidebar tooltips, and session-store parity.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.5.8]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.3.8&quot;&gt;v1.3.8&lt;/a&gt; — Optional multi-user deployments with isolated user workspaces, admin grants, auth routes, and scoped runtime access.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.5.4]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.3.7&quot;&gt;v1.3.7&lt;/a&gt; — Thinking-model/provider fixes, visible Knowledge index history, and safer Co-Writer clear/template editing.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.5.3]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.3.6&quot;&gt;v1.3.6&lt;/a&gt; — Catalog-based model selection for chat and TutorBot, safer RAG re-indexing, OpenAI Responses token-limit fixes, and Skills editor validation.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.5.2]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.3.5&quot;&gt;v1.3.5&lt;/a&gt; — Smoother local launch settings, safer RAG queries, cleaner local embedding auth, and Settings dark-mode polish.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.5.1]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.3.4&quot;&gt;v1.3.4&lt;/a&gt; — Book page chat persistence and rebuild flows, chat-to-book references, stronger language/reasoning handling, RAG document extraction hardening.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.4.30]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.3.3&quot;&gt;v1.3.3&lt;/a&gt; — NVIDIA NIM + Gemini embedding support, unified Space context for chat history/skills/memory, session snapshots, RAG re-index resilience.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.4.29]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.3.2&quot;&gt;v1.3.2&lt;/a&gt; — Transparent embedding endpoint URLs, RAG re-index resilience for invalid persisted vectors, memory cleanup for thinking-model output, Deep Solve runtime fix.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.4.28]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.3.1&quot;&gt;v1.3.1&lt;/a&gt; — Stability: safer RAG routing &amp;amp; embedding validation, Docker persistence, IME-safe input, Windows/GBK robustness.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.4.27]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.3.0&quot;&gt;v1.3.0&lt;/a&gt; — Versioned KB indexes with re-index workflow, rebuilt Knowledge workspace, embedding auto-discovery with new adapters, Space hub.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.4.25]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.2.5&quot;&gt;v1.2.5&lt;/a&gt; — Persistent chat attachments with file-preview drawer, attachment-aware capability pipelines, TutorBot Markdown export.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.4.25]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.2.4&quot;&gt;v1.2.4&lt;/a&gt; — Text/code/SVG attachments, one-command Setup Tour, Markdown chat export, compact KB management UI.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.4.24]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.2.3&quot;&gt;v1.2.3&lt;/a&gt; — Document attachments (PDF/DOCX/XLSX/PPTX), reasoning thinking-block display, Soul template editor, Co-Writer save-to-notebook.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.4.22]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.2.2&quot;&gt;v1.2.2&lt;/a&gt; — User-authored Skills system, chat input performance overhaul, TutorBot auto-start, Book Library UI, visualization fullscreen.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.4.21]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.2.1&quot;&gt;v1.2.1&lt;/a&gt; — Per-stage token limits, Regenerate response across all entry points, RAG &amp;amp; Gemma compatibility fixes.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.4.20]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.2.0&quot;&gt;v1.2.0&lt;/a&gt; — Book Engine &quot;living book&quot; compiler, multi-document Co-Writer, interactive HTML visualizations, Question Bank @-mention.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.4.18]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.1.2&quot;&gt;v1.1.2&lt;/a&gt; — Schema-driven Channels tab, RAG single-pipeline consolidation, externalized chat prompts.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.4.17]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.1.1&quot;&gt;v1.1.1&lt;/a&gt; — Universal &quot;Answer now&quot;, Co-Writer scroll sync, unified settings panel, streaming Stop button.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.4.15]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.1.0&quot;&gt;v1.1.0&lt;/a&gt; — LaTeX block math overhaul, LLM diagnostic probe, Docker + local LLM guidance.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.4.14]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.1.0-beta&quot;&gt;v1.1.0-beta&lt;/a&gt; — Bookmarkable sessions, Snow theme, WebSocket heartbeat &amp;amp; auto-reconnect, embedding registry overhaul.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.4.13]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.0.3&quot;&gt;v1.0.3&lt;/a&gt; — Question Notebook with bookmarks &amp;amp; categories, Mermaid in Visualize, embedding mismatch detection, Qwen/vLLM compatibility, LM Studio &amp;amp; llama.cpp support, and Glass theme.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.4.11]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.0.2&quot;&gt;v1.0.2&lt;/a&gt; — Search consolidation with SearXNG fallback, provider switch fix, and frontend resource leak fixes.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.4.10]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.0.1&quot;&gt;v1.0.1&lt;/a&gt; — Visualize capability (Chart.js/SVG), quiz duplicate prevention, and o4-mini model support.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.4.10]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.0.0-beta.4&quot;&gt;v1.0.0-beta.4&lt;/a&gt; — Embedding progress tracking with rate-limit retry, cross-platform dependency fixes, and MIME validation fix.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.4.8]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.0.0-beta.3&quot;&gt;v1.0.0-beta.3&lt;/a&gt; — Native OpenAI/Anthropic SDK (drop litellm), Windows Math Animator support, robust JSON parsing, and full Chinese i18n.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.4.7]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.0.0-beta.2&quot;&gt;v1.0.0-beta.2&lt;/a&gt; — Hot settings reload, MinerU nested output, WebSocket fix, and Python 3.11+ minimum.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.4.4]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v1.0.0-beta.1&quot;&gt;v1.0.0-beta.1&lt;/a&gt; — Agent-native architecture rewrite (~200k lines): Tools + Capabilities plugin model, CLI &amp;amp; SDK, TutorBot, Co-Writer, Guided Learning, and persistent memory.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.1.23]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v0.6.0&quot;&gt;v0.6.0&lt;/a&gt; — Session persistence, incremental document upload, flexible RAG pipeline import, and full Chinese localization.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.1.18]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v0.5.2&quot;&gt;v0.5.2&lt;/a&gt; — Docling support for RAG-Anything, logging system optimization, and bug fixes.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.1.15]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v0.5.0&quot;&gt;v0.5.0&lt;/a&gt; — Unified service configuration, RAG pipeline selection per knowledge base, question generation overhaul, and sidebar customization.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.1.9]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v0.4.0&quot;&gt;v0.4.0&lt;/a&gt; — Multi-provider LLM &amp;amp; embedding support, new home page, RAG module decoupling, and environment variable refactor.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.1.5]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v0.3.0&quot;&gt;v0.3.0&lt;/a&gt; — Unified PromptManager architecture, GitHub Actions CI/CD, and pre-built Docker images on GHCR.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;[2026.1.2]&lt;/strong&gt; &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/releases/tag/v0.2.0&quot;&gt;v0.2.0&lt;/a&gt; — Docker deployment, Next.js 16 &amp;amp; React 19 upgrade, WebSocket security hardening, and critical vulnerability fixes.&lt;/p&gt; 
 &lt;/blockquote&gt; 
&lt;/details&gt; 
&lt;h3&gt;📰 News&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;2026-05-22&lt;/strong&gt; 🌐 Official docs site live at &lt;a href=&quot;https://deeptutor.info/&quot;&gt;&lt;strong&gt;deeptutor.info&lt;/strong&gt;&lt;/a&gt; — guides, references, and capability tours in one place.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;2026-04-19&lt;/strong&gt; 🎉 20k stars in 111 days! Thank you for the support toward truly personalized, intelligent tutoring.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;2026-04-10&lt;/strong&gt; 📄 Our paper is live on arXiv — read the &lt;a href=&quot;https://arxiv.org/abs/2604.26962&quot;&gt;preprint&lt;/a&gt; for the design and ideas behind DeepTutor.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;2026-02-06&lt;/strong&gt; 🚀 10k stars in just 39 days! A huge thank you to our incredible community.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;2026-01-01&lt;/strong&gt; 🎊 Happy New Year! Join our &lt;a href=&quot;https://discord.gg/eRsjPgMU4t&quot;&gt;Discord&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/issues/78&quot;&gt;WeChat&lt;/a&gt;, or &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/discussions&quot;&gt;Discussions&lt;/a&gt; — let&#39;s shape DeepTutor together.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;2025-12-29&lt;/strong&gt; 🎓 DeepTutor is officially released!&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;✨ Key Features&lt;/h2&gt; 
&lt;p&gt;DeepTutor is an agent-native learning workspace that connects tutoring, problem solving, quiz generation, research, visualization, and mastery practice in one extensible system.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;One runtime for every mode&lt;/strong&gt; — Chat, Quiz, Research, Visualize, Solve, and Mastery Path run on the same agent loop, so you switch the objective, not the engine, and context moves with the learner.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Connected learning context&lt;/strong&gt; — Knowledge bases, books, Co-Writer drafts, notebooks, question banks, personas, and Memory stay available across every workflow instead of living in isolated tools.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Subagents and Partners&lt;/strong&gt; — consult a live coding CLI (Claude Code, Codex, Gemini, Kimi, opencode, or MiMo) or a Partner from any turn (or import their past conversations), and run persistent IM companions on the same brain.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Multi-engine knowledge&lt;/strong&gt; — versioned RAG libraries across LlamaIndex, PageIndex, GraphRAG, LightRAG, or a linked Obsidian vault, with pluggable document parsing.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Extensible tools and skills&lt;/strong&gt; — built-in tools, MCP servers, CLI apps, image / video / voice generation models, and installable community skills from EduHub.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Inspectable memory&lt;/strong&gt; — L1 traces, L2 surface summaries, and L3 synthesis make personalization visible and editable, with a Memory Graph that traces every claim back to its evidence.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;hr /&gt; 
&lt;h2&gt;🚀 Get Started&lt;/h2&gt; 
&lt;p&gt;DeepTutor ships four installation paths. They all share one workspace layout: settings live in &lt;code&gt;data/user/settings/&lt;/code&gt; under the directory you launch from (or under &lt;code&gt;DEEPTUTOR_HOME&lt;/code&gt; / &lt;code&gt;deeptutor start --home&lt;/code&gt; if you set one explicitly). For the full app, the recommended flow is &lt;strong&gt;pick a workspace directory → install → &lt;code&gt;deeptutor init&lt;/code&gt; → &lt;code&gt;deeptutor start&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;Option 1 — Install From PyPI&lt;/b&gt; · full local Web app + CLI, no clone required&lt;/summary&gt; 
 &lt;p&gt;Full local Web app + CLI, no clone required. Needs &lt;strong&gt;Python 3.11–3.13&lt;/strong&gt; and a &lt;strong&gt;Node.js 20+&lt;/strong&gt; runtime on PATH (the packaged Next.js standalone server is spawned by &lt;code&gt;deeptutor start&lt;/code&gt;).&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;mkdir -p my-deeptutor &amp;amp;&amp;amp; cd my-deeptutor
pip install -U deeptutor
deeptutor init     # prompts for ports + LLM provider + optional embedding
deeptutor start    # starts backend + frontend; keep the terminal open
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;&lt;code&gt;deeptutor init&lt;/code&gt; prompts for backend port (default &lt;code&gt;8001&lt;/code&gt;), frontend port (default &lt;code&gt;3782&lt;/code&gt;), LLM provider / base URL / API key / model, and an optional embedding provider for Knowledge Base / RAG.&lt;/p&gt; 
 &lt;p&gt;After &lt;code&gt;deeptutor start&lt;/code&gt;, open the frontend URL printed in the terminal — by default &lt;a href=&quot;http://127.0.0.1:3782&quot;&gt;http://127.0.0.1:3782&lt;/a&gt;. Press &lt;code&gt;Ctrl+C&lt;/code&gt; in that terminal to stop both backend and frontend. Skipping &lt;code&gt;deeptutor init&lt;/code&gt; is fine for a quick trial; the app boots with default ports and empty model settings, configure them later in &lt;strong&gt;Settings → Models&lt;/strong&gt;.&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;Option 2 — Install From Source&lt;/b&gt; · develop against a checkout&lt;/summary&gt; 
 &lt;p&gt;For development against a checkout. Use &lt;strong&gt;Python 3.11–3.13&lt;/strong&gt; and &lt;strong&gt;Node.js 22 LTS&lt;/strong&gt; to match CI and Docker.&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/HKUDS/DeepTutor.git
cd DeepTutor

# Create a venv (macOS/Linux). Windows PowerShell:
#   py -3.11 -m venv .venv ; .\.venv\Scripts\Activate.ps1
python3 -m venv .venv &amp;amp;&amp;amp; source .venv/bin/activate
python -m pip install --upgrade pip

# Install backend + frontend deps
python -m pip install -e .
( cd web &amp;amp;&amp;amp; npm ci --legacy-peer-deps )

deeptutor init
deeptutor start --dev
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;&lt;code&gt;deeptutor start&lt;/code&gt; builds the local &lt;code&gt;web/&lt;/code&gt; frontend for production once and reuses it; &lt;code&gt;--dev&lt;/code&gt; runs Next.js with HMR. Config layout, ports, and &lt;code&gt;Ctrl+C&lt;/code&gt; match Option 1.&lt;/p&gt; 
 &lt;details&gt; 
  &lt;summary&gt;&lt;b&gt;Conda environment&lt;/b&gt; (instead of &lt;code&gt;venv&lt;/code&gt;)&lt;/summary&gt; 
  &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;conda create -n deeptutor python=3.11
conda activate deeptutor
python -m pip install --upgrade pip
&lt;/code&gt;&lt;/pre&gt; 
 &lt;/details&gt; 
 &lt;details&gt; 
  &lt;summary&gt;&lt;b&gt;Optional install extras&lt;/b&gt; — dev / partners / matrix / math-animator&lt;/summary&gt; 
  &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install -e &quot;.[dev]&quot;             # tests/lint tools
pip install -e &quot;.[partners]&quot;        # Partner IM channel SDKs + MCP client
pip install -e &quot;.[matrix]&quot;          # Matrix channel without E2EE/libolm
pip install -e &quot;.[matrix-e2e]&quot;      # Matrix E2EE; requires libolm
pip install -e &quot;.[math-animator]&quot;   # Manim addon; requires LaTeX/ffmpeg/system libs
&lt;/code&gt;&lt;/pre&gt; 
 &lt;/details&gt; 
 &lt;details&gt; 
  &lt;summary&gt;&lt;b&gt;Frontend dependency tweaks &amp;amp; dev-server troubleshooting&lt;/b&gt;&lt;/summary&gt; 
  &lt;p&gt;&lt;strong&gt;Changing frontend dependencies:&lt;/strong&gt; run &lt;code&gt;npm install --legacy-peer-deps&lt;/code&gt; to refresh &lt;code&gt;web/package-lock.json&lt;/code&gt;, then commit both &lt;code&gt;web/package.json&lt;/code&gt; and &lt;code&gt;web/package-lock.json&lt;/code&gt;.&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;Stuck dev server:&lt;/strong&gt; if &lt;code&gt;deeptutor start --dev&lt;/code&gt; reports an existing frontend that isn&#39;t responding, stop the PID it prints. If no Next.js process is actually running, the lock files are stale — remove them and retry:&lt;/p&gt; 
  &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;rm -f web/.next/dev/lock web/.next/lock
deeptutor start --dev
&lt;/code&gt;&lt;/pre&gt; 
 &lt;/details&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;Option 3 — Docker&lt;/b&gt; · one self-contained container&lt;/summary&gt; 
 &lt;p&gt;One container for the full Web app. Images on GitHub Container Registry:&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;code&gt;ghcr.io/hkuds/deeptutor:latest&lt;/code&gt; — stable release&lt;/li&gt; 
  &lt;li&gt;&lt;code&gt;ghcr.io/hkuds/deeptutor:pre&lt;/code&gt; — pre-release, when available&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;See &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/CONTAINERIZATION.md&quot;&gt;CONTAINERIZATION.md&lt;/a&gt; for podman/rootless/read-only-rootfs deployments and the full per-installation guide.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker run --rm --name deeptutor \
  -p 127.0.0.1:3782:3782 \
  -v deeptutor-data:/app/data \
  ghcr.io/hkuds/deeptutor:latest
&lt;/code&gt;&lt;/pre&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;Only &lt;code&gt;3782&lt;/code&gt; needs to be published.&lt;/strong&gt; The browser talks exclusively to the frontend origin; the Next.js middleware (&lt;code&gt;web/proxy.ts&lt;/code&gt;) forwards &lt;code&gt;/api/*&lt;/code&gt; and &lt;code&gt;/ws/*&lt;/code&gt; to the FastAPI backend &lt;strong&gt;inside the container&lt;/strong&gt;. Publishing &lt;code&gt;8001&lt;/code&gt; (&lt;code&gt;-p 127.0.0.1:8001:8001&lt;/code&gt;) is optional — handy only for hitting the API directly with curl or scripts.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;p&gt;Open &lt;a href=&quot;http://127.0.0.1:3782&quot;&gt;http://127.0.0.1:3782&lt;/a&gt;. The container creates &lt;code&gt;/app/data/user/settings/*.json&lt;/code&gt; on first boot; configure model providers from the Web Settings page. Config, API keys, logs, workspace files, memory, and knowledge bases persist in the &lt;code&gt;deeptutor-data&lt;/code&gt; volume.&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;strong&gt;Different host ports:&lt;/strong&gt; change the left side of each &lt;code&gt;-p host:container&lt;/code&gt; mapping (e.g. &lt;code&gt;-p 127.0.0.1:8088:3782&lt;/code&gt;). If you change container-side ports in &lt;code&gt;/app/data/user/settings/system.json&lt;/code&gt;, restart and update the right side of each mapping to match.&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Detached:&lt;/strong&gt; add &lt;code&gt;-d&lt;/code&gt;, then &lt;code&gt;docker logs -f deeptutor&lt;/code&gt; to follow, &lt;code&gt;docker stop deeptutor&lt;/code&gt; to stop, &lt;code&gt;docker rm deeptutor&lt;/code&gt; before reusing the name. The &lt;code&gt;deeptutor-data&lt;/code&gt; volume keeps your settings and workspace across restarts.&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;&lt;strong&gt;Remote Docker / reverse proxy:&lt;/strong&gt; the browser only talks to the frontend origin (&lt;code&gt;:3782&lt;/code&gt;); the in-container Next.js middleware forwards &lt;code&gt;/api/*&lt;/code&gt; and &lt;code&gt;/ws/*&lt;/code&gt; to the backend server-side. For the common single-container case you don&#39;t configure an API base at all — just point your reverse proxy / TLS terminator at &lt;code&gt;:3782&lt;/code&gt;. You only need an API base for a &lt;strong&gt;split deployment&lt;/strong&gt; (backend in a separate container/host): set &lt;code&gt;next_public_api_base&lt;/code&gt; in &lt;code&gt;data/user/settings/system.json&lt;/code&gt; to the in-network address the frontend server uses to reach the backend (it&#39;s read server-side, never sent to the browser).&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;next_public_api_base&quot;: &quot;http://backend:8001&quot;
}
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;&lt;code&gt;next_public_api_base_external&lt;/code&gt; (and its alias &lt;code&gt;public_api_base&lt;/code&gt;) are accepted as lower-precedence fallbacks. CORS uses frontend &lt;strong&gt;origins&lt;/strong&gt;, not API URLs. With auth disabled, DeepTutor permits normal HTTP/HTTPS browser origins by default. With auth enabled, add exact frontend origins:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;cors_origins&quot;: [&quot;https://deeptutor.example.com&quot;]
}
&lt;/code&gt;&lt;/pre&gt; 
 &lt;details&gt; 
  &lt;summary&gt;&lt;b&gt;Connecting to Ollama / LM Studio / llama.cpp / vLLM / Lemonade on the host&lt;/b&gt;&lt;/summary&gt; 
  &lt;p&gt;Inside Docker, &lt;code&gt;localhost&lt;/code&gt; is the container itself, not your host machine. To reach a model service running on the host, use the host gateway (recommended):&lt;/p&gt; 
  &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker run --rm --name deeptutor \
  -p 127.0.0.1:3782:3782 -p 127.0.0.1:8001:8001 \
  --add-host=host.docker.internal:host-gateway \
  -v deeptutor-data:/app/data \
  ghcr.io/hkuds/deeptutor:latest
&lt;/code&gt;&lt;/pre&gt; 
  &lt;p&gt;Then in &lt;strong&gt;Settings → Models&lt;/strong&gt;, point the provider Base URL at &lt;code&gt;host.docker.internal&lt;/code&gt;:&lt;/p&gt; 
  &lt;ul&gt; 
   &lt;li&gt;Ollama LLM: &lt;code&gt;http://host.docker.internal:11434/v1&lt;/code&gt;&lt;/li&gt; 
   &lt;li&gt;Ollama embedding: &lt;code&gt;http://host.docker.internal:11434/api/embed&lt;/code&gt;&lt;/li&gt; 
   &lt;li&gt;LM Studio: &lt;code&gt;http://host.docker.internal:1234/v1&lt;/code&gt;&lt;/li&gt; 
   &lt;li&gt;llama.cpp: &lt;code&gt;http://host.docker.internal:8080/v1&lt;/code&gt;&lt;/li&gt; 
   &lt;li&gt;Lemonade: &lt;code&gt;http://host.docker.internal:13305/api/v1&lt;/code&gt;&lt;/li&gt; 
  &lt;/ul&gt; 
  &lt;p&gt;Docker Desktop (macOS/Windows) usually resolves &lt;code&gt;host.docker.internal&lt;/code&gt; without &lt;code&gt;--add-host&lt;/code&gt;. On Linux, the flag is the portable way to create that hostname on modern Docker Engine.&lt;/p&gt; 
  &lt;p&gt;&lt;strong&gt;Linux alternative — host networking:&lt;/strong&gt; add &lt;code&gt;--network=host&lt;/code&gt; and drop the &lt;code&gt;-p&lt;/code&gt; flags. The container shares the host network directly, so open &lt;a href=&quot;http://127.0.0.1:3782&quot;&gt;http://127.0.0.1:3782&lt;/a&gt; (or the &lt;code&gt;frontend_port&lt;/code&gt; in &lt;code&gt;system.json&lt;/code&gt;), and host services can be reached with normal localhost URLs like &lt;code&gt;http://127.0.0.1:11434/v1&lt;/code&gt;. Note that host networking exposes container ports directly on the host and may conflict with existing services — to keep them on loopback, set &lt;code&gt;BACKEND_HOST=127.0.0.1&lt;/code&gt; and &lt;code&gt;FRONTEND_HOST=127.0.0.1&lt;/code&gt; (see &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/CONTAINERIZATION.md&quot;&gt;CONTAINERIZATION.md&lt;/a&gt;).&lt;/p&gt; 
 &lt;/details&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;Option 4 — CLI Only&lt;/b&gt; · no Web UI, from a source checkout&lt;/summary&gt; 
 &lt;p&gt;When you don&#39;t need the Web UI. The CLI-only package is installed from a source checkout, not from PyPI.&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/HKUDS/DeepTutor.git
cd DeepTutor

# Create a venv (macOS/Linux). Windows PowerShell:
#   py -3.11 -m venv .venv-cli ; .\.venv-cli\Scripts\Activate.ps1
python3 -m venv .venv-cli &amp;amp;&amp;amp; source .venv-cli/bin/activate
python -m pip install --upgrade pip

python -m pip install -e ./packaging/deeptutor-cli
deeptutor init --cli
deeptutor chat
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;&lt;code&gt;deeptutor init --cli&lt;/code&gt; shares the same &lt;code&gt;data/user/settings/&lt;/code&gt; layout as the full app but skips the backend/frontend port prompts and defaults embeddings to &lt;strong&gt;off&lt;/strong&gt; (choose &lt;code&gt;Yes&lt;/code&gt; if you plan to use &lt;code&gt;deeptutor kb …&lt;/code&gt; or RAG tools). It still writes a complete runtime layout (&lt;code&gt;system.json&lt;/code&gt;, &lt;code&gt;auth.json&lt;/code&gt;, &lt;code&gt;integrations.json&lt;/code&gt;, &lt;code&gt;model_catalog.json&lt;/code&gt;, &lt;code&gt;main.yaml&lt;/code&gt;, &lt;code&gt;agents.yaml&lt;/code&gt;) and still prompts for the active LLM provider and model.&lt;/p&gt; 
 &lt;details&gt; 
  &lt;summary&gt;&lt;b&gt;Common commands&lt;/b&gt;&lt;/summary&gt; 
  &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;deeptutor chat                                          # interactive REPL
deeptutor chat --capability deep_solve --tool rag --kb my-kb
deeptutor run chat &quot;Explain Fourier transform&quot;
deeptutor run deep_solve &quot;Solve x^2 = 4&quot; --tool rag --kb my-kb
deeptutor kb create my-kb --doc textbook.pdf
deeptutor memory show
deeptutor config show
&lt;/code&gt;&lt;/pre&gt; 
 &lt;/details&gt; 
 &lt;p&gt;The local &lt;code&gt;deeptutor-cli&lt;/code&gt; install ships no Web assets or server dependencies. Keep the source checkout around — the editable install points to it. To add the Web app later, install the PyPI package (Option 1) and run &lt;code&gt;deeptutor init&lt;/code&gt; + &lt;code&gt;deeptutor start&lt;/code&gt; from the same workspace.&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;Code Execution Sandbox (office skills)&lt;/b&gt; · running model-generated code for docx / pdf / pptx / xlsx&lt;/summary&gt; 
 &lt;p&gt;The built-in office skills — &lt;strong&gt;docx / pdf / pptx / xlsx&lt;/strong&gt; — work by having the model write a short Python script (&lt;code&gt;python-docx&lt;/code&gt;, &lt;code&gt;reportlab&lt;/code&gt;, &lt;code&gt;openpyxl&lt;/code&gt;, …), run it through the &lt;code&gt;exec&lt;/code&gt; / &lt;code&gt;code_execution&lt;/code&gt; tools, and hand back a download URL. Those tools mount whenever a sandbox backend is active, which it is &lt;strong&gt;by default&lt;/strong&gt; in every deployment shape:&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;strong&gt;Local (Option 1 / 2) and Docker (Option 3, single container):&lt;/strong&gt; a restricted subprocess sandbox runs the model&#39;s code (on the host locally, or inside the container under Docker — the container being its own isolation boundary).&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;docker-compose:&lt;/strong&gt; routed instead to a hardened, least-privileged &lt;strong&gt;runner sidecar&lt;/strong&gt; (&lt;code&gt;Dockerfile.runner&lt;/code&gt;) via &lt;code&gt;DEEPTUTOR_SANDBOX_RUNNER_URL&lt;/code&gt; — the strongest posture, and preferred automatically when present.&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;The subprocess sandbox is controlled by the &lt;code&gt;sandbox_allow_subprocess&lt;/code&gt; setting in &lt;code&gt;data/user/settings/system.json&lt;/code&gt; (default &lt;code&gt;true&lt;/code&gt;). Running model-generated code on your host is a real trust decision — set it to &lt;code&gt;false&lt;/code&gt; (or export &lt;code&gt;DEEPTUTOR_SANDBOX_ALLOW_SUBPROCESS=0&lt;/code&gt;) to disable host-side execution, at the cost of the office skills no longer being able to produce files.&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;Configuration reference&lt;/b&gt; — config files under &lt;code&gt;data/user/settings/&lt;/code&gt; (JSON/YAML)&lt;/summary&gt; 
 &lt;p&gt;Everything under &lt;code&gt;data/user/settings/&lt;/code&gt; is plain JSON/YAML. The &lt;strong&gt;Settings&lt;/strong&gt; page in the browser is the recommended editor.&lt;/p&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th style=&quot;text-align:left&quot;&gt;File&lt;/th&gt; 
    &lt;th style=&quot;text-align:left&quot;&gt;Purpose&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;model_catalog.json&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;LLM, embedding, and search provider profiles; API keys; active models&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;system.json&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;Backend/frontend ports, public API base, CORS, SSL verification, attachment directory and upload/extraction limits&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;auth.json&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;Optional auth toggle, username, password hash, token/cookie settings&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;integrations.json&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;Optional PocketBase and sidecar integration settings&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;interface.json&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;UI and model output language / theme / sidebar preferences&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;main.yaml&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;Runtime behavior defaults and path injection&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;agents.yaml&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;Capability/tool temperature and token settings&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
 &lt;p&gt;Project-root &lt;code&gt;.env&lt;/code&gt; is &lt;strong&gt;not&lt;/strong&gt; read as an application config file. For a minimal model setup, open &lt;strong&gt;Settings → Models&lt;/strong&gt;, add an LLM profile (Base URL / API key / model name), and save. Add an embedding profile only if you plan to use Knowledge Base / RAG features.&lt;/p&gt; 
&lt;/details&gt; 
&lt;h2&gt;📖 Explore DeepTutor&lt;/h2&gt; 
&lt;p&gt;Start with the main surfaces you will use day to day: Chat, Partners, My Agents, Co-Writer, Book, Knowledge Center, Learning Space, Memory, and Settings. The tour then covers Multi-User deployments for shared, isolated workspaces.&lt;/p&gt; 
&lt;div align=&quot;center&quot;&gt; 
 &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/figs/web-1.4.6+/OVERVIEW.png&quot; alt=&quot;DeepTutor home — the Chat workspace with every surface in the sidebar&quot; width=&quot;900&quot; /&gt; 
&lt;/div&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;🏗️ System architecture&lt;/b&gt;&lt;/summary&gt; 
 &lt;div align=&quot;center&quot;&gt; 
  &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/figs/system/system%20architecture.png&quot; alt=&quot;DeepTutor system architecture&quot; width=&quot;900&quot; /&gt; 
 &lt;/div&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;💬 Chat — The Agent Loop You Actually Use&lt;/b&gt;&lt;/summary&gt; 
 &lt;p&gt;Chat is the default capability and where most work begins. A single thread can talk normally, call tools, ground itself in selected knowledge bases, read attachments, generate images, consult subagents, write notebook records, and continue with the same context across turns.&lt;/p&gt; 
 &lt;div align=&quot;center&quot;&gt; 
  &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/figs/web-1.4.6+/home/00-overview.png&quot; alt=&quot;DeepTutor chat workspace&quot; width=&quot;900&quot; /&gt; 
 &lt;/div&gt; 
 &lt;p&gt;The loop is deliberately simple: the model thinks in rounds, calls tools when useful, observes the results, and finishes with a tool-free message. &lt;code&gt;ask_user&lt;/code&gt; is special — instead of guessing, the agent can pause the turn, ask a structured clarifying question, and resume once you answer.&lt;/p&gt; 
 &lt;div align=&quot;center&quot;&gt; 
  &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/figs/system/chat-agent-loop.png&quot; alt=&quot;DeepTutor chat agent loop&quot; width=&quot;900&quot; /&gt; 
 &lt;/div&gt; 
 &lt;p&gt;User-toggleable tools are &lt;code&gt;brainstorm&lt;/code&gt;, &lt;code&gt;web_search&lt;/code&gt;, &lt;code&gt;paper_search&lt;/code&gt;, &lt;code&gt;reason&lt;/code&gt;, and &lt;code&gt;geogebra_analysis&lt;/code&gt; — plus &lt;code&gt;imagegen&lt;/code&gt; and &lt;code&gt;videogen&lt;/code&gt; once you configure the matching generation model. Contextual tools such as &lt;code&gt;rag&lt;/code&gt;, &lt;code&gt;kb_files&lt;/code&gt;, &lt;code&gt;read_source&lt;/code&gt;, &lt;code&gt;read_memory&lt;/code&gt;, &lt;code&gt;write_memory&lt;/code&gt;, &lt;code&gt;read_skill&lt;/code&gt;, &lt;code&gt;load_tools&lt;/code&gt;, &lt;code&gt;exec&lt;/code&gt;, &lt;code&gt;web_fetch&lt;/code&gt;, &lt;code&gt;ask_user&lt;/code&gt;, &lt;code&gt;list_notebook&lt;/code&gt;, &lt;code&gt;write_note&lt;/code&gt;, &lt;code&gt;github&lt;/code&gt;, and &lt;code&gt;consult_subagent&lt;/code&gt; mount automatically when the turn has the right context.&lt;/p&gt; 
 &lt;p&gt;Context comes in two kinds: &lt;strong&gt;sticky session context&lt;/strong&gt; (subagent, knowledge bases, persona, model, voice) lives on the composer toolbar and persists across turns; &lt;strong&gt;one-time references&lt;/strong&gt; (files, chat history, books, notebooks, question bank, imported agents) come from the &lt;code&gt;+&lt;/code&gt; menu for a single turn.&lt;/p&gt; 
 &lt;p&gt;Chat is also the launch point for deeper capabilities: &lt;strong&gt;Quiz&lt;/strong&gt; for question generation, &lt;strong&gt;Research&lt;/strong&gt; for cited reports, &lt;strong&gt;Visualize&lt;/strong&gt; for charts / diagrams / animations, and — under &lt;em&gt;More Capabilities&lt;/em&gt; — &lt;strong&gt;Solve&lt;/strong&gt; for worked reasoning and &lt;strong&gt;Mastery Path&lt;/strong&gt; for learning-plan flows.&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;🤝 Partner — Persistent Companions on the Same Brain&lt;/b&gt;&lt;/summary&gt; 
 &lt;div align=&quot;center&quot;&gt; 
  &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/figs/web-1.4.6+/partners/00-partners%20overview.png&quot; alt=&quot;DeepTutor partners workspace&quot; width=&quot;900&quot; /&gt; 
 &lt;/div&gt; 
 &lt;p&gt;Partners are persistent companions with their own soul, model policy, library, memory, and channels. They are not a separate bot engine: every inbound web or IM message becomes a normal &lt;code&gt;ChatOrchestrator&lt;/code&gt; turn inside a partner-scoped workspace. A partner is &quot;a chat that has a personality and a phone number.&quot;&lt;/p&gt; 
 &lt;div align=&quot;center&quot;&gt; 
  &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/figs/system/partners-architecture.png&quot; alt=&quot;DeepTutor partners architecture&quot; width=&quot;900&quot; /&gt; 
 &lt;/div&gt; 
 &lt;p&gt;Each partner has a &lt;code&gt;SOUL.md&lt;/code&gt;, model selection, channels, tool policy, and assigned library. Knowledge bases, skills, and notebooks are copied into &lt;code&gt;data/partners/&amp;lt;id&amp;gt;/workspace/&lt;/code&gt;, so the same RAG, skill, notebook, and memory tools work without special cases. A partner reads its owner&#39;s memory but writes only its own.&lt;/p&gt; 
 &lt;div align=&quot;center&quot;&gt; 
  &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/figs/web-1.4.6+/partners/02-IM%20config%20for%20each%20partner.png&quot; alt=&quot;Per-partner IM channel configuration&quot; width=&quot;900&quot; /&gt; 
 &lt;/div&gt; 
 &lt;p&gt;The channel layer is schema-driven and can connect to IM platforms such as Feishu, Telegram, Slack, Discord, DingTalk, QQ/NapCat, WeCom, WhatsApp, Zulip, Mattermost, Matrix, Mochat, and Microsoft Teams depending on installed extras and configured credentials. A partner can also be connected as a subagent and consulted from a normal chat turn — see &lt;strong&gt;My Agents&lt;/strong&gt; below.&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;🧑‍🚀 My Agents — Consult &amp;amp; Import Other Agents&lt;/b&gt;&lt;/summary&gt; 
 &lt;div align=&quot;center&quot;&gt; 
  &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/figs/web-1.4.6+/myagents/00-overview.png&quot; alt=&quot;DeepTutor My Agents workspace&quot; width=&quot;900&quot; /&gt; 
 &lt;/div&gt; 
 &lt;p&gt;My Agents turns other agents into context for DeepTutor, and does two distinct things. &lt;strong&gt;Connect a live agent&lt;/strong&gt; — a Claude Code, Codex, Gemini, Kimi, opencode, or MiMo Code CLI on your machine, or one of your Partners — and consult it from inside a chat turn: DeepTutor actually &lt;em&gt;runs&lt;/em&gt; the other agent and streams its work into the Activity panel via the &lt;code&gt;consult_subagent&lt;/code&gt; tool. Select it with the Agent chip (or type &lt;code&gt;@&lt;/code&gt;), and set how many rounds the consult may take.&lt;/p&gt; 
 &lt;div align=&quot;center&quot;&gt; 
  &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/figs/web-1.4.6+/home/08-subagent%20demo%20with%20claude%20code.png&quot; alt=&quot;Consulting a Claude Code subagent live&quot; width=&quot;900&quot; /&gt; 
 &lt;/div&gt; 
 &lt;p&gt;&lt;strong&gt;Import past conversations&lt;/strong&gt; — bring in your existing Claude Code and Codex history as named, searchable, resumable agents. Pick which days to import; refreshing re-syncs them. Reference an imported conversation from any chat turn via &lt;code&gt;+&lt;/code&gt; → My Agents, and DeepTutor reads it as a third-party transcript — it stays &lt;em&gt;their&lt;/em&gt; conversation, not DeepTutor&#39;s own voice.&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;✍️ Co-Writer — Selection-Aware Markdown Drafting&lt;/b&gt;&lt;/summary&gt; 
 &lt;div align=&quot;center&quot;&gt; 
  &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/figs/web-1.4.6+/co-writer/00-overview.png&quot; alt=&quot;DeepTutor Co-Writer workspace&quot; width=&quot;900&quot; /&gt; 
 &lt;/div&gt; 
 &lt;p&gt;Co-Writer is a split-view Markdown workspace for reports, tutorials, notes, and long-form learning artifacts. Documents autosave and render a live preview (KaTeX math, diagram fences), and can be saved back into notebooks when a draft becomes reusable context.&lt;/p&gt; 
 &lt;div align=&quot;center&quot;&gt; 
  &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/figs/web-1.4.6+/co-writer/01-edit%20panel.png&quot; alt=&quot;Co-Writer editor with live preview&quot; width=&quot;900&quot; /&gt; 
 &lt;/div&gt; 
 &lt;p&gt;Its defining idea is &lt;strong&gt;surgical editing&lt;/strong&gt;: select a span and ask DeepTutor to rewrite, expand, or shorten it. The edit agent can ground the change in a knowledge base or web evidence, keeps a trace of its tool calls, and shows every change as an accept/reject diff — so nothing lands until you approve it.&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;📖 Book — Living Books from Your Materials&lt;/b&gt;&lt;/summary&gt; 
 &lt;div align=&quot;center&quot;&gt; 
  &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/figs/web-1.4.6+/book/00-book_overview.png&quot; alt=&quot;DeepTutor book library&quot; width=&quot;900&quot; /&gt; 
 &lt;/div&gt; 
 &lt;p&gt;Book turns selected sources into an interactive &lt;strong&gt;living book&lt;/strong&gt; — not a static PDF, but a reading environment built from typed blocks. A book can start from knowledge bases, notebooks, question banks, or chat history; the creation flow proposes a chapter outline before content is generated, so you review the shape instead of accepting a blind one-shot output.&lt;/p&gt; 
 &lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/figs/web-1.4.6+/book/01-book-demo-quiz%20card.png&quot; alt=&quot;Book quiz block&quot; width=&quot;31%&quot; /&gt; &amp;nbsp; &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/figs/web-1.4.6+/book/02-book-demo-manim%20video.png&quot; alt=&quot;Book Manim animation block&quot; width=&quot;31%&quot; /&gt; &amp;nbsp; &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/figs/web-1.4.6+/book/03-book-demo%20interactive%20module.png&quot; alt=&quot;Book interactive widget block&quot; width=&quot;31%&quot; /&gt; &lt;/p&gt; 
 &lt;p&gt;Each chapter compiles into typed blocks — text, callouts, quizzes, flash cards, timelines, code, figures, interactive HTML, animations, concept graphs, deep dives, and user notes — and every page has its own Page Chat. Blocks are editable: insert, move, regenerate, or switch a block&#39;s type without rewriting the chapter. Maintenance commands such as &lt;code&gt;deeptutor book health&lt;/code&gt; and &lt;code&gt;deeptutor book refresh-fingerprints&lt;/code&gt; help detect when source knowledge has drifted from compiled pages.&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;📚 Knowledge Center — Multi-Engine RAG Libraries&lt;/b&gt;&lt;/summary&gt; 
 &lt;div align=&quot;center&quot;&gt; 
  &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/figs/web-1.4.6+/knowledge/00-overview.png&quot; alt=&quot;DeepTutor Knowledge Center&quot; width=&quot;900&quot; /&gt; 
 &lt;/div&gt; 
 &lt;p&gt;Knowledge bases are the document collections behind RAG — they ground Chat turns, Co-Writer edits, Book generation, and Partner conversations. What&#39;s distinctive is a &lt;strong&gt;choice of retrieval engines&lt;/strong&gt;: &lt;strong&gt;LlamaIndex&lt;/strong&gt; (the default, local vector + BM25), &lt;strong&gt;PageIndex&lt;/strong&gt; (hosted, reasoning retrieval with page-level citations), &lt;strong&gt;GraphRAG&lt;/strong&gt; and &lt;strong&gt;LightRAG&lt;/strong&gt; (knowledge-graph retrieval), &lt;strong&gt;LightRAG Server&lt;/strong&gt; (retrieval offloaded to an external LightRAG instance you connect over HTTP), &lt;strong&gt;Tencent IMA&lt;/strong&gt; (a library you curate in IMA, searched over its OpenAPI), or a linked &lt;strong&gt;Obsidian&lt;/strong&gt; vault the tutor reads and writes in place. Each KB is bound to one engine.&lt;/p&gt; 
 &lt;div align=&quot;center&quot;&gt; 
  &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/figs/web-1.4.6+/knowledge/01-create%20knowledge%20base.png&quot; alt=&quot;Create a knowledge base&quot; width=&quot;900&quot; /&gt; 
 &lt;/div&gt; 
 &lt;p&gt;Creating a KB, you either &lt;strong&gt;create new&lt;/strong&gt; (upload documents and build a fresh index) or &lt;strong&gt;link existing&lt;/strong&gt; (reuse an index built elsewhere, read in place with no re-index). Re-indexing writes a new flat &lt;code&gt;version-N&lt;/code&gt; directory and keeps prior ones, so a working index is never destroyed mid-rebuild. A single document can be removed even from an &lt;strong&gt;error&lt;/strong&gt;-state base — dropping a file that failed to parse without a full delete-and-rebuild. Document parsing — Text-only, MinerU, Docling, markitdown, or PyMuPDF4LLM — is chosen in &lt;strong&gt;Settings → Knowledge Base&lt;/strong&gt;, with local model downloads off by default. The CLI mirrors the lifecycle with &lt;code&gt;deeptutor kb list&lt;/code&gt;, &lt;code&gt;info&lt;/code&gt;, &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;add&lt;/code&gt;, &lt;code&gt;search&lt;/code&gt;, &lt;code&gt;set-default&lt;/code&gt;, and &lt;code&gt;delete&lt;/code&gt;.&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;🌐 Learning Space — Skills, Personas, and Reusable Context&lt;/b&gt;&lt;/summary&gt; 
 &lt;div align=&quot;center&quot;&gt; 
  &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/figs/web-1.4.6+/learning-space/00-overview.png&quot; alt=&quot;DeepTutor Learning Space hub&quot; width=&quot;900&quot; /&gt; 
 &lt;/div&gt; 
 &lt;p&gt;Learning Space is the library and personalization layer — where the things that persist live. &lt;strong&gt;Conversations &amp;amp; Materials&lt;/strong&gt; holds your chat history, notebooks, and a question bank (each saved question keeps your answer, the reference answer, and an explanation). &lt;strong&gt;Personalization&lt;/strong&gt; holds mastery paths, personas (behavior presets such as &lt;em&gt;peer&lt;/em&gt;, &lt;em&gt;research-assistant&lt;/em&gt;, &lt;em&gt;teacher&lt;/em&gt;), skills (&lt;code&gt;SKILL.md&lt;/code&gt; playbooks the model reads on demand), &lt;strong&gt;MCP Services&lt;/strong&gt; — a curated store of hosted MCP servers you install for yourself in one click, plus any remote server you configure by URL — and &lt;strong&gt;CLI Apps&lt;/strong&gt;, command-line tools from the &lt;a href=&quot;https://github.com/HKUDS/CLI-Anything&quot;&gt;CLI-Anything&lt;/a&gt; catalog that the chat agent calls directly, with each app&#39;s own usage guide loaded on demand. Everything here can be reused from Chat, Partners, Co-Writer, and Book.&lt;/p&gt; 
 &lt;div align=&quot;center&quot;&gt; 
  &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/figs/web-1.4.6+/learning-space/07-%20download%20skills%20from%20eduhub.png&quot; alt=&quot;Import skills from EduHub&quot; width=&quot;900&quot; /&gt; 
 &lt;/div&gt; 
 &lt;p&gt;You don&#39;t have to write every skill yourself — &lt;strong&gt;Import from EduHub&lt;/strong&gt; browses the community catalog and downloads a skill straight into your library through a security gate (see &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/#-ecosystem--eduhub--the-skills-community&quot;&gt;Ecosystem&lt;/a&gt;).&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;🧠 Memory — Inspectable Personalization&lt;/b&gt;&lt;/summary&gt; 
 &lt;div align=&quot;center&quot;&gt; 
  &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/figs/web-1.4.6+/memory/00-overview.png&quot; alt=&quot;DeepTutor memory overview&quot; width=&quot;900&quot; /&gt; 
 &lt;/div&gt; 
 &lt;p&gt;Memory is a file-backed, three-layer system you can read, curate, and audit — deliberately &lt;em&gt;not&lt;/em&gt; a hidden vector store. &lt;strong&gt;L1&lt;/strong&gt; is the workspace mirror plus an append-only event trace (&lt;code&gt;trace/&amp;lt;surface&amp;gt;/&amp;lt;date&amp;gt;.jsonl&lt;/code&gt;); &lt;strong&gt;L2&lt;/strong&gt; is per-surface curated facts (&lt;code&gt;L2/&amp;lt;surface&amp;gt;.md&lt;/code&gt;); &lt;strong&gt;L3&lt;/strong&gt; is cross-surface synthesis (&lt;code&gt;L3/&amp;lt;profile|recent|scope|preferences&amp;gt;.md&lt;/code&gt;). Because L2 cites L1 and L3 cites L2, nothing in your profile is unaccountable.&lt;/p&gt; 
 &lt;div align=&quot;center&quot;&gt; 
  &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/figs/web-1.4.6+/memory/01-3%20layer%20memory%20graph.png&quot; alt=&quot;DeepTutor memory graph&quot; width=&quot;900&quot; /&gt; 
 &lt;/div&gt; 
 &lt;p&gt;The Memory Graph shows the whole pyramid — L3 synthesis at the centre, L2 in the middle ring, L1 traces on the outside — so you can trace any synthesized claim back to the exact raw event behind it. Memory is tracked across &lt;code&gt;chat&lt;/code&gt;, &lt;code&gt;notebook&lt;/code&gt;, &lt;code&gt;quiz&lt;/code&gt;, &lt;code&gt;kb&lt;/code&gt;, &lt;code&gt;book&lt;/code&gt;, partner, and &lt;code&gt;cowriter&lt;/code&gt; surfaces; the consolidator&#39;s Update / Audit / Dedup budgets are tuned in &lt;strong&gt;Settings → Memory&lt;/strong&gt;.&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;⚙️ Settings — One Control Plane&lt;/b&gt;&lt;/summary&gt; 
 &lt;div align=&quot;center&quot;&gt; 
  &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/figs/web-1.4.6+/settings/00-setting%20overview.png&quot; alt=&quot;DeepTutor settings hub&quot; width=&quot;900&quot; /&gt; 
 &lt;/div&gt; 
 &lt;p&gt;Settings is the operational control plane, with a live status strip (backend health and resident memory across the process tree) and one card per area: &lt;strong&gt;Appearance&lt;/strong&gt; (theme, interface and model output language, code-block styling), &lt;strong&gt;Network&lt;/strong&gt; (API base, ports, CORS), &lt;strong&gt;Models&lt;/strong&gt; (LLM, Embedding, Search, Text-to-Speech, Speech-to-Text, Image Generation, Video Generation), &lt;strong&gt;Knowledge Base&lt;/strong&gt; (document parsing engine), &lt;strong&gt;Chat&lt;/strong&gt; (tools, per-capability parameters, attachment caps), &lt;strong&gt;Partners &amp;amp; Agents&lt;/strong&gt; (the subagents you can consult from a turn), and &lt;strong&gt;Memory&lt;/strong&gt; (the consolidator&#39;s budgets).&lt;/p&gt; 
 &lt;div align=&quot;center&quot;&gt; 
  &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/assets/figs/web-1.4.6+/settings/01-appearance%20settings.png&quot; alt=&quot;DeepTutor appearance settings and themes&quot; width=&quot;900&quot; /&gt; 
 &lt;/div&gt; 
 &lt;p&gt;Most sections use a draft-and-apply flow, so you can test a provider before committing it. Four themes ship in the box — Default, Cream, Dark, and Glass. Project-root &lt;code&gt;.env&lt;/code&gt; files are intentionally ignored; runtime configuration lives under &lt;code&gt;data/user/settings/*.json&lt;/code&gt; unless &lt;code&gt;DEEPTUTOR_HOME&lt;/code&gt; or &lt;code&gt;deeptutor start --home&lt;/code&gt; points the app elsewhere.&lt;/p&gt; 
 &lt;p&gt;&lt;strong&gt;OpenAI Codex OAuth (experimental).&lt;/strong&gt; Picking &lt;strong&gt;OpenAI Codex&lt;/strong&gt; under Models → LLM replaces the API-key fields with a browser sign-in that runs against your own ChatGPT plan, so no &lt;code&gt;OPENAI_API_KEY&lt;/code&gt; is needed. Tokens live only in &lt;code&gt;data/system/user-secrets/&amp;lt;owner&amp;gt;/private/openai-codex/&lt;/code&gt; — in the multi-container Compose deployment, outside every tree the exec sandbox can reach — and DeepTutor never reads or modifies your &lt;code&gt;~/.codex&lt;/code&gt; CLI login. The model list comes from that account&#39;s live catalog; signing in publishes the profile but only becomes the active model when no LLM is configured yet. Because a token authorizes one person&#39;s plan, the profile is not shareable through user grants — each account signs in for itself, ordinary users included: their card sits under Models → LLM, and the resulting models, catalog, and sign-out stay private to that account.&lt;/p&gt; 
 &lt;p&gt;Default local Docker and Podman deployments use separate loopback networks and need a temporary bridge during sign-in. Follow the &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/CONTAINERIZATION.md#temporary-local-codex-oauth-bridge&quot;&gt;temporary local Codex OAuth bridge guide&lt;/a&gt; for the exact Docker, Compose, Podman, and teardown commands.&lt;/p&gt; 
 &lt;p&gt;For a remote deployment, the browser&#39;s &lt;code&gt;localhost&lt;/code&gt; and the server&#39;s &lt;code&gt;localhost&lt;/code&gt; are different machines, so an ordinary reverse proxy alone cannot carry the browser&#39;s localhost callback to the server. Use an SSH tunnel as the callback bridge. The tunnel reaches the already-published Web port; Next.js rewrites only the exact callback path to the public callback broker, and the broker validates &lt;code&gt;state&lt;/code&gt; before routing to the original OAuth operation. The callback listener remains on the backend loopback, ports &lt;code&gt;1455&lt;/code&gt; and &lt;code&gt;1457&lt;/code&gt; are not published, and this path supports the default Docker bridge network.&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ssh -N -L 1455:127.0.0.1:3782 &amp;lt;ssh-user&amp;gt;@&amp;lt;server-host&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;If DeepTutor reports fallback callback port &lt;code&gt;1457&lt;/code&gt;, use:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ssh -N -L 1457:127.0.0.1:3782 &amp;lt;ssh-user&amp;gt;@&amp;lt;server-host&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;Run only the one command that matches the actual callback port; never run both. &lt;code&gt;3782&lt;/code&gt; is only the example Web port: it is the configured frontend/container port reported as &lt;code&gt;callback_forward_port&lt;/code&gt;. That value does not guarantee that the same port is listening on the SSH host&#39;s &lt;code&gt;127.0.0.1&lt;/code&gt;. If Docker or Podman publishes a different host port, or a reverse proxy listens on a different port, replace only the right-hand target port (&lt;code&gt;3782&lt;/code&gt; above) with the Web port actually listening on the SSH host&#39;s &lt;code&gt;127.0.0.1&lt;/code&gt;; keep the left-hand callback port as &lt;code&gt;1455&lt;/code&gt; or &lt;code&gt;1457&lt;/code&gt;. &lt;code&gt;&amp;lt;server-host&amp;gt;&lt;/code&gt; is the SSH host whose loopback owns that listening port. If the browser URL names a reverse proxy or load balancer, replace it with the correct SSH frontend host.&lt;/p&gt; 
 &lt;p&gt;The CLI prints the tunnel command and then immediately tries to open the browser. On a remote deployment, keep the authorization page open without completing it, establish the printed tunnel in another terminal, and only then continue authorization.&lt;/p&gt; 
 &lt;p&gt;Remote-topology detection has a localhost boundary. If Web itself is reached through an SSH or IDE localhost forward, the browser cannot tell that the server is remote. For the current Web operation, leave its authorization page unfinished, read &lt;code&gt;redirect_uri&lt;/code&gt; in that operation&#39;s authorize URL to identify callback port &lt;code&gt;1455&lt;/code&gt; or &lt;code&gt;1457&lt;/code&gt;, and create the second tunnel from that local port to the actual Web port. Alternatively, cancel that Web operation and start a new one with the CLI; the CLI output belongs to the new operation and must not be used for the existing Web operation. Quota errors and catalog failures are reported as-is and never fall back to a paid provider. This compatibility path is experimental: the upstream interface may change.&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;👥 Multi-User — Shared Deployments&lt;/b&gt; · optional auth, isolated per-user workspaces&lt;/summary&gt; 
 &lt;p&gt;Authentication is &lt;strong&gt;off by default&lt;/strong&gt; — DeepTutor runs single-user. Turn it on and one &lt;code&gt;data/&lt;/code&gt; tree hosts an admin workspace, isolated per-user workspaces, and partner workspaces side by side:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;data/
├── user/                    # Admin workspace + global settings
├── users/&amp;lt;uid&amp;gt;/             # Per-user scope: chat history, memory, notebooks, KBs
├── partners/&amp;lt;id&amp;gt;/workspace/ # Partner (synthetic-user) scope
├── cli-apps/                # Installed CLI apps, mounted read-only into the sandbox
└── system/                  # auth · grants · audit · user-secrets/&amp;lt;owner&amp;gt; (OAuth tokens)
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;The &lt;strong&gt;first registered user becomes admin&lt;/strong&gt; and owns model catalogs, provider credentials, shared knowledge bases, skills, and per-user grants. Everyone else gets an isolated workspace and a redacted Settings page — admin-assigned models, KBs, and skills show up as scoped, read-only options, never as raw API keys.&lt;/p&gt; 
 &lt;p&gt;&lt;strong&gt;Enable it:&lt;/strong&gt; turn auth on in &lt;code&gt;data/user/settings/auth.json&lt;/code&gt;, restart &lt;code&gt;deeptutor start&lt;/code&gt;, register the first admin at &lt;code&gt;/register&lt;/code&gt;, then add users from &lt;code&gt;/admin/users&lt;/code&gt; and assign models, KBs, skills, partners, tool/MCP/CLI-app policy, and code-execution access through grants.&lt;/p&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;PocketBase stays a single-user integration — keep &lt;code&gt;integrations.pocketbase_url&lt;/code&gt; blank for multi-user deployments unless you&#39;ve wired up an external user store.&lt;/p&gt; 
 &lt;/blockquote&gt; 
&lt;/details&gt; 
&lt;h2&gt;⌨️ DeepTutor CLI — Agent-Native Interface&lt;/h2&gt; 
&lt;p&gt;One &lt;code&gt;deeptutor&lt;/code&gt; binary, two ways in: an interactive &lt;strong&gt;REPL&lt;/strong&gt; for people who live in the terminal, and structured &lt;strong&gt;JSON&lt;/strong&gt; for other agents that drive DeepTutor as a tool. Same capabilities, tools, and knowledge bases either way.&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;Drive it yourself&lt;/b&gt;&lt;/summary&gt; 
 &lt;p&gt;&lt;code&gt;deeptutor chat&lt;/code&gt; opens an interactive REPL; &lt;code&gt;deeptutor run &amp;lt;capability&amp;gt; &quot;&amp;lt;message&amp;gt;&quot;&lt;/code&gt; fires a single turn and exits. Both speak the same &lt;code&gt;--capability&lt;/code&gt;, &lt;code&gt;--tool&lt;/code&gt;, &lt;code&gt;--kb&lt;/code&gt;, and &lt;code&gt;--config&lt;/code&gt; flags.&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;deeptutor chat                                              # interactive REPL
deeptutor chat --capability deep_solve --kb my-kb --tool rag
deeptutor run chat &quot;Explain the Fourier transform&quot; --tool rag --kb textbook
deeptutor run deep_research &quot;Survey 2026 papers on RAG&quot; \
  --config mode=report --config depth=standard
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;Everything the Web app does is here too — knowledge bases (&lt;code&gt;kb&lt;/code&gt;), sessions (&lt;code&gt;session&lt;/code&gt;), partners (&lt;code&gt;partner&lt;/code&gt;), skills (&lt;code&gt;skill&lt;/code&gt;), notebooks, memory, and config. Full list below.&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;Let an agent drive it&lt;/b&gt;&lt;/summary&gt; 
 &lt;p&gt;DeepTutor is built to be &lt;em&gt;operated by another agent&lt;/em&gt;. Add &lt;code&gt;--format json&lt;/code&gt; to any &lt;code&gt;run&lt;/code&gt; and each turn streams &lt;strong&gt;NDJSON — one event per line&lt;/strong&gt; (&lt;code&gt;content&lt;/code&gt;, &lt;code&gt;tool_call&lt;/code&gt;, &lt;code&gt;tool_result&lt;/code&gt;, &lt;code&gt;done&lt;/code&gt;, …), every line tagged with its &lt;code&gt;session_id&lt;/code&gt;. Runs are headless-safe: an &lt;code&gt;ask_user&lt;/code&gt; pause with no TTY auto-resolves with an empty reply instead of hanging.&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# One shot, machine-readable
deeptutor run deep_solve &quot;Find d/dx[sin(x^2)]&quot; --tool reason --format json

# Chain turns in one stateful session — capture the id, reuse it
SID=$(deeptutor run deep_research &quot;Survey 2026 papers on RAG&quot; \
  --config mode=report --config depth=standard --format json \
  | jq -r &#39;select(.type==&quot;done&quot;).session_id&#39;)
deeptutor run deep_question &quot;Quiz me on that survey&quot; --session &quot;$SID&quot; --format json
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;The repo ships a root &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/SKILL.md&quot;&gt;&lt;code&gt;SKILL.md&lt;/code&gt;&lt;/a&gt; — a ~150-line handover doc that teaches any tool-using LLM the whole surface in one read. Hand it to Claude Code, Codex, or OpenCode (they pick up &lt;code&gt;SKILL.md&lt;/code&gt; automatically), or wrap &lt;code&gt;deeptutor run&lt;/code&gt; as a tool in a LangChain / AutoGen loop. Full recipes: &lt;a href=&quot;https://deeptutor.info/docs/cli/agent-handoff/&quot;&gt;Agent Handoff&lt;/a&gt;.&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;Command reference&lt;/b&gt;&lt;/summary&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th style=&quot;text-align:left&quot;&gt;Command&lt;/th&gt; 
    &lt;th style=&quot;text-align:left&quot;&gt;Description&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;deeptutor init&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;Create or update &lt;code&gt;data/user/settings&lt;/code&gt; for the current workspace&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;deeptutor start [--home PATH] [--dev]&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;Launch backend + frontend together; &lt;code&gt;--dev&lt;/code&gt; enables frontend HMR&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;deeptutor serve [--port PORT]&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;Start only the FastAPI backend&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;deeptutor run &amp;lt;capability&amp;gt; &amp;lt;message&amp;gt;&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;Run a single capability turn (&lt;code&gt;chat&lt;/code&gt;, &lt;code&gt;deep_solve&lt;/code&gt;, &lt;code&gt;deep_question&lt;/code&gt;, &lt;code&gt;deep_research&lt;/code&gt;, &lt;code&gt;visualize&lt;/code&gt;, &lt;code&gt;math_animator&lt;/code&gt;, &lt;code&gt;mastery_path&lt;/code&gt;); add &lt;code&gt;--format json&lt;/code&gt; for NDJSON output&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;deeptutor chat&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;Interactive REPL with capability, tool, KB, notebook, and history controls&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;deeptutor partner list/create/start/stop&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;Manage IM-connected partners&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;deeptutor kb list/info/create/add/search/set-default/delete&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;Manage LlamaIndex knowledge bases&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;deeptutor skill search/install/list/remove/login/logout/publish/update&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;Manage skills, install from hubs, and publish your own (&lt;code&gt;eduhub:&amp;lt;slug&amp;gt;&lt;/code&gt; by default, see Ecosystem)&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;deeptutor memory show/clear&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;Inspect L2/L3 memory docs or clear L1/all memory&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;deeptutor session list/show/open/rename/delete&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;Manage shared sessions&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;deeptutor notebook list/create/show/add-md/replace-md/remove-record&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;Manage notebooks from Markdown files&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;deeptutor book list/health/refresh-fingerprints&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;Inspect books and refresh source fingerprints&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;deeptutor plugin list/info&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;Inspect registered tools and capabilities&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;deeptutor config show&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;Print configuration summary&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;deeptutor provider login &amp;lt;provider&amp;gt;&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:left&quot;&gt;Provider auth (&lt;code&gt;openai-codex&lt;/code&gt; OAuth login; &lt;code&gt;github-copilot&lt;/code&gt; validates an existing Copilot auth session)&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;CLI-only distribution&lt;/b&gt;&lt;/summary&gt; 
 &lt;p&gt;The CLI-only package lives in &lt;code&gt;packaging/deeptutor-cli&lt;/code&gt;. In this checkout, install it from source:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;python -m pip install -e ./packaging/deeptutor-cli
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;It isn&#39;t published to PyPI yet, so the main &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/#-get-started&quot;&gt;Get Started&lt;/a&gt; section keeps the source-install path.&lt;/p&gt; 
&lt;/details&gt; 
&lt;h2&gt;🧩 Ecosystem — EduHub &amp;amp; the Skills Community&lt;/h2&gt; 
&lt;p&gt;DeepTutor skills use the open &lt;strong&gt;Agent-Skills&lt;/strong&gt; format — a folder with a &lt;code&gt;SKILL.md&lt;/code&gt; playbook (YAML frontmatter + Markdown) and optional reference files. Nothing about it is DeepTutor-specific, so any registry that speaks the format becomes a source for your library. DeepTutor ships with &lt;strong&gt;&lt;a href=&quot;https://eduhub.deeptutor.info/&quot;&gt;EduHub&lt;/a&gt;&lt;/strong&gt; — our own education-focused skill registry — wired in as the default hub.&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;EduHub — DeepTutor&#39;s skill ecosystem&lt;/b&gt;&lt;/summary&gt; 
 &lt;p&gt;&lt;a href=&quot;https://eduhub.deeptutor.info/&quot;&gt;&lt;strong&gt;EduHub&lt;/strong&gt;&lt;/a&gt; is the community hub DeepTutor launched for sharing teaching-oriented agent skills — Socratic tutors, flashcard builders, essay feedback, exam blueprints, concept explainers, and more. It is built into DeepTutor, so there&#39;s nothing to configure: a bare slug or an &lt;code&gt;eduhub:&lt;/code&gt; prefix resolves to it.&lt;/p&gt; 
 &lt;p&gt;&lt;strong&gt;Find and install&lt;/strong&gt; — in the browser, open &lt;strong&gt;Learning Space → Skills → Import from EduHub&lt;/strong&gt; to browse the catalog and download a skill straight into your library. From the terminal:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;deeptutor skill search &quot;socratic tutor&quot;               # search EduHub (the default hub)
deeptutor skill install socratic-tutor                # fetch → verify → register
deeptutor skill install eduhub:socratic-tutor@1.2.0   # pin a hub and a version
deeptutor skill list                                  # local skills with their hub provenance
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;&lt;strong&gt;Publish your own&lt;/strong&gt; — package a &lt;code&gt;SKILL.md&lt;/code&gt; and share it back to the community:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;deeptutor skill login                                 # browser sign-in to EduHub
deeptutor skill publish ./my-skill                    # interactive: pick a track + tags, then upload
deeptutor skill update                                # roll back or release a new version
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;EduHub is also a standalone, ClawHub-compatible registry, so agents that aren&#39;t DeepTutor (Claude Code, Codex, …) can use it directly through the &lt;code&gt;eduhub&lt;/code&gt; CLI — &lt;code&gt;npx eduhub install socratic-tutor&lt;/code&gt;.&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;The import safety gate&lt;/b&gt;&lt;/summary&gt; 
 &lt;p&gt;Whatever the source, every import passes the &lt;strong&gt;same safety gate&lt;/strong&gt; before anything touches your workspace:&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;the registry&#39;s &lt;strong&gt;security verdict&lt;/strong&gt; is checked first — flagged packages are refused unless you pass &lt;code&gt;--allow-unverified&lt;/code&gt;;&lt;/li&gt; 
  &lt;li&gt;archives are extracted defensively (zip-slip / zip-bomb guards) behind a text/script &lt;strong&gt;suffix whitelist&lt;/strong&gt;, so binaries never land in the workspace;&lt;/li&gt; 
  &lt;li&gt;frontmatter is normalized to DeepTutor&#39;s schema and &lt;code&gt;always:&lt;/code&gt; is &lt;strong&gt;stripped&lt;/strong&gt;, so a downloaded skill can never force itself into every system prompt;&lt;/li&gt; 
  &lt;li&gt;provenance — hub, version, verdict, and install time — is written to &lt;code&gt;.hub-lock.json&lt;/code&gt; for audits and updates.&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;In multi-user deployments, installing is admin-only: a new skill lands in the admin catalog and stays invisible to other users until a grant assigns it, so an admin can vet it before rolling it out.&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;Also compatible with ClawHub&lt;/b&gt;&lt;/summary&gt; 
 &lt;p&gt;Because DeepTutor speaks the open Agent-Skills format, &lt;strong&gt;&lt;a href=&quot;https://clawhub.ai/&quot;&gt;ClawHub&lt;/a&gt;&lt;/strong&gt; works as a first-class source too — it&#39;s built in alongside EduHub. Pick it with the hub prefix:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;deeptutor skill search &quot;git release notes&quot; --hub clawhub
deeptutor skill install clawhub:git-release-notes@1.0.1
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;Add more registries in &lt;code&gt;settings/skill_hubs.json&lt;/code&gt;: a &lt;code&gt;type: &quot;clawhub&quot;&lt;/code&gt; entry points at any compatible HTTP API (EduHub and ClawHub both speak it), &lt;code&gt;type: &quot;command&quot;&lt;/code&gt; wraps whatever fetch CLI a registry ships, and &lt;code&gt;&quot;default&quot;&lt;/code&gt; chooses the hub used for bare slugs. All of them feed the same import gate.&lt;/p&gt; 
&lt;/details&gt; 
&lt;h2&gt;🌐 Community&lt;/h2&gt; 
&lt;h3&gt;📮 Contact&lt;/h3&gt; 
&lt;p&gt;DeepTutor is an open-source project led by &lt;a href=&quot;https://github.com/pancacake&quot;&gt;Bingxi Zhao&lt;/a&gt; within the &lt;a href=&quot;https://github.com/HKUDS&quot;&gt;HKUDS&lt;/a&gt; Group, and it iterates in a &lt;strong&gt;fully open-source form&lt;/strong&gt;, built together with the community. So far, we &lt;strong&gt;DO NOT&lt;/strong&gt; have paid online products of any form. Feel free to reach out at &lt;strong&gt;&lt;a href=&quot;mailto:bingxizhao39@gmail.com&quot;&gt;bingxizhao39@gmail.com&lt;/a&gt;&lt;/strong&gt; for discussions, ideas, or collaboration.&lt;/p&gt; 
&lt;h3&gt;🙏 Appreciation&lt;/h3&gt; 
&lt;p&gt;Heartfelt thanks to &lt;a href=&quot;https://sites.google.com/view/chaoh&quot;&gt;&lt;strong&gt;Chao Huang&lt;/strong&gt;&lt;/a&gt;, director of the Data Intelligence Lab @ HKU, and to our HKUDS labmates for their warm support — especially &lt;a href=&quot;https://github.com/zzhtx258&quot;&gt;&lt;strong&gt;Jiahao Zhang&lt;/strong&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/LarFii&quot;&gt;&lt;strong&gt;Zirui Guo&lt;/strong&gt;&lt;/a&gt;, and &lt;a href=&quot;https://github.com/Re-bin&quot;&gt;&lt;strong&gt;Xubin Ren&lt;/strong&gt;&lt;/a&gt;. We&#39;re also deeply grateful to the &lt;strong&gt;open-source community&lt;/strong&gt;: your stars, issues, pull requests, and discussions shape DeepTutor every single day.&lt;/p&gt; 
&lt;p&gt;DeepTutor also stands on the shoulders of outstanding open-source projects that gave us both tools and inspiration:&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Project&lt;/th&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Role / Inspiration&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/run-llama/llama_index&quot;&gt;&lt;strong&gt;LlamaIndex&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;RAG pipeline and document-indexing backbone&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/HKUDS/nanobot&quot;&gt;&lt;strong&gt;nanobot&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Ultra-lightweight agent engine that powered the original TutorBot &lt;em&gt;(HKUDS)&lt;/em&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/HKUDS/LightRAG&quot;&gt;&lt;strong&gt;LightRAG&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Simple &amp;amp; fast RAG &lt;em&gt;(HKUDS)&lt;/em&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/HKUDS/AutoAgent&quot;&gt;&lt;strong&gt;AutoAgent&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Zero-code agent framework &lt;em&gt;(HKUDS)&lt;/em&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/HKUDS/AI-Researcher&quot;&gt;&lt;strong&gt;AI-Researcher&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Automated research pipeline &lt;em&gt;(HKUDS)&lt;/em&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/openclaw/openclaw&quot;&gt;&lt;strong&gt;OpenClaw&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Open agent gateway and skill ecosystem behind ClawHub&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/openai/codex&quot;&gt;&lt;strong&gt;Codex&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Agent-native coding CLI that inspired our CLI workflow&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/anthropics/claude-code&quot;&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Agentic coding CLI that inspired the DeepTutor agent loop&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/Wing900/ManimCat&quot;&gt;&lt;strong&gt;ManimCat&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;AI-driven math animation generation for Math Animator&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h3&gt;🗺️ Roadmap &amp;amp; Contribute&lt;/h3&gt; 
&lt;p&gt;We want DeepTutor to keep iterating and improving — and ultimately to become a gift we give back to the open-source community. Our &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/issues/498&quot;&gt;&lt;strong&gt;roadmap&lt;/strong&gt;&lt;/a&gt; is updated continuously; vote on items there or propose new ones. If you&#39;d like to contribute, see the &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/CONTRIBUTING.md&quot;&gt;&lt;strong&gt;Contributing Guide&lt;/strong&gt;&lt;/a&gt; for branching strategy, coding standards, and how to get started.&lt;/p&gt; 
&lt;div align=&quot;center&quot;&gt; 
 &lt;p&gt;We hope DeepTutor becomes a gift for the community. 🎁&lt;/p&gt; 
 &lt;a href=&quot;https://github.com/HKUDS/DeepTutor/graphs/contributors&quot;&gt; &lt;img src=&quot;https://contrib.rocks/image?repo=HKUDS/DeepTutor&amp;amp;max=999&quot; alt=&quot;Contributors&quot; /&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://www.star-history.com/hkuds/deeptutor&quot;&gt; 
  &lt;picture&gt; 
   &lt;source media=&quot;(prefers-color-scheme: dark)&quot; srcset=&quot;https://api.star-history.com/badge?repo=HKUDS/DeepTutor&amp;amp;theme=dark&quot; /&gt; 
   &lt;source media=&quot;(prefers-color-scheme: light)&quot; srcset=&quot;https://api.star-history.com/badge?repo=HKUDS/DeepTutor&quot; /&gt; 
   &lt;img alt=&quot;Star History Rank&quot; src=&quot;https://api.star-history.com/badge?repo=HKUDS/DeepTutor&quot; /&gt; 
  &lt;/picture&gt; &lt;/a&gt; &lt;/p&gt; 
&lt;div align=&quot;center&quot;&gt; 
 &lt;p&gt;Licensed under the &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/DeepTutor/main/LICENSE&quot;&gt;Apache License 2.0&lt;/a&gt;.&lt;/p&gt; 
 &lt;p&gt; &lt;img src=&quot;https://visitor-badge.laobi.icu/badge?page_id=HKUDS.DeepTutor&amp;amp;style=for-the-badge&amp;amp;color=00d4ff&quot; alt=&quot;Views&quot; /&gt; &lt;/p&gt; 
&lt;/div&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/dae330e4523a81e6abf177085b09fb27988a32ece3cf9ef9ed567275a9c88c8c/HKUDS/DeepTutor" medium="image" />
      
    </item>
    
    <item>
      <title>Shubhamsaboo/awesome-llm-apps</title>
      <link>https://github.com/Shubhamsaboo/awesome-llm-apps</link>
      <description>&lt;p&gt;100+ AI Agents, Agent Skills and RAG Apps - Free and Open Source.&lt;/p&gt;&lt;hr&gt;&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;http://www.theunwindai.com&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/docs/banner/unwind_black.png&quot; width=&quot;900px&quot; alt=&quot;Unwind AI&quot; /&gt; &lt;/a&gt; &lt;/p&gt; 
&lt;div align=&quot;center&quot;&gt; 
 &lt;h1&gt;Awesome LLM Apps&lt;/h1&gt; 
 &lt;p&gt;&lt;strong&gt;100+ open-source AI agents, agent skills, and RAG apps. Hand-built, tested end-to-end, Apache-2.0.&lt;/strong&gt;&lt;/p&gt; 
 &lt;p&gt;Clone it, ship it, sell it - 100% free and open-source&lt;/p&gt; 
 &lt;p&gt;Works with Claude, Gemini, GPT, DeepSeek, Llama, Qwen and other open-source models.&lt;/p&gt; 
 &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.theunwindai.com&quot;&gt;Step-by-step tutorials on Unwind AI&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/#-run-one-now&quot;&gt;Quick start&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/#-browse-all-templates&quot;&gt;Browse all templates&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; 
 &lt;a href=&quot;https://trendshift.io/repositories/9876&quot; target=&quot;_blank&quot;&gt; &lt;img src=&quot;https://trendshift.io/api/badge/repositories/9876&quot; width=&quot;220&quot; alt=&quot;Featured on Trendshift as the #1 repository of the day&quot; /&gt; &lt;/a&gt; 
 &lt;br /&gt; 
&lt;/div&gt; 
&lt;table&gt; 
 &lt;tbody&gt;
  &lt;tr&gt; 
   &lt;td width=&quot;33.3%&quot; align=&quot;center&quot;&gt; &lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/agent_skills/project-graveyard/&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/docs/gallery/project-graveyard.png&quot; alt=&quot;Project Graveyard: an agent that autopsies your dead side projects&quot; /&gt;&lt;/a&gt; &lt;sub&gt;&lt;b&gt;Project Graveyard&lt;/b&gt;&lt;/sub&gt; &lt;/td&gt; 
   &lt;td width=&quot;33.3%&quot; align=&quot;center&quot;&gt; &lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/voice_ai_agents/insurance_claim_live_agent_team/&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/docs/gallery/insurance-claim-live-team.png&quot; alt=&quot;Insurance Claim Live Agent Team: voice claims settled in real time&quot; /&gt;&lt;/a&gt; &lt;sub&gt;&lt;b&gt;Insurance Claim Live Agent Team&lt;/b&gt;&lt;/sub&gt; &lt;/td&gt; 
   &lt;td width=&quot;33.3%&quot; align=&quot;center&quot;&gt; &lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/single_agent_apps/ai_fraud_investigation_agent/&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/docs/gallery/ai-fraud-investigation.png&quot; alt=&quot;AI Fraud Investigation Agent: public records, cross-examined&quot; /&gt;&lt;/a&gt; &lt;sub&gt;&lt;b&gt;AI Fraud Investigation Agent&lt;/b&gt;&lt;/sub&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot;&gt; &lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/agent_skills/self-improving-agent-skills/&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/docs/gallery/self-improving-agent-skills.png&quot; alt=&quot;Self-Improving Agent Skills: skills that rewrite themselves against evals&quot; /&gt;&lt;/a&gt; &lt;sub&gt;&lt;b&gt;Self-Improving Agent Skills&lt;/b&gt;&lt;/sub&gt; &lt;/td&gt; 
   &lt;td align=&quot;center&quot;&gt; &lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/multi_agent_apps/ai_home_renovation_agent&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/docs/gallery/ai-home-renovation.png&quot; alt=&quot;AI Home Renovation Agent: photo in, photoreal redesign out&quot; /&gt;&lt;/a&gt; &lt;sub&gt;&lt;b&gt;AI Home Renovation Agent&lt;/b&gt;&lt;/sub&gt; &lt;/td&gt; 
   &lt;td align=&quot;center&quot;&gt; &lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/always_on_agents/always_on_hn_briefing_agent/&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/docs/gallery/always-on-hn-briefing.png&quot; alt=&quot;Always-on HN Briefing Agent: it reads Hacker News while you sleep&quot; /&gt;&lt;/a&gt; &lt;sub&gt;&lt;b&gt;Always-on HN Briefing Agent&lt;/b&gt;&lt;/sub&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt;
&lt;/table&gt; 
&lt;h2&gt;🚀 Run one now&lt;/h2&gt; 
&lt;p&gt;Give your coding agent a new skill in 10 seconds:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npx skills add https://github.com/Shubhamsaboo/awesome-llm-apps/tree/main/agent_skills/project-graveyard
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Then ask it: &lt;em&gt;&quot;why do I never finish my side projects?&quot;&lt;/em&gt;&lt;/p&gt; 
&lt;p&gt;Or clone and run any agent in 30 seconds:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/Shubhamsaboo/awesome-llm-apps.git
cd awesome-llm-apps/starter_ai_agents/ai_travel_agent
pip install -r requirements.txt
streamlit run travel_agent.py
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;📬 New templates drop weekly. &lt;a href=&quot;https://www.theunwindai.com&quot;&gt;Get them in your inbox on Unwind AI&lt;/a&gt;.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h2&gt;📂 Browse all templates&lt;/h2&gt; 
&lt;h3&gt;🧩 Agent Skills&lt;/h3&gt; 
&lt;p&gt;&lt;em&gt;Give your coding agent new abilities. One command to install, plain English to use. Every skill ships real code and passes a security + eval CI gate. Works with Claude Code, Codex, Cursor, and other coding agents. &lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/agent_skills/&quot;&gt;Browse all skills →&lt;/a&gt;&lt;/em&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/agent_skills/project-graveyard/&quot;&gt;⚰️ Project Graveyard&lt;/a&gt; - Finds every side project you abandoned, tells you why each one died, and helps you finish the one worth going back to&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/agent_skills/scope-creep-detector/&quot;&gt;🔭 Scope Creep Detector&lt;/a&gt; - Checks whether a diff grew beyond its stated intent and recommends what to keep, split, or justify&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/agent_skills/commit-archaeologist/&quot;&gt;🏺 Commit Archaeologist&lt;/a&gt; - Reconstructs why a file or code region exists from its introducing commit, later edits, co-changes, and intent clues&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/agent_skills/dependency-doctor/&quot;&gt;🩺 Dependency Doctor&lt;/a&gt; - Checks a dependency manifest for standard-library pins, obsolete backports, unpinned entries, duplicate constraints, and yanked releases&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/agent_skills/advisor-orchestrator-worker/&quot;&gt;🧠 Advisor Orchestrator Worker&lt;/a&gt; - Meta Loop with Claude Fable 5 as advisor, GPT-5.6 as orchestrator, and Gemini 3.5 Flash as worker&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/agent_skills/self-improving-agent-skills/&quot;&gt;♾️ Self-Improving Agent Skills&lt;/a&gt; - Automatically optimize agent skills using Gemini and ADK&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;🌱 Starter AI Agents&lt;/h3&gt; 
&lt;p&gt;&lt;em&gt;Single-file agents that run with just an API key - a great place to start.&lt;/em&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/starter_ai_agents/ai_blog_to_podcast_agent/&quot;&gt;🎙️ AI Blog to Podcast Agent&lt;/a&gt; - Turn any blog URL into a narrated podcast episode&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/starter_ai_agents/ai_breakup_recovery_agent/&quot;&gt;❤️‍🩹 AI Breakup Recovery Agent&lt;/a&gt; - An agent team that talks you through the post-breakup spiral&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/starter_ai_agents/ai_data_analysis_agent/&quot;&gt;📊 AI Data Analysis Agent&lt;/a&gt; - Ask questions of any CSV or Excel file in plain English&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/starter_ai_agents/ai_medical_imaging_agent/&quot;&gt;🩻 AI Medical Imaging Agent&lt;/a&gt; - Diagnostic analysis of X-rays and scans with Gemini&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/starter_ai_agents/ai_meme_generator_agent_browseruse/&quot;&gt;😂 AI Meme Generator Agent (Browser)&lt;/a&gt; - Makes memes by driving a real browser, not an image API&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/starter_ai_agents/ai_music_generator_agent/&quot;&gt;🎵 AI Music Generator Agent&lt;/a&gt; - Prompt in, MP3 track out&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/starter_ai_agents/ai_travel_agent/&quot;&gt;🛫 AI Travel Agent (Local &amp;amp; Cloud)&lt;/a&gt; - Personalized day-by-day travel itineraries&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/starter_ai_agents/multimodal_ai_agent/&quot;&gt;✨ Gemini Multimodal Agent&lt;/a&gt; - Video analysis plus web search in one agent&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/starter_ai_agents/mixture_of_agents/&quot;&gt;🔄 Mixture of Agents&lt;/a&gt; - Multiple LLMs answer, one aggregates the best response&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/starter_ai_agents/xai_finance_agent/&quot;&gt;📊 xAI Finance Agent&lt;/a&gt; - Real-time stock analysis powered by Grok&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/starter_ai_agents/openai_research_agent/&quot;&gt;🔍 OpenAI Research Agent&lt;/a&gt; - Multi-agent topic research with the OpenAI Agents SDK&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/starter_ai_agents/web_scraping_ai_agent/&quot;&gt;🕸️ Web Scraping AI Agent&lt;/a&gt; - Describe what to extract and the agent scrapes it&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;🚀 Advanced AI Agents&lt;/h3&gt; 
&lt;p&gt;&lt;em&gt;Production-style agents with tools, memory, and multi-step reasoning.&lt;/em&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/multi_agent_apps/ai_home_renovation_agent&quot;&gt;🏚️ 🍌 AI Home Renovation Agent with Nano Banana Pro&lt;/a&gt; - Photos of your space in, renovation plan and photorealistic renders out&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/multi_agent_apps/devpulse_ai/&quot;&gt;🧠 DevPulse AI - Multi-Agent Signal Intelligence&lt;/a&gt; - Aggregates and scores technical signals into a daily intelligence digest&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/single_agent_apps/ai_deep_research_agent/&quot;&gt;🔍 AI Deep Research Agent&lt;/a&gt; - Comprehensive web research with the OpenAI Agents SDK and Firecrawl&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/multi_agent_apps/agent_teams/ai_vc_due_diligence_agent_team&quot;&gt;📊 AI VC Due Diligence Agent Team&lt;/a&gt; - Multi-agent startup investment analysis with Gemini 3&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/single_agent_apps/research_agent_gemini_interaction_api&quot;&gt;🔬 AI Research Planner &amp;amp; Executor (Google Interactions API)&lt;/a&gt; - Multi-phase research with stateful conversations and auto-generated infographics&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/single_agent_apps/ai_consultant_agent&quot;&gt;🤝 AI Consultant Agent&lt;/a&gt; - Market analysis and strategy recommendations with live web research&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/single_agent_apps/ai_system_architect_r1/&quot;&gt;🏗️ AI System Architect Agent&lt;/a&gt; - Architecture reviews using DeepSeek R1 reasoning plus Claude&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/multi_agent_apps/ai_financial_coach_agent/&quot;&gt;💰 AI Financial Coach Agent&lt;/a&gt; - Personalized budget, debt, and savings analysis&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/single_agent_apps/ai_movie_production_agent/&quot;&gt;🎬 AI Movie Production Agent&lt;/a&gt; - Script drafts and casting ideas from a one-line movie concept&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/single_agent_apps/ai_investment_agent/&quot;&gt;📈 AI Investment Agent&lt;/a&gt; - Stock comparison reports built on Yahoo Finance data&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/single_agent_apps/earnings_call_analyst_agent/&quot;&gt;📡 Earnings Call Analyst Agent&lt;/a&gt; - Turns YouTube earnings calls into a playback-synced analyst workspace&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/single_agent_apps/ai_health_fitness_agent/&quot;&gt;🏋️‍♂️ AI Health &amp;amp; Fitness Agent&lt;/a&gt; - Tailored diet and workout plans from your goals&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/multi_agent_apps/product_launch_intelligence_agent&quot;&gt;🚀 AI Product Launch Intelligence Agent&lt;/a&gt; - Go-to-market intelligence on competitor launches&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/single_agent_apps/ai_fraud_investigation_agent/&quot;&gt;🔍 AI Fraud Investigation Agent&lt;/a&gt; - Cross-references public records to flag facilities that don&#39;t add up&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/single_agent_apps/ai_journalist_agent/&quot;&gt;🗞️ AI Journalist Agent&lt;/a&gt; - Researches, writes, and edits articles on any topic&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/multi_agent_apps/ai_mental_wellbeing_agent/&quot;&gt;🧠 AI Mental Wellbeing Agent&lt;/a&gt; - A coordinated agent team for mental health support plans&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/single_agent_apps/ai_meeting_agent/&quot;&gt;📑 AI Meeting Agent&lt;/a&gt; - Context, industry insights, and strategy briefs before you walk in&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/multi_agent_apps/ai_self_evolving_agent/&quot;&gt;🧬 AI Self-Evolving Agent&lt;/a&gt; - Agents that rewrite their own workflows with EvoAgentX&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/multi_agent_apps/agent_teams/ai_sales_intelligence_agent_team&quot;&gt;👨🏻‍💼 AI Sales Intelligence Agent Team&lt;/a&gt; - Generates competitive sales battle cards in real time&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/multi_agent_apps/ai_news_and_podcast_agents/&quot;&gt;🎧 AI Social Media News and Podcast Agent&lt;/a&gt; - Curates your trusted sources into briefs and generated podcasts&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/accomplish-ai/openwork&quot;&gt;🌐 Openwork - Open Browser Automation Agent&lt;/a&gt; &lt;sub&gt;↗ external&lt;/sub&gt; - Open-source agent that operates a real browser&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/multi_agent_apps/trust_gated_agent_team/&quot;&gt;🛡️ Trust-Gated Multi-Agent Research Team&lt;/a&gt; - Every agent verified, every action in a hash-chained audit trail&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;🛰️ Always-on Agents&lt;/h3&gt; 
&lt;p&gt;&lt;em&gt;Background agents that run on schedules or events, monitor changing context, decide what needs attention, and proactively deliver updates, artifacts, or actions.&lt;/em&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/always_on_agents/always_on_hn_briefing_agent/&quot;&gt;📰 Always-on Hacker News Briefing Agent&lt;/a&gt; - A scheduled scout that ships a ranked daily brief to Slack or email&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/always_on_agents/release_radar_agent/&quot;&gt;📡 Release Radar Agent&lt;/a&gt; - Watches dependency releases and briefs you on breaking, deprecated, security, and major-version changes&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;🤝 Multi-agent Teams&lt;/h3&gt; 
&lt;p&gt;&lt;em&gt;Multiple agents collaborating to accomplish complex, cross-domain tasks.&lt;/em&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/multi_agent_apps/agent_teams/ai_competitor_intelligence_agent_team/&quot;&gt;🧲 AI Competitor Intelligence Agent Team&lt;/a&gt; - Structured competitor teardowns built from their own websites&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/multi_agent_apps/agent_teams/ai_finance_agent_team/&quot;&gt;💲 AI Finance Agent Team&lt;/a&gt; - A financial analyst team in 20 lines of Python&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/multi_agent_apps/agent_teams/ai_game_design_agent_team/&quot;&gt;🎨 AI Game Design Agent Team&lt;/a&gt; - Full game concepts from a swarm of design specialists&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/multi_agent_apps/agent_teams/ag2_adaptive_research_team/&quot;&gt;🧭 AG2 Adaptive Research Team&lt;/a&gt; - Agent teamwork with routing and fallback, built on AG2&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/multi_agent_apps/agent_teams/ai_legal_agent_team/&quot;&gt;👨‍⚖️ AI Legal Agent Team (Cloud &amp;amp; Local)&lt;/a&gt; - Research, contract analysis, and strategy from a full legal bench&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/multi_agent_apps/agent_teams/ai_recruitment_agent_team/&quot;&gt;💼 AI Recruitment Agent Team&lt;/a&gt; - Resume screening to interview scheduling, end to end&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/multi_agent_apps/agent_teams/ai_real_estate_agent_team&quot;&gt;🏠 AI Real Estate Agent Team&lt;/a&gt; - Property search, market analysis, and recommendations&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/multi_agent_apps/agent_teams/ai_services_agency/&quot;&gt;👨‍💼 AI Services Agency (CrewAI)&lt;/a&gt; - A digital agency that scopes and plans your software project&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/multi_agent_apps/agent_teams/ai_teaching_agent_team/&quot;&gt;👨‍🏫 AI Teaching Agent Team&lt;/a&gt; - A faculty of agents that builds your complete learning path&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/multi_agent_apps/agent_teams/multimodal_coding_agent_team/&quot;&gt;💻 Multimodal Coding Agent Team&lt;/a&gt; - Snap a photo of a coding problem, get a sandboxed solution&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/multi_agent_apps/agent_teams/multimodal_design_agent_team/&quot;&gt;✨ Multimodal Design Agent Team&lt;/a&gt; - Design critiques from a Gemini-powered expert panel&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/multi_agent_apps/agent_teams/multimodal_uiux_feedback_agent_team/&quot;&gt;🎨 🍌 Multimodal UI/UX Feedback Agent Team&lt;/a&gt; - Landing page feedback plus an auto-generated improved version&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/multi_agent_apps/agent_teams/ai_travel_planner_agent_team/&quot;&gt;🌏 AI Travel Planner Agent Team&lt;/a&gt; - A complete trip itinerary, crafted by a team&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;🗣️ Voice AI Agents&lt;/h3&gt; 
&lt;p&gt;&lt;em&gt;Speech-in, speech-out agents using real-time voice APIs.&lt;/em&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/voice_ai_agents/ai_audio_tour_agent/&quot;&gt;🗣️ AI Audio Tour Agent&lt;/a&gt; - Self-guided audio tours from your location, interests, and pace&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/voice_ai_agents/customer_support_voice_agent/&quot;&gt;📞 Customer Support Voice Agent&lt;/a&gt; - Voice answers grounded in your own docs&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/voice_ai_agents/insurance_claim_live_agent_team/&quot;&gt;🛡️ Insurance Claim Live Agent Team&lt;/a&gt; - Real-time voice claim intake with Gemini Live&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/voice_ai_agents/voice_rag_openaisdk/&quot;&gt;🔊 Voice RAG Agent (OpenAI SDK)&lt;/a&gt; - Ask your PDFs questions, hear the answers&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/akshayaggarwal99/jarvis-ai-assistant&quot;&gt;🎙️ OpenSource Voice Dictation Agent (Wispr Flow clone)&lt;/a&gt; &lt;sub&gt;↗ external&lt;/sub&gt; - Open-source dictation that types where you talk&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;🖼️ Generative UI and Agentic Frontends&lt;/h3&gt; 
&lt;p&gt;&lt;em&gt;Agents that render interactive UI components, not just text: forms, cards, charts, editable plans.&lt;/em&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/generative_ui_agents/generative-ui-starter-project/&quot;&gt;🗂️ Generative UI Starter Project&lt;/a&gt; - A chat-driven kanban board you and the agent work together&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/generative_ui_agents/ai-financial-coach-agent/&quot;&gt;🪙 AI Financial Coach Agent&lt;/a&gt; - Budget, savings, and debt plans rendered as interactive cards&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/generative_ui_agents/ai-dashboard-canvas-agent/&quot;&gt;📊 AI Dashboard Canvas Agent&lt;/a&gt; - Describe a dashboard in chat, charts assemble on a live canvas&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/generative_ui_agents/ai-mcp-app-builder/&quot;&gt;🛠️ AI MCP App Builder&lt;/a&gt; - Describe an MCP app, get a live sandboxed instance back&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/generative_ui_agents/mcp-apps-generative-ui-showcase/&quot;&gt;✈️ MCP Apps Generative UI Showcase&lt;/a&gt; - MCP apps that render real interactive UI, flight search included&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/generative_ui_agents/ai-shadcn-component-generator/&quot;&gt;🎛️ AI Shadcn Component Generator&lt;/a&gt; - Chat your way to production-ready shadcn components&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/generative_ui_agents/ai-deep-research-agent/&quot;&gt;🔍 AI Deep Research Agent&lt;/a&gt; - Research where every tool call renders as a live workspace card&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;🎮 Autonomous Game-Playing Agents&lt;/h3&gt; 
&lt;p&gt;&lt;em&gt;Agents that play games end-to-end: reasoning, strategy, and action.&lt;/em&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/autonomous_game_playing_agent_apps/ai_3dpygame_r1/&quot;&gt;🎮 AI 3D Pygame Agent&lt;/a&gt; - DeepSeek R1 writes PyGame code, browser agents run it live&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/autonomous_game_playing_agent_apps/ai_chess_agent/&quot;&gt;♜ AI Chess Agent&lt;/a&gt; - Agent White vs Agent Black with validated moves&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_ai_agents/autonomous_game_playing_agent_apps/ai_tic_tac_toe_agent/&quot;&gt;🎲 AI Tic-Tac-Toe Agent&lt;/a&gt; - Two different LLMs battle it out, move by move&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;♾️ MCP AI Agents&lt;/h3&gt; 
&lt;p&gt;&lt;em&gt;Agents that connect to external tools and data via Model Context Protocol.&lt;/em&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/mcp_ai_agents/browser_mcp_agent/&quot;&gt;♾️ Browser MCP Agent&lt;/a&gt; - Drive a real browser with natural language over MCP&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/mcp_ai_agents/github_mcp_agent/&quot;&gt;🐙 GitHub MCP Agent&lt;/a&gt; - Explore and analyze any repo in plain English&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/mcp_ai_agents/notion_mcp_agent&quot;&gt;📑 Notion MCP Agent&lt;/a&gt; - Talk to your Notion pages from the terminal&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/mcp_ai_agents/ai_travel_planner_mcp_agent_team&quot;&gt;🌍 AI Travel Planner MCP Agent&lt;/a&gt; - Itineraries built on live Airbnb and Google Maps data&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/mcp_ai_agents/multi_mcp_agent_router/&quot;&gt;🔀 Multi-MCP Agent Router&lt;/a&gt; - Specialist agents, each wired to its own MCP server&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;📀 RAG (Retrieval Augmented Generation)&lt;/h3&gt; 
&lt;p&gt;&lt;em&gt;Retrieval pipelines, from simple chains to agentic and multi-source.&lt;/em&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/rag_tutorials/agentic_rag_embedding_gemma&quot;&gt;🔥 Agentic RAG with Embedding Gemma&lt;/a&gt; - Fully local agentic RAG with EmbeddingGemma and Llama 3.2&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/rag_tutorials/agentic_rag_with_reasoning/&quot;&gt;🧐 Agentic RAG with Reasoning&lt;/a&gt; - Watch the agent&#39;s step-by-step reasoning as it retrieves&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/rag_tutorials/ai_blog_search/&quot;&gt;📰 AI Blog Search (RAG)&lt;/a&gt; - Agentic search over blog content, built on LangGraph&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/rag_tutorials/autonomous_rag/&quot;&gt;🔍 Autonomous RAG&lt;/a&gt; - GPT-4o answers from your PDFs, falls back to web search&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/rag_tutorials/contextualai_rag_agent/&quot;&gt;🔄 Contextual AI RAG Agent&lt;/a&gt; - Managed RAG: datastore to grounded chat in minutes&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/rag_tutorials/corrective_rag/&quot;&gt;🔄 Corrective RAG (CRAG)&lt;/a&gt; - Retrieval that grades itself and retries before answering&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/rag_tutorials/agentic_typed_rag_pydanticai/&quot;&gt;📎 Typed Agentic RAG with Pydantic AI&lt;/a&gt; - Validated answers with exact citations, or a refusal when evidence is weak&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/rag_tutorials/deepseek_local_rag_agent/&quot;&gt;🐋 Deepseek Local RAG Agent&lt;/a&gt; - Local DeepSeek reasoning over your own documents&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/rag_tutorials/gemini_agentic_rag/&quot;&gt;🤔 Gemini Agentic RAG&lt;/a&gt; - Query rewriting and web fallback with Gemini Flash Thinking&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/rag_tutorials/hybrid_search_rag/&quot;&gt;👀 Hybrid Search RAG (Cloud)&lt;/a&gt; - Keyword plus vector search feeding Claude&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/rag_tutorials/llama3.1_local_rag/&quot;&gt;🔄 Llama 3.1 Local RAG&lt;/a&gt; - Chat with any webpage, fully offline&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/rag_tutorials/local_hybrid_search_rag/&quot;&gt;🖥️ Local Hybrid Search RAG&lt;/a&gt; - Hybrid search with everything running on your machine&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/rag_tutorials/multimodal_agentic_rag/&quot;&gt;🧬 Multimodal Agentic RAG&lt;/a&gt; - Text, PDFs, images, audio, and video, answered with citations&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/rag_tutorials/local_rag_agent/&quot;&gt;🦙 Local RAG Agent&lt;/a&gt; - Llama 3.2 and Qdrant, no API keys required&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/rag_tutorials/rag-as-a-service/&quot;&gt;🧩 RAG-as-a-Service&lt;/a&gt; - A production RAG service in under 50 lines&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/rag_tutorials/rag_agent_cohere/&quot;&gt;✨ RAG Agent with Cohere&lt;/a&gt; - Command R7B retrieval with web-search fallback&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/rag_tutorials/rag_chain/&quot;&gt;⛓️ Basic RAG Chain&lt;/a&gt; - The minimal retrieval pipeline, applied to pharma research&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/rag_tutorials/rag_database_routing/&quot;&gt;📠 RAG with Database Routing&lt;/a&gt; - Routes each question to the right database automatically&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/rag_tutorials/vision_rag/&quot;&gt;🖼️ Vision RAG&lt;/a&gt; - Ask questions about images and PDF pages with Embed-4&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/rag_tutorials/rag_failure_diagnostics_clinic/&quot;&gt;🩺 RAG Failure Diagnostics Clinic&lt;/a&gt; - Find out why your RAG pipeline is wrong, systematically&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/rag_tutorials/knowledge_graph_rag_citations/&quot;&gt;🕸️ Knowledge Graph RAG with Citations&lt;/a&gt; - Multi-hop answers with verifiable source attribution&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;💾 LLM Apps with Memory&lt;/h3&gt; 
&lt;p&gt;&lt;em&gt;Agents and chatbots that remember conversations and user state across sessions.&lt;/em&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_llm_apps/llm_apps_with_memory_tutorials/ai_arxiv_agent_memory/&quot;&gt;💾 AI ArXiv Agent with Memory&lt;/a&gt; - Paper search that remembers your research interests&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_llm_apps/llm_apps_with_memory_tutorials/ai_travel_agent_memory/&quot;&gt;🛩️ AI Travel Agent with Memory&lt;/a&gt; - A travel assistant that remembers your preferences&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_llm_apps/llm_apps_with_memory_tutorials/llama3_stateful_chat/&quot;&gt;💬 Llama3 Stateful Chat&lt;/a&gt; - Session-persistent chat with Llama 3&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_llm_apps/llm_apps_with_memory_tutorials/llm_app_personalized_memory/&quot;&gt;📝 LLM App with Personalized Memory&lt;/a&gt; - A chatbot that keeps context across conversations&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_llm_apps/llm_apps_with_memory_tutorials/local_chatgpt_with_memory/&quot;&gt;🗄️ Local ChatGPT Clone with Memory&lt;/a&gt; - Fully local, with a personal memory per user&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_llm_apps/llm_apps_with_memory_tutorials/multi_llm_memory/&quot;&gt;🧠 Multi-LLM Application with Shared Memory&lt;/a&gt; - Different models, one shared conversation memory&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;💬 Chat with X&lt;/h3&gt; 
&lt;p&gt;&lt;em&gt;Turn any data source into a chat interface.&lt;/em&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_llm_apps/chat_with_X_tutorials/chat_with_github/&quot;&gt;💬 Chat with GitHub (GPT &amp;amp; Llama3)&lt;/a&gt; - Any repo, answered in 30 lines of RAG&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_llm_apps/chat_with_X_tutorials/chat_with_gmail/&quot;&gt;📨 Chat with Gmail&lt;/a&gt; - Ask your inbox questions&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_llm_apps/chat_with_X_tutorials/chat_with_pdf/&quot;&gt;📄 Chat with PDF (GPT &amp;amp; Llama3)&lt;/a&gt; - The classic, in 30 lines of Python&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_llm_apps/chat_with_X_tutorials/chat_with_research_papers/&quot;&gt;📚 Chat with Research Papers (ArXiv) (GPT &amp;amp; Llama3)&lt;/a&gt; - Explore arXiv conversationally with GPT-4o&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_llm_apps/chat_with_X_tutorials/chat_with_substack/&quot;&gt;📝 Chat with Substack&lt;/a&gt; - Chat with any newsletter&#39;s archive&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_llm_apps/chat_with_X_tutorials/chat_with_youtube_videos/&quot;&gt;📽️ Chat with YouTube Videos&lt;/a&gt; - Ask videos questions via their transcripts&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;🎯 LLM Optimization Tools&lt;/h3&gt; 
&lt;p&gt;&lt;em&gt;Reduce token usage, context size, and API cost without losing quality.&lt;/em&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_llm_apps/llm_optimization_tools/toonify_token_optimization/&quot;&gt;🎯 Toonify Token Optimization&lt;/a&gt; - Reduce LLM API costs by 30-60% using TOON format&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_llm_apps/llm_optimization_tools/headroom_context_optimization/&quot;&gt;🧠 Headroom Context Optimization&lt;/a&gt; - Reduce LLM API costs by 50-90%&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;🔧 LLM Fine-tuning&lt;/h3&gt; 
&lt;p&gt;&lt;em&gt;End-to-end fine-tuning recipes for open-source models.&lt;/em&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_llm_apps/llm_finetuning_tutorials/gemma3_finetuning/&quot;&gt;🦥 Gemma 3 Fine-tuning&lt;/a&gt; - 4-bit LoRA with Unsloth, small and readable&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/advanced_llm_apps/llm_finetuning_tutorials/llama3.2_finetuning/&quot;&gt;🦙 Llama 3.2 Fine-tuning&lt;/a&gt; - Fine-tune in 30 lines, free on Colab&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;🧑‍🏫 AI Agent Framework Crash Courses&lt;/h3&gt; 
&lt;p&gt;&lt;em&gt;Deep-dive tutorials on the major agent frameworks.&lt;/em&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/ai_agent_framework_crash_course/google_adk_crash_course/&quot;&gt;Google ADK Crash Course&lt;/a&gt; - Starter agent, structured outputs, tools (built-in, function, third-party, MCP), memory, callbacks, plugins, and multi-agent patterns. Model-agnostic.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/ai_agent_framework_crash_course/openai_sdk_crash_course/&quot;&gt;OpenAI Agents SDK Crash Course&lt;/a&gt; - Starter agent, function calling, structured outputs, tools, memory, evaluation, handoffs, swarm orchestration, and routing logic.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;hr /&gt; 
&lt;div align=&quot;center&quot;&gt; 
 &lt;p&gt;⭐ &lt;strong&gt;&lt;a href=&quot;https://github.com/Shubhamsaboo/awesome-llm-apps/stargazers&quot;&gt;Star the repo&lt;/a&gt;&lt;/strong&gt; to get notified when new templates drop.&lt;/p&gt; 
 &lt;sub&gt; 
  &lt;!-- Keep these links. Translations will automatically update with the README. --&gt; &lt;a href=&quot;https://www.readme-i18n.com/Shubhamsaboo/awesome-llm-apps?lang=de&quot;&gt;Deutsch&lt;/a&gt; · &lt;a href=&quot;https://www.readme-i18n.com/Shubhamsaboo/awesome-llm-apps?lang=es&quot;&gt;Español&lt;/a&gt; · &lt;a href=&quot;https://www.readme-i18n.com/Shubhamsaboo/awesome-llm-apps?lang=fr&quot;&gt;français&lt;/a&gt; · &lt;a href=&quot;https://www.readme-i18n.com/Shubhamsaboo/awesome-llm-apps?lang=ja&quot;&gt;日本語&lt;/a&gt; · &lt;a href=&quot;https://www.readme-i18n.com/Shubhamsaboo/awesome-llm-apps?lang=ko&quot;&gt;한국어&lt;/a&gt; · &lt;a href=&quot;https://www.readme-i18n.com/Shubhamsaboo/awesome-llm-apps?lang=pt&quot;&gt;Português&lt;/a&gt; · &lt;a href=&quot;https://www.readme-i18n.com/Shubhamsaboo/awesome-llm-apps?lang=ru&quot;&gt;Русский&lt;/a&gt; · &lt;a href=&quot;https://www.readme-i18n.com/Shubhamsaboo/awesome-llm-apps?lang=zh&quot;&gt;中文&lt;/a&gt; &lt;/sub&gt; 
 &lt;p&gt;&lt;sub&gt;Apache-2.0 · See &lt;a href=&quot;https://raw.githubusercontent.com/Shubhamsaboo/awesome-llm-apps/main/LICENSE&quot;&gt;LICENSE&lt;/a&gt; · Fork it, ship it, sell it.&lt;/sub&gt;&lt;/p&gt; 
&lt;/div&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/2ba1b4a731b638830b6d6c916a59e65a3b8d3a3a9aefe622f9a371b73970526b/Shubhamsaboo/awesome-llm-apps" medium="image" />
      
    </item>
    
    <item>
      <title>tirth8205/code-review-graph</title>
      <link>https://github.com/tirth8205/code-review-graph</link>
      <description>&lt;p&gt;Local-first code intelligence graph for MCP and CLI. Builds a persistent map of your codebase so AI coding tools read only what matters, with benchmarked context reductions on reviews and large-repo workflows.&lt;/p&gt;&lt;hr&gt;&lt;h1 align=&quot;center&quot;&gt;code-review-graph&lt;/h1&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://trendshift.io/repositories/23329?utm_source=repository-badge&amp;amp;utm_medium=badge&amp;amp;utm_campaign=badge-repository-23329&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt; &lt;img src=&quot;https://trendshift.io/api/badge/repositories/23329&quot; alt=&quot;tirth8205%2Fcode-review-graph | Trendshift&quot; width=&quot;250&quot; height=&quot;55&quot; /&gt; &lt;/a&gt; &lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;strong&gt;Stop burning tokens. Start reviewing smarter.&lt;/strong&gt; &lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/README.md&quot;&gt;English&lt;/a&gt; | &lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/README.zh-CN.md&quot;&gt;简体中文&lt;/a&gt; | &lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/README.ja-JP.md&quot;&gt;日本語&lt;/a&gt; | &lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/README.ko-KR.md&quot;&gt;한국어&lt;/a&gt; | &lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/README.hi-IN.md&quot;&gt;हिन्दी&lt;/a&gt; &lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://pypi.org/project/code-review-graph/&quot;&gt;&lt;img src=&quot;https://img.shields.io/pypi/v/code-review-graph?style=flat-square&amp;amp;color=blue&quot; alt=&quot;PyPI&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://pepy.tech/project/code-review-graph&quot;&gt;&lt;img src=&quot;https://img.shields.io/pepy/dt/code-review-graph?style=flat-square&quot; alt=&quot;Downloads&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/tirth8205/code-review-graph/stargazers&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/tirth8205/code-review-graph?style=flat-square&quot; alt=&quot;Stars&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://opensource.org/licenses/MIT&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square&quot; alt=&quot;MIT Licence&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/tirth8205/code-review-graph/actions/workflows/ci.yml&quot;&gt;&lt;img src=&quot;https://github.com/tirth8205/code-review-graph/actions/workflows/ci.yml/badge.svg?sanitize=true&quot; alt=&quot;CI&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.python.org/&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/python-3.10%2B-blue.svg?style=flat-square&quot; alt=&quot;Python 3.10+&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://modelcontextprotocol.io/&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/MCP-compatible-green.svg?style=flat-square&quot; alt=&quot;MCP&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://code-review-graph.com&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/website-code--review--graph.com-blue?style=flat-square&quot; alt=&quot;Website&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://discord.gg/3p58KXqGFN&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/discord-join-5865F2?style=flat-square&amp;amp;logo=discord&amp;amp;logoColor=white&quot; alt=&quot;Discord&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/docs/USAGE.md&quot;&gt;Usage&lt;/a&gt; · &lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/docs/COMMANDS.md&quot;&gt;Commands&lt;/a&gt; · &lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/docs/FAQ.md&quot;&gt;FAQ&lt;/a&gt; · &lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/docs/TROUBLESHOOTING.md&quot;&gt;Troubleshooting&lt;/a&gt; · &lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/docs/GITHUB_ACTION.md&quot;&gt;GitHub Action&lt;/a&gt; · &lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/docs/REPRODUCING.md&quot;&gt;Reproducing the benchmarks&lt;/a&gt; · &lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/docs/ROADMAP.md&quot;&gt;Roadmap&lt;/a&gt; &lt;/p&gt; 
&lt;br /&gt; 
&lt;p&gt;AI coding tools can end up re-reading large parts of your codebase on review tasks. &lt;code&gt;code-review-graph&lt;/code&gt; fixes that. It builds a structural map of your code with &lt;a href=&quot;https://tree-sitter.github.io/tree-sitter/&quot;&gt;Tree-sitter&lt;/a&gt;, tracks changes incrementally, and gives your AI assistant precise context via &lt;a href=&quot;https://modelcontextprotocol.io/&quot;&gt;MCP&lt;/a&gt; so it reads only what matters.&lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/diagrams/diagram1_before_vs_after.png&quot; alt=&quot;The Token Problem: reading flask&#39;s whole corpus costs 143,594 tokens, a graph answer costs 2,196 — 71.0x fewer&quot; width=&quot;85%&quot; /&gt; &lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Quick Start&lt;/h2&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install code-review-graph                     # or: pipx install code-review-graph
code-review-graph install          # auto-detects and configures all supported platforms
code-review-graph build            # parse your codebase
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;One command sets up everything. &lt;code&gt;install&lt;/code&gt; detects which AI coding tools you have, writes the correct MCP configuration for each one, installs platform-native hooks/skills where supported, and injects graph-aware instructions into your platform rules. It auto-detects whether you installed via &lt;code&gt;uvx&lt;/code&gt; or &lt;code&gt;pip&lt;/code&gt;/&lt;code&gt;pipx&lt;/code&gt; and generates the right config. Restart your editor/tool after installing.&lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/diagrams/diagram8_supported_platforms.png&quot; alt=&quot;One Install, Every Platform: auto-detects Codex, Claude Code, CodeBuddy Code, Cursor, Windsurf, Zed, Continue, OpenCode, Antigravity, Gemini CLI, Qwen, Qoder, Kiro, GitHub Copilot, and GitHub Copilot CLI&quot; width=&quot;85%&quot; /&gt; &lt;/p&gt; 
&lt;p&gt;To target a specific platform:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;code-review-graph install --platform codex       # configure only Codex
code-review-graph install --platform cursor      # configure only Cursor
code-review-graph install --platform claude-code  # configure only Claude Code
code-review-graph install --platform gemini-cli   # configure only Gemini CLI
code-review-graph install --platform antigravity   # configure only Antigravity
code-review-graph install --platform windsurf     # configure only Windsurf
code-review-graph install --platform zed          # configure only Zed
code-review-graph install --platform continue     # configure only Continue
code-review-graph install --platform opencode     # configure only OpenCode
code-review-graph install --platform qwen         # configure only Qwen
code-review-graph install --platform qoder        # configure only Qoder
code-review-graph install --platform kiro         # configure only Kiro
code-review-graph install --platform copilot      # configure only GitHub Copilot (VS Code)
code-review-graph install --platform copilot-cli  # configure only GitHub Copilot CLI
code-review-graph install --platform codebuddy    # configure only CodeBuddy Code
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Requires Python 3.10+. For the best experience, install &lt;a href=&quot;https://docs.astral.sh/uv/&quot;&gt;uv&lt;/a&gt; (the MCP config will use &lt;code&gt;uvx&lt;/code&gt; if available, otherwise falls back to the &lt;code&gt;code-review-graph&lt;/code&gt; command directly).&lt;/p&gt; 
&lt;p&gt;To remove CRG from a Git or SVN project, use the symmetric uninstall command from anywhere inside its working tree. The target is normalized to the working tree root, and non-repository directories are refused. It removes only CRG-owned files and entries; unrelated MCP servers, hooks, skills, and JSONC comments remain untouched. Shared configuration changes use atomic replacement so a failed write leaves the original file intact.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;code-review-graph uninstall --dry-run    # preview every action; write nothing
code-review-graph uninstall              # preview, ask for confirmation, then apply
code-review-graph uninstall --yes        # apply without prompting
code-review-graph uninstall --all-repos  # also clean every registered repository
code-review-graph uninstall --keep-data  # remove integrations but keep graph databases
code-review-graph uninstall --keep-user-configs --repo .  # clean this project only
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Then open your project and ask your AI assistant:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Build the code review graph for this project
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The initial build takes ~10 seconds for a 500-file project. After that, watch mode and supported hooks can keep the graph updated automatically.&lt;/p&gt; 
&lt;h2&gt;How It Works&lt;/h2&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/diagrams/diagram7_mcp_integration_flow.png&quot; alt=&quot;How your AI assistant uses the graph: User asks for review, AI checks MCP tools, graph returns blast radius and risk scores, AI reads only what matters&quot; width=&quot;80%&quot; /&gt; &lt;/p&gt; 
&lt;p&gt;Your repository is parsed into an AST with Tree-sitter, stored as a graph of nodes (functions, classes, imports) and edges (calls, inheritance, test coverage), then queried at review time to compute the minimal set of files your AI assistant needs to read.&lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/diagrams/diagram2_architecture_pipeline.png&quot; alt=&quot;Architecture pipeline: Repository to Tree-sitter Parser to SQLite Graph to Blast Radius to Minimal Review Set&quot; width=&quot;100%&quot; /&gt; &lt;/p&gt; 
&lt;h3&gt;Blast-radius analysis&lt;/h3&gt; 
&lt;p&gt;When a file changes, the graph traces every caller, dependent, and test that could be affected. This is the &quot;blast radius&quot; of the change. Your AI reads only these files instead of scanning the whole project.&lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/diagrams/diagram3_blast_radius.png&quot; alt=&quot;Blast radius visualization showing how a change to login() propagates to callers, dependents, and tests&quot; width=&quot;70%&quot; /&gt; &lt;/p&gt; 
&lt;h3&gt;Incremental updates in seconds&lt;/h3&gt; 
&lt;p&gt;When hooks or watch mode are enabled, file saves and supported commit hooks trigger incremental updates. The graph diffs changed files, finds their dependents through the graph&#39;s own import and call edges, and re-parses only the files whose SHA-256 hash actually changed. On a ~3,000-file project (django) a two-file edit re-indexes in about 2.5 seconds on the path the hooks use, of which ~1.4 s is process start-up; a no-op update costs only that start-up. See &lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/docs/REPRODUCING.md#incremental-update-latency&quot;&gt;Incremental update latency&lt;/a&gt; for the full measurement.&lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/diagrams/diagram4_incremental_update.png&quot; alt=&quot;Incremental update flow: a supported hook or watch update triggers a git diff, dependents are found through graph edges, and only files whose SHA-256 hash changed are re-parsed&quot; width=&quot;90%&quot; /&gt; &lt;/p&gt; 
&lt;h3&gt;Whole codebase or targeted answer?&lt;/h3&gt; 
&lt;p&gt;The bigger the repository, the more token waste hurts. Instead of feeding a whole corpus to the model, the graph returns an answer-shaped slice of it: on this repository, 208,821 source tokens become ~3,190 tokens per question.&lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/diagrams/diagram6_monorepo_funnel.png&quot; alt=&quot;code-review-graph repo: 208,821 source tokens funnel down to ~3,190 token graph responses — 68x fewer tokens per question&quot; width=&quot;80%&quot; /&gt; &lt;/p&gt; 
&lt;h3&gt;Broad language coverage + Jupyter notebooks&lt;/h3&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/diagrams/diagram9_language_coverage.png&quot; alt=&quot;Language coverage organized by category: Web, Backend, Systems, Mobile, Scripting, Shells, Domain, and Other, plus Jupyter and Databricks notebook support&quot; width=&quot;90%&quot; /&gt; &lt;/p&gt; 
&lt;p&gt;Parser support covers functions, classes, imports, call sites, inheritance, and test detection across the current parser surface, using Tree-sitter where available and targeted fallbacks where needed. Current support includes Python, JavaScript/TypeScript/TSX, Go, Rust, Java, C/C++, C#, &lt;a href=&quot;http://VB.NET&quot;&gt;VB.NET&lt;/a&gt;, Ruby, Kotlin, Swift, PHP, Scala, Solidity, Dart, R, Perl, Lua/Luau, Objective-C, shell scripts, Elixir, Zig, PowerShell, Julia, ReScript, GDScript, Nix, Verilog/SystemVerilog, SQL, Terraform/OpenTofu structure (&lt;code&gt;.tf&lt;/code&gt;; generic &lt;code&gt;.hcl&lt;/code&gt; files are recognized as file nodes), Ansible playbooks/roles/tasks, Vue/Svelte SFCs, Astro files parsed through the TypeScript parser, Jupyter/Databricks notebooks (&lt;code&gt;.ipynb&lt;/code&gt;), and Perl XS files (&lt;code&gt;.xs&lt;/code&gt;). Generic YAML is not treated as source code.&lt;/p&gt; 
&lt;p&gt;PHP projects additionally get repository-bounded Composer PSR-4 resolution, Blade template references, and Laravel Route/Eloquent semantic edges when the source includes explicit framework imports, model inheritance, and receiver evidence.&lt;/p&gt; 
&lt;h3&gt;Add your own language (no fork needed)&lt;/h3&gt; 
&lt;p&gt;If your repo uses a language the parser does not cover yet, drop a &lt;code&gt;languages.toml&lt;/code&gt; into &lt;code&gt;.code-review-graph/&lt;/code&gt; mapping file extensions to any grammar bundled in &lt;code&gt;tree_sitter_language_pack&lt;/code&gt;, plus the tree-sitter node types for functions, classes, imports, and calls:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;[languages.erlang]
extensions = [&quot;.erl&quot;]
grammar = &quot;erlang&quot;
function_node_types = [&quot;function_clause&quot;]
class_node_types = [&quot;record_decl&quot;]
import_node_types = [&quot;import_attribute&quot;]
call_node_types = [&quot;call&quot;]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The generic tree-sitter walker handles extraction from there — no code changes, and built-in languages can never be overridden. See &lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/docs/CUSTOM_LANGUAGES.md&quot;&gt;docs/CUSTOM_LANGUAGES.md&lt;/a&gt; for the schema reference, validation rules, and a worked end-to-end example.&lt;/p&gt; 
&lt;h3&gt;Risk-scored PR reviews in CI (GitHub Action)&lt;/h3&gt; 
&lt;p&gt;The same analysis runs as a composite GitHub Action — and it stays local-first: the knowledge graph is built and queried entirely on your CI runner, with no source code sent to any external service. On each pull request the action posts a single sticky comment with risk-scored functions, affected execution flows, and test gaps, updated in place on every push. An optional &lt;code&gt;fail-on-risk&lt;/code&gt; input turns the review into a merge gate.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# .github/workflows/code-review-graph.yml
on:
  pull_request:

permissions:
  contents: read
  pull-requests: write

jobs:
  review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
      - uses: tirth8205/code-review-graph@v2.3.6
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;See &lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/docs/GITHUB_ACTION.md&quot;&gt;docs/GITHUB_ACTION.md&lt;/a&gt; for inputs, risk levels, and caching details, or the dogfood workflow this repo runs on itself in &lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/.github/workflows/pr-review.yml&quot;&gt;&lt;code&gt;.github/workflows/pr-review.yml&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Benchmarks&lt;/h2&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/diagrams/diagram5_benchmark_board.png&quot; alt=&quot;Benchmarks across 6 real repositories: ~65x median per-question token reduction (376x max), 0.69 average impact F1 against graph-derived ground truth&quot; width=&quot;85%&quot; /&gt; &lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Headline number: the median per-question token reduction across the 6 repos is ~65x&lt;/strong&gt; (whole-corpus baseline vs graph query). The &lt;strong&gt;376x maximum&lt;/strong&gt; is a single best-case repo (fastapi, the largest corpus) — not the typical result.&lt;/p&gt; 
&lt;p&gt;All numbers come from the automated evaluation runner against 6 real open-source repositories (13 commits total). Every config pins an upstream SHA, the Leiden community detector runs with a fixed seed, and embeddings are deterministic on CPU — so two runs on different machines produce identical numbers. The full reproduction recipe with expected outputs is in &lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/docs/REPRODUCING.md&quot;&gt;&lt;code&gt;docs/REPRODUCING.md&lt;/code&gt;&lt;/a&gt;. A weekly report-only run on the two smallest configs lives in &lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/.github/workflows/eval.yml&quot;&gt;&lt;code&gt;.github/workflows/eval.yml&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;strong&gt;Token efficiency: ~65x median per-question reduction (range 36x – 376x; whole-corpus vs graph query)&lt;/strong&gt;&lt;/summary&gt; 
 &lt;br /&gt; 
 &lt;p&gt;For a typical agent question (&lt;code&gt;&quot;how does authentication work&quot;&lt;/code&gt;, &lt;code&gt;&quot;what is the main entry point&quot;&lt;/code&gt;, etc.), the graph returns ~2,000–3,500 tokens of targeted search hits + neighbor edges instead of forcing the agent to read every source file. The table below averages over the 5 sample questions defined in &lt;code&gt;code_review_graph/token_benchmark.py&lt;/code&gt;.&lt;/p&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Repo&lt;/th&gt; 
    &lt;th&gt;Snapshot SHA&lt;/th&gt; 
    &lt;th style=&quot;text-align:right&quot;&gt;naive_corpus_tokens&lt;/th&gt; 
    &lt;th style=&quot;text-align:right&quot;&gt;avg graph_tokens&lt;/th&gt; 
    &lt;th style=&quot;text-align:right&quot;&gt;Reduction&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;fastapi&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;22381558&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;948,793&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;2,653&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;&lt;strong&gt;375.6x&lt;/strong&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;flask&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;a29f88ce&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;143,594&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;2,196&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;&lt;strong&gt;71.0x&lt;/strong&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;code-review-graph&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;84bde354&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;208,821&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;3,190&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;&lt;strong&gt;68.1x&lt;/strong&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;gin&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;5c00df8a&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;166,868&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;2,766&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;&lt;strong&gt;61.9x&lt;/strong&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;httpx&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;b55d4635&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;142,356&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;2,661&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;&lt;strong&gt;60.6x&lt;/strong&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;express&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;b4ab7d65&lt;/code&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;136,052&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;3,936&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;&lt;strong&gt;36.0x&lt;/strong&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
 &lt;p&gt;Median per-question reduction across the 6 repos: &lt;strong&gt;~65x&lt;/strong&gt;. The range is 36x – 376x, where &lt;strong&gt;376x is the best case&lt;/strong&gt; (fastapi, the largest corpus), not the headline.&lt;/p&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;Re-captured 2026-08-02 from clean clones at the pinned SHAs (crg 2.3.7, local &lt;code&gt;all-MiniLM-L6-v2&lt;/code&gt; embeddings). These numbers are lower than the 2026-05-25 capture they replace: the graph response grew as node embedding text became richer, so &lt;code&gt;avg graph_tokens&lt;/code&gt; rose across every repo. fastapi is now measured at its current pin &lt;code&gt;22381558&lt;/code&gt; rather than the retired &lt;code&gt;0227991a&lt;/code&gt;.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;p&gt;The whole-corpus baseline above is an upper bound no real agent pays: a competent agent greps for identifiers and reads only the best-matching files. The &lt;code&gt;agent_baseline&lt;/code&gt; eval benchmark measures that realistic baseline — a pure-python grep over the corpus, top-3 files by match count, token-counted and compared to the graph query cost (&lt;code&gt;evaluate/results/&amp;lt;repo&amp;gt;_agent_baseline_*.csv&lt;/code&gt;).&lt;/p&gt; 
 &lt;p&gt;The formal &lt;code&gt;eval/benchmarks/token_efficiency.py&lt;/code&gt; benchmark measures a different scenario — full &lt;code&gt;get_review_context()&lt;/code&gt; JSON versus just the changed-file content of a commit — and reports ratios below 1 for small commits, because the review-context response carries impact-radius edges plus source snippets that exceed a tiny single-file diff. That is not a bug; the two benchmarks answer different questions. See &lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/docs/REPRODUCING.md&quot;&gt;&lt;code&gt;docs/REPRODUCING.md&lt;/code&gt;&lt;/a&gt; for the full methodology.&lt;/p&gt; 
 &lt;p&gt;Since v2.3.4, review and impact tools attach a compact &lt;code&gt;context_savings&lt;/code&gt; estimate so MCP clients can see the approximate context saved per call. In v2.3.5 the CLI surfaces this as the boxed &lt;code&gt;Token Savings&lt;/code&gt; panel shown above (see &quot;Token Savings panel&quot; in the Usage section) and adds &lt;code&gt;--verify&lt;/code&gt; to cross-check against OpenAI&#39;s &lt;code&gt;cl100k_base&lt;/code&gt; tokenizer. Calibration data in &lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/docs/REPRODUCING.md&quot;&gt;&lt;code&gt;docs/REPRODUCING.md&lt;/code&gt;&lt;/a&gt; shows the estimate is within ~1% of real GPT-4 tokens in aggregate across 222 sample files.&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;strong&gt;Impact accuracy: 0.69 average F1 against graph-derived ground truth (recall 1.0 is a circular upper bound, not &quot;100% recall&quot;)&lt;/strong&gt;&lt;/summary&gt; 
 &lt;br /&gt; 
 &lt;p&gt;Blast-radius analysis recovers every file in the ground truth on all 13 evaluation commits — &lt;strong&gt;but read that as an upper bound, not as &quot;100% recall&quot;&lt;/strong&gt;: in this mode the ground truth (changed files + files with call/import edges into them) is derived from the same graph the predictor traverses, so it is circular by construction. The over-prediction visible in the precision column is a deliberate trade-off: better to flag too many files than miss a broken dependency.&lt;/p&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Repo&lt;/th&gt; 
    &lt;th style=&quot;text-align:right&quot;&gt;Commits&lt;/th&gt; 
    &lt;th style=&quot;text-align:right&quot;&gt;Avg F1&lt;/th&gt; 
    &lt;th style=&quot;text-align:right&quot;&gt;Avg Precision&lt;/th&gt; 
    &lt;th style=&quot;text-align:right&quot;&gt;Recall (graph-derived upper bound)&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;httpx&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;2&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;0.863&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;0.785&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;1.0&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;code-review-graph&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;2&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;0.734&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;0.584&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;1.0&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;fastapi&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;2&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;0.697&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;0.539&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;1.0&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;express&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;2&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;0.667&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;0.500&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;1.0&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;flask&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;2&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;0.633&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;0.485&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;1.0&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;gin&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;3&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;0.609&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;0.439&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;1.0&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;Average&lt;/strong&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;&lt;strong&gt;13&lt;/strong&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;&lt;strong&gt;0.693&lt;/strong&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;&lt;strong&gt;0.546&lt;/strong&gt;&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;&lt;strong&gt;1.000&lt;/strong&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
 &lt;p&gt;The benchmark also runs an honest &lt;strong&gt;co-change mode&lt;/strong&gt;: the predictor is seeded with a single changed file and graded against the &lt;em&gt;other&lt;/em&gt; files the author actually touched in the same commit — independent-ish evidence from git history, not from the graph. Both modes appear side by side in the result CSVs (&lt;code&gt;ground_truth_mode&lt;/code&gt; column). As of the 2026-08-02 capture that mode returns &lt;code&gt;predicted_files = 0&lt;/code&gt; on every graded commit, so it is not yet a usable measurement and no co-change number is quoted here — the harness needs fixing before the mode says anything about accuracy.&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;strong&gt;Build performance&lt;/strong&gt;&lt;/summary&gt; 
 &lt;br /&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Repo&lt;/th&gt; 
    &lt;th style=&quot;text-align:right&quot;&gt;Files&lt;/th&gt; 
    &lt;th style=&quot;text-align:right&quot;&gt;Nodes&lt;/th&gt; 
    &lt;th style=&quot;text-align:right&quot;&gt;Edges&lt;/th&gt; 
    &lt;th style=&quot;text-align:right&quot;&gt;Flow Detection&lt;/th&gt; 
    &lt;th style=&quot;text-align:right&quot;&gt;Search Latency&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;express&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;141&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;1,910&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;17,553&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;106ms&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;0.7ms&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;fastapi&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;1,122&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;6,285&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;27,117&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;128ms&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;1.5ms&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;flask&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;83&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;1,446&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;7,974&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;95ms&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;0.7ms&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;gin&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;99&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;1,286&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;16,762&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;111ms&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;0.5ms&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;httpx&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;60&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;1,253&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;7,896&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;96ms&lt;/td&gt; 
    &lt;td style=&quot;text-align:right&quot;&gt;0.4ms&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
&lt;/details&gt; 
&lt;h3&gt;Limitations and known weaknesses&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Impact &quot;recall 1.0&quot; is graph-derived and circular:&lt;/strong&gt; the historical ground truth comes from the same graph edges the predictor walks, so it is an upper bound by construction. The honest co-change mode (grade against files actually co-changed in the same commit) is measured alongside it; expect those numbers to be substantially lower.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Small single-file changes:&lt;/strong&gt; Graph context can exceed naive file reads for trivial edits (see express results above). The overhead is the structural metadata that enables multi-file analysis.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Search quality (MRR 0.35):&lt;/strong&gt; Keyword search finds the right result in the top-4 for most queries, but ranking needs improvement. Express queries return 0 hits due to module-pattern naming.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Flow detection (33% recall):&lt;/strong&gt; Framework and conventional entry patterns are strongest for Python and PHP/Laravel. JavaScript and Go flow detection needs work.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Precision vs recall trade-off:&lt;/strong&gt; Impact analysis is deliberately conservative. It flags files that &lt;em&gt;might&lt;/em&gt; be affected, which means some false positives in large dependency graphs.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Features&lt;/h2&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Feature&lt;/th&gt; 
   &lt;th&gt;Details&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Incremental updates&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Re-parses only the files whose hash changed. On a ~3,000-file repo a two-file edit takes ~2.5s on the hook path (&lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/docs/REPRODUCING.md#incremental-update-latency&quot;&gt;measured&lt;/a&gt;).&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Broad language + notebook support&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Python, JavaScript/TypeScript/TSX, Go, Rust, Java, C/C++, C#, &lt;a href=&quot;http://VB.NET&quot;&gt;VB.NET&lt;/a&gt;, Ruby, Kotlin, Swift, PHP, Scala, Solidity, Dart, R, Perl, Lua/Luau, Objective-C, shell scripts, Elixir, Zig, PowerShell, Julia, ReScript, GDScript, Nix, Verilog/SystemVerilog, SQL, Terraform/OpenTofu structure (&lt;code&gt;.tf&lt;/code&gt;; generic &lt;code&gt;.hcl&lt;/code&gt; files are file-only), Ansible playbooks/roles/tasks, Vue/Svelte SFCs, Astro files parsed through the TypeScript parser, Jupyter/Databricks (.ipynb), and Perl XS (.xs)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Framework-aware PHP parsing&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Repository-bounded Composer PSR-4 imports, Blade template references, and evidence-gated Laravel Route-to-controller and Eloquent relationship edges&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Blast-radius analysis&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Shows which functions, classes, and files are likely affected by a change&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Auto-update hooks&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Hooks and watch mode can update the graph on file saves and supported commit hooks&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Semantic search&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Optional vector embeddings via sentence-transformers, Google Gemini, MiniMax, or any OpenAI-compatible endpoint (real OpenAI, Azure, new-api, LiteLLM, vLLM, LocalAI)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Interactive visualisation&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;D3.js force-directed graph with search, community legend toggles, and degree-scaled nodes&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Hub &amp;amp; bridge detection&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Find most-connected nodes and architectural chokepoints via betweenness centrality&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Surprise scoring&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Detect unexpected coupling: cross-community, cross-language, peripheral-to-hub edges&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Knowledge gap analysis&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Identify isolated nodes, untested hotspots, thin communities, and structural weaknesses&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Suggested questions&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Auto-generated review questions from graph analysis (bridges, hubs, surprises)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Edge confidence&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Three-tier confidence scoring (EXTRACTED/INFERRED/AMBIGUOUS) with float scores on edges&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Graph traversal&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Free-form BFS/DFS exploration from any node with configurable depth and token budget&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Export formats&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;GraphML (Gephi/yEd), Neo4j Cypher, Obsidian vault with wikilinks, SVG static graph&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Graph diff&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Compare graph snapshots over time: new/removed nodes, edges, community changes&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Token benchmarking&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Measure naive full-corpus tokens vs graph query tokens with per-question ratios&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Estimated context savings&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Compact &lt;code&gt;context_savings&lt;/code&gt; metadata on relevant MCP/CLI review outputs, labelled as estimated and kept to three small fields&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Memory loop&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Persist Q&amp;amp;A results as markdown for re-ingestion, so the graph grows from queries&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Community auto-split&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Oversized communities (&amp;gt;25% of graph) are recursively split via Leiden&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Execution flows&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Trace call chains from entry points, sorted by weighted criticality&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Community detection&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Cluster related code via Leiden algorithm with resolution scaling for large graphs&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Architecture overview&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Auto-generated architecture map with coupling warnings&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Risk-scored reviews&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;detect_changes&lt;/code&gt; maps diffs to affected functions, flows, and test gaps&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Custom languages&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Add new languages via &lt;code&gt;.code-review-graph/languages.toml&lt;/code&gt; — no fork or code changes needed&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;GitHub Action&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Sticky risk-scored PR review comments in CI, with an optional &lt;code&gt;fail-on-risk&lt;/code&gt; merge gate&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Refactoring tools&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Rename preview, framework-aware dead code detection, community-driven suggestions&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Wiki generation&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Auto-generate markdown wiki from community structure&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Multi-repo registry&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Register multiple repos, search across all of them&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Multi-repo daemon&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;crg-daemon&lt;/code&gt; watches multiple repos as child processes, with health checks and auto-restart&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;MCP prompts&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;5 workflow templates: review, architecture, debug, onboard, pre-merge&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Full-text search&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;FTS5-powered hybrid search combining keyword and vector similarity&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Local storage&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;SQLite file in &lt;code&gt;.code-review-graph/&lt;/code&gt;. Core graph storage needs no external database or cloud service.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Watch mode&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Continuous graph updates as you work&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Usage&lt;/h2&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;strong&gt;Slash commands&lt;/strong&gt;&lt;/summary&gt; 
 &lt;br /&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Command&lt;/th&gt; 
    &lt;th&gt;Description&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/code-review-graph:build-graph&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Build or rebuild the code graph&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/code-review-graph:review-delta&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Review changes since last commit&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/code-review-graph:review-pr&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Full PR review with blast-radius analysis&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;strong&gt;CLI reference&lt;/strong&gt;&lt;/summary&gt; 
 &lt;br /&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;code-review-graph install          # Auto-detect and configure all platforms
code-review-graph install --platform &amp;lt;name&amp;gt;  # Target a specific platform
code-review-graph uninstall --dry-run  # Preview safe removal of installed artifacts
code-review-graph build            # Parse entire codebase
code-review-graph update           # Incremental update (changed files only)
code-review-graph status           # Graph statistics
code-review-graph watch            # Auto-update on file changes
code-review-graph visualize        # Generate interactive HTML graph
code-review-graph visualize --format json      # Export local graph data as JSON
code-review-graph visualize --format graphml   # Export as GraphML
code-review-graph visualize --format svg       # Export as SVG
code-review-graph visualize --format obsidian  # Export as Obsidian vault
code-review-graph visualize --format cypher    # Export as Neo4j Cypher
code-review-graph wiki             # Generate markdown wiki from communities
code-review-graph detect-changes --brief         # Risk panel + token savings (read-only)
code-review-graph update --brief                 # Refresh graph + same panel
code-review-graph detect-changes --brief --verify  # Cross-check vs tiktoken
code-review-graph register &amp;lt;path&amp;gt;  # Register repo in multi-repo registry
code-review-graph unregister &amp;lt;id&amp;gt;  # Remove repo from registry
code-review-graph repos            # List registered repositories
code-review-graph daemon start     # Start multi-repo watch daemon
code-review-graph daemon stop      # Stop the daemon
code-review-graph daemon status    # Show daemon status and repos
code-review-graph eval             # Run evaluation benchmarks
code-review-graph serve            # Start MCP server
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;JSON exports stay inside the local graph data directory, which Git ignores by default. They can contain absolute paths and code-structure metadata, so inspect and sanitize an export before publishing it outside your machine.&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;strong&gt;Token Savings panel: &lt;code&gt;detect-changes --brief&lt;/code&gt; vs &lt;code&gt;update --brief&lt;/code&gt;&lt;/strong&gt;&lt;/summary&gt; 
 &lt;br /&gt; 
 &lt;p&gt;Both commands print the same compact panel showing how many tokens the graph saved you compared to handing the changed files to an agent raw. They differ in &lt;strong&gt;one&lt;/strong&gt; thing: whether the graph gets refreshed first.&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;┌─────────────────────── Token Savings ────────────────────────┐
│ Full context would be:     12,921 tokens                     │
│ Graph context used:           762 tokens                     │
│ Saved:                     12,159 tokens (~94%)              │
│ Breakdown: Functions 244 · Tests 191 · Risk 244 · Other 83   │
└──────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Command&lt;/th&gt; 
    &lt;th&gt;What it does&lt;/th&gt; 
    &lt;th&gt;When to use&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;detect-changes --brief&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;strong&gt;Read-only.&lt;/strong&gt; Looks at your current changes, queries the &lt;strong&gt;existing&lt;/strong&gt; graph, prints the panel. ~1 sec.&lt;/td&gt; 
    &lt;td&gt;Most of the time — the hooks (or &lt;code&gt;crg-daemon&lt;/code&gt;) keep the graph fresh in the background, so this is enough.&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;update --brief&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;strong&gt;Re-parses your changed files into the graph first&lt;/strong&gt;, then prints the same panel. ~5 sec.&lt;/td&gt; 
    &lt;td&gt;After a rebase, a large change set, or any time you suspect the graph is stale.&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
 &lt;p&gt;Both end with the &lt;strong&gt;same panel&lt;/strong&gt; because both call the same &lt;code&gt;analyze_changes()&lt;/code&gt; step at the end. The difference is whether the graph itself got refreshed before that analysis ran.&lt;/p&gt; 
 &lt;p&gt;Add &lt;code&gt;--verify&lt;/code&gt; to either command to cross-check the displayed numbers against OpenAI&#39;s &lt;code&gt;cl100k_base&lt;/code&gt; tokenizer (the GPT-4 family). Requires &lt;code&gt;pip install tiktoken&lt;/code&gt;. The estimate stays within ~1% of real tokens on a typical change set — see &lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/docs/REPRODUCING.md&quot;&gt;&lt;code&gt;docs/REPRODUCING.md&lt;/code&gt;&lt;/a&gt; for the calibration data.&lt;/p&gt; 
 &lt;p&gt;The same &lt;code&gt;context_savings&lt;/code&gt; metadata is also attached automatically to the JSON responses of &lt;code&gt;get_impact_radius&lt;/code&gt;, &lt;code&gt;get_review_context&lt;/code&gt;, &lt;code&gt;detect_changes&lt;/code&gt;, and &lt;code&gt;get_architecture_overview&lt;/code&gt; MCP tools, so AI agents can surface the savings to humans in chat without any extra prompting.&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;strong&gt;Multi-repo daemon&lt;/strong&gt;&lt;/summary&gt; 
 &lt;br /&gt; 
 &lt;p&gt;If your editor doesn&#39;t support hooks (e.g. Cursor, OpenCode), or you just want your graph to stay fresh in the background without any editor integration, the daemon is for you. It watches your repos for file changes and automatically rebuilds the graph — no manual &lt;code&gt;build&lt;/code&gt; or &lt;code&gt;update&lt;/code&gt; commands needed.&lt;/p&gt; 
 &lt;p&gt;The daemon is included with &lt;code&gt;code-review-graph&lt;/code&gt; — no separate install required.&lt;/p&gt; 
 &lt;p&gt;&lt;strong&gt;Quick setup:&lt;/strong&gt;&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 1. Register the repos you want to watch
crg-daemon add ~/project-a --alias proj-a
crg-daemon add ~/project-b

# 2. Start the daemon (runs in the background)
crg-daemon start

# 3. That&#39;s it — graphs stay up to date automatically
crg-daemon status                 # check daemon and per-repo watcher status
crg-daemon logs --repo proj-a -f  # tail logs for a specific repo
crg-daemon stop                   # stop daemon and all watcher processes
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;Also available as &lt;code&gt;code-review-graph daemon start|stop|status|...&lt;/code&gt;.&lt;/p&gt; 
 &lt;p&gt;Under the hood, &lt;code&gt;crg-daemon add&lt;/code&gt; writes to a TOML config file at &lt;code&gt;~/.code-review-graph/watch.toml&lt;/code&gt;. You can also edit this file directly:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;[[repos]]
path = &quot;/home/user/project-a&quot;
alias = &quot;proj-a&quot;

[[repos]]
path = &quot;/home/user/project-b&quot;
alias = &quot;project-b&quot;
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;The daemon monitors this config file for changes and automatically starts/stops watcher processes as repos are added or removed. Health checks every 30 seconds restart dead watchers. No external dependencies required.&lt;/p&gt; 
 &lt;p&gt;See &lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/docs/COMMANDS.md#standalone-daemon-cli-crg-daemon&quot;&gt;docs/COMMANDS.md&lt;/a&gt; for the full config reference and all available options.&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;strong&gt;30 MCP tools&lt;/strong&gt;&lt;/summary&gt; 
 &lt;br /&gt; 
 &lt;p&gt;Your AI assistant uses these automatically once the graph is built.&lt;/p&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Tool&lt;/th&gt; 
    &lt;th&gt;Description&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;build_or_update_graph_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Build or incrementally update the graph&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;run_postprocess_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Re-run flow detection, community detection, and FTS indexing&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;get_minimal_context_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Ultra-compact context (~100 tokens) — call this first&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;get_impact_radius_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Blast radius of changed files&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;get_review_context_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Token-optimised review context with structural summary&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;query_graph_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Callers, callees, tests, imports, inheritance queries&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;traverse_graph_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;BFS/DFS traversal from any node with token budget&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;semantic_search_nodes_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Search code entities by name or meaning&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;embed_graph_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Compute vector embeddings for semantic search&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;list_graph_stats_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Graph size and health&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;get_docs_section_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Retrieve documentation sections&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;find_large_functions_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Find functions/classes exceeding a line-count threshold&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;list_flows_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;List execution flows sorted by criticality&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;get_flow_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Get details of a single execution flow&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;get_affected_flows_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Find flows affected by changed files&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;list_communities_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;List detected code communities&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;get_community_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Get details of a single community&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;get_architecture_overview_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Architecture overview from community structure&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;detect_changes_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Risk-scored change impact analysis for code review&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;get_hub_nodes_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Find most-connected nodes (architectural hotspots)&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;get_bridge_nodes_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Find chokepoints via betweenness centrality&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;get_knowledge_gaps_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Identify structural weaknesses and untested hotspots&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;get_surprising_connections_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Detect unexpected cross-community coupling&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;get_suggested_questions_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Auto-generated review questions from analysis&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;refactor_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Rename preview, dead code detection, suggestions&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;apply_refactor_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Apply a previously previewed refactoring&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;generate_wiki_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Generate markdown wiki from communities&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;get_wiki_page_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Retrieve a specific wiki page&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;list_repos_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;List registered repositories&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;cross_repo_search_tool&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Search across all registered repositories&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
 &lt;p&gt;&lt;strong&gt;MCP Prompts&lt;/strong&gt; (5 workflow templates): &lt;code&gt;review_changes&lt;/code&gt;, &lt;code&gt;architecture_map&lt;/code&gt;, &lt;code&gt;debug_issue&lt;/code&gt;, &lt;code&gt;onboard_developer&lt;/code&gt;, &lt;code&gt;pre_merge_check&lt;/code&gt;&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;strong&gt;Configuration&lt;/strong&gt;&lt;/summary&gt; 
 &lt;br /&gt; 
 &lt;p&gt;To exclude paths from indexing, create a &lt;code&gt;.code-review-graphignore&lt;/code&gt; file in your repository root:&lt;/p&gt; 
 &lt;pre&gt;&lt;code&gt;generated/**
*.generated.ts
vendor/**
node_modules/**
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;Note: in git repos, only tracked files are indexed (&lt;code&gt;git ls-files&lt;/code&gt;), so gitignored files are skipped automatically. Use &lt;code&gt;.code-review-graphignore&lt;/code&gt; to exclude tracked files or when git isn&#39;t available.&lt;/p&gt; 
 &lt;p&gt;Optional dependency groups:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install &quot;code-review-graph[embeddings]&quot;          # Local vector embeddings (sentence-transformers)
pip install &quot;code-review-graph[google-embeddings]&quot;   # Google Gemini embeddings
pip install &quot;code-review-graph[communities]&quot;         # Community detection (igraph)
pip install &quot;code-review-graph[enrichment]&quot;          # Python call-resolution enrichment (Jedi)
pip install &quot;code-review-graph[eval]&quot;                # Evaluation benchmarks (matplotlib)
pip install &quot;code-review-graph[wiki]&quot;                # Wiki generation with LLM summaries (ollama)
pip install &quot;code-review-graph[all]&quot;                 # All optional dependencies
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h3&gt;Environment Variables&lt;/h3&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Variable&lt;/th&gt; 
    &lt;th&gt;Description&lt;/th&gt; 
    &lt;th&gt;Default&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;CRG_GIT_TIMEOUT&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Timeout in seconds for Git operations&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;30&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;CRG_DATA_DIR&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Override directory for graph databases and generated graph artefacts&lt;/td&gt; 
    &lt;td&gt;-&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;CRG_EMBEDDING_MODEL&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Default model for vector embeddings&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;all-MiniLM-L6-v2&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;CRG_ACCEPT_CLOUD_EMBEDDINGS&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Suppress the cloud embedding egress warning after explicit acknowledgement&lt;/td&gt; 
    &lt;td&gt;-&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;CRG_ALLOW_REMOTE_CODE&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Allow HuggingFace models that require &lt;code&gt;trust_remote_code=True&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;CRG_MAX_IMPACT_NODES&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Maximum nodes to include in impact analysis&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;500&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;CRG_MAX_IMPACT_DEPTH&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Search depth for blast-radius analysis&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;CRG_MAX_BFS_DEPTH&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Maximum depth for graph traversal&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;15&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;CRG_MAX_CHANGED_FUNCS&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Maximum changed functions analysed in one change report&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;500&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;CRG_MAX_TRANSITIVE_FRONTIER&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Maximum frontier size for transitive caller/callee expansion&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;50&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;CRG_TOOL_TIMEOUT&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Optional timeout in seconds for bounded MCP tools (&lt;code&gt;0&lt;/code&gt; disables timeout)&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;CRG_RECURSE_SUBMODULES&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Include git submodules in file collection when set to &lt;code&gt;1&lt;/code&gt;, &lt;code&gt;true&lt;/code&gt;, or &lt;code&gt;yes&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;-&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;CRG_TOOLS&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Comma-separated allowlist of MCP tools to expose when serving&lt;/td&gt; 
    &lt;td&gt;-&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;GOOGLE_API_KEY&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;API key for Google Gemini embeddings&lt;/td&gt; 
    &lt;td&gt;-&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;MINIMAX_API_KEY&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;API key for MiniMax embeddings&lt;/td&gt; 
    &lt;td&gt;-&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;VOYAGE_API_KEY&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;API key for Voyage embeddings&lt;/td&gt; 
    &lt;td&gt;-&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;CRG_VOYAGE_MODEL&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Model name for Voyage embeddings&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;voyage-code-3&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;CRG_VOYAGE_OUTPUT_DIMENSION&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Output dimension for Voyage embeddings&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;1024&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;CRG_VOYAGE_OUTPUT_DTYPE&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Output dtype for Voyage embeddings&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;float&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;CRG_VOYAGE_BASE_URL&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Voyage embeddings endpoint&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;https://api.voyageai.com/v1&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;CRG_VOYAGE_BATCH_SIZE&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Batch size for Voyage embedding requests&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;100&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;CRG_VOYAGE_MIN_INTERVAL_SEC&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Minimum delay between Voyage requests&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;CRG_OPENAI_BASE_URL&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;OpenAI-compatible embeddings endpoint&lt;/td&gt; 
    &lt;td&gt;-&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;CRG_OPENAI_API_KEY&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;API key for OpenAI-compatible embeddings&lt;/td&gt; 
    &lt;td&gt;-&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;CRG_OPENAI_MODEL&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Model name for OpenAI-compatible embeddings&lt;/td&gt; 
    &lt;td&gt;-&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;CRG_OPENAI_DIMENSION&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Pin embedding dimension (v3 models support reduction)&lt;/td&gt; 
    &lt;td&gt;-&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;NO_COLOR&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;If set, disables ANSI colors in terminal&lt;/td&gt; 
    &lt;td&gt;-&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;CRG_SERIAL_PARSE&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;If &lt;code&gt;1&lt;/code&gt;, disables parallel parsing (use for debugging)&lt;/td&gt; 
    &lt;td&gt;-&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
 &lt;p&gt;OpenAI-compatible embeddings (real OpenAI, Azure, or any self-hosted gateway like new-api / LiteLLM / vLLM / LocalAI / Ollama in openai mode) need no extra install — just set the environment variables and pass &lt;code&gt;provider=&quot;openai&quot;&lt;/code&gt; to &lt;code&gt;embed_graph&lt;/code&gt;:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;export CRG_OPENAI_BASE_URL=http://127.0.0.1:3000/v1     # or https://api.openai.com/v1
export CRG_OPENAI_API_KEY=sk-...
export CRG_OPENAI_MODEL=text-embedding-3-small          # whatever your gateway serves
# optional:
export CRG_OPENAI_DIMENSION=1536                        # pin dim (v3 models support reduction)
export CRG_OPENAI_BATCH_SIZE=100                        # lower for gateways with tight limits
                                                        # (e.g. Qwen text-embedding-v4 caps at 10)
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;The cloud-egress warning is auto-skipped when the base URL points to localhost (&lt;code&gt;127.0.0.1&lt;/code&gt;, &lt;code&gt;localhost&lt;/code&gt;, &lt;code&gt;0.0.0.0&lt;/code&gt;, &lt;code&gt;::1&lt;/code&gt;).&lt;/p&gt; 
 &lt;p&gt;Voyage embeddings need no extra install. Set &lt;code&gt;VOYAGE_API_KEY&lt;/code&gt; and pass &lt;code&gt;provider=&quot;voyage&quot;&lt;/code&gt; to &lt;code&gt;embed_graph&lt;/code&gt;; the default model is &lt;code&gt;voyage-code-3&lt;/code&gt;:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;export VOYAGE_API_KEY=pa-...
export CRG_ACCEPT_CLOUD_EMBEDDINGS=1
code-review-graph embed --provider voyage --model voyage-code-3
&lt;/code&gt;&lt;/pre&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;Model selection tip.&lt;/strong&gt; Avoid &lt;code&gt;-preview&lt;/code&gt; / &lt;code&gt;-beta&lt;/code&gt; / &lt;code&gt;-exp&lt;/code&gt; model IDs (e.g. &lt;code&gt;google/gemini-embedding-2-preview&lt;/code&gt;) for anything you plan to keep long-term — preview models can change weights (different dimension → full re-embed required) or be deprecated without notice. Prefer stable GA releases such as &lt;code&gt;text-embedding-3-small&lt;/code&gt; / &lt;code&gt;text-embedding-3-large&lt;/code&gt; (OpenAI), &lt;code&gt;Qwen/Qwen3-Embedding-8B&lt;/code&gt; (via self-hosted vLLM / LocalAI), or &lt;code&gt;gemini-embedding-001&lt;/code&gt; (via the native Gemini provider, which requires &lt;code&gt;GOOGLE_API_KEY&lt;/code&gt; instead of the OpenAI-compatible path).&lt;/p&gt; 
  &lt;p&gt;&lt;code&gt;code-review-graph&lt;/code&gt; embeds identifiers, signatures, structural context, and a bounded first-paragraph docstring/doc-comment summary. It does not transmit function bodies. Graphs created before documentation extraction was added need one full &lt;code&gt;code-review-graph build&lt;/code&gt; before re-embedding so every file is reparsed. Routine builds never refresh embeddings by default. To refresh an existing index after a build, explicitly pass both &lt;code&gt;--embedding-provider&lt;/code&gt; and &lt;code&gt;--embedding-model&lt;/code&gt;; cloud choices may transmit this source-derived text and incur API cost.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;h4&gt;Tool Filtering&lt;/h4&gt; 
 &lt;p&gt;CRG exposes 30 MCP tools by default. In token-constrained environments, you can limit the server to a subset of tools using &lt;code&gt;--tools&lt;/code&gt; or the &lt;code&gt;CRG_TOOLS&lt;/code&gt; environment variable:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Via CLI flag
code-review-graph serve --tools query_graph_tool,semantic_search_nodes_tool,detect_changes_tool

# Via environment variable
CRG_TOOLS=query_graph_tool,semantic_search_nodes_tool code-review-graph serve
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;The CLI flag takes precedence over the environment variable. When neither is set, all tools are available. This is especially useful for MCP client configurations:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;mcpServers&quot;: {
    &quot;code-review-graph&quot;: {
      &quot;command&quot;: &quot;code-review-graph&quot;,
      &quot;args&quot;: [&quot;serve&quot;, &quot;--tools&quot;, &quot;query_graph_tool,semantic_search_nodes_tool,detect_changes_tool,get_review_context_tool&quot;]
    }
  }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;hr /&gt; 
&lt;h2&gt;FAQ &amp;amp; how it compares&lt;/h2&gt; 
&lt;p&gt;Short, honest answers in &lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/docs/FAQ.md&quot;&gt;docs/FAQ.md&lt;/a&gt;:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/docs/FAQ.md#how-is-this-different-from-lsp-and-language-servers&quot;&gt;vs LSP / language servers&lt;/a&gt; — one persistent cross-language graph instead of per-language daemons; LSP stays more precise per symbol.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/docs/FAQ.md#isnt-this-just-rag&quot;&gt;vs RAG / embeddings&lt;/a&gt; — structural edges parsed from the AST, not similarity chunks; embeddings are optional and only assist search.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/docs/FAQ.md#why-not-just-grep&quot;&gt;vs grep / agentic search&lt;/a&gt; — grep wins on one-hop lookups; the graph wins on multi-hop questions (impact radius, callers-of-callers, tests-for, affected flows).&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/docs/FAQ.md#how-does-it-compare-to-serena-codegraph-claude-context-and-repomix&quot;&gt;vs Serena, codegraph, claude-context, repomix&lt;/a&gt; — factual comparison table.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/docs/FAQ.md#when-should-i-not-use-it&quot;&gt;When NOT to use it&lt;/a&gt; — small repos, trivial single-file diffs, one-off questions.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/docs/FAQ.md#does-it-phone-home&quot;&gt;Does it phone home?&lt;/a&gt; — no; zero telemetry, cloud embeddings are opt-in.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/docs/FAQ.md#how-do-i-verify-it-is-working&quot;&gt;How do I verify it is working?&lt;/a&gt; — &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;detect-changes --brief&lt;/code&gt;, &lt;code&gt;/mcp&lt;/code&gt;.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Troubleshooting&lt;/h2&gt; 
&lt;h3&gt;&lt;code&gt;pip&lt;/code&gt; / &lt;code&gt;pipx&lt;/code&gt; cannot download &lt;code&gt;hatchling&lt;/code&gt; (or &lt;code&gt;Errno 9&lt;/code&gt; / &lt;code&gt;Bad file descriptor&lt;/code&gt; to PyPI)&lt;/h3&gt; 
&lt;p&gt;Installing from a &lt;strong&gt;source tree&lt;/strong&gt; (for example &lt;code&gt;pipx install .&lt;/code&gt;) needs build dependencies from &lt;strong&gt;PyPI&lt;/strong&gt; (for example &lt;code&gt;hatchling&lt;/code&gt;). If you see &lt;code&gt;Could not find a version that satisfies the requirement hatchling&lt;/code&gt; after connection warnings, the Python/pip in that &lt;strong&gt;terminal&lt;/strong&gt; may not be able to open an HTTPS client to &lt;code&gt;pypi.org&lt;/code&gt; (sometimes seen in an integrated editor terminal; less often system-wide with VPN, firewall, or proxy).&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Options:&lt;/strong&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;Run the same command from &lt;strong&gt;macOS Terminal.app&lt;/strong&gt; (or iTerm) instead of the IDE’s terminal, then retry &lt;code&gt;pipx install .&lt;/code&gt; or &lt;code&gt;pipx install &quot;git+https://...&quot;&lt;/code&gt; .&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Use &lt;strong&gt;&lt;a href=&quot;https://docs.astral.sh/uv/&quot;&gt;uv&lt;/a&gt;&lt;/strong&gt; to install the CLI from a checkout (uses different download machinery than &lt;code&gt;pip&lt;/code&gt; in many cases):&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd /path/to/code-review-graph
uv tool install . --force
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;For &lt;strong&gt;development in a clone&lt;/strong&gt; without a global install, use &lt;code&gt;uv sync&lt;/code&gt; and &lt;code&gt;uv run code-review-graph …&lt;/code&gt; (or activate &lt;code&gt;.venv&lt;/code&gt; after &lt;code&gt;uv sync&lt;/code&gt;).&lt;/p&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;strong&gt;Diagnose (optional):&lt;/strong&gt; &lt;code&gt;python3 scripts/diagnose_pypi_connectivity.py&lt;/code&gt; — if it prints &lt;code&gt;FAILED&lt;/code&gt;, the issue is environment/network, not a wrong package name in this repo.&lt;/p&gt; 
&lt;h3&gt;Windows Configuration Issues (Invalid JSON / Connection Closed)&lt;/h3&gt; 
&lt;p&gt;If you are using Windows and encounter &lt;code&gt;Invalid JSON: EOF while parsing&lt;/code&gt; or &lt;code&gt;MCP error -32000: Connection closed&lt;/code&gt; when connecting via Claude Code, do not use the &lt;code&gt;cmd /c&lt;/code&gt; wrapper in your config.&lt;/p&gt; 
&lt;p&gt;Ensure &lt;code&gt;fastmcp&lt;/code&gt; is updated to at least &lt;code&gt;3.2.4+&lt;/code&gt;. Then, configure your &lt;code&gt;~/.claude.json&lt;/code&gt; to execute the &lt;code&gt;.exe&lt;/code&gt; directly and pass the UTF-8 environment variable via the config:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;&quot;code-review-graph&quot;: {
  &quot;command&quot;: &quot;C:\\path\\to\\your\\venv\\Scripts\\code-review-graph.exe&quot;,
  &quot;args&quot;: [&quot;serve&quot;, &quot;--repo&quot;, &quot;C:\\path\\to\\your\\project&quot;],
  &quot;env&quot;: { &quot;PYTHONUTF8&quot;: &quot;1&quot; }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Contributing&lt;/h2&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/tirth8205/code-review-graph.git
cd code-review-graph
python3 -m venv .venv &amp;amp;&amp;amp; source .venv/bin/activate
pip install -e &quot;.[dev]&quot;
pytest
&lt;/code&gt;&lt;/pre&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;strong&gt;Adding a new language&lt;/strong&gt;&lt;/summary&gt; 
 &lt;br /&gt; 
 &lt;p&gt;Edit &lt;code&gt;code_review_graph/parser.py&lt;/code&gt; and add your extension to &lt;code&gt;EXTENSION_TO_LANGUAGE&lt;/code&gt; along with node type mappings in &lt;code&gt;_CLASS_TYPES&lt;/code&gt;, &lt;code&gt;_FUNCTION_TYPES&lt;/code&gt;, &lt;code&gt;_IMPORT_TYPES&lt;/code&gt;, and &lt;code&gt;_CALL_TYPES&lt;/code&gt;. Include a test fixture and open a PR.&lt;/p&gt; 
&lt;/details&gt; 
&lt;h2&gt;Licence&lt;/h2&gt; 
&lt;p&gt;MIT. See &lt;a href=&quot;https://raw.githubusercontent.com/tirth8205/code-review-graph/main/LICENSE&quot;&gt;LICENSE&lt;/a&gt;.&lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;br /&gt; &lt;a href=&quot;https://code-review-graph.com&quot;&gt;code-review-graph.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt; &lt;code&gt;pip install code-review-graph &amp;amp;&amp;amp; code-review-graph install&lt;/code&gt;&lt;br /&gt; &lt;sub&gt;Works with Codex, Claude Code, CodeBuddy Code, Cursor, Windsurf, Zed, Continue, OpenCode, Antigravity, Gemini CLI, Qwen, Qoder, Kiro, GitHub Copilot, and GitHub Copilot CLI&lt;/sub&gt; &lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/d6d2cebf175ff38bd65b99f24dfc1874d4ddbda5be27bf053e4726fd4aec1131/tirth8205/code-review-graph" medium="image" />
      
    </item>
    
    <item>
      <title>virgiliojr94/book-to-skill</title>
      <link>https://github.com/virgiliojr94/book-to-skill</link>
      <description>&lt;p&gt;Turn any technical book PDF into a Claude Code skill — ready to study, reference, and use while you work.&lt;/p&gt;&lt;hr&gt;&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/virgiliojr94/book-to-skill/master/docs/assets/banner.webp&quot; alt=&quot;Booklin, the book-to-skill wizard, holding an open book whose pages scatter into sparkles that settle into an ordered grid&quot; width=&quot;100%&quot; /&gt; &lt;/p&gt; 
&lt;h1 align=&quot;center&quot;&gt;book-to-skill&lt;/h1&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;strong&gt;Turn any technical book, document folder, or collection of sources into a unified agent skill — ready to study, reference, and use while you work in GitHub Copilot CLI, Amp, or Claude Code.&lt;/strong&gt; &lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://github.com/virgiliojr94/book-to-skill/releases&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/v/release/virgiliojr94/book-to-skill?style=for-the-badge&amp;amp;color=blueviolet&quot; alt=&quot;Latest release&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;https://img.shields.io/badge/Agent_Skills-Open_Standard-blueviolet?style=for-the-badge&quot; alt=&quot;Agent Skills standard&quot; /&gt; &lt;img src=&quot;https://img.shields.io/badge/PDF%20%E2%80%A2%20EPUB%20%E2%80%A2%20DOCX%20%E2%80%A2%20MD%20%E2%80%A2%20HTML%20%E2%80%A2%20RTF%20%E2%80%A2%20MOBI-supported-green?style=for-the-badge&quot; alt=&quot;Formats supported&quot; /&gt; &lt;img src=&quot;https://img.shields.io/badge/License-MIT-blue?style=for-the-badge&quot; alt=&quot;MIT License&quot; /&gt; &lt;a href=&quot;https://github.com/sponsors/virgiliojr94&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/sponsors/virgiliojr94?style=for-the-badge&amp;amp;color=ea4aaa&amp;amp;logo=githubsponsors&amp;amp;logoColor=white&quot; alt=&quot;Sponsor&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://trendshift.io/repositories/27038?utm_source=repository-badge&amp;amp;utm_medium=badge&amp;amp;utm_campaign=badge-repository-27038&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;img src=&quot;https://trendshift.io/api/badge/repositories/27038&quot; alt=&quot;virgiliojr94%2Fbook-to-skill | Trendshift&quot; width=&quot;250&quot; height=&quot;55&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://trendshift.io/repositories/27038?utm_source=trendshift-badge&amp;amp;utm_medium=badge&amp;amp;utm_campaign=badge-trendshift-27038&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;img src=&quot;https://trendshift.io/api/badge/trendshift/repositories/27038/daily?language=Python&quot; alt=&quot;virgiliojr94%2Fbook-to-skill | Trendshift (daily, Python)&quot; width=&quot;250&quot; height=&quot;55&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://raw.githubusercontent.com/virgiliojr94/book-to-skill/master/#-why&quot;&gt;Why&lt;/a&gt; · &lt;a href=&quot;https://raw.githubusercontent.com/virgiliojr94/book-to-skill/master/#-what-it-generates&quot;&gt;What it generates&lt;/a&gt; · &lt;a href=&quot;https://raw.githubusercontent.com/virgiliojr94/book-to-skill/master/#-beyond-books&quot;&gt;Beyond books&lt;/a&gt; · &lt;a href=&quot;https://raw.githubusercontent.com/virgiliojr94/book-to-skill/master/docs/how-it-works.md&quot;&gt;How it works&lt;/a&gt; · &lt;a href=&quot;https://raw.githubusercontent.com/virgiliojr94/book-to-skill/master/docs/usage.md&quot;&gt;Usage&lt;/a&gt; · &lt;a href=&quot;https://raw.githubusercontent.com/virgiliojr94/book-to-skill/master/docs/install.md&quot;&gt;Install&lt;/a&gt; · &lt;a href=&quot;https://raw.githubusercontent.com/virgiliojr94/book-to-skill/master/docs/faq.md&quot;&gt;FAQ&lt;/a&gt; · &lt;a href=&quot;https://raw.githubusercontent.com/virgiliojr94/book-to-skill/master/docs/performance.md&quot;&gt;Performance&lt;/a&gt; · &lt;a href=&quot;https://raw.githubusercontent.com/virgiliojr94/book-to-skill/master/docs/architecture.md&quot;&gt;Architecture&lt;/a&gt; · &lt;a href=&quot;https://raw.githubusercontent.com/virgiliojr94/book-to-skill/master/CHANGELOG.md&quot;&gt;Changelog&lt;/a&gt; &lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;strong&gt;24×–51× fewer tokens than dumping the book into context&lt;/strong&gt; to answer one question, measured on real books (&lt;a href=&quot;https://raw.githubusercontent.com/virgiliojr94/book-to-skill/master/docs/performance.md#the-discovery-loop-tax&quot;&gt;how it&#39;s measured&lt;/a&gt;). &lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;How it works, in 3 steps:&lt;/strong&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;strong&gt;Point&lt;/strong&gt; it at a file, folder, or glob — &lt;code&gt;/book-to-skill ./my-book.pdf&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;It distills&lt;/strong&gt; the book into a skill — frameworks, decision rules, anti-patterns, and per-chapter files. Structure, not a summary.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Your agent loads it on demand&lt;/strong&gt; — ask &lt;code&gt;/my-book replication&lt;/code&gt; and it reads the right chapter and answers from the real content, no hallucination.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;hr /&gt; 
&lt;h2&gt;🤔 Why&lt;/h2&gt; 
&lt;img align=&quot;right&quot; width=&quot;200&quot; src=&quot;https://raw.githubusercontent.com/virgiliojr94/book-to-skill/master/docs/assets/booklin.png&quot; alt=&quot;Booklin — the book-to-skill mascot, a purple wizard holding a book&quot; /&gt; 
&lt;p&gt;You buy a great technical book. You read it once. Three months later you can&#39;t remember chapter 7 existed.&lt;/p&gt; 
&lt;p&gt;The usual workarounds don&#39;t help:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;📄 &quot;Let me just search the PDF&quot; → you get a list of pages, not answers&lt;/li&gt; 
 &lt;li&gt;🧠 &quot;I&#39;ll ask the agent about this book&quot; → it either hallucinates or says it doesn&#39;t have the content&lt;/li&gt; 
 &lt;li&gt;📝 &quot;I&#39;ll take notes as I read&quot; → you end up with a 200-line doc you never open again&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong&gt;book-to-skill solves this by turning the book into a structured skill your agent loads on demand.&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;Once installed, you just type &lt;code&gt;/your-book-slug replication&lt;/code&gt; and the agent reads the right chapter and answers from the actual content. No hallucination. No digging through PDFs. The book becomes part of your workflow.&lt;/p&gt; 
&lt;p&gt;Works with any host that supports the open &lt;a href=&quot;https://github.com/agentskills/agentskills&quot;&gt;Agent Skills&lt;/a&gt; standard — GitHub Copilot CLI, Amp, and Claude Code all read the same &lt;code&gt;SKILL.md&lt;/code&gt; format.&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;📦 What it generates&lt;/h2&gt; 
&lt;p&gt;Running &lt;code&gt;/book-to-skill your-book.pdf&lt;/code&gt; (or a folder, glob, or list of files) creates a full skill in your agent&#39;s skills directory (&lt;code&gt;~/.copilot/skills/&amp;lt;slug&amp;gt;/&lt;/code&gt; for Copilot CLI, &lt;code&gt;~/.agents/skills/&amp;lt;slug&amp;gt;/&lt;/code&gt; for Amp or cross-agent, &lt;code&gt;~/.claude/skills/&amp;lt;slug&amp;gt;/&lt;/code&gt; for Claude Code):&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;File&lt;/th&gt; 
   &lt;th&gt;Purpose&lt;/th&gt; 
   &lt;th&gt;Size&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;SKILL.md&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Core mental models + chapter index&lt;/td&gt; 
   &lt;td&gt;~4,000 tokens&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;chapters/ch01-*.md&lt;/code&gt; …&lt;/td&gt; 
   &lt;td&gt;One file per chapter, loaded on-demand&lt;/td&gt; 
   &lt;td&gt;~1,000 tokens each&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;glossary.md&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Every key term, alphabetically sorted with chapter refs&lt;/td&gt; 
   &lt;td&gt;~1,500 tokens&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;patterns.md&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;All techniques, algorithms, and design patterns&lt;/td&gt; 
   &lt;td&gt;~2,000 tokens&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;cheatsheet.md&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Decision tables and quick-reference rules&lt;/td&gt; 
   &lt;td&gt;~1,000 tokens&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;&lt;strong&gt;Chapter files are loaded on-demand&lt;/strong&gt; — they don&#39;t count against the skill budget until you ask about that topic.&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;🏢 Beyond books&lt;/h2&gt; 
&lt;p&gt;The name says &quot;book&quot;, but the input is any structured prose. The same extraction works on knowledge you own and re-read constantly:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Internal documentation&lt;/strong&gt; — architecture decision records, runbooks, onboarding guides. Fold a whole &lt;code&gt;docs/&lt;/code&gt; folder into one skill and ask it while you code.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Brand &amp;amp; design systems&lt;/strong&gt; — voice guidelines, tone-of-voice docs, component principles. Turn a brand book into a skill your team queries instead of skimming a 60-page PDF.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Research clusters&lt;/strong&gt; — a stack of papers plus your own notes, merged into a single unified skill and updated as new material lands (see &lt;a href=&quot;https://raw.githubusercontent.com/virgiliojr94/book-to-skill/master/#-usage&quot;&gt;Update / fold-in&lt;/a&gt;).&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Specs &amp;amp; standards&lt;/strong&gt; — RFCs, API contracts, compliance docs you reference but never memorize.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;If you re-open a document often enough to wish you&#39;d memorized it, it&#39;s a candidate.&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;🧾 The Discovery Loop Tax&lt;/h2&gt; 
&lt;p&gt;A PDF-reading agent doesn&#39;t just read — it &lt;em&gt;navigates&lt;/em&gt;: it re-fetches the ToC, backtracks, and re-processes all of it on every turn. book-to-skill pays that structuring cost &lt;strong&gt;once&lt;/strong&gt;, at conversion, so queries stay proportional to the answer — &lt;strong&gt;24×–51× fewer tokens&lt;/strong&gt; than dumping the book into context, measured on real books.&lt;/p&gt; 
&lt;p&gt;📊 &lt;strong&gt;Full methodology, numbers, and per-book tables → &lt;a href=&quot;https://raw.githubusercontent.com/virgiliojr94/book-to-skill/master/docs/performance.md#the-discovery-loop-tax&quot;&gt;docs/performance.md&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;⚙️ How it works&lt;/h2&gt; 
&lt;p&gt;Two halves: a deterministic Python &lt;strong&gt;extractor&lt;/strong&gt; (document → clean text + metadata) and a spec-driven &lt;strong&gt;generator&lt;/strong&gt; (your agent follows &lt;code&gt;SKILL.md&lt;/code&gt; to turn that into a structured skill). On-demand chapter files keep the loaded skill small.&lt;/p&gt; 
&lt;p&gt;🔧 &lt;strong&gt;Full walkthrough (Steps 0–10, extraction modes, token budgets) → &lt;a href=&quot;https://raw.githubusercontent.com/virgiliojr94/book-to-skill/master/docs/how-it-works.md&quot;&gt;docs/how-it-works.md&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;🚀 Usage&lt;/h2&gt; 
&lt;p&gt;&lt;code&gt;/book-to-skill &amp;lt;path|folder|glob&amp;gt; [skill-name]&lt;/code&gt; — plus analyze-only, generate-from-analysis, and update/fold-in modes.&lt;/p&gt; 
&lt;p&gt;▶️ &lt;strong&gt;All modes and examples → &lt;a href=&quot;https://raw.githubusercontent.com/virgiliojr94/book-to-skill/master/docs/usage.md&quot;&gt;docs/usage.md&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;📥 Install&lt;/h2&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Agent skill (registers /book-to-skill) — clone into your skills folder:
git clone https://github.com/virgiliojr94/book-to-skill.git ~/.claude/skills/book-to-skill
# (Copilot CLI: ~/.copilot/skills/ · Amp/cross-agent: ~/.agents/skills/)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;📥 &lt;strong&gt;All hosts, optional extractors, and the standalone CLI → &lt;a href=&quot;https://raw.githubusercontent.com/virgiliojr94/book-to-skill/master/docs/install.md&quot;&gt;docs/install.md&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;❓ FAQ&lt;/h2&gt; 
&lt;p&gt;Common questions — &quot;why not just dump the PDF?&quot;, cost, privacy, non-book inputs, multi-file books.&lt;/p&gt; 
&lt;p&gt;❓ &lt;strong&gt;Answers → &lt;a href=&quot;https://raw.githubusercontent.com/virgiliojr94/book-to-skill/master/docs/faq.md&quot;&gt;docs/faq.md&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;hr /&gt; 
&lt;details&gt; 
 &lt;summary&gt;🔧 &lt;strong&gt;Requirements&lt;/strong&gt;&lt;/summary&gt; 
 &lt;p&gt;The extractor tries tools in order per format and uses the first available. If nothing is installed, it tells you which command to run. Plain text, Markdown, reStructuredText and AsciiDoc need no extra deps.&lt;/p&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;Check your setup in one command:&lt;/strong&gt; &lt;code&gt;python3 scripts/extract.py --check&lt;/code&gt; prints which extractors are installed for every format and the exact command to install anything missing — no file needed.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;PDF — choose by book type:&lt;/strong&gt;&lt;/p&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Book type&lt;/th&gt; 
    &lt;th&gt;Tool&lt;/th&gt; 
    &lt;th&gt;Install&lt;/th&gt; 
    &lt;th&gt;Speed&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Text-heavy (prose, few tables)&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;pdftotext&lt;/code&gt; (poppler)&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;sudo apt install poppler-utils&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;⚡ instant&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Text-heavy fallback&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;pypdf&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;pip3 install pypdf&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;⚡ instant&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Text-heavy fallback&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;pdfminer.six&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;pip3 install pdfminer.six&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;⚡ instant&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;Technical (code, tables, formulas)&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;strong&gt;&lt;code&gt;docling&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;pip3 install docling&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;~1.5s/page&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;Before extraction begins, the skill asks you whether the book is &lt;strong&gt;technical&lt;/strong&gt; or &lt;strong&gt;text-heavy&lt;/strong&gt; and picks the right tool automatically. Docling preserves markdown tables and code blocks; pdftotext is faster for prose-only books.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;EPUB:&lt;/strong&gt;&lt;/p&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Tool&lt;/th&gt; 
    &lt;th&gt;Install&lt;/th&gt; 
    &lt;th&gt;Quality&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;ebooklib&lt;/code&gt; + &lt;code&gt;beautifulsoup4&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;pip3 install ebooklib beautifulsoup4&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;⭐⭐⭐ Best&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;stdlib &lt;code&gt;zipfile&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;built-in — no install needed&lt;/td&gt; 
    &lt;td&gt;⭐⭐ Always available&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
 &lt;p&gt;&lt;strong&gt;Other formats:&lt;/strong&gt;&lt;/p&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Format&lt;/th&gt; 
    &lt;th&gt;Tool&lt;/th&gt; 
    &lt;th&gt;Install&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;DOCX&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;python-docx&lt;/code&gt; (fallback: stdlib ZIP/XML)&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;pip3 install python-docx&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;HTML&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;beautifulsoup4&lt;/code&gt; (fallback: stdlib &lt;code&gt;html.parser&lt;/code&gt;)&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;pip3 install beautifulsoup4&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;RTF&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;striprtf&lt;/code&gt; (fallback: regex)&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;pip3 install striprtf&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;MOBI / AZW / AZW3&lt;/td&gt; 
    &lt;td&gt;Calibre &lt;code&gt;ebook-convert&lt;/code&gt; (external app, not pip)&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://calibre-ebook.com/download&quot;&gt;https://calibre-ebook.com/download&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;TXT / Markdown / reStructuredText / AsciiDoc&lt;/td&gt; 
    &lt;td&gt;built-in&lt;/td&gt; 
    &lt;td&gt;—&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
 &lt;hr /&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;📁 &lt;strong&gt;Repository structure&lt;/strong&gt;&lt;/summary&gt; 
 &lt;pre&gt;&lt;code&gt;book-to-skill/
├── SKILL.md              # Skill definition + step-by-step instructions (the generator spec)
├── scripts/
│   ├── extract.py        # Thin entrypoint wrapper
│   └── extractor/        # Modular extraction package
│       ├── config.py     # Extensions, paths, dependency constants
│       ├── dependencies.py  # optional-dep probing + --check
│       ├── exceptions.py # ExtractionError (per-source failures, batch-safe)
│       ├── utils.py      # CLI parsing, multi-source resolution, chapter detection, runner
│       └── parsers/      # Format-specific parsers (pdf, epub, docx, html, rtf, calibre, text)
├── tools/
│   ├── discovery_tax.py  # measures token cost vs context-dump / discovery loop
│   └── validate_skill.py # checks a generated SKILL.md against host rules (--lens claude|copilot|amp)
├── tests/                # pytest suite (extraction, detection, discovery tax)
├── docs/
│   ├── performance.md    # measured benchmarks, discovery tax, cost
│   └── architecture.md   # pipeline + component map
├── CHANGELOG.md          # release history (semver)
├── CONTRIBUTING.md       # dev setup, PR conventions, release process
├── SECURITY.md           # vulnerability reporting
└── README.md             # This file
&lt;/code&gt;&lt;/pre&gt; 
 &lt;hr /&gt; 
&lt;/details&gt; 
&lt;hr /&gt; 
&lt;h2&gt;⚖️ Copyright &amp;amp; fair use&lt;/h2&gt; 
&lt;p&gt;book-to-skill ships &lt;strong&gt;no book content&lt;/strong&gt; — not a single page. It&#39;s a converter you point at files you already own.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Processing is local.&lt;/strong&gt; Extraction and analysis run on your machine. Your files are never uploaded by this tool. (If your agent&#39;s model runs in the cloud, the text you feed it follows that provider&#39;s normal data terms — same as any prompt.)&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;You use your own copy.&lt;/strong&gt; Bring a book you bought, docs your company owns, or papers you have the right to read.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;The output is your notes.&lt;/strong&gt; A generated skill is a structured, synthesized derivative — framework names, definitions, takeaways — not a reproduction of the text. The skill explicitly never copies raw passages (see Quality Rule #7). Treat it like handwritten study notes: yours, for personal use.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Don&#39;t redistribute.&lt;/strong&gt; Publishing or sharing a generated skill of a copyrighted work can infringe the rights holder. Keep skills of third-party books private. Internal docs, your own writing, and openly-licensed material are fine to share within the bounds of their license.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;When in doubt, follow the license or terms of the source document. This project is a tool; how you use it is on you.&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;💖 Sponsors&lt;/h2&gt; 
&lt;img align=&quot;right&quot; width=&quot;150&quot; src=&quot;https://raw.githubusercontent.com/virgiliojr94/book-to-skill/master/docs/assets/booklin-celebrating.png&quot; alt=&quot;Booklin celebrating&quot; /&gt; 
&lt;p&gt;book-to-skill is free and MIT-licensed, maintained on personal time. If it saves you tokens or study hours, consider sponsoring its upkeep: PR reviews, multilingual fixes, releases, and docs.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/sponsors/virgiliojr94&quot;&gt;Become a sponsor → github.com/sponsors/virgiliojr94&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;Every sponsor is listed in &lt;a href=&quot;https://raw.githubusercontent.com/virgiliojr94/book-to-skill/master/BACKERS.md&quot;&gt;BACKERS.md&lt;/a&gt;. Thank you for keeping open, privacy-first tooling alive. ✨&lt;/p&gt; 
&lt;h2&gt;License&lt;/h2&gt; 
&lt;p&gt;MIT — applies to the converter (code + skill definition) in this repository, &lt;strong&gt;not&lt;/strong&gt; to any book or document you process with it.&lt;/p&gt; 
&lt;h2&gt;Star History&lt;/h2&gt; 
&lt;a href=&quot;https://www.star-history.com/?repos=virgiliojr94%2Fbook-to-skill&amp;amp;type=date&amp;amp;legend=top-left&quot;&gt; 
 &lt;picture&gt; 
  &lt;source media=&quot;(prefers-color-scheme: dark)&quot; srcset=&quot;https://api.star-history.com/chart?repos=virgiliojr94/book-to-skill&amp;amp;type=date&amp;amp;theme=dark&amp;amp;legend=top-left&quot; /&gt; 
  &lt;source media=&quot;(prefers-color-scheme: light)&quot; srcset=&quot;https://api.star-history.com/chart?repos=virgiliojr94/book-to-skill&amp;amp;type=date&amp;amp;legend=top-left&quot; /&gt; 
  &lt;img alt=&quot;Star History Chart&quot; src=&quot;https://api.star-history.com/chart?repos=virgiliojr94/book-to-skill&amp;amp;type=date&amp;amp;legend=top-left&quot; /&gt; 
 &lt;/picture&gt; &lt;/a&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/7088ad568c7dbbd42443b4509e019490afe385b15ffff8d02001158470b99ff4/virgiliojr94/book-to-skill" medium="image" />
      
    </item>
    
    <item>
      <title>huggingface/speech-to-speech</title>
      <link>https://github.com/huggingface/speech-to-speech</link>
      <description>&lt;p&gt;Build local voice agents with open-source models&lt;/p&gt;&lt;hr&gt;&lt;div align=&quot;center&quot;&gt; 
 &lt;div&gt;
  &amp;nbsp;
 &lt;/div&gt; 
 &lt;img src=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/logo.png&quot; width=&quot;600&quot; /&gt; 
 &lt;h1&gt;Speech To Speech: Build voice agents with open-source models&lt;/h1&gt; 
 &lt;p&gt;&lt;a href=&quot;https://pypi.org/project/speech-to-speech/&quot;&gt;&lt;img src=&quot;https://img.shields.io/pypi/v/speech-to-speech&quot; alt=&quot;PyPI&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://pypi.org/project/speech-to-speech/&quot;&gt;&lt;img src=&quot;https://img.shields.io/pypi/pyversions/speech-to-speech&quot; alt=&quot;Python&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/LICENSE&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/license-Apache%202.0-blue&quot; alt=&quot;License&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://trendshift.io/repositories/20645&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/GitHub%20Trending-%231%20Repository%20of%20the%20Day-7B2CBF?logo=github&amp;amp;logoColor=white&quot; alt=&quot;GitHub Trending: #1 Repository of the Day&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;/div&gt; 
&lt;p&gt;A low-latency, fully modular voice-agent pipeline: &lt;strong&gt;VAD -&amp;gt; STT -&amp;gt; LLM -&amp;gt; TTS&lt;/strong&gt;, exposed through an &lt;strong&gt;OpenAI Realtime-compatible WebSocket API&lt;/strong&gt;. Every component is swappable. The LLM slot speaks OpenAI-compatible protocols, so you can point it at a hosted provider, at &lt;a href=&quot;https://huggingface.co/inference-providers&quot;&gt;HF Inference Providers&lt;/a&gt;, or at a vLLM or llama.cpp server on your own hardware for a fully local, fully open stack.&lt;/p&gt; 
&lt;p&gt;This pipeline runs in production as the conversation backend for thousands of &lt;a href=&quot;https://huggingface.co/blog/reachy-mini&quot;&gt;Reachy Mini&lt;/a&gt; robots.&lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; 
 &lt;picture&gt; 
  &lt;source media=&quot;(prefers-color-scheme: dark)&quot; srcset=&quot;./docs/assets/endpoint-swap-dark.gif&quot; /&gt; 
  &lt;source media=&quot;(prefers-color-scheme: light)&quot; srcset=&quot;./docs/assets/endpoint-swap-light.gif&quot; /&gt; 
  &lt;img src=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/docs/assets/endpoint-swap-light.gif&quot; alt=&quot;Switching an OpenAI Realtime client endpoint from hosted OpenAI to a self-hosted speech-to-speech server&quot; width=&quot;640&quot; /&gt; 
 &lt;/picture&gt; &lt;/p&gt; 
&lt;h2&gt;Quickstart&lt;/h2&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install speech-to-speech
export OPENAI_API_KEY=...
speech-to-speech serve
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This starts an OpenAI Realtime-compatible server at &lt;code&gt;ws://localhost:8765/v1/realtime&lt;/code&gt; using Parakeet TDT for local STT, an OpenAI-compatible LLM, and Qwen3-TTS for local speech output.&lt;/p&gt; 
&lt;p&gt;Talk to it from a second terminal:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;speech-to-speech talk --url ws://127.0.0.1:8765/v1/realtime
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To start the server and packaged microphone/speaker client in one command:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;speech-to-speech local
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Prefer to keep the LLM on your own machine? Serve Gemma 4 with llama.cpp:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;llama-server -hf ggml-org/gemma-4-E4B-it-GGUF -np 2 -c 65536 -fa on --swa-full
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Then point the OpenAI-compatible LLM backend at it:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;speech-to-speech serve \
    --model_name &quot;ggml-org/gemma-4-E4B-it-GGUF&quot; \
    --responses_api_base_url &quot;http://127.0.0.1:8080/v1&quot; \
    --responses_api_api_key &quot;&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Any OpenAI Realtime-compatible client can connect. See &lt;a href=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/#realtime-api&quot;&gt;Realtime API&lt;/a&gt; for the protocol and &lt;a href=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/#llm-backends&quot;&gt;LLM backends&lt;/a&gt; for provider and local-server options.&lt;/p&gt; 
&lt;h2&gt;Index&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/#how-it-works&quot;&gt;How it works&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/#installation&quot;&gt;Installation&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/#offline-operation&quot;&gt;Offline operation&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/#supported-components&quot;&gt;Supported components&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/#commands&quot;&gt;Commands&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/#realtime-api&quot;&gt;Realtime API&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/#llm-backends&quot;&gt;LLM backends&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/#multi-language-support&quot;&gt;Multi-language support&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/#pocket-tts&quot;&gt;Pocket TTS&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/#cli-reference&quot;&gt;CLI reference&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/#contributing&quot;&gt;Contributing&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/#star-history&quot;&gt;Star history&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/#citations&quot;&gt;Citations&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;How it works&lt;/h2&gt; 
&lt;p&gt;The pipeline is a cascade of four components, each running in its own thread and connected by queues:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;strong&gt;Voice Activity Detection (VAD)&lt;/strong&gt;: &lt;a href=&quot;https://github.com/snakers4/silero-vad&quot;&gt;Silero VAD v5&lt;/a&gt; detects speech boundaries and turn-taking.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Speech to Text (STT)&lt;/strong&gt;: transcribes the user&#39;s turn, with optional live partial transcripts.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Language Model (LLM)&lt;/strong&gt;: generates the response, streaming text and tool calls.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Text to Speech (TTS)&lt;/strong&gt;: synthesizes audio and streams it back to the client.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;Every stage has multiple interchangeable backends, selected via CLI flags. The code is designed for easy modification, with a focus on models available through Transformers and the Hugging Face Hub.&lt;/p&gt; 
&lt;h2&gt;Installation&lt;/h2&gt; 
&lt;p&gt;Requires Python 3.10+.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install speech-to-speech
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The default install covers the standard realtime path:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Parakeet TDT for STT&lt;/li&gt; 
 &lt;li&gt;OpenAI-compatible API for the language model&lt;/li&gt; 
 &lt;li&gt;Qwen3-TTS for speech output, using the GGML backend by default on non-macOS platforms and &lt;code&gt;mlx-audio&lt;/code&gt; on Apple Silicon&lt;/li&gt; 
 &lt;li&gt;local audio and realtime server modes&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;macOS and non-macOS dependencies are resolved automatically via platform markers in &lt;code&gt;pyproject.toml&lt;/code&gt;.&lt;/p&gt; 
&lt;h3&gt;CUDA Note for Qwen3-TTS&lt;/h3&gt; 
&lt;p&gt;On Linux, the Qwen3-TTS GGML backend comes from &lt;code&gt;faster-qwen3-tts[ggml]&lt;/code&gt;. Its default &lt;code&gt;qwentts-cpp-python&lt;/code&gt; wheel on PyPI targets CUDA 12.8. If your machine does not have the CUDA 12 runtime that wheel expects, install the matching wheel from the Hugging Face wheelhouse before installing &lt;code&gt;speech-to-speech&lt;/code&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# CUDA 13.x
pip install &quot;qwentts-cpp-python==0.3.1+cu130&quot; \
  -f https://huggingface.co/datasets/andito/qwentts-cpp-python-wheels/tree/main/whl/cu130

# CUDA 12.4
pip install &quot;qwentts-cpp-python==0.3.1+cu124&quot; \
  -f https://huggingface.co/datasets/andito/qwentts-cpp-python-wheels/tree/main/whl/cu124

# CPU-only fallback
pip install &quot;qwentts-cpp-python==0.3.1+cpu&quot; \
  -f https://huggingface.co/datasets/andito/qwentts-cpp-python-wheels/tree/main/whl/cpu

pip install speech-to-speech
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To use the previous CUDA-graphs implementation instead of GGML, pass &lt;code&gt;--qwen3_tts_backend torch&lt;/code&gt;.&lt;/p&gt; 
&lt;h3&gt;Optional Components&lt;/h3&gt; 
&lt;p&gt;Optional components are installed with pip extras:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install &quot;speech-to-speech[kokoro]&quot;          # Kokoro-82M TTS on non-macOS
pip install &quot;speech-to-speech[pocket]&quot;          # Pocket TTS
pip install &quot;speech-to-speech[chattts]&quot;         # ChatTTS
pip install &quot;speech-to-speech[faster-whisper]&quot;  # Faster Whisper STT
pip install &quot;speech-to-speech[whisper-mlx]&quot;     # Lightning Whisper MLX STT on macOS
pip install &quot;speech-to-speech[paraformer]&quot;      # Paraformer STT through FunASR
pip install &quot;speech-to-speech[mlx-lm]&quot;          # mlx-vlm support for vision models on macOS
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Deprecated implementations, including MeloTTS, live in &lt;a href=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/archive&quot;&gt;&lt;code&gt;archive/&lt;/code&gt;&lt;/a&gt; and are no longer wired into the CLI.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Note on DeepFilterNet:&lt;/strong&gt; DeepFilterNet, used for optional audio enhancement in VAD, requires &lt;code&gt;numpy&amp;lt;2&lt;/code&gt; and conflicts with Pocket TTS, which requires &lt;code&gt;numpy&amp;gt;=2&lt;/code&gt;. Install it manually only in environments where you are not using Pocket TTS.&lt;/p&gt; 
&lt;h3&gt;From Source&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/huggingface/speech-to-speech.git
cd speech-to-speech
uv sync
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This installs the package in editable mode and makes the &lt;code&gt;speech-to-speech&lt;/code&gt; CLI available.&lt;/p&gt; 
&lt;h2&gt;Supported Components&lt;/h2&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Component&lt;/th&gt; 
   &lt;th&gt;Backend&lt;/th&gt; 
   &lt;th&gt;Platforms&lt;/th&gt; 
   &lt;th&gt;Install&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;VAD&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/snakers4/silero-vad&quot;&gt;Silero VAD v5&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;all&lt;/td&gt; 
   &lt;td&gt;built-in&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;STT&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://huggingface.co/nvidia/parakeet-tdt-0.6b-v3&quot;&gt;Parakeet TDT&lt;/a&gt; (default)&lt;/td&gt; 
   &lt;td&gt;CUDA / CPU through nano-parakeet, Apple Silicon through MLX&lt;/td&gt; 
   &lt;td&gt;built-in&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;STT&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://huggingface.co/docs/transformers/en/model_doc/whisper&quot;&gt;Whisper&lt;/a&gt; through Transformers&lt;/td&gt; 
   &lt;td&gt;CUDA / CPU&lt;/td&gt; 
   &lt;td&gt;built-in&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;STT&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/SYSTRAN/faster-whisper&quot;&gt;Faster Whisper&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;CUDA / CPU&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;faster-whisper&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;STT&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/mustafaaljadery/lightning-whisper-mlx&quot;&gt;Lightning Whisper MLX&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Apple Silicon&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;whisper-mlx&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;STT&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/huggingface/mlx-audio&quot;&gt;MLX Audio Whisper&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Apple Silicon&lt;/td&gt; 
   &lt;td&gt;built-in on macOS&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;STT&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/modelscope/FunASR&quot;&gt;Paraformer&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;CUDA / CPU&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;paraformer&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;LLM&lt;/td&gt; 
   &lt;td&gt;OpenAI-compatible API (&lt;code&gt;responses-api&lt;/code&gt;, &lt;code&gt;chat-completions&lt;/code&gt;)&lt;/td&gt; 
   &lt;td&gt;hosted providers or self-hosted servers&lt;/td&gt; 
   &lt;td&gt;built-in&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;LLM&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://huggingface.co/models?pipeline_tag=text-generation&amp;amp;sort=trending&quot;&gt;Transformers&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;CUDA / CPU&lt;/td&gt; 
   &lt;td&gt;built-in&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;LLM&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/ml-explore/mlx-lm&quot;&gt;mlx-lm&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Apple Silicon&lt;/td&gt; 
   &lt;td&gt;built-in on macOS&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;TTS&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://huggingface.co/Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice&quot;&gt;Qwen3-TTS&lt;/a&gt; (default)&lt;/td&gt; 
   &lt;td&gt;GGML / CUDA on Linux, mlx-audio on macOS&lt;/td&gt; 
   &lt;td&gt;built-in&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;TTS&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://huggingface.co/hexgrad/Kokoro-82M&quot;&gt;Kokoro-82M&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;CUDA / CPU, Apple Silicon&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;kokoro&lt;/code&gt; on non-macOS; built-in on macOS&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;TTS&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/kyutai-labs/pocket-tts&quot;&gt;Pocket TTS&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;CPU / CUDA&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;pocket&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;TTS&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/2noise/ChatTTS&quot;&gt;ChatTTS&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;CUDA / CPU&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;chattts&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;TTS&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://huggingface.co/docs/transformers/model_doc/mms&quot;&gt;MMS TTS&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;CUDA / CPU&lt;/td&gt; 
   &lt;td&gt;built-in&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;Select implementations with &lt;code&gt;--stt&lt;/code&gt;, &lt;code&gt;--llm_backend&lt;/code&gt;, and &lt;code&gt;--tts&lt;/code&gt;. The CLI constructs configuration only for the selected backends; known options for inactive backends remain accepted for compatibility but are ignored with a warning. JSON configuration may likewise include extra inactive-backend keys, which are ignored. Run &lt;code&gt;speech-to-speech serve -h&lt;/code&gt; for the defaults, or pass selectors before &lt;code&gt;-h&lt;/code&gt; to see another combination&#39;s backend-specific flags (for example, &lt;code&gt;speech-to-speech serve --stt mlx-audio-whisper -h&lt;/code&gt;).&lt;/p&gt; 
&lt;h2&gt;Commands&lt;/h2&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Command&lt;/th&gt; 
   &lt;th&gt;Behavior&lt;/th&gt; 
   &lt;th&gt;Use it when&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;serve&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Runs the pipeline server over OpenAI Realtime WebSocket and WebRTC.&lt;/td&gt; 
   &lt;td&gt;You are building an app or device against the API.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;talk --url &amp;lt;full-realtime-url&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Runs the packaged microphone/speaker client.&lt;/td&gt; 
   &lt;td&gt;You want to talk to an existing Realtime server.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;local&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Composes &lt;code&gt;serve&lt;/code&gt; and &lt;code&gt;talk&lt;/code&gt; in-process over loopback.&lt;/td&gt; 
   &lt;td&gt;You want to run the server and talk to it from one command.&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;&lt;code&gt;serve&lt;/code&gt; binds to &lt;code&gt;127.0.0.1&lt;/code&gt; by default; pass &lt;code&gt;--host 0.0.0.0&lt;/code&gt; explicitly for network exposure. &lt;code&gt;local&lt;/code&gt; always binds to loopback and connects the same packaged client at &lt;code&gt;ws://127.0.0.1:&amp;lt;port&amp;gt;/v1/realtime&lt;/code&gt;.&lt;/p&gt; 
&lt;h3&gt;Migrating from &lt;code&gt;--mode&lt;/code&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;code&gt;--mode&lt;/code&gt; is deprecated and will stop working soon. During this migration window, &lt;code&gt;speech-to-speech --mode realtime&lt;/code&gt; runs &lt;code&gt;speech-to-speech serve&lt;/code&gt;, and &lt;code&gt;speech-to-speech --mode local&lt;/code&gt; runs &lt;code&gt;speech-to-speech local&lt;/code&gt;; both print a warning. All other mode values have been removed and exit with guidance to use the new commands.&lt;/p&gt; 
&lt;h3&gt;Realtime Server&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;export OPENAI_API_KEY=...
speech-to-speech serve
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This is equivalent to:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;speech-to-speech serve \
    --thresh 0.6 \
    --stt parakeet-tdt \
    --llm_backend responses-api \
    --tts qwen3 \
    --qwen3_tts_model_name Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice \
    --qwen3_tts_speaker Aiden \
    --qwen3_tts_language auto \
    --qwen3_tts_backend ggml \
    --qwen3_tts_non_streaming_mode True \
    --qwen3_tts_mlx_quantization 6bit \
    --model_name gpt-5.4-mini \
    --chat_size 30 \
    --responses_api_stream \
    --enable_live_transcription
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The default model is &lt;code&gt;gpt-5.4-mini&lt;/code&gt; through the OpenAI Responses API. Override it with &lt;code&gt;--model_name&lt;/code&gt;, and set &lt;code&gt;--responses_api_base_url&lt;/code&gt; for another OpenAI-compatible provider or server.&lt;/p&gt; 
&lt;h3&gt;Local Mac&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;speech-to-speech local --mac-optimal-settings
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Optionally with a specific LLM:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;speech-to-speech local \
    --mac-optimal-settings \
    --model_name mlx-community/Qwen3-4B-Instruct-2507-bf16
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This setting:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Uses MPS defaults for supported model components.&lt;/li&gt; 
 &lt;li&gt;Sets Parakeet TDT for STT.&lt;/li&gt; 
 &lt;li&gt;Sets MLX LM as the LLM backend.&lt;/li&gt; 
 &lt;li&gt;Sets Qwen3-TTS for TTS, using &lt;code&gt;mlx-audio&lt;/code&gt; with the &lt;code&gt;6bit&lt;/code&gt; MLX variant by default.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;The preset supplies these as defaults only: explicit &lt;code&gt;--device&lt;/code&gt;, component-device flags such as &lt;code&gt;--qwen3_tts_device&lt;/code&gt;, and &lt;code&gt;--stt&lt;/code&gt;, &lt;code&gt;--llm_backend&lt;/code&gt;, &lt;code&gt;--model_name&lt;/code&gt;, and &lt;code&gt;--tts&lt;/code&gt; all win. Use it with &lt;code&gt;serve&lt;/code&gt; instead of &lt;code&gt;local&lt;/code&gt; when you want to expose the server without starting the microphone/speaker client.&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;--tts pocket&lt;/code&gt; and &lt;code&gt;--tts kokoro&lt;/code&gt; are also valid on macOS.&lt;/p&gt; 
&lt;p&gt;To compare the MLX quantization variants locally:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;python scripts/benchmark_tts.py \
    --handlers qwen3 \
    --iterations 3 \
    --qwen3_mlx_quantizations bf16 4bit 6bit 8bit
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Docker&lt;/h3&gt; 
&lt;p&gt;Install the &lt;a href=&quot;https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html&quot;&gt;NVIDIA Container Toolkit&lt;/a&gt;, then:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose up
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The compose file starts a llama.cpp server with Gemma 4 and the Realtime server, exposing ports &lt;code&gt;8080&lt;/code&gt; and &lt;code&gt;8765&lt;/code&gt;.&lt;/p&gt; 
&lt;h2&gt;Realtime API&lt;/h2&gt; 
&lt;p&gt;Realtime mode supports the OpenAI Realtime protocol over WebSocket and WebRTC, with live transcription and low-latency turn-taking. WebSocket clients connect at &lt;code&gt;/v1/realtime&lt;/code&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from openai import OpenAI

client = OpenAI(
    base_url=&quot;http://localhost:8765/v1&quot;,
    websocket_base_url=&quot;ws://localhost:8765/v1&quot;,
    api_key=&quot;not-needed&quot;,
)

with client.realtime.connect(model=&quot;local&quot;) as conn:
    conn.send(
        {
            &quot;type&quot;: &quot;session.update&quot;,
            &quot;session&quot;: {
                &quot;type&quot;: &quot;realtime&quot;,
                &quot;instructions&quot;: &quot;You are a helpful assistant.&quot;,
                &quot;audio&quot;: {
                    &quot;input&quot;: {
                        &quot;turn_detection&quot;: {
                            &quot;type&quot;: &quot;server_vad&quot;,
                            &quot;interrupt_response&quot;: True,
                        }
                    }
                },
            },
        }
    )

    for event in conn:
        print(event.type)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The server implements the core Realtime event set: &lt;code&gt;input_audio_buffer.append&lt;/code&gt;, &lt;code&gt;session.update&lt;/code&gt;, &lt;code&gt;conversation.item.create&lt;/code&gt;, &lt;code&gt;response.create&lt;/code&gt;, and &lt;code&gt;response.cancel&lt;/code&gt; inbound; speech start/stop, streaming transcription, audio deltas, tool calls, and &lt;code&gt;response.done&lt;/code&gt; outbound. The full event reference, architecture, and design details live in the &lt;a href=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/src/speech_to_speech/api/openai_realtime/README.md&quot;&gt;Realtime Engine README&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;LLM Proxy&lt;/h3&gt; 
&lt;p&gt;With &lt;code&gt;--enable_llm_proxy&lt;/code&gt;, the realtime server also exposes the remote LLM it is configured with as a plain OpenAI compatible endpoint, so a client can run side tasks (summaries, titles, background agents) with tools and streaming, fully concurrent with the voice conversation and never interrupted by new speech:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;POST /v1/chat/completions&lt;/code&gt; when running &lt;code&gt;--llm_backend chat-completions&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;POST /v1/responses&lt;/code&gt; when running &lt;code&gt;--llm_backend responses-api&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;The server performs no authentication and no throttling of its own. Enable the proxy only on a trusted network, or deploy the server behind a gateway that owns access control. The s2s-endpoint compute replica is such a gateway: it opens these paths only to clients that created their session with an HF token, checks the API key against that token, and applies a rate limit per user. Point the stock OpenAI SDK at whichever host you talk to; this server ignores the API key (a gateway in front decides what it must be):&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from openai import OpenAI

llm = OpenAI(base_url=&quot;http://localhost:8765/v1&quot;, api_key=&quot;unused&quot;)
completion = llm.chat.completions.create(
    model=&quot;anything&quot;,  # ignored: the server forces its configured --model_name
    messages=[{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;Summarize the conversation so far: ...&quot;}],
)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Requests are stateless (send the full message list each time) and are proxied to the configured upstream with the key held by the server, which never reaches clients. The &lt;code&gt;model&lt;/code&gt; field is always overwritten with the server configured &lt;code&gt;--model_name&lt;/code&gt;. The proxy is off by default, requires a remote backend (&lt;code&gt;chat-completions&lt;/code&gt; or &lt;code&gt;responses-api&lt;/code&gt;), and answers 501 with the reason otherwise.&lt;/p&gt; 
&lt;h2&gt;LLM Backends&lt;/h2&gt; 
&lt;p&gt;The LLM is the most compute-intensive and highest-latency component in the pipeline. A single forward pass through a large model can dominate end-to-end response time, so choosing the right backend for your hardware and latency budget matters. The pipeline supports:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Local inference&lt;/strong&gt;: &lt;code&gt;transformers&lt;/code&gt; on CUDA / CPU and &lt;code&gt;mlx-lm&lt;/code&gt; on Apple Silicon.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Self-hosted servers&lt;/strong&gt;: &lt;code&gt;responses-api&lt;/code&gt; and &lt;code&gt;chat-completions&lt;/code&gt; can point at a local &lt;a href=&quot;https://github.com/vllm-project/vllm&quot;&gt;vLLM&lt;/a&gt; or &lt;a href=&quot;https://github.com/ggerganov/llama.cpp&quot;&gt;llama.cpp&lt;/a&gt; server.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Provider APIs&lt;/strong&gt;: the same backends work with OpenAI, &lt;a href=&quot;https://huggingface.co/inference-providers&quot;&gt;HF Inference Providers&lt;/a&gt;, &lt;a href=&quot;https://openrouter.ai&quot;&gt;OpenRouter&lt;/a&gt;, and other OpenAI-compatible providers.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Two API backends are available, sharing the same &lt;code&gt;--responses_api_*&lt;/code&gt; connection flags:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;--llm_backend responses-api&lt;/code&gt; (default) targets &lt;code&gt;/v1/responses&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;--llm_backend chat-completions&lt;/code&gt; targets &lt;code&gt;/v1/chat/completions&lt;/code&gt;.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Direct Audio Input (No STT)&lt;/h3&gt; 
&lt;p&gt;Use &lt;code&gt;--stt none --llm_backend chat-completions&lt;/code&gt; to send each completed VAD audio segment directly to an audio-input model. Direct audio mode is not supported with &lt;code&gt;--llm_backend responses-api&lt;/code&gt;: a model may accept audio through &lt;code&gt;/v1/chat/completions&lt;/code&gt; without supporting &lt;code&gt;/v1/responses&lt;/code&gt;, including OpenAI&#39;s &lt;a href=&quot;https://developers.openai.com/api/docs/models/gpt-audio-1.5&quot;&gt;&lt;code&gt;gpt-audio-1.5&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;You must explicitly set &lt;code&gt;--model_name&lt;/code&gt; to a model that accepts audio: the default &lt;code&gt;gpt-5.4-mini&lt;/code&gt; accepts text and image input, but not audio. Check the provider&#39;s model documentation and endpoint support before enabling this mode. For OpenAI, see the &lt;a href=&quot;https://developers.openai.com/api/docs/models/gpt-5.4-mini&quot;&gt;GPT-5.4 mini model card&lt;/a&gt; and &lt;a href=&quot;https://developers.openai.com/api/docs/guides/audio#add-audio-to-your-existing-application&quot;&gt;audio-input guide&lt;/a&gt;.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;speech-to-speech serve \
    --stt none \
    --llm_backend chat-completions \
    --model_name &quot;YOUR_AUDIO_CAPABLE_MODEL&quot; \
    --responses_api_base_url &quot;https://provider.example/v1&quot; \
    --responses_api_api_key &quot;$PROVIDER_API_KEY&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;OpenAI-compatible servers represent input audio differently. Use &lt;code&gt;--responses_api_audio_content_type input_audio&lt;/code&gt; (the default) for embedded WAV base64, or &lt;code&gt;--responses_api_audio_content_type audio_url&lt;/code&gt; for a base64 data URL.&lt;/p&gt; 
&lt;p&gt;The examples below pair Parakeet TDT for local STT and Qwen3-TTS for local TTS with different LLM backends.&lt;/p&gt; 
&lt;h3&gt;Responses API Backend&lt;/h3&gt; 
&lt;p&gt;Works with any provider or server that implements the OpenAI Responses API. Point &lt;code&gt;--responses_api_base_url&lt;/code&gt; at the endpoint and set &lt;code&gt;--model_name&lt;/code&gt; accordingly:&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Provider / server&lt;/th&gt; 
   &lt;th&gt;&lt;code&gt;--responses_api_base_url&lt;/code&gt;&lt;/th&gt; 
   &lt;th&gt;&lt;code&gt;--responses_api_api_key&lt;/code&gt;&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;OpenAI&lt;/td&gt; 
   &lt;td&gt;omit, uses OpenAI default&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;$OPENAI_API_KEY&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;HF Inference Providers&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;https://router.huggingface.co/v1&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;$HF_TOKEN&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;OpenRouter&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;https://openrouter.ai/api/v1&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;$OPENROUTER_API_KEY&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;vLLM&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;http://localhost:8000/v1&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;omit or any string&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;llama.cpp&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;http://127.0.0.1:8080/v1&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;empty string&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# OpenAI
speech-to-speech local \
    --stt parakeet-tdt \
    --llm_backend responses-api \
    --tts qwen3 \
    --qwen3_tts_mlx_quantization 6bit \
    --model_name &quot;gpt-4o-mini&quot; \
    --responses_api_api_key &quot;$OPENAI_API_KEY&quot; \
    --responses_api_stream \
    --enable_live_transcription
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# HF Inference Providers: Qwen3.5-9B via Together
speech-to-speech local \
    --stt parakeet-tdt \
    --llm_backend responses-api \
    --tts qwen3 \
    --qwen3_tts_mlx_quantization 6bit \
    --model_name &quot;Qwen/Qwen3.5-9B:together&quot; \
    --responses_api_base_url &quot;https://router.huggingface.co/v1&quot; \
    --responses_api_api_key &quot;$HF_TOKEN&quot; \
    --responses_api_stream \
    --enable_live_transcription
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# HF Inference Providers: GPT-oss-20B via Groq
speech-to-speech serve \
    --stt parakeet-tdt \
    --llm_backend responses-api \
    --tts qwen3 \
    --qwen3_tts_mlx_quantization 6bit \
    --model_name &quot;openai/gpt-oss-20b:groq&quot; \
    --responses_api_base_url &quot;https://router.huggingface.co/v1&quot; \
    --responses_api_api_key &quot;$HF_TOKEN&quot; \
    --responses_api_stream \
    --enable_live_transcription
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Chat Completions Backend&lt;/h3&gt; 
&lt;p&gt;Identical configuration to &lt;code&gt;responses-api&lt;/code&gt;, reusing the same &lt;code&gt;--responses_api_*&lt;/code&gt; connection flags, but talks to &lt;code&gt;/v1/chat/completions&lt;/code&gt; instead of &lt;code&gt;/v1/responses&lt;/code&gt;. Prefer it when:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;the provider ignores &lt;code&gt;chat_template_kwargs.enable_thinking&lt;/code&gt; on the Responses path and needs a &lt;code&gt;reasoning_effort&lt;/code&gt; knob to suppress reasoning, or&lt;/li&gt; 
 &lt;li&gt;the server&#39;s Responses streaming tool-call path is unreliable, while its Chat Completions tool-call streaming is solid. This is useful for some vLLM builds; see &lt;a href=&quot;https://github.com/huggingface/speech-to-speech/issues/312&quot;&gt;#312&lt;/a&gt;.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Add &lt;code&gt;--responses_api_reasoning_effort none&lt;/code&gt; to disable reasoning on providers where the chat-template flag has no effect:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# vLLM serving a Qwen model with tool calling
speech-to-speech serve \
    --stt parakeet-tdt \
    --llm_backend chat-completions \
    --tts qwen3 \
    --model_name &quot;Qwen/Qwen3-4B-Instruct-2507&quot; \
    --responses_api_base_url &quot;http://localhost:8000/v1&quot; \
    --responses_api_stream
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Gemma 4 31B via the HF router on Cerebras, with reasoning disabled for low voice latency
speech-to-speech serve \
    --stt parakeet-tdt \
    --llm_backend chat-completions \
    --tts qwen3 \
    --model_name &quot;google/gemma-4-31B-it:cerebras&quot; \
    --responses_api_base_url &quot;https://router.huggingface.co/v1&quot; \
    --responses_api_api_key &quot;$HF_TOKEN&quot; \
    --responses_api_reasoning_effort none \
    --responses_api_stream
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Fully Local&lt;/h3&gt; 
&lt;p&gt;Run the LLM in a separate llama.cpp process for the lowest-friction fully local setup, as shown in the &lt;a href=&quot;https://huggingface.co/blog/local-reachy-mini-conversation&quot;&gt;Reachy Mini local conversation guide&lt;/a&gt;:&lt;/p&gt; 
&lt;p&gt;For a fully local native-audio setup with the browser demo, Realtime turn revisions, and barge-in, see the tested &lt;a href=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/examples/gemma4-12b-macos/README.md&quot;&gt;Gemma 4 12B speech-to-speech example for Apple Silicon&lt;/a&gt;.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Terminal 1: llama.cpp serving Gemma 4
llama-server -hf ggml-org/gemma-4-E4B-it-GGUF -np 2 -c 65536 -fa on --swa-full
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Terminal 2: speech-to-speech using that local LLM server
speech-to-speech serve \
    --stt parakeet-tdt \
    --llm_backend responses-api \
    --tts qwen3 \
    --model_name &quot;ggml-org/gemma-4-E4B-it-GGUF&quot; \
    --responses_api_base_url &quot;http://127.0.0.1:8080/v1&quot; \
    --responses_api_api_key &quot;&quot; \
    --responses_api_stream \
    --enable_live_transcription
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Use &lt;code&gt;speech-to-speech local&lt;/code&gt; when you want to run the same server and talk through the machine hosting it. In-process local backends are available with &lt;code&gt;--llm_backend mlx-lm&lt;/code&gt; on Apple Silicon or &lt;code&gt;--llm_backend transformers&lt;/code&gt; on CUDA / CPU.&lt;/p&gt; 
&lt;h2&gt;Offline Operation&lt;/h2&gt; 
&lt;p&gt;The pipeline can run without internet access after the dependencies and model assets for the selected components are installed locally. Before disconnecting, start the exact configuration once while online so it can cache the STT, LLM, TTS, Silero VAD, NLTK, and Smart Turn resources it needs.&lt;/p&gt; 
&lt;p&gt;For the lowest-friction fully local LLM setup, run llama.cpp on the same machine as described in &lt;a href=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/#fully-local&quot;&gt;Fully Local&lt;/a&gt;. Once llama.cpp and the pipeline assets are available locally, set &lt;code&gt;HF_HUB_OFFLINE=1&lt;/code&gt; when starting speech-to-speech to prevent Hugging Face Hub requests:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;HF_HUB_OFFLINE=1 speech-to-speech serve \
    --model_name &quot;ggml-org/gemma-4-E4B-it-GGUF&quot; \
    --responses_api_base_url &quot;http://127.0.0.1:8080/v1&quot; \
    --responses_api_api_key &quot;&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Without the local base URL override, the default &lt;code&gt;responses-api&lt;/code&gt; LLM backend calls a remote service. Alternatively, use an in-process local backend such as &lt;code&gt;transformers&lt;/code&gt; or &lt;code&gt;mlx-lm&lt;/code&gt;. Every selected model must already be cached or supplied through a local path supported by its backend.&lt;/p&gt; 
&lt;p&gt;Smart Turn uses a separate ONNX checkpoint. A cached checkpoint works with &lt;code&gt;HF_HUB_OFFLINE=1&lt;/code&gt;; for an explicit, cache-independent setup, pass &lt;code&gt;--smart_turn_model_path /path/to/smart-turn-v3.2-cpu.onnx&lt;/code&gt;. If the checkpoint is not available, pass &lt;code&gt;--no_smart_turn&lt;/code&gt; to disable Smart Turn.&lt;/p&gt; 
&lt;h2&gt;Multi-Language Support&lt;/h2&gt; 
&lt;p&gt;Language coverage depends on the STT and TTS backends you pick, not on the pipeline itself:&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Component&lt;/th&gt; 
   &lt;th&gt;Backend&lt;/th&gt; 
   &lt;th&gt;Languages&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;STT&lt;/td&gt; 
   &lt;td&gt;Parakeet TDT (default)&lt;/td&gt; 
   &lt;td&gt;25 European languages&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;STT&lt;/td&gt; 
   &lt;td&gt;Whisper / Whisper MLX / Faster Whisper&lt;/td&gt; 
   &lt;td&gt;Broad multilingual coverage, depending on the selected Whisper checkpoint&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;STT&lt;/td&gt; 
   &lt;td&gt;Paraformer&lt;/td&gt; 
   &lt;td&gt;Depends on the selected FunASR checkpoint; the default is Chinese-oriented&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;TTS&lt;/td&gt; 
   &lt;td&gt;Qwen3-TTS (default)&lt;/td&gt; 
   &lt;td&gt;Multilingual, with &lt;code&gt;--qwen3_tts_language auto&lt;/code&gt; by default&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;TTS&lt;/td&gt; 
   &lt;td&gt;Kokoro&lt;/td&gt; 
   &lt;td&gt;Multiple language/voice mappings, depending on backend availability&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;TTS&lt;/td&gt; 
   &lt;td&gt;ChatTTS&lt;/td&gt; 
   &lt;td&gt;English and Chinese&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;TTS&lt;/td&gt; 
   &lt;td&gt;MMS TTS&lt;/td&gt; 
   &lt;td&gt;Broad multilingual coverage through MMS checkpoints&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;Make sure the STT, LLM, and TTS you pair all cover your target language(s). Two usage patterns:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Single language&lt;/strong&gt;: set &lt;code&gt;--language&lt;/code&gt; to the target language code. The default is &lt;code&gt;en&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Language switching&lt;/strong&gt;: set &lt;code&gt;--language auto&lt;/code&gt;. The STT detects the language of each spoken prompt and forwards it to the LLM. Optionally add &lt;code&gt;--enable_lang_prompt&lt;/code&gt; to append a &quot;Please reply to my message in ...&quot; instruction. It defaults to &lt;code&gt;False&lt;/code&gt;; large LLMs usually infer the language from context, but the explicit instruction can help smaller models.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Automatic language detection:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;speech-to-speech serve \
    --stt parakeet-tdt \
    --language auto \
    --llm_backend mlx-lm \
    --model_name &quot;mlx-community/Qwen3-4B-Instruct-2507-bf16&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;A single non-English language, Chinese in this example:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;speech-to-speech serve \
    --stt whisper-mlx \
    --stt_model_name large-v3 \
    --language zh \
    --llm_backend mlx-lm \
    --model_name mlx-community/Qwen3-4B-Instruct-2507-bf16
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Both commands also work with &lt;code&gt;--mac-optimal-settings&lt;/code&gt;; explicit &lt;code&gt;--stt&lt;/code&gt; flags override the defaults it sets.&lt;/p&gt; 
&lt;h2&gt;Pocket TTS&lt;/h2&gt; 
&lt;p&gt;Pocket TTS from Kyutai Labs provides streaming TTS with voice cloning:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;speech-to-speech serve \
    --tts pocket \
    --pocket_tts_voice jean \
    --pocket_tts_device cpu
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Available voice presets: &lt;code&gt;alba&lt;/code&gt;, &lt;code&gt;marius&lt;/code&gt;, &lt;code&gt;javert&lt;/code&gt;, &lt;code&gt;jean&lt;/code&gt;, &lt;code&gt;fantine&lt;/code&gt;, &lt;code&gt;cosette&lt;/code&gt;, &lt;code&gt;eponine&lt;/code&gt;, &lt;code&gt;azelma&lt;/code&gt;. Custom voice files and Hugging Face paths also work.&lt;/p&gt; 
&lt;h2&gt;CLI Reference&lt;/h2&gt; 
&lt;p&gt;References for pipeline CLI arguments live in the &lt;a href=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/src/speech_to_speech/arguments_classes&quot;&gt;arguments classes&lt;/a&gt; and in &lt;code&gt;speech-to-speech serve -h&lt;/code&gt;. Client arguments are listed by &lt;code&gt;speech-to-speech talk -h&lt;/code&gt;.&lt;/p&gt; 
&lt;h3&gt;Module-Level Parameters&lt;/h3&gt; 
&lt;p&gt;See &lt;a href=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/src/speech_to_speech/arguments_classes/module_arguments.py&quot;&gt;ModuleArguments&lt;/a&gt;. It allows setting:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;a common &lt;code&gt;--device&lt;/code&gt;, if every part should run on the same device&lt;/li&gt; 
 &lt;li&gt;macOS model/device defaults (&lt;code&gt;--mac-optimal-settings&lt;/code&gt;)&lt;/li&gt; 
 &lt;li&gt;STT implementation (&lt;code&gt;--stt&lt;/code&gt;)&lt;/li&gt; 
 &lt;li&gt;LLM backend (&lt;code&gt;--llm_backend&lt;/code&gt;: &lt;code&gt;transformers&lt;/code&gt;, &lt;code&gt;mlx-lm&lt;/code&gt;, &lt;code&gt;responses-api&lt;/code&gt;, or &lt;code&gt;chat-completions&lt;/code&gt;)&lt;/li&gt; 
 &lt;li&gt;TTS implementation (&lt;code&gt;--tts&lt;/code&gt;)&lt;/li&gt; 
 &lt;li&gt;logging level&lt;/li&gt; 
 &lt;li&gt;realtime pipeline pool size (&lt;code&gt;--num_pipelines&lt;/code&gt;)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;VAD Parameters&lt;/h3&gt; 
&lt;p&gt;See &lt;a href=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/src/speech_to_speech/arguments_classes/vad_arguments.py&quot;&gt;VADHandlerArguments&lt;/a&gt;. Notable options:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;--thresh&lt;/code&gt;: threshold value to trigger voice activity detection.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;--min_speech_ms&lt;/code&gt;: minimum duration of detected voice activity to be considered speech.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;--min_speech_continuation_ms&lt;/code&gt;: sustain-bar hysteresis threshold for speech that continues a reopenable soft-ended, uncommitted turn within the reopen window. The default and recommended pairing is &lt;code&gt;--min_speech_ms 384 --min_speech_continuation_ms 192&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;--min_silence_ms&lt;/code&gt;: minimum length of silence intervals for segmenting speech. Default is 64 ms.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;--short_segment_merge_ms&lt;/code&gt;: optional merge window for stitching adjacent VAD segments that are each shorter than &lt;code&gt;--min_speech_ms&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;--speculative_reopen_ms&lt;/code&gt;: delay response commitment for 800 ms after a soft-ended turn so immediately resumed speech can reopen it.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;--unanswered_reopen_ms&lt;/code&gt;: sanity cap on how long a soft-ended speculative turn that has not yet received any assistant output stays reopenable. With Smart Turn enabled, this is clamped to at least &lt;code&gt;--smart_turn_max_wait_ms&lt;/code&gt; so a turn remains reopenable for its full grace.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Smart Turn endpointing&lt;/h3&gt; 
&lt;p&gt;&lt;a href=&quot;https://huggingface.co/pipecat-ai/smart-turn-v3&quot;&gt;Smart Turn v3.2&lt;/a&gt; can validate Silero&#39;s end-of-speech decisions using the content and prosody of the current turn. Silero finalizes the segment and STT/LLM work may begin speculatively. Complete turns start processing immediately and use &lt;code&gt;--speculative_reopen_ms&lt;/code&gt; (800 ms by default) before committing output. Incomplete turns wait &lt;code&gt;--smart_turn_incomplete_delay_ms&lt;/code&gt; (600 ms by default) before starting STT/LLM work, while their output remains gated by &lt;code&gt;--smart_turn_max_wait_ms&lt;/code&gt; (2 seconds by default). If speech resumes during either delay, the existing turn is reopened as a newer revision, the accumulated audio is re-emitted, and work from the previous revision is discarded before it reaches the user.&lt;/p&gt; 
&lt;p&gt;The base package includes the quantized CPU runtime and enables Smart Turn by default:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install speech-to-speech
speech-to-speech serve
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The latest supported v3.2 CPU checkpoint downloads from the Hugging Face Hub on first use. Pass &lt;code&gt;--smart_turn_model_path /path/to/model.onnx&lt;/code&gt; to use a local model, or &lt;code&gt;--no_smart_turn&lt;/code&gt; to disable Smart Turn. Smart Turn is enabled by default for server sessions and the packaged local client.&lt;/p&gt; 
&lt;p&gt;Tune the completion cutoff with &lt;code&gt;--smart_turn_threshold&lt;/code&gt; (default &lt;code&gt;0.5&lt;/code&gt;). A higher threshold makes ambiguous pauses more likely to use the longer speculative response grace.&lt;/p&gt; 
&lt;h3&gt;STT, LLM, and TTS Parameters&lt;/h3&gt; 
&lt;p&gt;&lt;code&gt;model_name&lt;/code&gt;, &lt;code&gt;torch_dtype&lt;/code&gt;, and &lt;code&gt;device&lt;/code&gt; are exposed for each STT, LLM, and TTS implementation. STT and TTS parameters use the handler prefix, for example &lt;code&gt;--stt_model_name&lt;/code&gt; or &lt;code&gt;--qwen3_tts_device&lt;/code&gt;. LLM model selection and chat settings are shared across backends via unprefixed flags, for example &lt;code&gt;--model_name&lt;/code&gt; and &lt;code&gt;--chat_size&lt;/code&gt;; backend-specific flags use the &lt;code&gt;responses_api_&lt;/code&gt; prefix for the &lt;code&gt;responses-api&lt;/code&gt; and &lt;code&gt;chat-completions&lt;/code&gt; backends and the &lt;code&gt;llm_&lt;/code&gt; prefix for local backends.&lt;/p&gt; 
&lt;p&gt;For example:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Local transformers/mlx-lm backend
--model_name google/gemma-2b-it

# OpenAI-compatible backend
--llm_backend responses-api --model_name deepseek-chat --responses_api_base_url https://api.deepseek.com
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Generation Parameters&lt;/h3&gt; 
&lt;p&gt;Other generation parameters can be set using the handler prefix plus &lt;code&gt;_gen_&lt;/code&gt;, for example &lt;code&gt;--stt_gen_max_new_tokens 128&lt;/code&gt; or &lt;code&gt;--llm_gen_temperature 0.7&lt;/code&gt;. Parameters not yet exposed can be added to the relevant arguments class.&lt;/p&gt; 
&lt;h2&gt;Contributing&lt;/h2&gt; 
&lt;p&gt;Issues and PRs are welcome. Good starting points are the &lt;a href=&quot;https://github.com/huggingface/speech-to-speech/issues&quot;&gt;open issues&lt;/a&gt;. For larger changes, open an issue first to discuss the approach.&lt;/p&gt; 
&lt;p&gt;For local development:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;uv sync
pytest
ruff check
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Star History&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/huggingface/speech-to-speech/stargazers&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/assets/star-history.svg?sanitize=true&quot; alt=&quot;Star History Chart&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;Citations&lt;/h2&gt; 
&lt;p&gt;If you use this pipeline, please also cite the component models you run. The defaults are:&lt;/p&gt; 
&lt;h3&gt;Silero VAD&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bibtex&quot;&gt;@misc{SileroVAD,
  author = {Silero Team},
  title = {Silero VAD: pre-trained enterprise-grade Voice Activity Detector (VAD), Number Detector and Language Classifier},
  year = {2021},
  publisher = {GitHub},
  journal = {GitHub repository},
  howpublished = {\url{https://github.com/snakers4/silero-vad}},
  email = {hello@silero.ai}
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Parakeet TDT&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bibtex&quot;&gt;@misc{parakeet-tdt,
  author = {NVIDIA},
  title = {Parakeet TDT 0.6B v3},
  publisher = {Hugging Face},
  howpublished = {\url{https://huggingface.co/nvidia/parakeet-tdt-0.6b-v3}}
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Qwen3-TTS&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bibtex&quot;&gt;@misc{qwen3-tts,
  author = {Qwen Team},
  title = {Qwen3-TTS},
  publisher = {Hugging Face},
  howpublished = {\url{https://huggingface.co/Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice}}
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Citations for optional backends such as Kokoro, Pocket TTS, ChatTTS, Whisper variants, Paraformer, and MMS live in the respective &lt;a href=&quot;https://raw.githubusercontent.com/huggingface/speech-to-speech/main/src/speech_to_speech&quot;&gt;component READMEs&lt;/a&gt;.&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/69fb3e3238728b81365081e8092c423947666532140763c31ae58da308997838/huggingface/speech-to-speech" medium="image" />
      
    </item>
    
    <item>
      <title>bradautomates/claude-video</title>
      <link>https://github.com/bradautomates/claude-video</link>
      <description>&lt;p&gt;Give Claude the ability to watch any video. /watch downloads, extracts frames, transcribes, hands it all to Claude.&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;/watch&lt;/h1&gt; 
&lt;p&gt;&lt;strong&gt;Give Claude the ability to watch any video.&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;Claude Code (recommended — auto-updates via marketplace):&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/plugin marketplace add bradautomates/claude-video
/plugin install watch@claude-video
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Codex, Cursor, Copilot, Gemini CLI, or any of 50+ &lt;a href=&quot;https://agentskills.io&quot;&gt;Agent Skills&lt;/a&gt; hosts:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npx skills add bradautomates/claude-video -g
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;(&lt;code&gt;-g&lt;/code&gt; installs globally for your user, available across all projects. Drop it to scope per-project.)&lt;/p&gt; 
&lt;p&gt;More install options (&lt;a href=&quot;http://claude.ai&quot;&gt;claude.ai&lt;/a&gt; web, manual) in the &lt;a href=&quot;https://raw.githubusercontent.com/bradautomates/claude-video/main/#install&quot;&gt;Install&lt;/a&gt; section below.&lt;/p&gt; 
&lt;p&gt;Zero config to start — &lt;code&gt;yt-dlp&lt;/code&gt; and &lt;code&gt;ffmpeg&lt;/code&gt; install on first run via &lt;code&gt;brew&lt;/code&gt; on macOS (Linux/Windows print exact commands). Captions cover most public videos for free. Whisper API key is only needed when a video has no captions.&lt;/p&gt; 
&lt;hr /&gt; 
&lt;p&gt;Claude can read a webpage, run a script, browse a repo. What it can&#39;t do, out of the box, is &lt;em&gt;watch a video&lt;/em&gt;. You paste a YouTube link and it has to either guess from the title or pull a transcript that&#39;s missing 90% of what&#39;s on screen.&lt;/p&gt; 
&lt;p&gt;With Claude Video &lt;code&gt;/watch&lt;/code&gt; you can paste a URL or a local path, ask a question, and Claude fetches captions first, downloads only what it needs, extracts frames (scene-aware, or fast keyframes at &lt;code&gt;efficient&lt;/code&gt; detail), pulls a timestamped transcript (free captions when available, Whisper API as fallback), and &lt;code&gt;Read&lt;/code&gt;s every frame as an image. By the time it answers, it has &lt;em&gt;seen&lt;/em&gt; the video and &lt;em&gt;heard&lt;/em&gt; the audio.&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/watch https://youtu.be/dQw4w9WgXcQ what happens at the 30 second mark?
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;What people actually use it for&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Analyze someone else&#39;s content.&lt;/strong&gt; &lt;code&gt;/watch https://youtu.be/&amp;lt;viral-video&amp;gt; what hook did they open with?&lt;/code&gt; Claude looks at the first frames, reads the opening transcript, breaks down the structure. Same for ad creative, competitor launches, podcast intros, anything where the &lt;em&gt;how&lt;/em&gt; matters as much as the &lt;em&gt;what&lt;/em&gt;.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Diagnose a bug from a video.&lt;/strong&gt; Someone sends you a screen recording of something broken. &lt;code&gt;/watch bug-repro.mov what&#39;s going wrong?&lt;/code&gt; Claude watches the recording, finds the frame where the issue appears, describes what&#39;s on screen, often catches the cause without you ever opening the file.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Summarize a video.&lt;/strong&gt; &lt;code&gt;/watch https://youtu.be/&amp;lt;long-thing&amp;gt; summarize this&lt;/code&gt; does the obvious thing — pulls the structure, the key moments, what was actually said and shown. Faster than watching at 2x.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Cut the hype out of an update video.&lt;/strong&gt; &lt;code&gt;/watch https://youtu.be/&amp;lt;launch-video&amp;gt; what&#39;s actually new — skip the hype&lt;/code&gt; Strip a &quot;game-changer&quot; feature drop down to the few things that matter, so you get the substance without ten minutes of intro and overselling.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Turn a playlist into notes.&lt;/strong&gt; &lt;code&gt;/watch https://youtu.be/&amp;lt;video&amp;gt; summarize this to a note&lt;/code&gt; Run it across a series and file a per-video summary, so a channel or course becomes a searchable set of notes instead of hours you have to sit through.&lt;/p&gt; 
&lt;h2&gt;How it works&lt;/h2&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;strong&gt;You paste a video and a question.&lt;/strong&gt; URL (anything yt-dlp supports — YouTube, Loom, TikTok, X, Instagram, plus a few hundred more) or a local path (&lt;code&gt;.mp4&lt;/code&gt;, &lt;code&gt;.mov&lt;/code&gt;, &lt;code&gt;.mkv&lt;/code&gt;, &lt;code&gt;.webm&lt;/code&gt;).&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;code&gt;yt-dlp&lt;/code&gt; checks captions first.&lt;/strong&gt; At &lt;code&gt;transcript&lt;/code&gt; detail, captioned URLs return without downloading video. Otherwise, or when Whisper needs audio, it downloads only what the run needs.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;code&gt;ffmpeg&lt;/code&gt; extracts frames at the chosen detail.&lt;/strong&gt; &lt;code&gt;efficient&lt;/code&gt; decodes keyframes only (near-instant); &lt;code&gt;balanced&lt;/code&gt;/&lt;code&gt;token-burner&lt;/code&gt; prefer scene-change frames and fall back to the duration-aware uniform sampler when they under-produce. JPEGs are 512px wide by default and clamped to 1998px tall for Claude Read compatibility.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;The transcript comes from one of two places.&lt;/strong&gt; First try: &lt;code&gt;yt-dlp&lt;/code&gt; pulls native captions (manual or auto-generated) from the source. Free, instant, accurate-ish. Fallback: extract a mono 16 kHz 64 kbps mp3 audio clip (~480 kB/min) and ship it to Whisper — Groq&#39;s &lt;code&gt;whisper-large-v3&lt;/code&gt; (preferred — cheaper and faster) or OpenAI&#39;s &lt;code&gt;whisper-1&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Frames + transcript are handed to Claude.&lt;/strong&gt; The script prints frame paths with &lt;code&gt;t=MM:SS&lt;/code&gt; markers and the transcript with timestamps. Claude &lt;code&gt;Read&lt;/code&gt;s each frame in parallel — JPEGs render directly as images in its context.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Claude answers grounded in what&#39;s actually on screen and in the audio.&lt;/strong&gt; Not &quot;based on the description&quot; or &quot;according to the title.&quot; It saw the frames. It heard the transcript. It answers the way someone who watched the video would.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Cleanup.&lt;/strong&gt; The script prints a working directory at the end. If you&#39;re not asking follow-ups, Claude removes it.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;h2&gt;Frame budget — why it matters&lt;/h2&gt; 
&lt;p&gt;Token cost is dominated by frames. Every frame is an image; image tokens add up fast. The script&#39;s auto-fps logic exists so you don&#39;t blow your context budget on a sparse scan of a 30-minute video that would have been better answered by a focused 30-second window.&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Duration&lt;/th&gt; 
   &lt;th&gt;Default frame budget&lt;/th&gt; 
   &lt;th&gt;What you get&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;≤30 s&lt;/td&gt; 
   &lt;td&gt;~30 frames&lt;/td&gt; 
   &lt;td&gt;Dense — basically every key moment&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;30 s - 1 min&lt;/td&gt; 
   &lt;td&gt;~40 frames&lt;/td&gt; 
   &lt;td&gt;Still dense&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;1 - 3 min&lt;/td&gt; 
   &lt;td&gt;~60 frames&lt;/td&gt; 
   &lt;td&gt;Comfortable&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;3 - 10 min&lt;/td&gt; 
   &lt;td&gt;~80 frames&lt;/td&gt; 
   &lt;td&gt;Sparse but workable&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&amp;gt; 10 min&lt;/td&gt; 
   &lt;td&gt;100 frames (capped modes)&lt;/td&gt; 
   &lt;td&gt;&quot;Sparse scan&quot; warning — re-run focused, or &lt;code&gt;--detail token-burner&lt;/code&gt; for full uncapped coverage&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;When the user names a moment (&quot;around 2:30&quot;, &quot;the last 30 seconds&quot;, &quot;from 0:45 to 1:00&quot;), pass &lt;code&gt;--start&lt;/code&gt; / &lt;code&gt;--end&lt;/code&gt;. Focused mode gets denser per-second budgets, capped at 2 fps. Far more useful than a sparse pass over the whole thing.&lt;/p&gt; 
&lt;h2&gt;Frame deduplication&lt;/h2&gt; 
&lt;p&gt;Frame selection — keyframes (&lt;code&gt;efficient&lt;/code&gt;), scene-change detection (&lt;code&gt;balanced&lt;/code&gt;/&lt;code&gt;token-burner&lt;/code&gt;), or the uniform sampler it falls back to — can still surface near-identical frames: a screen recording that holds one slide for 90 seconds produces a dozen, each billed as a separate image. A dedup pass drops them before frames reach Claude. It runs by default on every frame mode (&lt;code&gt;--no-dedup&lt;/code&gt; turns it off):&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;One &lt;code&gt;ffmpeg&lt;/code&gt; call scales each extracted JPEG to a 16×16 grayscale thumbnail. Everything after is pure-stdlib Python — no image libraries.&lt;/li&gt; 
 &lt;li&gt;For each frame, compute the &lt;strong&gt;mean absolute difference&lt;/strong&gt; against the &lt;em&gt;last frame that was kept&lt;/em&gt; (average per-pixel brightness change, 0–255 scale).&lt;/li&gt; 
 &lt;li&gt;If that difference is at or below the threshold (&lt;code&gt;2.0&lt;/code&gt;), the frame is a near-duplicate and is dropped. Otherwise it&#39;s kept and becomes the new reference.&lt;/li&gt; 
 &lt;li&gt;The frame-budget cap applies &lt;em&gt;after&lt;/em&gt; dedup, so the budget is spent on distinct frames.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;Comparing against the last &lt;em&gt;kept&lt;/em&gt; frame (not the previous one) catches slow fades that never trip a frame-to-frame threshold. The threshold is deliberately low and measures absolute brightness rather than structure, so a one-line code diff, a terminal scrolling a row, or two differently-colored flat slides all survive.&lt;/p&gt; 
&lt;p&gt;The &lt;strong&gt;Frames&lt;/strong&gt; line reports what was collapsed, e.g. &lt;code&gt;6 selected from 14 candidates (… 8 near-duplicates dropped …)&lt;/code&gt;. On always-moving footage nothing is dropped and you pay what you would have anyway.&lt;/p&gt; 
&lt;h2&gt;Detail modes — measured&lt;/h2&gt; 
&lt;p&gt;The &lt;code&gt;--detail&lt;/code&gt; dial trades speed and token cost for visual fidelity. Numbers below are from a real run against a &lt;strong&gt;49:08&lt;/strong&gt; YouTube video (1280×720, English auto-captions) — a long, mostly-static screen recording, the case that stresses the caps hardest. Extraction times are local CPU against a pre-downloaded copy; the one-time download was &lt;strong&gt;~37 s&lt;/strong&gt; / 76 MB, shared by the three frame modes.&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Mode&lt;/th&gt; 
   &lt;th&gt;Engine&lt;/th&gt; 
   &lt;th&gt;Frames&lt;/th&gt; 
   &lt;th&gt;Cap&lt;/th&gt; 
   &lt;th&gt;Extraction time&lt;/th&gt; 
   &lt;th&gt;Temporal coverage&lt;/th&gt; 
   &lt;th&gt;Est. image tokens&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;transcript&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;none (captions)&lt;/td&gt; 
   &lt;td&gt;0&lt;/td&gt; 
   &lt;td&gt;—&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;~4.5 s&lt;/strong&gt; (one yt-dlp call, no download)&lt;/td&gt; 
   &lt;td&gt;full (text)&lt;/td&gt; 
   &lt;td&gt;0 (≈26.6k text tokens)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;efficient&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;keyframe (&lt;code&gt;-skip_frame nokey&lt;/code&gt;)&lt;/td&gt; 
   &lt;td&gt;50&lt;/td&gt; 
   &lt;td&gt;50&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;~0.5 s&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;0:00 → 49:04 (full)&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;~9.8k&lt;/strong&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;balanced&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;scene-change&lt;/td&gt; 
   &lt;td&gt;100&lt;/td&gt; 
   &lt;td&gt;100&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;~20.9 s&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;0:00 → 48:38 (full)&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;~19.7k&lt;/strong&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;token-burner&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;scene-change&lt;/td&gt; 
   &lt;td&gt;116&lt;/td&gt; 
   &lt;td&gt;uncapped&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;~21.0 s&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;0:00 → 48:38 (full)&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;~22.8k&lt;/strong&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Image tokens&lt;/strong&gt; use Anthropic&#39;s &lt;code&gt;(width × height) / 750&lt;/code&gt; — at the default 512px width these 720p frames are 512×288, &lt;strong&gt;≈197 tokens/frame&lt;/strong&gt;; &lt;code&gt;--resolution 1024&lt;/code&gt; roughly 4×s that. The transcript is surfaced in every captioned mode and on long videos is often the larger cost.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;One sampling rule across frame modes.&lt;/strong&gt; Each detects all candidates across the full range, then even-samples (first + last always kept) down to its cap. The modes differ only in candidate &lt;em&gt;source&lt;/em&gt; (keyframes vs. scene cuts) and cap, never in how coverage is spread — so the last frame always lands at the end, not partway through.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;code&gt;efficient&lt;/code&gt; is the speed tier&lt;/strong&gt; (~0.5 s) — it only reconstructs keyframes, so it&#39;s ~40× faster than the scene modes, which decode every frame to find cuts. It can also return &lt;em&gt;more&lt;/em&gt; frames than &lt;code&gt;balanced&lt;/code&gt; on low-motion footage (keyframes outnumber scene cuts); &quot;efficient&quot; means fast extraction, not fewer frames.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;code&gt;token-burner&lt;/code&gt; only diverges from &lt;code&gt;balanced&lt;/code&gt; past the cap.&lt;/strong&gt; This clip had 116 cuts, so &lt;code&gt;balanced&lt;/code&gt; sampled 100 and &lt;code&gt;token-burner&lt;/code&gt; kept all 116. On high-motion video with hundreds of cuts, &lt;code&gt;token-burner&lt;/code&gt; keeps everything (and trips the &amp;gt;250-frame token warning) while &lt;code&gt;balanced&lt;/code&gt; thins to 100.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;End-to-end from a cold URL, &lt;code&gt;transcript&lt;/code&gt; is the cheapest mode by far; the frame modes add the shared ~37 s download on top of the extraction times above.&lt;/p&gt; 
&lt;h2&gt;Install&lt;/h2&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Surface&lt;/th&gt; 
   &lt;th&gt;Install&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/plugin marketplace add bradautomates/claude-video&lt;/code&gt; then &lt;code&gt;/plugin install watch@claude-video&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Codex, Cursor, Copilot, Gemini CLI, +50 more&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;npx skills add bradautomates/claude-video -g&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;&lt;a href=&quot;http://claude.ai&quot;&gt;claude.ai&lt;/a&gt;&lt;/strong&gt; (web)&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/bradautomates/claude-video/releases/latest&quot;&gt;Download &lt;code&gt;watch.skill&lt;/code&gt;&lt;/a&gt; → Settings → Capabilities → Skills → &lt;code&gt;+&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Manual / dev&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;git clone&lt;/code&gt; then symlink &lt;code&gt;skills/watch&lt;/code&gt; into your host&#39;s skills dir (see below)&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h3&gt;Claude Code&lt;/h3&gt; 
&lt;pre&gt;&lt;code&gt;/plugin marketplace add bradautomates/claude-video
/plugin install watch@claude-video
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Update later with &lt;code&gt;/plugin update watch@claude-video&lt;/code&gt;.&lt;/p&gt; 
&lt;h3&gt;Codex, Cursor, Copilot, Gemini CLI, and 50+ other hosts&lt;/h3&gt; 
&lt;p&gt;The &lt;a href=&quot;https://agentskills.io&quot;&gt;Agent Skills&lt;/a&gt; CLI installs the skill into whatever agents it detects:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npx skills add bradautomates/claude-video -g
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;-g&lt;/code&gt; installs globally for your user (&lt;code&gt;~/.codex/skills&lt;/code&gt;, &lt;code&gt;~/.cursor/skills&lt;/code&gt;, etc.); drop it to install into the current project instead. Useful flags:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;-a, --agent &amp;lt;names…&amp;gt;&lt;/code&gt; — target specific hosts, e.g. &lt;code&gt;-a codex -a cursor&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;-l, --list&lt;/code&gt; — list the skills in this repo without installing&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;--copy&lt;/code&gt; — copy files instead of symlinking (for filesystems without symlink support)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;The CLI discovers the skill from &lt;code&gt;skills/watch/SKILL.md&lt;/code&gt; and copies the whole folder — &lt;code&gt;SKILL.md&lt;/code&gt; plus its &lt;code&gt;scripts/&lt;/code&gt; runtime — as a self-contained unit. &lt;code&gt;SKILL.md&lt;/code&gt; resolves its own scripts relative to wherever it was installed, so it works the same on every host.&lt;/p&gt; 
&lt;p&gt;Update later with &lt;code&gt;npx skills update watch -g&lt;/code&gt;.&lt;/p&gt; 
&lt;h3&gt;&lt;a href=&quot;http://claude.ai&quot;&gt;claude.ai&lt;/a&gt; (web)&lt;/h3&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/bradautomates/claude-video/releases/latest&quot;&gt;Download &lt;code&gt;watch.skill&lt;/code&gt;&lt;/a&gt; from the latest release.&lt;/li&gt; 
 &lt;li&gt;Go to Settings → Capabilities → Skills.&lt;/li&gt; 
 &lt;li&gt;Click &lt;code&gt;+&lt;/code&gt; and drop the file in.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;Enable &quot;Code execution and file creation&quot; under Capabilities first — the skill shells out to &lt;code&gt;ffmpeg&lt;/code&gt; and &lt;code&gt;yt-dlp&lt;/code&gt;, so it won&#39;t run without it.&lt;/p&gt; 
&lt;h3&gt;Manual (developer)&lt;/h3&gt; 
&lt;p&gt;Clone the repo and symlink the self-contained skill folder into your host&#39;s skills directory — the symlink keeps the install in sync with your working tree as you edit:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/bradautomates/claude-video.git
ln -s &quot;$(pwd)/claude-video/skills/watch&quot; ~/.claude/skills/watch   # or ~/.codex/skills/watch
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;For &lt;a href=&quot;http://claude.ai&quot;&gt;claude.ai&lt;/a&gt;, build the &lt;code&gt;.skill&lt;/code&gt; bundle from source: &lt;code&gt;bash skills/watch/scripts/build-skill.sh&lt;/code&gt; produces &lt;code&gt;dist/watch.skill&lt;/code&gt;.&lt;/p&gt; 
&lt;h2&gt;First run&lt;/h2&gt; 
&lt;p&gt;On the first &lt;code&gt;/watch&lt;/code&gt; call, the skill runs &lt;code&gt;scripts/setup.py --check&lt;/code&gt;. If &lt;code&gt;ffmpeg&lt;/code&gt; / &lt;code&gt;yt-dlp&lt;/code&gt; aren&#39;t on your PATH, or no Whisper API key is set, it walks you through fixing it:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;macOS&lt;/strong&gt; — auto-runs &lt;code&gt;brew install ffmpeg yt-dlp&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Linux&lt;/strong&gt; — prints the exact &lt;code&gt;apt&lt;/code&gt; / &lt;code&gt;dnf&lt;/code&gt; / &lt;code&gt;pipx&lt;/code&gt; commands.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Windows&lt;/strong&gt; — prints the &lt;code&gt;winget&lt;/code&gt; / &lt;code&gt;pip&lt;/code&gt; commands.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;API key&lt;/strong&gt; — scaffolds &lt;code&gt;~/.config/watch/.env&lt;/code&gt; (mode &lt;code&gt;0600&lt;/code&gt;) with commented placeholders for &lt;code&gt;GROQ_API_KEY&lt;/code&gt; (preferred) and &lt;code&gt;OPENAI_API_KEY&lt;/code&gt;.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;After setup, preflight is silent and &lt;code&gt;/watch&lt;/code&gt; just works. The check is a sub-100ms lookup, so it doesn&#39;t slow you down on subsequent runs.&lt;/p&gt; 
&lt;h2&gt;Bring your own keys&lt;/h2&gt; 
&lt;p&gt;Captions cover the majority of public videos for free. The Whisper fallback only kicks in when a video genuinely has no caption track — typically local files, TikToks, some Vimeos, and the occasional caption-less YouTube upload.&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Capability&lt;/th&gt; 
   &lt;th&gt;What you need&lt;/th&gt; 
   &lt;th&gt;Cost&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Download + native captions&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;yt-dlp&lt;/code&gt; + &lt;code&gt;ffmpeg&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Free&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Whisper fallback (preferred)&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://console.groq.com/keys&quot;&gt;Groq API key&lt;/a&gt; — &lt;code&gt;whisper-large-v3&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Cheap, fast&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Whisper fallback (alt)&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://platform.openai.com/api-keys&quot;&gt;OpenAI API key&lt;/a&gt; — &lt;code&gt;whisper-1&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Standard pricing&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Disable Whisper entirely&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;--no-whisper&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Free, frames-only when no captions&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h2&gt;Usage&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;/watch https://youtu.be/dQw4w9WgXcQ what happens at the 30 second mark?
/watch https://www.tiktok.com/@user/video/123 summarize this
/watch ~/Movies/screen-recording.mp4 when does the UI break?
/watch https://vimeo.com/123 what tools does she mention?
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Focused on a specific section — denser frame budget, lower token cost:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/watch https://youtu.be/abc --start 2:15 --end 2:45
/watch video.mp4 --start 50 --end 60
/watch &quot;$URL&quot; --start 1:12:00            # from 1h12m to end
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Other knobs (passed to &lt;code&gt;scripts/watch.py&lt;/code&gt;):&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;--detail transcript|efficient|balanced|token-burner&lt;/code&gt; — fidelity/speed dial. &lt;code&gt;transcript&lt;/code&gt; skips frames (transcript only); &lt;code&gt;efficient&lt;/code&gt; uses fast keyframes (cap 50); &lt;code&gt;balanced&lt;/code&gt; uses scene-aware frames (cap 100); &lt;code&gt;token-burner&lt;/code&gt; is scene-aware and uncapped.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;--timestamps T1,T2,…&lt;/code&gt; — grab a frame at each absolute timestamp (&lt;code&gt;SS&lt;/code&gt;/&lt;code&gt;MM:SS&lt;/code&gt;/&lt;code&gt;HH:MM:SS&lt;/code&gt;). Claude reads the transcript first, then targets the moments the presenter flags (&quot;look here&quot;, &quot;as you can see&quot;). Added on top of the detail frames (reserved against the cap); out-of-window cues are dropped in focus mode; with &lt;code&gt;--detail transcript&lt;/code&gt; these become the only frames.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;--max-frames N&lt;/code&gt; — lower the frame cap for a tighter token budget.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;--resolution W&lt;/code&gt; — bump frame width to 1024 px when Claude needs to read on-screen text (slides, terminals, code).&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;--fps F&lt;/code&gt; — override the auto-fps calculation (still capped at 2 fps).&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;--whisper groq|openai&lt;/code&gt; — force a specific Whisper backend.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;--no-whisper&lt;/code&gt; — disable transcription entirely; frames only.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;--no-dedup&lt;/code&gt; — keep near-duplicate frames. By default a frame-delta pass drops frames that are visually near-identical to the one before them (held slides, static screen recordings, paused video), so the frame budget is spent on distinct content; this flag turns that off.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;--out-dir DIR&lt;/code&gt; — keep working files somewhere specific (default: auto-generated tmp dir).&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Limits&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Long-video accuracy depends on the detail mode.&lt;/strong&gt; On the capped modes (&lt;code&gt;efficient&lt;/code&gt;, default &lt;code&gt;balanced&lt;/code&gt;) coverage thins out past ~10 minutes — the frame cap spreads across the whole clip, so the script prints a &quot;sparse scan&quot; warning and you&#39;re better off re-running focused with &lt;code&gt;--start&lt;/code&gt;/&lt;code&gt;--end&lt;/code&gt;. &lt;code&gt;token-burner&lt;/code&gt; lifts the cap and keeps &lt;em&gt;every&lt;/em&gt; scene-change frame across the full video, so it stays complete on longer clips at the cost of more image tokens. The 10-minute mark is guidance for the capped modes, not a hard ceiling.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Detail is one dial.&lt;/strong&gt; Defaults are balanced: scene-aware frames, 2 fps max, 100-frame cap. Use &lt;code&gt;--detail efficient&lt;/code&gt; for a fast 50-frame keyframe pass, or &lt;code&gt;--detail token-burner&lt;/code&gt; for uncapped scene candidates. Set &lt;code&gt;WATCH_DETAIL&lt;/code&gt; in &lt;code&gt;~/.config/watch/.env&lt;/code&gt; to change the default.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Structure&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;.
├── skills/watch/                 # self-contained skill — copied as a unit by every installer
│   ├── SKILL.md                  # skill contract — the source of truth across all surfaces
│   └── scripts/
│       ├── watch.py              # entry point — orchestrates download → frames → transcript
│       ├── download.py           # yt-dlp wrapper
│       ├── frames.py             # ffmpeg frame extraction + auto-fps logic
│       ├── transcribe.py         # VTT parsing + dedupe + Whisper orchestration
│       ├── whisper.py            # Groq / OpenAI clients (pure stdlib)
│       ├── config.py             # shared config (~/.config/watch/.env)
│       ├── setup.py              # preflight + installer
│       └── build-skill.sh        # build dist/watch.skill for claude.ai upload (dev-only)
├── hooks/                        # SessionStart status hook (Claude Code only)
├── .claude-plugin/               # plugin.json + marketplace.json (Claude Code)
├── .codex-plugin/                # plugin.json — Codex/agents manifest (&quot;skills&quot;: &quot;./skills/&quot;)
├── .agents/plugins/              # marketplace.json — Agent Skills marketplace listing
├── AGENTS.md → CLAUDE.md         # generic-agent entry point
├── tests/                        # pytest suite (ffmpeg-synthesized clips, no network)
└── .github/workflows/            # release.yml — auto-builds watch.skill on tag push
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Develop&lt;/h2&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Run the test suite (stdlib + pytest; ffmpeg required for frame tests):
python3 -m pytest -q

# Build the claude.ai upload bundle:
bash skills/watch/scripts/build-skill.sh      # → dist/watch.skill
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Releasing: tag &lt;code&gt;vX.Y.Z&lt;/code&gt;, push the tag. The workflow builds &lt;code&gt;dist/watch.skill&lt;/code&gt; and attaches it to the GitHub release. Keep the version in sync across &lt;code&gt;skills/watch/SKILL.md&lt;/code&gt;, &lt;code&gt;.claude-plugin/plugin.json&lt;/code&gt;, and &lt;code&gt;.codex-plugin/plugin.json&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;See &lt;a href=&quot;https://raw.githubusercontent.com/bradautomates/claude-video/main/CHANGELOG.md&quot;&gt;CHANGELOG.md&lt;/a&gt; for version history.&lt;/p&gt; 
&lt;h2&gt;Open source&lt;/h2&gt; 
&lt;p&gt;MIT license.&lt;/p&gt; 
&lt;p&gt;Built on &lt;code&gt;yt-dlp&lt;/code&gt;, &lt;code&gt;ffmpeg&lt;/code&gt;, and Claude&#39;s multimodal &lt;code&gt;Read&lt;/code&gt; tool. Whisper transcription via &lt;a href=&quot;https://groq.com&quot;&gt;Groq&lt;/a&gt; or &lt;a href=&quot;https://openai.com&quot;&gt;OpenAI&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;Built by Brad Bonanno — I make content about building with AI on &lt;a href=&quot;https://www.youtube.com/@bradbonanno&quot;&gt;YouTube (@bradbonanno)&lt;/a&gt;, and build AI operating systems for businesses at &lt;a href=&quot;https://www.solarisautomation.io/&quot;&gt;Solaris Automation&lt;/a&gt;. If &lt;code&gt;/watch&lt;/code&gt; saves you from scrubbing through a video, come say hi on the channel.&lt;/p&gt; 
&lt;h2&gt;Star History&lt;/h2&gt; 
&lt;a href=&quot;https://www.star-history.com/?repos=bradautomates%2Fclaude-video&amp;amp;type=date&amp;amp;legend=top-left&quot;&gt; 
 &lt;picture&gt; 
  &lt;source media=&quot;(prefers-color-scheme: dark)&quot; srcset=&quot;https://api.star-history.com/chart?repos=bradautomates/claude-video&amp;amp;type=date&amp;amp;theme=dark&amp;amp;legend=top-left&quot; /&gt; 
  &lt;source media=&quot;(prefers-color-scheme: light)&quot; srcset=&quot;https://api.star-history.com/chart?repos=bradautomates/claude-video&amp;amp;type=date&amp;amp;legend=top-left&quot; /&gt; 
  &lt;img alt=&quot;Star History Chart&quot; src=&quot;https://api.star-history.com/chart?repos=bradautomates/claude-video&amp;amp;type=date&amp;amp;legend=top-left&quot; /&gt; 
 &lt;/picture&gt; &lt;/a&gt; 
&lt;hr /&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/bradautomates/claude-video&quot;&gt;github.com/bradautomates/claude-video&lt;/a&gt; · &lt;a href=&quot;https://www.youtube.com/@bradbonanno&quot;&gt;@bradbonanno&lt;/a&gt; · &lt;a href=&quot;https://www.solarisautomation.io/&quot;&gt;Solaris Automation&lt;/a&gt; · &lt;a href=&quot;https://raw.githubusercontent.com/bradautomates/claude-video/main/LICENSE&quot;&gt;LICENSE&lt;/a&gt;&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/093e331c2bf1c1282305a91139c34e12d29a4089322eaf093d15f00228ff5dc7/bradautomates/claude-video" medium="image" />
      
    </item>
    
    <item>
      <title>HKUDS/Vibe-Trading</title>
      <link>https://github.com/HKUDS/Vibe-Trading</link>
      <description>&lt;p&gt;&quot;Vibe-Trading: Your Personal Trading Agent&quot;&lt;/p&gt;&lt;hr&gt;&lt;p align=&quot;center&quot;&gt; &lt;b&gt;English&lt;/b&gt; | &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/README_zh.md&quot;&gt;中文&lt;/a&gt; | &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/README_ja.md&quot;&gt;日本語&lt;/a&gt; | &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/README_ko.md&quot;&gt;한국어&lt;/a&gt; | &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/README_ar.md&quot;&gt;العربية&lt;/a&gt; &lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/assets/icon.png&quot; width=&quot;120&quot; alt=&quot;Vibe-Trading Logo&quot; /&gt; &lt;/p&gt; 
&lt;h1 align=&quot;center&quot;&gt;Vibe-Trading: Your Personal Trading Agent&lt;/h1&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;b&gt;One Command to Empower Your Agent with Comprehensive Trading Capabilities&lt;/b&gt; &lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://trendshift.io/repositories/25527&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://trendshift.io/api/badge/repositories/25527&quot; alt=&quot;HKUDS%2FVibe-Trading | Trendshift&quot; style=&quot;width: 250px; height: 55px;&quot; width=&quot;250&quot; height=&quot;55&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://img.shields.io/badge/Python-3.11%2B-3776AB?style=flat&amp;amp;logo=python&amp;amp;logoColor=white&quot; alt=&quot;Python&quot; /&gt; &lt;img src=&quot;https://img.shields.io/badge/Backend-FastAPI-009688?style=flat&quot; alt=&quot;FastAPI&quot; /&gt; &lt;img src=&quot;https://img.shields.io/badge/Frontend-React%2019-61DAFB?style=flat&amp;amp;logo=react&amp;amp;logoColor=white&quot; alt=&quot;React&quot; /&gt; &lt;a href=&quot;https://pypi.org/project/vibe-trading-ai/&quot;&gt;&lt;img src=&quot;https://img.shields.io/pypi/v/vibe-trading-ai?style=flat&amp;amp;logo=pypi&amp;amp;logoColor=white&quot; alt=&quot;PyPI&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/LICENSE&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/License-MIT-yellow?style=flat&quot; alt=&quot;License&quot; /&gt;&lt;/a&gt; &lt;br /&gt; &lt;a href=&quot;https://github.com/HKUDS/.github/raw/main/profile/README.md&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Feishu-Group-E9DBFC?style=flat-square&amp;amp;logo=feishu&amp;amp;logoColor=white&quot; alt=&quot;Feishu&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/HKUDS/.github/raw/main/profile/README.md&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/WeChat-Group-C5EAB4?style=flat-square&amp;amp;logo=wechat&amp;amp;logoColor=white&quot; alt=&quot;WeChat&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://discord.gg/6TdQnT5xcF&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Discord-Join-7289DA?style=flat-square&amp;amp;logo=discord&amp;amp;logoColor=white&quot; alt=&quot;Discord&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://vibetrading.wiki/&quot;&gt;Website&lt;/a&gt; &amp;nbsp;·&amp;nbsp; &lt;a href=&quot;https://vibetrading.wiki/docs/&quot;&gt;Docs&lt;/a&gt; &amp;nbsp;·&amp;nbsp; &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/#-news&quot;&gt;News&lt;/a&gt; &amp;nbsp;·&amp;nbsp; &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/#-key-features&quot;&gt;Features&lt;/a&gt; &amp;nbsp;·&amp;nbsp; &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/#-shadow-account&quot;&gt;Shadow Account&lt;/a&gt; &amp;nbsp;·&amp;nbsp; &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/#-demo&quot;&gt;Demo&lt;/a&gt; &amp;nbsp;·&amp;nbsp; &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/#-quick-start&quot;&gt;Quick Start&lt;/a&gt; &amp;nbsp;·&amp;nbsp; &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/#-examples&quot;&gt;Examples&lt;/a&gt; &amp;nbsp;·&amp;nbsp; &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/#-api-server&quot;&gt;API / MCP&lt;/a&gt; &amp;nbsp;·&amp;nbsp; &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/#-roadmap&quot;&gt;Roadmap&lt;/a&gt; &amp;nbsp;·&amp;nbsp; &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/#contributing&quot;&gt;Contributing&lt;/a&gt; &lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/#-quick-start&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/assets/pip-install.svg?sanitize=true&quot; height=&quot;45&quot; alt=&quot;pip install vibe-trading-ai&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;📰 News&lt;/h2&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;⚠️ &lt;strong&gt;Security warning:&lt;/strong&gt; The X account &lt;code&gt;VibeTrading_HKU&lt;/code&gt;, Virtuals project &lt;code&gt;101845&lt;/code&gt;, and token contract &lt;code&gt;0x640BDBF77b6447E8b7DB7894cED84BD1c40571f4&lt;/code&gt; are not official Vibe-Trading assets. We have never launched or endorsed any token or memecoin. Do not buy, connect a wallet, or sign anything. &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/SECURITY.md#official-channels--impersonation&quot;&gt;Details&lt;/a&gt;.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;2026-08-09&lt;/strong&gt; 🪟 &lt;strong&gt;Secure Windows packaging, Canada markets, ModelScope, and Alpha Zoo over MCP&lt;/strong&gt;: Windows desktop packaging now assembles a checksum-pinned embedded Python 3.12 runtime and x64 NSIS review/signing paths, plus Electron &lt;code&gt;safeStorage&lt;/code&gt; for an allowlisted credential set. The renderer can set or clear secrets but never read them; plaintext configuration migrates once; decrypted values reach only the owned backend; and both unsigned review and signed builds fail closed on the wrong signature state. No installer artifact was published from this PR (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/1015&quot;&gt;#1015&lt;/a&gt;). Canadian equities now work end to end: &lt;code&gt;.TO&lt;/code&gt;/&lt;code&gt;.V&lt;/code&gt; symbols are classified in CAD, route through Yahoo → yfinance → local fallback, execute under Canada-specific GlobalEquity rules, benchmark against &lt;code&gt;XIC.TO&lt;/code&gt;, and refuse mixed-currency aggregation. Strict USD-M historical backtests can also opt into &lt;code&gt;position_adjustment=rebalance&lt;/code&gt; while preserving collateral, funding, fees, realized P&amp;amp;L, liquidation behavior, and immutable fill evidence across increases and reductions (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/1024&quot;&gt;#1024&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/1019&quot;&gt;#1019&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/952&quot;&gt;#952&lt;/a&gt;). ModelScope joins the built-in providers through its official OpenAI-compatible hosted-inference endpoint, with &lt;code&gt;Qwen/Qwen3.5-27B&lt;/code&gt; as the default (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/1011&quot;&gt;#1011&lt;/a&gt;); the new &lt;code&gt;vibe-trading update&lt;/code&gt; distinguishes wheel installs from editable/source checkouts, installs the exact release it checked, and verifies fresh metadata without downgrading (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/1020&quot;&gt;#1020&lt;/a&gt;); and &lt;code&gt;alpha_zoo&lt;/code&gt; plus bounded &lt;code&gt;alpha_bench&lt;/code&gt; now reach MCP (64 tools), with horizon/result/output-path limits and safe report creation (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/979&quot;&gt;#979&lt;/a&gt;). Verified Python and frontend lock refreshes also update grouped dependencies, &lt;code&gt;postcss&lt;/code&gt;, and &lt;code&gt;akshare&lt;/code&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/1021&quot;&gt;#1021&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/1023&quot;&gt;#1023&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/1026&quot;&gt;#1026&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/1027&quot;&gt;#1027&lt;/a&gt;). Thanks &lt;a href=&quot;https://github.com/QCYTSN&quot;&gt;@QCYTSN&lt;/a&gt;, &lt;a href=&quot;https://github.com/wiliao&quot;&gt;@wiliao&lt;/a&gt;, &lt;a href=&quot;https://github.com/honginp&quot;&gt;@honginp&lt;/a&gt;, &lt;a href=&quot;https://github.com/yrk111222&quot;&gt;@yrk111222&lt;/a&gt;, &lt;a href=&quot;https://github.com/zwrong&quot;&gt;@zwrong&lt;/a&gt;, and &lt;a href=&quot;https://github.com/cgycorey&quot;&gt;@cgycorey&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;2026-08-08&lt;/strong&gt; 🧱 &lt;strong&gt;Desktop shell, eToro, atomic rebalancing, and a broad reliability pass&lt;/strong&gt;: A source-first Electron host now owns the existing backend lifecycle — random loopback port, per-launch secret, five-locale startup recovery, and owned-process cleanup — while eToro joins with path-separated demo/real profiles; live risk-increasing actions remain mandate-gated and audited, and API capability surfaces are authenticated under enforced CSP (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/923&quot;&gt;#923&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/989&quot;&gt;#989&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/961&quot;&gt;#961&lt;/a&gt;). Backtests gain opt-in atomic same-direction rebalancing with immutable fill evidence; Shadow splits mixed markets by settlement currency without invented FX aggregation and honors the configured runtime root; indicators use consecutive unsampled history; negative-equity drawdown and empty insolvent cross accounts are handled correctly (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/951&quot;&gt;#951&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/997&quot;&gt;#997&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/1017&quot;&gt;#1017&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/1005&quot;&gt;#1005&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/958&quot;&gt;#958&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/959&quot;&gt;#959&lt;/a&gt;). OpenAI Codex OAuth gets a separate synchronized credential store and one-shot 401 recovery; proxy opt-out covers sync and async clients; sandboxed runs retain their canonical root; scheduled research isolates malformed records and fixes interval-timezone validation; lowercase &lt;code&gt;4h&lt;/code&gt; requests return true four-hour bars (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/1014&quot;&gt;#1014&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/995&quot;&gt;#995&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/1012&quot;&gt;#1012&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/1003&quot;&gt;#1003&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/1004&quot;&gt;#1004&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/1013&quot;&gt;#1013&lt;/a&gt;). QQ replies retain source message IDs, long model slugs remain readable, and the agent stops when evidence is sufficient (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/1008&quot;&gt;#1008&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/1006&quot;&gt;#1006&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/1010&quot;&gt;#1010&lt;/a&gt;). Thanks &lt;a href=&quot;https://github.com/QCYTSN&quot;&gt;@QCYTSN&lt;/a&gt;, &lt;a href=&quot;https://github.com/Shizoqua&quot;&gt;@Shizoqua&lt;/a&gt;, &lt;a href=&quot;https://github.com/ngoanpv&quot;&gt;@ngoanpv&lt;/a&gt;, &lt;a href=&quot;https://github.com/hhj123123&quot;&gt;@hhj123123&lt;/a&gt;, &lt;a href=&quot;https://github.com/su322&quot;&gt;@su322&lt;/a&gt;, &lt;a href=&quot;https://github.com/Robin1987China&quot;&gt;@Robin1987China&lt;/a&gt;, &lt;a href=&quot;https://github.com/shadowinlife&quot;&gt;@shadowinlife&lt;/a&gt;, &lt;a href=&quot;https://github.com/dineeshd&quot;&gt;@dineeshd&lt;/a&gt;, &lt;a href=&quot;https://github.com/honginp&quot;&gt;@honginp&lt;/a&gt;, &lt;a href=&quot;https://github.com/santhreal&quot;&gt;@santhreal&lt;/a&gt;, &lt;a href=&quot;https://github.com/00EVA&quot;&gt;@00EVA&lt;/a&gt;, &lt;a href=&quot;https://github.com/x-lambda&quot;&gt;@x-lambda&lt;/a&gt;, &lt;a href=&quot;https://github.com/ofeksh-tr&quot;&gt;@ofeksh-tr&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;2026-08-07&lt;/strong&gt; 🛡️ &lt;strong&gt;Fewer false refusals, a closed sandbox gap, QVeris on MCP&lt;/strong&gt;: The grounding gate stops rejecting well-formed answers over numbers that were never prices — confidence scores, indicator readings, moving-average windows, year-less dates like &lt;code&gt;8/5&lt;/code&gt;, percentage ranges, and a trading plan&#39;s own trigger levels (&lt;code&gt;close ≥ 6.45&lt;/code&gt; is a condition, not a quote) — while a quote outside recorded OHLC evidence is still refused, and a price table dated &lt;code&gt;08-05&lt;/code&gt; now matches its evidence instead of every cell coming back unavailable (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/1001&quot;&gt;#1001&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/983&quot;&gt;#983&lt;/a&gt;). &lt;strong&gt;Sandbox:&lt;/strong&gt; generated strategy code can no longer import the broker layer, nor reach &lt;code&gt;socket&lt;/code&gt;/&lt;code&gt;subprocess&lt;/code&gt;/&lt;code&gt;os.system&lt;/code&gt;/&lt;code&gt;ctypes&lt;/code&gt; through a renamed binding — both were accepted before, and &lt;code&gt;src.quantlib&lt;/code&gt; still imports. &lt;strong&gt;QVeris&lt;/strong&gt; discovery/inspect/execute join the MCP surface (62 tools), with the cost quote read from the marketplace instead of trusted from the caller (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/976&quot;&gt;#976&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/964&quot;&gt;#964&lt;/a&gt;, thanks &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/shadowinlife&quot;&gt;@shadowinlife&lt;/a&gt;). Plus HK market-data fallback routing repaired with a new Tencent HK source, yfinance crypto routed to the crypto engine, memory entries written and recovered with their &lt;code&gt;.md&lt;/code&gt; suffix, MCP list/dict arguments tolerating JSON-string clients, and Portfolio Studio artifacts surfaced in run detail (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/1000&quot;&gt;#1000&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/970&quot;&gt;#970&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/984&quot;&gt;#984&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/993&quot;&gt;#993&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/980&quot;&gt;#980&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/982&quot;&gt;#982&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/966&quot;&gt;#966&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/973&quot;&gt;#973&lt;/a&gt;, thanks &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/he-yufeng&quot;&gt;@he-yufeng&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/ngoanpv&quot;&gt;@ngoanpv&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/sambazhu&quot;&gt;@sambazhu&lt;/a&gt;).&lt;/li&gt; 
&lt;/ul&gt; 
&lt;details&gt; 
 &lt;summary&gt;Earlier news&lt;/summary&gt; 
 &lt;ul&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-08-06&lt;/strong&gt; 🧮 &lt;strong&gt;A tested finance-math layer + valuation engine + irregular cash flows + wired-in governance&lt;/strong&gt;: &lt;code&gt;src/quantlib&lt;/code&gt; replaces the formulas that lived as markdown inside skills with one tested implementation each — options, bonds, credit, econometrics, VaR/CVaR/EVT, attribution, event studies, multiple-testing control, purged cross-validation — ~250 functions, reachable from Web/API/MCP via the new read-only &lt;code&gt;quantlib_call&lt;/code&gt; tool. A valuation engine (&lt;code&gt;run_dcf&lt;/code&gt; / &lt;code&gt;run_comps&lt;/code&gt; / three-statement) refuses to run on a missing input instead of silently defaulting it, and a new entity + cash-flow spine admits NAVs, capital calls, and coupons (XIRR/MOIC/DPI/TVPI and TWR/Modified Dietz via &lt;code&gt;cashflow_performance&lt;/code&gt;; crypto L2 impact cost via &lt;code&gt;orderbook_depth&lt;/code&gt;). Every run now writes a hash manifest, the audit ledger is hash-chained so tampering is detectable, and all 30 swarm presets were re-audited — a deliverable no granted tool can compute is now declared as such instead of invented.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-08-05&lt;/strong&gt; 🔭 &lt;strong&gt;Institutional holdings, ETF look-through, prediction markets, research papers&lt;/strong&gt;: Four read-only data tools, all on free public sources — SEC 13F books with quarter-over-quarter position diffs; ETF constituents across markets (a CSI-300 tracker resolves to 342 positions covering 98.7% of net assets, not the quarterly top ten); event contracts as labelled implied probability; and arXiv/OpenAlex search that marks what a source does not state instead of inferring it. Plus five scheduled-research templates, six institutional commands (&lt;code&gt;/comps&lt;/code&gt; &lt;code&gt;/dcf&lt;/code&gt; &lt;code&gt;/attrib&lt;/code&gt; &lt;code&gt;/memo&lt;/code&gt; &lt;code&gt;/earnings&lt;/code&gt; &lt;code&gt;/screen&lt;/code&gt;), investor lenses as a standalone skill, and an agent core that traces every number back to the tool that produced it.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-08-04&lt;/strong&gt; 🔧 &lt;strong&gt;Correctness pass: fundamentals, A-share prices, oversized results&lt;/strong&gt;: SEC reporting periods are now keyed on their &lt;code&gt;(start, end)&lt;/code&gt; span — a 10-Q files the true quarter and the year-to-date frame under the same end date and fiscal period, so &lt;code&gt;period=&quot;annual&quot;&lt;/code&gt; had been returning a single quarter for AAPL FY2018–2020 (a 4.2× understatement) and every fiscal-Q4 slot in a quarterly series carried the full-year figure; &lt;code&gt;get_fundamentals(&quot;AAPL.US&quot;)&lt;/code&gt; no longer answers &lt;code&gt;ok:true&lt;/code&gt; with an all-null panel. Tushare A-share prices are now corporate-action adjusted in both the factor bench and backtests — a raw close-to-close return across an ex-date was off by up to 47 percentage points (&lt;a href=&quot;http://300750.SZ&quot;&gt;300750.SZ&lt;/a&gt;, 2023-04-26) — and the CSI300 bench masks each date to its point-in-time index membership. Cross-market composite backtests refuse a mixed-currency code set instead of summing CNY, USD and KRW into one equity curve; option legs are marked at the volatility they were opened at, removing a fabricated day-zero P&amp;amp;L of up to +93% of premium; oversized tool results are paged by whole record with an explicit total instead of being cut mid-JSON; and &lt;code&gt;calc_metrics&lt;/code&gt; reports tracking error and benchmark beta.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-08-03&lt;/strong&gt; ⏰ &lt;strong&gt;Timezone-aware scheduled research + unblocked stock screening&lt;/strong&gt;: Scheduled jobs now take an optional IANA &lt;code&gt;timezone&lt;/code&gt; and evaluate cron on that zone&#39;s wall clock, so a cadence survives DST — a spring-forward gap is skipped and a fall-back ambiguous time runs once — while cron fields gain comma lists and ranges (&lt;code&gt;1,3-5&lt;/code&gt;), jobs without a timezone keep UTC semantics, and the web UI gains a &lt;strong&gt;Scheduled&lt;/strong&gt; page in all five locales where it previously had no scheduling surface at all (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/954&quot;&gt;#954&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/953&quot;&gt;#953&lt;/a&gt;, thanks &lt;a href=&quot;https://github.com/ngoanpv&quot;&gt;@ngoanpv&lt;/a&gt;). A screening request no longer dead-ends: a many-candidate shortlist counts as an answer rather than a stalled resolution and retires once a candidate is locked, and price validation stops reading ticker digits, localized dates, share counts, and position costs as quoted prices — while still refusing any quote outside recorded OHLC evidence (closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/955&quot;&gt;#955&lt;/a&gt;). Agent memory also gets exact index-anchor matching and a respected result bound (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/956&quot;&gt;#956&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/957&quot;&gt;#957&lt;/a&gt;, thanks &lt;a href=&quot;https://github.com/santhreal&quot;&gt;@santhreal&lt;/a&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-08-02&lt;/strong&gt; 🧠 &lt;strong&gt;Live model discovery, truthful runtime identity, and a verified dependency refresh&lt;/strong&gt;: Settings now discovers configured-provider models on demand with stable warning codes and five-locale controls, while each reply records and reloads the immutable provider/model/reasoning identity that actually served it—cleared safely when sessions change (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/924&quot;&gt;#924&lt;/a&gt;, thanks &lt;a href=&quot;https://github.com/QCYTSN&quot;&gt;@QCYTSN&lt;/a&gt;). Nine hash-locked Python updates plus &lt;code&gt;jsdom&lt;/code&gt;/&lt;code&gt;postcss&lt;/code&gt; also landed with exact-version imports, 330 focused tests, the production build, 373 frontend tests, full &lt;code&gt;main&lt;/code&gt; CI, and Dependency Graph green (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/949&quot;&gt;#949&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/948&quot;&gt;#948&lt;/a&gt;); the breaking MCP 2.0 bump remains unmerged pending a complete lock/runtime migration (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/950&quot;&gt;#950&lt;/a&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-08-01&lt;/strong&gt; 🧮 &lt;strong&gt;Options strategy analytics + market sentiment + auditable USD-M research&lt;/strong&gt;: A new options payoff workflow analytically calculates expiry P&amp;amp;L extrema, exact breakevens—including continuous zero-P&amp;amp;L intervals—engine-aligned entry commissions, and spot × IV scenarios through Agent and MCP (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/946&quot;&gt;#946&lt;/a&gt;, rebuilt from &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/883&quot;&gt;#883&lt;/a&gt;, thanks @he-yufeng). The read-only &lt;code&gt;sentiment&lt;/code&gt; tool scores arbitrary text locally and retrieves the crypto Fear &amp;amp; Greed Index without an API key (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/939&quot;&gt;#939&lt;/a&gt;, thanks @Robin1987China). Strict USD-M backtests now persist ordered fill, funding, risk, and liquidation events plus a fidelity summary, while rejecting unsupported 100× intervals (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/936&quot;&gt;#936&lt;/a&gt;, thanks @honginp). Reliability improvements also ensure symbol and venue resolution precedes market-data calls, final quoted prices are checked against recorded OHLC evidence, scheduled research retries transient failures, and nested MCP results serialize cleanly.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-31&lt;/strong&gt; 🔧 &lt;strong&gt;USD-M liquidation lifecycle + technical indicators + user-level state dirs&lt;/strong&gt;: Opt-in &lt;code&gt;perpetual_strict&lt;/code&gt; mode settles historical funding before fills and executes isolated/cross margin breaches as real liquidations (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/903&quot;&gt;#903&lt;/a&gt;, thanks @honginp). A read-only &lt;code&gt;technical_indicators&lt;/code&gt; tool computes RSI/MACD/Bollinger/SMA/EMA through the existing loaders (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/921&quot;&gt;#921&lt;/a&gt;, refs &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/920&quot;&gt;#920&lt;/a&gt;, thanks @Robin1987China). Sessions, runs, swarm runs, and uploads now live under &lt;code&gt;~/.vibe-trading&lt;/code&gt; (relocatable via &lt;code&gt;VIBE_TRADING_HOME&lt;/code&gt;) with a one-time automatic migration (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/925&quot;&gt;#925&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/904&quot;&gt;#904&lt;/a&gt;, thanks @MuggleJinx). Plus ten correctness fixes — Yahoo &lt;code&gt;.SS&lt;/code&gt; classified as A-share, bare/prefix-style A-share codes, slash-delimited crypto pairs, &lt;code&gt;nan&lt;/code&gt;/&lt;code&gt;inf&lt;/code&gt; guards (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/919&quot;&gt;#919&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/926&quot;&gt;#926&lt;/a&gt;–&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/935&quot;&gt;#935&lt;/a&gt;, thanks @santhreal).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-30&lt;/strong&gt; 🎨 &lt;strong&gt;Rebuilt WebUI + Korea (KRX) market + an OpenBB Workspace bridge&lt;/strong&gt;: The web UI lands its guided-minimalism overhaul — no first-frame flash, one durable activity object per turn with a live reasoning whisper and a reload-safe tool trail, LLM-written session titles, full five-locale parity. &lt;strong&gt;Korea equity (KRX: KOSPI/KOSDAQ)&lt;/strong&gt; becomes the 9th backtest engine — execution-time ±30% band, long-only, 2026 0.20% transaction tax, optional &lt;code&gt;pykrx&lt;/code&gt; loader (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/693&quot;&gt;#693&lt;/a&gt;, thanks @JungHoonGhae) — plus an &lt;strong&gt;OpenBB Workspace bridge&lt;/strong&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/817&quot;&gt;#817&lt;/a&gt;, thanks @shugaoye) and a read-only &lt;strong&gt;Taiwan snapshot&lt;/strong&gt; tool (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/848&quot;&gt;#848&lt;/a&gt;, thanks @TSENGCHIENFENG). Correctness: daily price bands are judged &lt;strong&gt;at execution time&lt;/strong&gt;, not from the decision bar&#39;s close; a session runs one attempt at a time (HTTP 409) and a user stop is its own terminal state (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/676&quot;&gt;#676&lt;/a&gt;, thanks @tyj147454413-cmd). Plus durable traces (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/662&quot;&gt;#662&lt;/a&gt;), secret-scrubbed tool results (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/675&quot;&gt;#675&lt;/a&gt;), fail-closed tool arguments (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/913&quot;&gt;#913&lt;/a&gt;/&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/911&quot;&gt;#911&lt;/a&gt;, thanks @santhreal), direct-OpenAI &lt;code&gt;reasoning_effort&lt;/code&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/755&quot;&gt;#755&lt;/a&gt;, thanks @1anter), and numeric guards across the risk x-ray / edge density / options engine (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/909&quot;&gt;#909&lt;/a&gt;/&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/908&quot;&gt;#908&lt;/a&gt;/&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/907&quot;&gt;#907&lt;/a&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-29&lt;/strong&gt; 🔧 &lt;strong&gt;Gap-safe returns + liquidation risk modeling + a risk x-ray in every run&lt;/strong&gt;: &lt;code&gt;bar_returns&lt;/code&gt; no longer erases the real move across a trading halt longer than the forward-fill window — the resumption move was silently recorded as 0, understating volatility and inflating Sharpe — and an &lt;code&gt;inf&lt;/code&gt; prior price can no longer read as a clean −100% (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/895&quot;&gt;#895&lt;/a&gt;, thanks @darkknight4563). Annualisation now covers &lt;strong&gt;all 24 data sources&lt;/strong&gt; at every interval, with a coverage test that fails CI when a loader lands without entries (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/891&quot;&gt;#891&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/884&quot;&gt;#884&lt;/a&gt;, thanks @Robin1987China). USD-M perpetual research gains deterministic &lt;strong&gt;isolated &amp;amp; cross margin liquidation&lt;/strong&gt; evaluation (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/889&quot;&gt;#889&lt;/a&gt;, thanks @honginp), and every portfolio backtest now emits &lt;strong&gt;risk x-ray artifacts&lt;/strong&gt; (&lt;code&gt;risk_xray.json&lt;/code&gt;/&lt;code&gt;.md&lt;/code&gt;) with headline concentration/vol/drawdown metrics (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/900&quot;&gt;#900&lt;/a&gt;, thanks @he-yufeng). The &lt;code&gt;connector&lt;/code&gt; CLI now loads &lt;code&gt;~/.vibe-trading/.env&lt;/code&gt;, so env-sourced broker credentials resolve again (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/902&quot;&gt;#902&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/901&quot;&gt;#901&lt;/a&gt;, thanks @MuggleJinx). Plus indent-preserving channel message splits and skill-frontmatter parsing at EOF (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/867&quot;&gt;#867&lt;/a&gt;/&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/861&quot;&gt;#861&lt;/a&gt;, thanks @santhreal).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-28&lt;/strong&gt; 🔧 &lt;strong&gt;Next-gen Claude models unblocked + sign-safe returns&lt;/strong&gt;: Claude models that deprecate the &lt;code&gt;temperature&lt;/code&gt; field (opus-4-7, opus-5, sonnet-5) now work — the adapter drops the field when the API rejects it, retries once, and remembers the model, so no per-release patch is needed (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/890&quot;&gt;#890&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/856&quot;&gt;#856&lt;/a&gt;, thanks @yagnikpipaliya). Non-interactive &lt;code&gt;vibe-trading run&lt;/code&gt; now injects a host session id: research-goal tools previously failed on every call while the run still reported success (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/885&quot;&gt;#885&lt;/a&gt;). Buy-and-hold returns are sign-safe — a near-zero prior close no longer explodes the compounded benchmark, and an exact-zero close no longer yields &lt;code&gt;inf&lt;/code&gt;/&lt;code&gt;nan&lt;/code&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/872&quot;&gt;#872&lt;/a&gt;, thanks @darkknight4563). The frontend moves to &lt;strong&gt;Node 22 + React Router 8&lt;/strong&gt;, clearing a high-severity advisory.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-27&lt;/strong&gt; 🔧 &lt;strong&gt;Correlation integrity + &lt;a href=&quot;http://vn.py&quot;&gt;vn.py&lt;/a&gt; 4.0 export repair + an encoding batch&lt;/strong&gt;: The rolling correlation matrix no longer forward-fills missing closes — a halted session was being scored as a fabricated 0% return against the peer&#39;s real move, distorting the matrix (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/873&quot;&gt;#873&lt;/a&gt;, thanks @ddy4633). The &lt;strong&gt;&lt;a href=&quot;http://vn.py&quot;&gt;vn.py&lt;/a&gt; export&lt;/strong&gt; skill is repaired for the &lt;a href=&quot;http://vn.py&quot;&gt;vn.py&lt;/a&gt; 4.x layout, where &lt;code&gt;vnpy.app.cta_strategy&lt;/code&gt; no longer exists upstream — templates now import from &lt;code&gt;vnpy_ctastrategy&lt;/code&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/869&quot;&gt;#869&lt;/a&gt;, thanks @y85998607). Plus a six-fix batch: UTF-16 BOM decoding in the document reader and trade-journal CSVs, currency symbols stripped before numeric coercion, &lt;code&gt;BTCUSDT&lt;/code&gt;-style symbols inferred as crypto, lowercase &lt;code&gt;1h&lt;/code&gt;/&lt;code&gt;1d&lt;/code&gt; intervals annualized correctly, and CJK characters preserved in skill directory slugs (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/862&quot;&gt;#862&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/863&quot;&gt;#863&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/864&quot;&gt;#864&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/865&quot;&gt;#865&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/866&quot;&gt;#866&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/868&quot;&gt;#868&lt;/a&gt;, thanks @santhreal).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-26&lt;/strong&gt; 🔒 &lt;strong&gt;Dependency lock + universe transparency&lt;/strong&gt;: Docker’s hash-locked install works again, with a new CI lock check (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/858&quot;&gt;#858&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/847&quot;&gt;#847&lt;/a&gt;). &lt;code&gt;alpha bench&lt;/code&gt; now discloses CSI300/SP500 sources, counts, degraded fallbacks, and survivorship bias (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/859&quot;&gt;#859&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/845&quot;&gt;#845&lt;/a&gt;). Actions and five frontend dependencies were also refreshed (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/850&quot;&gt;#850&lt;/a&gt;–&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/852&quot;&gt;#852&lt;/a&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-25&lt;/strong&gt; 🔧 &lt;strong&gt;Perpetual realism + MCP crash fix + a correctness batch&lt;/strong&gt;: USD-M perpetuals gain &lt;strong&gt;margin state contracts&lt;/strong&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/798&quot;&gt;#798&lt;/a&gt;, thanks @honginp) and the engine now consumes &lt;strong&gt;historical funding rates&lt;/strong&gt; instead of fetching-and-ignoring them (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/819&quot;&gt;#819&lt;/a&gt;, thanks @g0rdonL). MCP dataclass results no longer crash on a false &lt;code&gt;Circular reference detected&lt;/code&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/849&quot;&gt;#849&lt;/a&gt;, thanks @Echoandelementwebsites), and &lt;code&gt;alpha bench&lt;/code&gt; CLI/HTML forward the &lt;code&gt;_meta&lt;/code&gt; survivorship disclosure (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/841&quot;&gt;#841&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/797&quot;&gt;#797&lt;/a&gt;, thanks @AmirF194). Plus 12 correctness fixes across journals, connectors, and channels (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/799&quot;&gt;#799&lt;/a&gt;–&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/810&quot;&gt;#810&lt;/a&gt;, thanks @santhreal), and a real account label in CLI balances (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/843&quot;&gt;#843&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/846&quot;&gt;#846&lt;/a&gt;, thanks @Robin1987China).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-24&lt;/strong&gt; 🔀 &lt;strong&gt;Memory Tier 2, composable optimizer constraints + an interval-handling sweep&lt;/strong&gt;: Persistent memory gains &lt;strong&gt;Tier 2 structural organization&lt;/strong&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/815&quot;&gt;#815&lt;/a&gt;, thanks @shadowinlife), and backtest optimizers accept &lt;strong&gt;composable weight constraints&lt;/strong&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/818&quot;&gt;#818&lt;/a&gt;, thanks @he-yufeng). Correctness: the daily-bar validator can opt in to &lt;strong&gt;non-positive prices&lt;/strong&gt; — opening on negative bars while still rejecting zero (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/816&quot;&gt;#816&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/571&quot;&gt;#571&lt;/a&gt;, thanks @darkknight4563). Plus a 19-PR loader &lt;strong&gt;interval-normalization sweep&lt;/strong&gt;: lowercase &lt;code&gt;1h/4h/1d/1w&lt;/code&gt; aliases accepted everywhere, unsupported intervals now fail fast instead of silently returning daily bars, Yahoo &lt;code&gt;4H&lt;/code&gt; maps to &lt;code&gt;1h&lt;/code&gt;, and MT5 accepts &lt;code&gt;1W/1M&lt;/code&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/812&quot;&gt;#812&lt;/a&gt;–&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/838&quot;&gt;#838&lt;/a&gt;, thanks @santhreal), a trade-journal fix for Eastmoney Excel-serial dates (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/811&quot;&gt;#811&lt;/a&gt;, thanks @santhreal), and a README nav-anchor fix (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/840&quot;&gt;#840&lt;/a&gt;, thanks @dvirarad).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-23&lt;/strong&gt; 🔧 &lt;strong&gt;Reliability sweep + strict alpha-bench surfaced + opt-in memory lifecycle&lt;/strong&gt;: A 22-PR contributor batch. A broad &lt;strong&gt;reliability sweep&lt;/strong&gt; fixes timeframe handling end to end — yfinance &lt;code&gt;1M&lt;/code&gt;→monthly (not minute), CCXT &lt;code&gt;1W&lt;/code&gt;/&lt;code&gt;1M&lt;/code&gt;, akshare/india-broker rejecting unsupported intervals instead of silent daily, and the Tiger/Alpaca/OKX/Shoonya/Longbridge connectors keeping &lt;code&gt;1H&lt;/code&gt;/&lt;code&gt;4H&lt;/code&gt; as hour bars — plus trade-journal Excel-date normalization (eastmoney float &lt;code&gt;YYYYMMDD&lt;/code&gt;, Futu/Tonghuashun serial dates), finite-JSON &lt;code&gt;report_audit&lt;/code&gt;, blank &lt;code&gt;holding_days&lt;/code&gt; validation, and Feishu/CLI markdown table edges (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/778&quot;&gt;#778&lt;/a&gt;–&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/794&quot;&gt;#794&lt;/a&gt;, thanks @santhreal). &lt;strong&gt;MT5&lt;/strong&gt; &lt;code&gt;trading_history&lt;/code&gt; now coerces numpy scalars so JSON serialization no longer dies on &lt;code&gt;int64&lt;/code&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/776&quot;&gt;#776&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/774&quot;&gt;#774&lt;/a&gt;, thanks @shadowinlife), and &lt;strong&gt;PIT fundamentals&lt;/strong&gt; dedup restated rows and stop the snapshot regressing to an older fiscal period on a late restatement (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/772&quot;&gt;#772&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/771&quot;&gt;#771&lt;/a&gt;, thanks @klmtseng). New: &lt;strong&gt;&lt;code&gt;alpha bench --strict&lt;/code&gt;&lt;/strong&gt; finally wires the strict same-universe random-control + OOS gate that shipped unreachable since 0.1.9 (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/796&quot;&gt;#796&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/773&quot;&gt;#773&lt;/a&gt;, thanks @he-yufeng), an opt-in &lt;strong&gt;memory lifecycle&lt;/strong&gt; (quality scoring, Ebbinghaus decay, archive-only GC — all off by default) (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/733&quot;&gt;#733&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/732&quot;&gt;#732&lt;/a&gt;, thanks @shadowinlife), and backtest &lt;strong&gt;rebalance-notes&lt;/strong&gt; artifacts + turnover metrics (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/795&quot;&gt;#795&lt;/a&gt;, thanks @he-yufeng).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-22&lt;/strong&gt; 🚀 &lt;strong&gt;v0.1.12 released&lt;/strong&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/releases/tag/v0.1.12&quot;&gt;Release notes&lt;/a&gt;, &lt;code&gt;pip install -U vibe-trading-ai&lt;/code&gt;): The &lt;strong&gt;correlation regime timeline&lt;/strong&gt; adds a &lt;code&gt;GET /correlation/regime&lt;/code&gt; endpoint + an opt-in Correlation-tab strip — edge density run through a causal hysteresis state machine that marks FUSED market episodes, descriptive risk context rather than a signal (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/756&quot;&gt;#756&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/719&quot;&gt;#719&lt;/a&gt;, thanks @ebujinovch). Provider endpoint resolution now falls back to each provider&#39;s canonical base URL and gracefully handles non-SSE endpoints, fixing the native &lt;strong&gt;zai&lt;/strong&gt; provider on glm-5.1 (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/758&quot;&gt;#758&lt;/a&gt;). Plus a strict-JSON / finite-number &lt;strong&gt;reliability sweep&lt;/strong&gt; across metrics, factors, pattern, session, and journal (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/761&quot;&gt;#761&lt;/a&gt;–&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/770&quot;&gt;#770&lt;/a&gt;, thanks @santhreal) and a Binance maintenance-bracket decouple that keeps &lt;code&gt;-PERP&lt;/code&gt; backtests zero-credential (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/757&quot;&gt;#757&lt;/a&gt;, thanks @honginp). Rolls up ~90 fixes since 0.1.11.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-21&lt;/strong&gt; 🔧 &lt;strong&gt;Data-loader completeness + a reliability fix sweep&lt;/strong&gt;: Partial market-data results now complete the missing symbols through the fallback chain and fail closed instead of silently shrinking the backtest universe (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/689&quot;&gt;#689&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/681&quot;&gt;#681&lt;/a&gt;, thanks @xkam7ar), and OKX bars use the &lt;code&gt;history-candles&lt;/code&gt; endpoint with rate-limit retry for deep backfills (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/644&quot;&gt;#644&lt;/a&gt;, thanks @tyj147454413-cmd). Plus a fix sweep: the MCP network guard accepts IPv6 / case-variant hosts (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/750&quot;&gt;#750&lt;/a&gt;, thanks @Robin1987China), trade-journal parsers skip blank/NaN symbol rows (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/749&quot;&gt;#749&lt;/a&gt;, thanks @Robin1987China), the Shadow Account skips the mined entry-hour gate on daily bars (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/748&quot;&gt;#748&lt;/a&gt;, thanks @Robin1987China), and MiniMax regional API endpoints are selectable (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/731&quot;&gt;#731&lt;/a&gt;, thanks @octo-patch).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-20&lt;/strong&gt; 🔀 &lt;strong&gt;Providers, MetaTrader 5, and a reliability sweep&lt;/strong&gt;: Native &lt;strong&gt;Anthropic Messages API&lt;/strong&gt; (optional &lt;code&gt;[anthropic]&lt;/code&gt; extra, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/695&quot;&gt;#695&lt;/a&gt;, thanks @jelech), &lt;strong&gt;SiliconFlow&lt;/strong&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/565&quot;&gt;#565&lt;/a&gt;, thanks @UNHNQ), and &lt;strong&gt;iFlytek Spark&lt;/strong&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/537&quot;&gt;#537&lt;/a&gt;, thanks @FenjuFu) join the provider roster, and a &lt;strong&gt;MetaTrader 5 (Exness)&lt;/strong&gt; broker connector + &lt;code&gt;mt5&lt;/code&gt; forex/metal data source lands (broker connectors → &lt;strong&gt;12&lt;/strong&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/481&quot;&gt;#481&lt;/a&gt;, thanks @StaniellG). Plus a provider-agnostic &lt;strong&gt;&lt;code&gt;llm-vision&lt;/code&gt; OCR&lt;/strong&gt; engine (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/548&quot;&gt;#548&lt;/a&gt;, thanks @shadowinlife), an &lt;strong&gt;80× signal-alignment vectorization&lt;/strong&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/698&quot;&gt;#698&lt;/a&gt;, thanks @shadowinlife), historical &lt;strong&gt;Binance USD-M funding/bracket&lt;/strong&gt; data (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/716&quot;&gt;#716&lt;/a&gt;, thanks @honginp), a swarm MCP-discovery cache (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/704&quot;&gt;#704&lt;/a&gt;), and a reliability consolidation closing &lt;strong&gt;13&lt;/strong&gt; SSE/session/CLI/swarm/scheduler issues (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/584&quot;&gt;#584&lt;/a&gt;, thanks @xkam7ar). Correctness: options &lt;strong&gt;partial-close&lt;/strong&gt; now honors the requested quantity instead of flattening the lot (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/577&quot;&gt;#577&lt;/a&gt;), centralized provider credential resolution (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/563&quot;&gt;#563&lt;/a&gt;), queued-cancel handling (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/641&quot;&gt;#641&lt;/a&gt;), a frontend streaming-DOM race (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/717&quot;&gt;#717&lt;/a&gt;, thanks @Marnie0415), and the connector CLI renderers (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/726&quot;&gt;#726&lt;/a&gt;, thanks @nareshkps).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-19&lt;/strong&gt; 🔧 &lt;strong&gt;Real US/HK stock-news articles + MCP factor-analysis fix + a robustness pass&lt;/strong&gt;: The stock-news tool now returns real &lt;strong&gt;Yahoo Finance articles&lt;/strong&gt; (title/url/source/published/snippet) for US and HK tickers instead of related-instrument matches, still routed through the frozen IP-throttled client (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/730&quot;&gt;#730&lt;/a&gt;, thanks @yxhuang). The MCP &lt;code&gt;factor_analysis&lt;/code&gt; tool is realigned to the registered tool&#39;s real CSV contract, so calls no longer die on &lt;code&gt;KeyError&lt;/code&gt; before running (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/715&quot;&gt;#715&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/635&quot;&gt;#635&lt;/a&gt;, thanks @Robin1987China). Plus a robustness pass: the whole &lt;strong&gt;Kimi K-series&lt;/strong&gt; (k2/k3/…/&lt;code&gt;for-coding&lt;/code&gt;) now auto-forces &lt;code&gt;temperature=1&lt;/code&gt; as the API requires (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/701&quot;&gt;#701&lt;/a&gt;, thanks @sambazhu), and &lt;code&gt;split_message&lt;/code&gt;, PDF page ranges, and trade-journal date filters all fail fast on degenerate or inverted input instead of hanging or silently returning nothing (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/727&quot;&gt;#727&lt;/a&gt;–&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/729&quot;&gt;#729&lt;/a&gt;, thanks @santhreal).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-18&lt;/strong&gt; 🔧 &lt;strong&gt;Binance crypto fallback + parallel-execution and correctness fixes&lt;/strong&gt;: A &lt;strong&gt;Binance&lt;/strong&gt; loader joins the crypto historical-data fallback chain (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/643&quot;&gt;#643&lt;/a&gt;, thanks @tyj147454413-cmd), and the IBKR connector moves to a thread-local connection pool with snapshot quotes, fixing hangs under parallel agent runs (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/636&quot;&gt;#636&lt;/a&gt;, thanks @MikeCer). Plus a correctness pass: factor analysis rejects non-positive &lt;code&gt;n_groups&lt;/code&gt;, inverted period ranges and non-positive detection windows fail fast, an unnamed &lt;code&gt;DatetimeIndex&lt;/code&gt; in the correlation matrix is handled, &lt;code&gt;equity.csv&lt;/code&gt; nav/value column aliases are accepted, and empty A-share codes are no longer coerced to &lt;code&gt;000000.SZ&lt;/code&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/709&quot;&gt;#709&lt;/a&gt;–&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/714&quot;&gt;#714&lt;/a&gt;, thanks @santhreal). A correlation-rewiring stability factor joins the academic zoo (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/705&quot;&gt;#705&lt;/a&gt;, thanks @ebujinovch), the fundamental zoo is whitelisted for factor analysis (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/707&quot;&gt;#707&lt;/a&gt;, thanks @sambazhu), persisted run state is now fsync-durable (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/645&quot;&gt;#645&lt;/a&gt;, thanks @tyj147454413-cmd), and the dev extra installs the documented Black/Ruff toolchain (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/634&quot;&gt;#634&lt;/a&gt;, thanks @xkam7ar).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-17&lt;/strong&gt; 🧩 &lt;strong&gt;Correlation-regime skill + a broad backtest / data / live-safety correctness pass&lt;/strong&gt;: a new &lt;strong&gt;correlation-regime&lt;/strong&gt; detection skill (bundled skills → 88, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/557&quot;&gt;#557&lt;/a&gt;, thanks @ebujinovch), a Longbridge runtime connection card (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/569&quot;&gt;#569&lt;/a&gt;, thanks @fanfpy), and user-defined swarm presets loaded from &lt;code&gt;~/.vibe-trading&lt;/code&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/570&quot;&gt;#570&lt;/a&gt;, thanks @darkknight4563). Plus hardening across the stack: silent-data-corruption fixes in the Futu / Tencent / CCXT / mootdx loaders, look-ahead-bias and strict-OOS guards in the factor bench and Shadow Account, live-trading safety (signed exposure caps, atomic daily order limits, consent-first mandate commits, fail-closed live state), and journal / QVeris-budget / swarm / CI-gate improvements (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/552&quot;&gt;#552&lt;/a&gt;, thanks @xor-xe; much of the correctness work by @xkam7ar).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-16&lt;/strong&gt; 🔧 &lt;strong&gt;Dependency lock repaired + Windows settings save fix&lt;/strong&gt;: the hash-verified runtime lock is regenerated so Docker&#39;s &lt;code&gt;pip install --require-hashes&lt;/code&gt; resolves cleanly again, fixing the incompatible &lt;code&gt;caio&lt;/code&gt;/&lt;code&gt;pydantic-core&lt;/code&gt;/&lt;code&gt;websockets&lt;/code&gt; pins (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/564&quot;&gt;#564&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/558&quot;&gt;#558&lt;/a&gt;, thanks @tianrking). Saving Agent LLM settings from the Web UI no longer returns HTTP 500 on Windows — the POSIX-only &lt;code&gt;os.fchmod&lt;/code&gt; hardening is now platform-guarded, with a regression test for platforms without &lt;code&gt;fchmod&lt;/code&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/561&quot;&gt;#561&lt;/a&gt;, thanks @CRui5in).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-15&lt;/strong&gt; 🧮 &lt;strong&gt;Backtest correctness + Portfolio Studio core&lt;/strong&gt;: A 10-PR convergence pass made rebalances causal and order-independent, charged terminal close costs, reported fill-derived turnover, enforced exposure caps, and kept validation output finite and strict (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/530&quot;&gt;#530&lt;/a&gt;/&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/531&quot;&gt;#531&lt;/a&gt;/&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/532&quot;&gt;#532&lt;/a&gt;/&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/540&quot;&gt;#540&lt;/a&gt;). Charts now reuse the run&#39;s actual data source, repeatable market queries are no longer dropped, and &lt;code&gt;.env&lt;/code&gt; loads refresh cached config (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/535&quot;&gt;#535&lt;/a&gt;/&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/544&quot;&gt;#544&lt;/a&gt;/&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/554&quot;&gt;#554&lt;/a&gt;). Portfolio Studio &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/456&quot;&gt;#456&lt;/a&gt; and config bug &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/541&quot;&gt;#541&lt;/a&gt; are closed; provider fixes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/528&quot;&gt;#528&lt;/a&gt;/&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/529&quot;&gt;#529&lt;/a&gt; closed too. Thanks @YZY0108, @santhreal, @Robin1987China, @xkam7ar, @Marnie0415, and @marichu99.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-14&lt;/strong&gt; 🌉 &lt;strong&gt;Longbridge market data + modern MCP transport + provider reliability&lt;/strong&gt;: Longbridge joins the historical-data fallback layer with key-gated credentials, date-window splitting, strict completeness checks, and an opt-in SDK dependency; four China-market flow tools gain verified Tushare fallbacks, and negative final equity no longer crashes backtest metrics. The MCP server now supports Streamable HTTP, &lt;code&gt;write_file&lt;/code&gt; safely recovers aliased or missing path arguments, hypothesis updates reject unsupported fields, and Correlation requests are authenticated. NVIDIA NIM is now a first-class provider across Web Settings and both CLI onboarding paths, with a versioned compatibility User-Agent to address the reported 403; Web Settings now writes to the canonical &lt;code&gt;~/.vibe-trading/.env&lt;/code&gt;, migrates legacy configuration, and reports permission failures clearly, fixing the DeepSeek save-time 500 (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/534&quot;&gt;#534&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/516&quot;&gt;#516&lt;/a&gt;/&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/524&quot;&gt;#524&lt;/a&gt;; &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/528&quot;&gt;#528&lt;/a&gt;/&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/529&quot;&gt;#529&lt;/a&gt;). Thanks @fanfpy, @asahikiko, @santhreal, @sTunnaSu, @abhishekjaisinghani, @huangcheng, @ShiroKSH, @Meru143, @DIEGOD79, and @not-knope for the code, reports, and diagnosis.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-13&lt;/strong&gt; 🔒 &lt;strong&gt;Security hardening: all 10 external-audit findings closed + contributor batch&lt;/strong&gt;: every finding from the 2026-07-10 external security audit (issue &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/476&quot;&gt;#476&lt;/a&gt;, discussion &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/discussions/468&quot;&gt;#468&lt;/a&gt;) is now addressed on &lt;code&gt;main&lt;/code&gt; — Docker multi-stage rebuild with digest-pinned images, an AST-hardened backtest sandbox blocking network/subprocess/eval/os.environ/unsafe-open (including inside nested function bodies), short-lived single-use SSE auth tickets, hardened Compose (read-only rootfs, dropped capabilities, resource limits), auth + rate limiting on &lt;code&gt;/correlation&lt;/code&gt;, security headers, hash-locked dependencies, and more. Also merged: opt-in &lt;strong&gt;TAP mode&lt;/strong&gt; for Alpaca key isolation (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/377&quot;&gt;#377&lt;/a&gt;, thanks @0xZKnw), realized portfolio turnover surfaced in backtest metrics (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/478&quot;&gt;#478&lt;/a&gt;, thanks @Robin1987China), a &lt;strong&gt;Frazzini-Pedersen betting-against-beta&lt;/strong&gt; academic factor (Alpha Zoo → 461, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/480&quot;&gt;#480&lt;/a&gt;, thanks @YogeshModi24), a look-ahead-bias fix across all 5 portfolio optimizers (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/487&quot;&gt;#487&lt;/a&gt;, thanks @YZY0108), and two preflight/provider-config fixes (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/479&quot;&gt;#479&lt;/a&gt;/&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/484&quot;&gt;#484&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/477&quot;&gt;#477&lt;/a&gt;/&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/482&quot;&gt;#482&lt;/a&gt;, thanks @ananaymital/@Bortlesboat).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-12&lt;/strong&gt; 🧪 &lt;strong&gt;Strategy Development Manager + contributor fix batch&lt;/strong&gt;: the new &lt;code&gt;strategy-dev-manager&lt;/code&gt; skill (#87) turns academic papers and broker research into registered factors/strategies with a persistent artifact store and automated IC/Sharpe decay monitoring — &lt;code&gt;sdm_register&lt;/code&gt; / &lt;code&gt;sdm_status&lt;/code&gt; / &lt;code&gt;sdm_decay_scan&lt;/code&gt; drive an active → monitoring → decayed → disabled lifecycle over &lt;code&gt;~/.vibe-trading/&lt;/code&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/457&quot;&gt;#457&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/455&quot;&gt;#455&lt;/a&gt;, thanks @shadowinlife). Also merged: the Correlation tab accepts bare tickers (&lt;code&gt;AAPL,SPY&lt;/code&gt;) and walks the full loader fallback chain (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/472&quot;&gt;#472&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/471&quot;&gt;#471&lt;/a&gt;, thanks @yxhuang), the &lt;code&gt;local&lt;/code&gt; loader honors requested intervals via OHLCV resampling (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/467&quot;&gt;#467&lt;/a&gt;, thanks @Shizoqua), Binance USD-M perpetual history lands with explicit &lt;code&gt;BTC-USDT-PERP&lt;/code&gt; routing + execution/mark price separation as the first &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/462&quot;&gt;#462&lt;/a&gt; slice (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/470&quot;&gt;#470&lt;/a&gt;, thanks @honginp), FastMCP transport imports now work across both module layouts (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/469&quot;&gt;#469&lt;/a&gt;, thanks @roberttidball), and Requesty is available as an OpenAI-compatible LLM gateway provider (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/474&quot;&gt;#474&lt;/a&gt;, thanks @Thibaultjaigu).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-11&lt;/strong&gt; 🚀 &lt;strong&gt;v0.1.11 released&lt;/strong&gt; (&lt;code&gt;pip install -U vibe-trading-ai&lt;/code&gt;): rolls up three weeks since 0.1.10 — first-class Indian equity (NSE/BSE) backtesting, the PIT-safe fundamental factor layer (Alpha Zoo → 460), the 16-adapter IM channel runtime, end-to-end scheduled research, optional QVeris premium data, and today&#39;s contributor batch: a turnover-aware optimizer (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/466&quot;&gt;#466&lt;/a&gt;, thanks @Robin1987China), an &lt;code&gt;analyze_image&lt;/code&gt; vision tool + NapCat DM pairing + the IM-media read fix (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/464&quot;&gt;#464&lt;/a&gt;/&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/463&quot;&gt;#463&lt;/a&gt;/&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/465&quot;&gt;#465&lt;/a&gt;, thanks @fei-moss), Longbridge Decimal serialization (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/459&quot;&gt;#459&lt;/a&gt;, thanks @fanfpy), and packaged-manifest count guards (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/461&quot;&gt;#461&lt;/a&gt;, thanks @asahikiko). Full details: &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/CHANGELOG.md&quot;&gt;CHANGELOG&lt;/a&gt; · &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/releases/tag/v0.1.11&quot;&gt;release notes&lt;/a&gt;.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-10&lt;/strong&gt; 🇮🇳 &lt;strong&gt;Indian equity (NSE/BSE) support + centralized env config&lt;/strong&gt;: a dedicated &lt;code&gt;IndiaEquityEngine&lt;/code&gt; lands — T+1 delivery, circuit bands, and a config-driven STT/stamp/exchange/SEBI/GST cost stack — with &lt;code&gt;.NS&lt;/code&gt;/&lt;code&gt;.BO&lt;/code&gt; symbol routing, an opt-in read-only Shoonya/Dhan data bridge, and 255 alpha101/qlib158 factors opted into the new &lt;code&gt;equity_in&lt;/code&gt; universe (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/305&quot;&gt;#305&lt;/a&gt;, thanks @muku314115). Environment variables now flow through a single Pydantic &lt;code&gt;EnvConfig&lt;/code&gt; schema with an AST-based CI gate against future &lt;code&gt;os.getenv&lt;/code&gt; sprawl (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/440&quot;&gt;#440&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/438&quot;&gt;#438&lt;/a&gt;, thanks @shadowinlife). Also: a second-confirmation dialog before committing a real trading mandate plus unified error toasts (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/453&quot;&gt;#453&lt;/a&gt;, thanks @wison1717-maker), scheduled-research route tests (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/452&quot;&gt;#452&lt;/a&gt;, thanks @Robin1987China), and GLM thinking models no longer lose their reasoning stream on the zhipu provider (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/458&quot;&gt;#458&lt;/a&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-09&lt;/strong&gt; 🧯 &lt;strong&gt;Docker startup unblocked + provider/CLI contributor batch&lt;/strong&gt;: Docker/server startup no longer crashes when FastAPI route iteration sees an included-router-like entry without &lt;code&gt;path&lt;/code&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/450&quot;&gt;#450&lt;/a&gt;, thanks @Penn-Live). We also landed the queued quick-win contributor fixes: loader &lt;code&gt;fetch()&lt;/code&gt; signatures now match the protocol across OKX / Tushare / yfinance (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/437&quot;&gt;#437&lt;/a&gt;, thanks @shadowinlife), the CLI resume prompt preserves the first user message (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/448&quot;&gt;#448&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/447&quot;&gt;#447&lt;/a&gt;, thanks @morluto), Codex OAuth defaults to &lt;code&gt;openai-codex/gpt-5.4&lt;/code&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/446&quot;&gt;#446&lt;/a&gt;, thanks @morluto), Kimi for Coding is available as a distinct provider (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/435&quot;&gt;#435&lt;/a&gt;, thanks @yxhuang), opencode provider mappings are wired (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/444&quot;&gt;#444&lt;/a&gt;, thanks @imsankz), and Tushare reference code fences now say &lt;code&gt;python&lt;/code&gt; instead of &lt;code&gt;pyhton&lt;/code&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/449&quot;&gt;#449&lt;/a&gt;, thanks @flash1234pku). Validation included focused server/CLI/provider/loader tests plus a Docker build and &lt;code&gt;/health&lt;/code&gt; smoke.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-08&lt;/strong&gt; 💎 &lt;strong&gt;Fundamental factor layer (Phase 1) + optional QVeris premium data + maintainer day&lt;/strong&gt;: PIT-safe SEC fundamentals now flow into daily factor panels — &lt;code&gt;fund:*&lt;/code&gt; panel columns, filed-date anchoring with restatement and YTD-frame protection, and 4 new quality/value factors (registry now 460 alphas). Data routing gains an optional premium track: the 18 free sources stay the default, while QVeris unlocks 63+ providers via Settings → QVeris or &lt;code&gt;vibe-trading data mode paid&lt;/code&gt; (see the QVeris section below). Also: &lt;code&gt;api_server&lt;/code&gt; modularization completed (1,103 → 371 lines, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/424&quot;&gt;#424&lt;/a&gt; closing &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/331&quot;&gt;#331&lt;/a&gt;, thanks @shadowinlife), backtest &lt;code&gt;validation.json&lt;/code&gt; no longer requires a pre-existing artifacts dir (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/429&quot;&gt;#429&lt;/a&gt;, thanks @isaveall), clearer &lt;code&gt;--swarm-run&lt;/code&gt; errors (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/428&quot;&gt;#428&lt;/a&gt;, thanks @isaveall), and we reverted the governance stack that broke session chats (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/433&quot;&gt;#433&lt;/a&gt;, thanks @yxhuang for the precise diagnosis).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-07&lt;/strong&gt; ✅ &lt;strong&gt;Contributor PR batch&lt;/strong&gt;: merged the queued contributor work for IM channel timeout configuration (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/413&quot;&gt;#413&lt;/a&gt;, thanks @SyntaxSawdust), Alpha Library social previews and the beginner tutorial (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/396&quot;&gt;#396&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/393&quot;&gt;#393&lt;/a&gt;, thanks @kadaliao), value-investing skills / tools / committee presets (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/407&quot;&gt;#407&lt;/a&gt;, thanks @sambazhu), zero-sized order-field handling in &lt;code&gt;trading_place_order&lt;/code&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/417&quot;&gt;#417&lt;/a&gt;, thanks @irfanallana-oss), and timezone-aware UTC timestamps across session/API paths (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/397&quot;&gt;#397&lt;/a&gt;, thanks @mustafakamal88).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-06&lt;/strong&gt; 🧭 &lt;strong&gt;Preflight hardening, API slices, and CN search fallback&lt;/strong&gt;: provider preflight no longer follows redirects (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/404&quot;&gt;#404&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/402&quot;&gt;#402&lt;/a&gt;, thanks @SyntaxSawdust), the remaining API routes moved into focused modules (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/387&quot;&gt;#387&lt;/a&gt;, superseding &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/383&quot;&gt;#383&lt;/a&gt;-&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/386&quot;&gt;#386&lt;/a&gt;, thanks @shadowinlife), and CN web-search fallbacks now include Alibaba Cloud IQS (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/408&quot;&gt;#408&lt;/a&gt;, thanks @sambazhu). Maintainer cleanup added no-network fallback tests and EOF whitespace cleanup (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/commit/fbac74f77bfed58dd7fc23d0f001c29190b4b2b6&quot;&gt;fbac74f&lt;/a&gt;); main CI is green (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/actions/runs/28780619018&quot;&gt;run 28780619018&lt;/a&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-05&lt;/strong&gt; ✅ &lt;strong&gt;Contributor PR queue closed + Windows baseline green&lt;/strong&gt;: merged the four non-draft PRs selected for today&#39;s maintainer pass. A-share mootdx batch pulls now let &lt;code&gt;KeyboardInterrupt&lt;/code&gt; / &lt;code&gt;SystemExit&lt;/code&gt; propagate instead of being swallowed by a bare &lt;code&gt;except&lt;/code&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/399&quot;&gt;#399&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/398&quot;&gt;#398&lt;/a&gt;, thanks @shadowinlife). The Settings route slice and patched dependency floors are now merged under their original contributor PRs (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/382&quot;&gt;#382&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/390&quot;&gt;#390&lt;/a&gt;, thanks @shadowinlife and @aeonframework). Windows baseline compatibility now isolates loader caches, makes OAuth cache assertions platform-aware, skips one fork-only mock test on Windows, and bypasses proxies for MCP loopback fixtures (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/401&quot;&gt;#401&lt;/a&gt;, thanks @Elfsa-Miranda). Validation: &lt;code&gt;4701 passed, 47 skipped&lt;/code&gt;.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-04&lt;/strong&gt; 🧩 &lt;strong&gt;API route slices, tutorial docs, and dependency floors&lt;/strong&gt;: IM channel and Settings routes moved out of &lt;code&gt;api_server.py&lt;/code&gt; into &lt;code&gt;src/api/channels_routes.py&lt;/code&gt; and &lt;code&gt;src/api/settings_routes.py&lt;/code&gt;, continuing the narrow &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/331&quot;&gt;#331&lt;/a&gt; modularization path from contributor work (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/379&quot;&gt;#379&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/382&quot;&gt;#382&lt;/a&gt;, thanks @shadowinlife). The wiki gained a Chinese beginner tutorial for non-finance readers (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/393&quot;&gt;#393&lt;/a&gt;, thanks @kadaliao), and dependency floors now keep Pillow / LangChain / LangGraph on the installable patched track (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/390&quot;&gt;#390&lt;/a&gt;, thanks @aeonframework).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-04&lt;/strong&gt; 🧹 &lt;strong&gt;UTC timestamp cleanup for session and API paths&lt;/strong&gt;: tightened the #395 timestamp fix so session, goal, channel, and API timestamps now emit timezone-aware UTC values in explicit ISO form.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-03&lt;/strong&gt; 🛡️ &lt;strong&gt;Robinhood MCP refresh + API modularization + SSRF guard&lt;/strong&gt;: Robinhood Agentic Trading now uses the current MCP tool names across generic reads, live-runner plumbing, default read-only seeds, and mandate-gate tests, while interactive startup honors the same &lt;code&gt;.env&lt;/code&gt; search order as the provider loader (&lt;code&gt;~/.vibe-trading/.env&lt;/code&gt; → &lt;code&gt;agent/.env&lt;/code&gt; → &lt;code&gt;$CWD/.env&lt;/code&gt;) (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/391&quot;&gt;#391&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/381&quot;&gt;#381&lt;/a&gt; and &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/380&quot;&gt;#380&lt;/a&gt;). System routes (&lt;code&gt;/health&lt;/code&gt;, &lt;code&gt;/correlation&lt;/code&gt;, &lt;code&gt;/system/shutdown&lt;/code&gt;, &lt;code&gt;/skills&lt;/code&gt;, &lt;code&gt;/api&lt;/code&gt;) moved into &lt;code&gt;src/api/system_routes.py&lt;/code&gt; as the next narrow API modularization slice (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/378&quot;&gt;#378&lt;/a&gt;, thanks @shadowinlife). Channel media SSRF defenses now reject CGNAT/mesh/non-global targets and QQ media redirects-to-internal before fetching (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/389&quot;&gt;#389&lt;/a&gt;, thanks @hobostay).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-02&lt;/strong&gt; ⚡ &lt;strong&gt;Factor acceleration + safer runtime boundaries&lt;/strong&gt;: hot rolling factor operators now use &lt;code&gt;bottleneck&lt;/code&gt;/NumPy fast paths, alpha bench parallelism avoids repeated large-panel worker payloads, and base equity math has regression coverage (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/376&quot;&gt;#376&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/339&quot;&gt;#339&lt;/a&gt;, original work from &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/342&quot;&gt;#342&lt;/a&gt; by @shadowinlife). Upload and Shadow report routes moved out of the monolithic &lt;code&gt;api_server.py&lt;/code&gt; as the first narrow API modularization slice while &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/331&quot;&gt;#331&lt;/a&gt; stays open (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/375&quot;&gt;#375&lt;/a&gt;, based on &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/358&quot;&gt;#358&lt;/a&gt;, thanks @shadowinlife). Generated backtests now inherit only an allowlisted subprocess environment instead of the parent secrets surface (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/374&quot;&gt;#374&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/332&quot;&gt;#332&lt;/a&gt;), and IM channels gained &lt;code&gt;/new&lt;/code&gt; session reset plus case-insensitive pairing commands (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/372&quot;&gt;#372&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/371&quot;&gt;#371&lt;/a&gt;, thanks @shadowinlife).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-07-01&lt;/strong&gt; 🧹 &lt;strong&gt;Security polish + tracker cleanup&lt;/strong&gt;: tightened API/Docker/frontend dev defaults, stabilized Settings channel and &lt;code&gt;zh-CN&lt;/code&gt; edges, cleared frontend dependency/CSP alerts, and closed stale WhatsApp + paper-trading tracker items (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/338&quot;&gt;#338&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/351&quot;&gt;#351&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/349&quot;&gt;#349&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/365&quot;&gt;#365&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/367&quot;&gt;#367&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/350&quot;&gt;#350&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/335&quot;&gt;#335&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/283&quot;&gt;#283&lt;/a&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-30&lt;/strong&gt; 💬 &lt;strong&gt;IM channel runtime for research delivery&lt;/strong&gt;: Vibe-Trading can now attach the same agent session runtime to 16 built-in message adapters — WebSocket, Telegram, Slack, Discord, Matrix, WhatsApp, Signal, QQ/NapCat, WeChat/WeCom, Feishu/Lark, DingTalk, Teams, email, and Mochat. CLI (&lt;code&gt;vibe-trading channels status/start/stop/login/pairing&lt;/code&gt;), REST (&lt;code&gt;/channels/status&lt;/code&gt;, &lt;code&gt;/channels/start&lt;/code&gt;, &lt;code&gt;/channels/stop&lt;/code&gt;, &lt;code&gt;/channels/pairing/command&lt;/code&gt;), and the Web UI Settings panel expose status, recovery hints, start/stop, and sender pairing; SDK-backed adapters stay behind extras such as &lt;code&gt;vibe-trading-ai[telegram]&lt;/code&gt; or &lt;code&gt;vibe-trading-ai[channels]&lt;/code&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/341&quot;&gt;#341&lt;/a&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-29&lt;/strong&gt; 🛡️ &lt;strong&gt;Live advisory safety + Trading 212 read-only connector + Windows/Gemini fixes&lt;/strong&gt;: live order guards now have an opt-in, broker-agnostic &lt;code&gt;PreTradeAdvisoryInterface&lt;/code&gt; that records advisory reviews without bypassing the mandate gate, kill switch, or audit trail (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/328&quot;&gt;#328&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/317&quot;&gt;#317&lt;/a&gt;, thanks @shadowinlife). Trading 212 joins the connector layer with read-only account, positions, orders, history, and instrument-metadata support; &lt;code&gt;place_order&lt;/code&gt; / &lt;code&gt;cancel_order&lt;/code&gt; still hard-refuse until a structural paper/live boundary exists (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/321&quot;&gt;#321&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/309&quot;&gt;#309&lt;/a&gt;, thanks @mvanhorn). Windows startup avoids the pandas 3.0 &lt;code&gt;Timestamp&lt;/code&gt; crash via the &lt;code&gt;&amp;lt;3.0.0&lt;/code&gt; constraint (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/329&quot;&gt;#329&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/324&quot;&gt;#324&lt;/a&gt;, thanks @hannibal-lee); Gemini &lt;code&gt;thought_signature&lt;/code&gt; dict-history replay was verified/fixed on &lt;code&gt;main&lt;/code&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/318&quot;&gt;#318&lt;/a&gt;); &lt;code&gt;.US&lt;/code&gt; financial statements now route to SEC EDGAR instead of Eastmoney (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/325&quot;&gt;#325&lt;/a&gt;); and the Alpha Library landing page got cache/date/selector/noscript/DNS-prefetch hardening while heavier CSP and social-card follow-ups stay tracked (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/323&quot;&gt;#323&lt;/a&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-28&lt;/strong&gt; 🧰 &lt;strong&gt;Cross-platform setup/dev + runtime and file-tool hardening&lt;/strong&gt;: &lt;code&gt;vibe-trading setup&lt;/code&gt; and &lt;code&gt;vibe-trading dev&lt;/code&gt; now handle Windows TypeScript builds, launch the backend from the right cwd, use the Vite 5899 port, and shut child processes down cleanly (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/292&quot;&gt;#292&lt;/a&gt;, thanks @digger-yu). Runtime status polling now degrades instead of crashing (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/322&quot;&gt;#322&lt;/a&gt;); MCP OAuth cache keys are sanitized (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/313&quot;&gt;#313&lt;/a&gt;); OpenAI defaults and Robinhood &lt;code&gt;agent.json&lt;/code&gt; validation were tightened (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/319&quot;&gt;#319&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/320&quot;&gt;#320&lt;/a&gt;, thanks @mvanhorn); and file tools got isolated read/write roots plus broader sandbox tests (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/299&quot;&gt;#299&lt;/a&gt;, thanks @skloxo).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-27&lt;/strong&gt; 🧯 &lt;strong&gt;Content-filter resilience + Shadow Account feature contract cleanup&lt;/strong&gt;: event-driven and swarm runs now skip individual LLM content-moderation hits, warn in run cards when filter rates are high, and recognize Gemini safety finish reasons instead of aborting an entire analysis (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/308&quot;&gt;#308&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/307&quot;&gt;#307&lt;/a&gt;, thanks @shadowinlife). Shadow Account extraction/codegen now share one &lt;code&gt;PRICE_FEATURES&lt;/code&gt; contract and keep four-decimal return bounds, preventing rule/codegen drift and precision loss on &lt;code&gt;prior_5d_return&lt;/code&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/316&quot;&gt;#316&lt;/a&gt;, thanks @Robin1987China).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-26&lt;/strong&gt; 🎯 &lt;strong&gt;Shadow Account conditional entry + tushare ETF/index/HK routing&lt;/strong&gt;: extracted Shadow Account rules now carry RSI / prior-return bounds, so the generated SignalEngine enters on real conditions (RSI in range, prior-return in range) instead of blindly replaying the holding cadence (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/314&quot;&gt;#314&lt;/a&gt;, follows &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/302&quot;&gt;#302&lt;/a&gt;, thanks @Robin1987China). The tushare loader also routes ETF/LOF → &lt;code&gt;fund_daily()&lt;/code&gt;, indices → &lt;code&gt;index_daily()&lt;/code&gt;, and HK equities → &lt;code&gt;hk_daily()&lt;/code&gt; instead of always calling &lt;code&gt;daily()&lt;/code&gt; (which silently returns empty for non-stocks), with per-symbol empty-result + partial-fetch warnings (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/315&quot;&gt;#315&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/310&quot;&gt;#310&lt;/a&gt;, thanks @shadowinlife).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-25&lt;/strong&gt; 🧪 &lt;strong&gt;Strict validation JSON + calmer agent context&lt;/strong&gt;: standalone backtest validation now normalizes nested &lt;code&gt;NaN&lt;/code&gt; / &lt;code&gt;Infinity&lt;/code&gt; values before writing &lt;code&gt;artifacts/validation.json&lt;/code&gt; or CLI stdout, so strict JSON parsers no longer choke on validation payloads (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/306&quot;&gt;#306&lt;/a&gt;, thanks @gyx09212214-prog). The agent prompt also derives the current data-source count from the loader registry, and &lt;code&gt;_microcompact()&lt;/code&gt; now waits for real token pressure instead of clearing older tool results during short runs (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/296&quot;&gt;#296&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/282&quot;&gt;#282&lt;/a&gt;, thanks @MarkfuGod).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-24&lt;/strong&gt; 🎯 &lt;strong&gt;Shadow Account price context + reactive Chinese UI + LAN auth fix&lt;/strong&gt;: Shadow Account rule extraction now sees PIT-safe entry context — &lt;code&gt;entry_rsi14&lt;/code&gt; and &lt;code&gt;prior_5d_return&lt;/code&gt; fetched through the loader registry as of &lt;code&gt;buy_dt&lt;/code&gt;, with graceful offline/no-data degradation (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/302&quot;&gt;#302&lt;/a&gt;, follows &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/295&quot;&gt;#295&lt;/a&gt;, thanks @Robin1987China). The main Web UI panels now use reactive English / zh-CN translations across charts, chat, Alpha Library, Correlation, and Run Detail (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/301&quot;&gt;#301&lt;/a&gt;, thanks @skloxo). Remote same-origin Web UI deployments with &lt;code&gt;API_AUTH_KEY&lt;/code&gt; can post and upload again after the CSRF hardening, while mismatched cross-site origins remain blocked (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/304&quot;&gt;#304&lt;/a&gt;, thanks @Hinotoi-agent).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-23&lt;/strong&gt; 🛡️ &lt;strong&gt;Local API CSRF hardening&lt;/strong&gt;: a malicious web page can no longer drive unsafe cross-site requests (POST/PUT/DELETE) against the loopback API — CORS blocks reading the response but not the side effect, so loopback dev-mode trust now applies the existing cross-site guard to unsafe methods &lt;em&gt;before&lt;/em&gt; honoring it. Safe methods and local CLI / non-browser uploads are unaffected (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/293&quot;&gt;#293&lt;/a&gt;, thanks @Hinotoi-agent).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-22&lt;/strong&gt; 🔧 &lt;strong&gt;Live-authorize OAuth fix + Alpha Zoo headline fix&lt;/strong&gt;: &lt;code&gt;connector authorize&lt;/code&gt; now holds the OAuth handshake open through a multi-minute broker sign-in (tunable via &lt;code&gt;VIBE_LIVE_AUTHORIZE_TIMEOUT_SECONDS&lt;/code&gt;) and no longer spawns a competing callback server on retry, so the token actually persists (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/281&quot;&gt;#281&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/259&quot;&gt;#259&lt;/a&gt;, thanks @Robin1987China). The Alpha Zoo page no longer prints its alpha count twice (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/287&quot;&gt;#287&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/286&quot;&gt;#286&lt;/a&gt;, thanks @digger-yu). Scheduled research also picked up end-to-end usage docs (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/288&quot;&gt;#288&lt;/a&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-21&lt;/strong&gt; ⏰ &lt;strong&gt;Scheduled-research executor + Reports library + post-backtest attribution&lt;/strong&gt;: scheduled research now runs &lt;strong&gt;end to end&lt;/strong&gt; — a default-off background executor (&lt;code&gt;VIBE_TRADING_ENABLE_SCHEDULER&lt;/code&gt;) fires due interval/cron jobs through the session runtime (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/278&quot;&gt;#278&lt;/a&gt;, thanks @mvanhorn, closing &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/254&quot;&gt;#254&lt;/a&gt;). A new &lt;strong&gt;&lt;code&gt;/reports&lt;/code&gt; Run Library&lt;/strong&gt; page lists, searches, and filters report-worthy runs with links into Run Detail + Compare (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/224&quot;&gt;#224&lt;/a&gt;, thanks @LemonCANDY42). And after every backtest the agent now runs &lt;strong&gt;layered attribution&lt;/strong&gt; — trade-level winners/losers, beta regression, market-regime analysis, and a Monte Carlo permutation test, gated by data availability and routing (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/280&quot;&gt;#280&lt;/a&gt;, thanks @shadowinlife).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-20&lt;/strong&gt; 🔬 &lt;strong&gt;Research Autopilot loop closes (Phase 3) + loader OHLC integrity guard + 4 academic alphas&lt;/strong&gt;: &lt;strong&gt;Research Autopilot&lt;/strong&gt; now runs &lt;strong&gt;hypothesis → signal-engine → backtest&lt;/strong&gt; end to end — &lt;code&gt;scaffold_signal_engine&lt;/code&gt; writes a contract-correct engine and &lt;code&gt;link_autopilot_backtest&lt;/code&gt; feeds run metrics back to the hypothesis (&lt;strong&gt;68 tools&lt;/strong&gt;) (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/267&quot;&gt;#267&lt;/a&gt;). A structural &lt;strong&gt;OHLC sanity check&lt;/strong&gt; drops dirty bars (&lt;code&gt;high &amp;lt; low&lt;/code&gt;, non-positive prices, bad bracketing) centrally at the loader boundary, guarding every data source (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/274&quot;&gt;#274&lt;/a&gt;, thanks @Shizoqua). And the &lt;strong&gt;academic alpha family grows 6 → 10&lt;/strong&gt; — Jegadeesh reversal, George-Hwang 52-week-high, Amihud illiquidity, Harvey-Siddique skew (&lt;strong&gt;456 factors&lt;/strong&gt;) (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/277&quot;&gt;#277&lt;/a&gt;, thanks @Robin1987China).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-19&lt;/strong&gt; 🚀 &lt;strong&gt;v0.1.10 — Global data layer&lt;/strong&gt;: market-data sources grow 10 → 18 (free &lt;strong&gt;Eastmoney / Sina / Stooq / Yahoo&lt;/strong&gt; + key-gated &lt;strong&gt;Finnhub / Alpha Vantage / Tiingo / FMP&lt;/strong&gt;, ban-risk fallback) plus &lt;strong&gt;18 read-only data tools&lt;/strong&gt; (fund flow, dragon-tiger, northbound, margin, block trades, SEC EDGAR + XBRL, financials, options chains, full-market screening…) across A-share / US / HK, all over MCP. Also bundles everything since 0.1.9 — 10 broker connectors, &lt;code&gt;alpha compare&lt;/code&gt;, the provider-reliability overhaul, and the opt-in data cache. &lt;code&gt;pip install -U vibe-trading-ai&lt;/code&gt;&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-18&lt;/strong&gt; 🔬 &lt;strong&gt;Research Autopilot Phase 1 + a local Data Bridge loader, + a Discord security notice&lt;/strong&gt;: new &lt;code&gt;run_research_autopilot&lt;/code&gt; + &lt;code&gt;generate_backtest_config&lt;/code&gt; wire &lt;strong&gt;Hypothesis → Research Goal → backtest&lt;/strong&gt; end to end (now &lt;strong&gt;50 tools&lt;/strong&gt;), and a &lt;strong&gt;&lt;code&gt;local&lt;/code&gt;&lt;/strong&gt; loader reads OHLCV straight from your own &lt;strong&gt;CSV / Parquet / DuckDB&lt;/strong&gt; files (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/260&quot;&gt;#260&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/252&quot;&gt;#252&lt;/a&gt;, thanks @Robin1987China), alongside DeepSeek &lt;code&gt;DSML&lt;/code&gt; tool-call parsing and an identifier-containment hardening wave. ⚠️ &lt;strong&gt;Security:&lt;/strong&gt; the old community Discord invite now points to a server we don&#39;t control running a fake Collab.Land wallet-&quot;verification&quot; phishing scam — removed everywhere; the &lt;strong&gt;only&lt;/strong&gt; official Discord is the HKUDS server (&lt;a href=&quot;https://discord.gg/6TdQnT5xcF&quot;&gt;discord.gg/6TdQnT5xcF&lt;/a&gt;), and we&#39;ll never ask you to connect a wallet.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-17&lt;/strong&gt; 🧩 &lt;strong&gt;Install compatibility + Opus/Kimi provider fixes&lt;/strong&gt;: Baseline &lt;code&gt;pip install vibe-trading-ai&lt;/code&gt; no longer pulls the optional &lt;code&gt;pyharmonics&lt;/code&gt; / &lt;code&gt;ta&lt;/code&gt; dependency chain; harmonic detection now lives behind &lt;code&gt;vibe-trading-ai[harmonic]&lt;/code&gt; while the bundled detector remains available (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/250&quot;&gt;#250&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/249&quot;&gt;#249&lt;/a&gt;). The agent loop also avoids assistant-prefill handoff messages rejected by Opus 4.8+, and Kimi/Moonshot can override the client &lt;code&gt;User-Agent&lt;/code&gt; with &lt;code&gt;MOONSHOT_USER_AGENT&lt;/code&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/248&quot;&gt;#248&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/246&quot;&gt;#246&lt;/a&gt; and &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/204&quot;&gt;#204&lt;/a&gt;); follow-up tests now directly cover background-result and auto-compact handoff paths (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/251&quot;&gt;#251&lt;/a&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-16&lt;/strong&gt; 🛡️ &lt;strong&gt;Security/API hardening + GLM/Zhipu alias&lt;/strong&gt;: Settings writes require auth when configured (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/245&quot;&gt;#245&lt;/a&gt;); API shell-capable tools require explicit &lt;code&gt;VIBE_TRADING_ENABLE_SHELL_TOOLS=1&lt;/code&gt; opt-in (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/243&quot;&gt;#243&lt;/a&gt;); local shutdown requires auth when an API key is configured (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/241&quot;&gt;#241&lt;/a&gt;); and untrusted loopback-looking hosts are rejected instead of treated as local (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/242&quot;&gt;#242&lt;/a&gt;). Runtime edges also got cleaned up: Web chat syncs completed attempts (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/236&quot;&gt;#236&lt;/a&gt;), run cards emit strict JSON for non-finite metrics (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/238&quot;&gt;#238&lt;/a&gt;), malformed &lt;code&gt;RSSHUB_TIMEOUT_S&lt;/code&gt; / &lt;code&gt;RSSHUB_FETCH_BUDGET_S&lt;/code&gt; falls back safely (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/240&quot;&gt;#240&lt;/a&gt;), and ddgs retry fallback is regression-covered (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/239&quot;&gt;#239&lt;/a&gt;). GLM/Zhipu is now a first-class provider alias with model-name inference (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/247&quot;&gt;#247&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/237&quot;&gt;#237&lt;/a&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-15&lt;/strong&gt; 🧭 &lt;strong&gt;Web-search resilience + Web UI run-continuity fixes&lt;/strong&gt;: &lt;code&gt;web_search&lt;/code&gt; no longer fails when a single engine is rate-limited — it now queries several free, no-key engines in order (DuckDuckGo, Google, Bing, Brave, Mojeek, Yahoo) with retry/backoff, treats &quot;no results&quot; as an empty answer rather than an error, and returns an actionable message instead of a bare ❌ when every engine is throttled (override the engine list with &lt;code&gt;VIBE_TRADING_SEARCH_BACKENDS&lt;/code&gt;) (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/232&quot;&gt;#232&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/231&quot;&gt;#231&lt;/a&gt;, thanks @Ethan-sun01). In the Web UI, switching pages during a run no longer freezes it — the chat re-subscribes to the live stream and replays missed progress on return (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/234&quot;&gt;#234&lt;/a&gt;) — and the Stop button now takes effect mid-stream and between tools instead of only at iteration boundaries (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/235&quot;&gt;#235&lt;/a&gt;), closing both halves of &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/229&quot;&gt;#229&lt;/a&gt; (thanks @kalkinj). The baostock loader also accepts native &lt;code&gt;sh.601398&lt;/code&gt; / &lt;code&gt;sz.000001&lt;/code&gt; codes alongside tushare-style &lt;code&gt;601398.SH&lt;/code&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/230&quot;&gt;#230&lt;/a&gt;, thanks @bhlt).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-14&lt;/strong&gt; 📊 &lt;strong&gt;Per-run token usage + progressive Run Detail charts&lt;/strong&gt;: Every agent run now persists provider-reported token usage as a run-scoped &lt;code&gt;llm_usage.json&lt;/code&gt; — provider/model, aggregate totals, and per-iteration counts — surfaced additively on &lt;code&gt;/runs/{id}&lt;/code&gt;, so a finished run&#39;s token cost stays auditable after the live stream is gone (provider-reported only; no prompt/content capture, no price estimation) (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/223&quot;&gt;#223&lt;/a&gt;, thanks @LemonCANDY42). The Run Detail page no longer loads every symbol&#39;s candlesticks up front: the default &lt;code&gt;/runs/{id}&lt;/code&gt; response is unchanged, but the UI now renders the run summary first and loads each symbol&#39;s chart on demand through opt-in &lt;code&gt;?chart_payload=summary&lt;/code&gt; / &lt;code&gt;?chart_symbol=&lt;/code&gt; modes, with per-symbol loading state and a load-all-with-progress control (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/225&quot;&gt;#225&lt;/a&gt;, thanks @LemonCANDY42). Two loader fixes close the cycle: yfinance&#39;s exclusive &lt;code&gt;end&lt;/code&gt; boundary no longer drops the final requested trading day — the download now passes &lt;code&gt;end + 1 day&lt;/code&gt; while cache keys keep the original range (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/226&quot;&gt;#226&lt;/a&gt;, thanks @gyx09212214-prog) — and a malformed &lt;code&gt;CCXT_TIMEOUT_MS&lt;/code&gt; / &lt;code&gt;OKX_TIMEOUT_S&lt;/code&gt; value now warns and falls back to its default instead of raising at import and blocking startup (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/227&quot;&gt;#227&lt;/a&gt;, thanks @gyx09212214-prog).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-13&lt;/strong&gt; ↩️ &lt;strong&gt;Resume a past session by ID from the CLI&lt;/strong&gt;: The interactive CLI now prints the session-id on exit, with a copy-paste &lt;code&gt;vibe-trading resume &amp;lt;session-id&amp;gt;&lt;/code&gt; hint — so locating the trace for a finished run no longer means guessing which folder under &lt;code&gt;agent/sessions/&lt;/code&gt; is newest by timestamp. The new &lt;code&gt;vibe-trading resume &amp;lt;session-id&amp;gt;&lt;/code&gt; subcommand reopens that exact session and replays its recent turns into the loop; an unknown id fails fast instead of silently starting a blank session (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/218&quot;&gt;#218&lt;/a&gt;, thanks @zwrong).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-12&lt;/strong&gt; 🩺 &lt;strong&gt;Provider reliability overhaul — DeepSeek hangs, Kimi access, streaming liveness&lt;/strong&gt;: A cluster of provider reports — DeepSeek runs stuck on &quot;Agent is working…&quot; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/208&quot;&gt;#208&lt;/a&gt;, thanks @XYWOX), &lt;code&gt;reached max iterations&lt;/code&gt; masking empty model responses (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/203&quot;&gt;#203&lt;/a&gt;, thanks @mojianliang), the UI never recovering after a stall (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/195&quot;&gt;#195&lt;/a&gt;, thanks @mafia23), and Kimi rejecting the client (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/204&quot;&gt;#204&lt;/a&gt;, thanks @liao497) — shared one root: every OpenAI-compatible provider ran through a single shim that applied DeepSeek/Kimi/Gemini quirks globally and silently swallowed stream failures. Provider-specific behavior now lives in an explicit &lt;strong&gt;capability layer&lt;/strong&gt; — reasoning capture/replay, Gemini thought signatures, the Kimi &lt;code&gt;User-Agent&lt;/code&gt;, OpenRouter&#39;s reasoning body are each gated to their own provider instead of cross-contaminating. Reasoning-only streams show a live &lt;strong&gt;&quot;Reasoning…&quot;&lt;/strong&gt; indicator instead of dead air; a stream failure raises a contextual &lt;code&gt;provider_stream_error&lt;/code&gt; with one automatic retry for transient resets (deterministic 4xx fail fast) instead of silently falling back to a slow non-streaming call; an empty model response is reported as &lt;code&gt;empty_model_response&lt;/code&gt; instead of &quot;max iterations&quot;; SSE heartbeats no longer break reconnect replay; and a stuck read-only tool times out instead of hiding behind heartbeats forever. A new &lt;strong&gt;&lt;code&gt;vibe-trading provider doctor&lt;/code&gt;&lt;/strong&gt; prints a redacted provider/model/package/proxy snapshot for one-command triage of environment-side hangs. DeepSeek users can opt into the official native adapter with &lt;code&gt;pip install &quot;vibe-trading-ai[deepseek]&quot;&lt;/code&gt;, and kimi-k2.x&#39;s &lt;code&gt;temperature=1&lt;/code&gt; requirement is applied automatically — the Kimi path is verified end-to-end against the live API (tool calls + strict multi-turn reasoning replay on &lt;code&gt;kimi-k2.6&lt;/code&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-11&lt;/strong&gt; 🐝 &lt;strong&gt;Swarm workers now pull market data through the loader layer&lt;/strong&gt;: An investment-committee run on NVDA exposed a chain of gaps — workers wrote ad-hoc yfinance scripts, trusted a malformed latest bar (volume present, OHLC empty), leaked &lt;code&gt;NaN&lt;/code&gt; into non-strict JSON, and a context-free continuation prompt re-routed to the wrong preset (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/198&quot;&gt;#198&lt;/a&gt;, thanks @BillDin for an exceptional diagnosis plus both fixes). Swarm workers now get a local &lt;code&gt;get_market_data&lt;/code&gt; tool backed by the same normalized loader registry as MCP — strict JSON, non-finite floats serialize as &lt;code&gt;null&lt;/code&gt; — wired into &lt;strong&gt;every market-data preset&lt;/strong&gt; (21 workers across 13 presets) with a prompt policy that steers OHLCV work tool-first (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/199&quot;&gt;#199&lt;/a&gt;); &lt;code&gt;run_swarm&lt;/code&gt; takes an explicit &lt;code&gt;preset_name&lt;/code&gt; and refuses ambiguous continuation fragments instead of silently falling back to &lt;code&gt;equity_research_team&lt;/code&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/200&quot;&gt;#200&lt;/a&gt;). Grounding got smarter too: a bare US ticker like &lt;code&gt;NVDA&lt;/code&gt; in a swarm prompt is promoted to &lt;code&gt;NVDA.US&lt;/code&gt; (stopword-guarded), so workers start from authoritative pre-fetched prices. The tool joins the main agent registry as well — &lt;strong&gt;48 tools&lt;/strong&gt; now. Also: &lt;strong&gt;your Docker data now survives updates&lt;/strong&gt; — persistent memory, the session search index, user-created skills, shadow accounts and broker config live in named volumes, so &lt;code&gt;docker compose up --build&lt;/code&gt; no longer wipes them (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/197&quot;&gt;#197&lt;/a&gt;, thanks @FlyerJ).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-10&lt;/strong&gt; 🐳 &lt;strong&gt;Docker reaches a host-side Ollama out of the box&lt;/strong&gt;: Inside the container &lt;code&gt;localhost&lt;/code&gt; is the container itself, so the shipped &lt;code&gt;OLLAMA_BASE_URL=http://localhost:11434&lt;/code&gt; failed the LLM preflight for every Dockerized Ollama setup. &lt;code&gt;docker-compose.yml&lt;/code&gt; now defaults to &lt;code&gt;http://host.docker.internal:11434&lt;/code&gt; (export &lt;code&gt;OLLAMA_BASE_URL&lt;/code&gt; to point elsewhere) and adds the &lt;code&gt;host-gateway&lt;/code&gt; &lt;code&gt;extra_hosts&lt;/code&gt; mapping so the same file works on Linux as well as Docker Desktop (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/196&quot;&gt;#196&lt;/a&gt;, thanks @ShahNewazKhan).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-09&lt;/strong&gt; 🔑 &lt;strong&gt;Clearer error when the Web UI is opened from another machine&lt;/strong&gt;: Reaching the chat from a non-loopback client (another machine, a VM host, a phone on your LAN) without &lt;code&gt;API_AUTH_KEY&lt;/code&gt; set returned &lt;code&gt;403&lt;/code&gt; on every sensitive endpoint — sending a message, listing sessions, live status — but the chat only showed a generic &quot;Failed to send message, please retry.&quot; The send path now surfaces the real reason — &lt;em&gt;&quot;Remote API access requires an API key. Add it in Settings, or run the backend on localhost for local-only use.&quot;&lt;/em&gt; — and the README&#39;s web-UI setup spells out the localhost-vs-LAN rule plus the three fixes (browse via &lt;code&gt;localhost&lt;/code&gt; on the same machine; set &lt;code&gt;API_AUTH_KEY&lt;/code&gt; and enter it once in Settings; or &lt;code&gt;VIBE_TRADING_TRUST_DOCKER_LOOPBACK=1&lt;/code&gt; for Docker Desktop&#39;s host gateway) (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/191&quot;&gt;#191&lt;/a&gt;, thanks @mafia23).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-08&lt;/strong&gt; 🔧 &lt;strong&gt;Gemini 3.x multi-turn tool-calling fix&lt;/strong&gt;: This completes the Gemini 3.x thinking-model fix. The 6/05 round-trip (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/176&quot;&gt;#176&lt;/a&gt;) only covered in-memory history, but the real agent loop replays history as OpenAI-format dicts where LangChain dropped the per-tool-call &lt;code&gt;thought_signature&lt;/code&gt; before the request was built — so multi-turn tool calling still 400&#39;d with &lt;code&gt;missing thought_signature&lt;/code&gt;. It is now re-attached at the single &lt;code&gt;_convert_input&lt;/code&gt; chokepoint both &lt;code&gt;invoke&lt;/code&gt; and &lt;code&gt;stream&lt;/code&gt; pass through (parallel calls, where only the first of N is signed, included) (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/184&quot;&gt;#184&lt;/a&gt;, thanks @ngoanpv).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-07&lt;/strong&gt; 🐝 &lt;strong&gt;Live swarm status in the chat timeline&lt;/strong&gt;: When the agent launches a multi-agent swarm (investment committee, quant desk, risk committee, …), the chat now renders an inline &lt;strong&gt;status card&lt;/strong&gt; that streams each worker&#39;s state — waiting / running / done / failed / blocked / retrying — in real time, the same per-agent visibility the standalone swarm dashboard already had. Runtime events are bridged into the session SSE stream without changing the existing &lt;code&gt;/swarm/runs&lt;/code&gt; API, and a finished card rehydrates from the final &lt;code&gt;run_swarm&lt;/code&gt; result on reconnect or history replay (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/188&quot;&gt;#188&lt;/a&gt;, thanks @BillDin). Preset routing also got sharper: an explicitly named preset (e.g. &lt;code&gt;investment_committee&lt;/code&gt;, with or without underscores) now wins over keyword scoring, and the bare &lt;code&gt;IV&lt;/code&gt; derivatives keyword no longer false-matches inside ordinary words like &quot;g&lt;strong&gt;iv&lt;/strong&gt;en&quot; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/189&quot;&gt;#189&lt;/a&gt;, thanks @BillDin).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-06&lt;/strong&gt; ⚖️ &lt;strong&gt;Alpha compare — head-to-head across CLI, Web UI, REST &amp;amp; agent&lt;/strong&gt;: A new &lt;code&gt;alpha compare&lt;/code&gt; benches a hand-picked shortlist of Alpha Zoo alphas against each other on a universe and period, then ranks them by IC mean/std, IR, IC-positive ratio or sample count — each with its gap to the leader. Unlike a full-zoo bench it evaluates &lt;strong&gt;only the alphas you name&lt;/strong&gt; (a new &lt;code&gt;run_bench(only=…)&lt;/code&gt; subset filter), so comparing three alphas no longer scores all 191 in their zoo. One shared core powers every surface: &lt;code&gt;vibe-trading alpha compare &amp;lt;id1&amp;gt; &amp;lt;id2&amp;gt; … --sort ir&lt;/code&gt; (CLI), a &lt;strong&gt;Compare view&lt;/strong&gt; in the Alpha Zoo Web UI (tick alphas in the catalogue → one-click compare with a streamed ranking table), &lt;code&gt;POST /alpha/compare&lt;/code&gt; + SSE (REST), and a read-only &lt;code&gt;alpha_compare&lt;/code&gt; agent tool (&lt;strong&gt;47 tools&lt;/strong&gt; now).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-05&lt;/strong&gt; 🇮🇳 &lt;strong&gt;Dhan + Shoonya connectors (India) — 10 brokers total&lt;/strong&gt;: The connector-first trading layer adds &lt;strong&gt;Dhan&lt;/strong&gt; and &lt;strong&gt;Shoonya&lt;/strong&gt; for the Indian market (NSE/BSE equities + F&amp;amp;O), bringing the roster to ten brokers. Both are &lt;strong&gt;paper + read-only&lt;/strong&gt; — like Longbridge, their APIs expose no runtime paper/live discriminator, so their &lt;code&gt;place_order&lt;/code&gt; / &lt;code&gt;cancel_order&lt;/code&gt; hard-refuse any non-paper config at the first line (the rule: a broker with no structural paper/live guard is capped at paper + read-only) (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/181&quot;&gt;#181&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/174&quot;&gt;#174&lt;/a&gt;). This cycle also fixes &lt;strong&gt;Gemini 2.5 / 3.x thinking models&lt;/strong&gt;: their per-tool-call &lt;code&gt;thoughtSignature&lt;/code&gt; now round-trips through the OpenAI-compatible path, so multi-turn function calling no longer fails with &lt;code&gt;INVALID_ARGUMENT&lt;/code&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/176&quot;&gt;#176&lt;/a&gt;, closes &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/170&quot;&gt;#170&lt;/a&gt;, thanks @mvanhorn &amp;amp; @jliu6789). Chinese docstrings landed on all &lt;strong&gt;452 Alpha Zoo factors&lt;/strong&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/180&quot;&gt;#180&lt;/a&gt;, thanks @LeeCQiang), and a &lt;strong&gt;frontend test suite (197 vitest tests)&lt;/strong&gt; plus backend auth / path-traversal / CORS security tests joined CI (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/175&quot;&gt;#175&lt;/a&gt;, thanks @sambazhu).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-04&lt;/strong&gt; 🗃️ &lt;strong&gt;Opt-in local data cache for all 7 data sources&lt;/strong&gt;: A new &lt;code&gt;VIBE_TRADING_DATA_CACHE&lt;/code&gt; switch lets every backtest loader — tushare, okx, ccxt, akshare, mootdx, yfinance, futu — cache settled historical bars under &lt;code&gt;~/.vibe-trading/cache&lt;/code&gt; (user home, never the repo), so repeated and long-horizon / cross-market backtests skip the network and avoid provider rate limits. Off by default. Batch and connection loaders (yfinance, futu) skip the bulk download / FutuOpenD connection entirely on a full cache hit, a staleness guard never caches a range ending today (its last bar is still forming), and cached frames round-trip byte-identical to freshly fetched ones (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/177&quot;&gt;#177&lt;/a&gt;, thanks @mvanhorn). A new contributor guide for AI / automation-assisted PRs also landed, mapping safe local checks and high-risk broker/MCP/credential surfaces (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/173&quot;&gt;#173&lt;/a&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-03&lt;/strong&gt; 🧹 &lt;strong&gt;Community triage + trace correlation&lt;/strong&gt;: Tool-call trace entries now carry the originating &lt;code&gt;call_id&lt;/code&gt;, so a &lt;code&gt;tool_result&lt;/code&gt; can be matched back to its &lt;code&gt;tool_call&lt;/code&gt; when replaying a run trace — arg previews stay truncated to keep trace files small (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/168&quot;&gt;#168&lt;/a&gt;, thanks @zwrong). Source comments no longer point at an internal-only docs path that external contributors couldn&#39;t find (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/166&quot;&gt;#166&lt;/a&gt;, thanks @jaleelpersonal). Also clarified that the &lt;code&gt;langchain-community&lt;/code&gt; resolver warning on install is a harmless leftover-package notice, not a failure (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/167&quot;&gt;#167&lt;/a&gt;), and scoped Gemini 2.5/3.0 &lt;code&gt;thoughtSignature&lt;/code&gt; round-tripping for function calls as a &lt;code&gt;help wanted&lt;/code&gt; task with a full fix plan (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/170&quot;&gt;#170&lt;/a&gt;, thanks @jliu6789).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-02&lt;/strong&gt; 🔌 &lt;strong&gt;Six new broker connectors (Tiger / Longbridge / Alpaca / OKX / Binance / Futu)&lt;/strong&gt;: The connector-first trading layer gains a direct-SDK transport alongside IBKR (local) and Robinhood (MCP). Each connector exposes read-only account / positions / orders / quote / history &lt;strong&gt;plus paper-account order placement&lt;/strong&gt; — test your strategies across these broker paper accounts. Five of them (Tiger, Alpaca, OKX, Binance, Futu) also support &lt;strong&gt;bounded, mandate-gated order placement&lt;/strong&gt; behind the same safety model as Robinhood: a user-committed mandate (symbol universe / order size / exposure / leverage / daily cap), a filesystem kill switch, a fail-closed pre-trade gate, and a full audit ledger. &lt;strong&gt;Longbridge is paper + read-only only&lt;/strong&gt; (its API exposes no runtime paper/live discriminator). Every paper/live distinction is a structural per-broker guard — account-id format, host separation, demo flag, or trade environment. New &lt;code&gt;trading_place_order&lt;/code&gt; / &lt;code&gt;trading_cancel_order&lt;/code&gt; tools; HK and A-share asset classes added to the mandate universe. Experimental / use at your own risk.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-06-01&lt;/strong&gt; 🚀 &lt;strong&gt;v0.1.9 released&lt;/strong&gt; (&lt;code&gt;pip install -U vibe-trading-ai&lt;/code&gt;): Rolls up everything since 0.1.8. Connector-first broker profiles (IBKR local read-only TWS / IB Gateway + Robinhood Agentic Trading behind OAuth, a committed mandate, order guard, audit ledger, and instant halt). Research Goal runtime across CLI / REST / MCP / Web. A swarm pass — live reconcile + MCP keepalive, operator-configured worker MCP tools, a strict alpha-bench random control, and a new &lt;code&gt;retry_run&lt;/code&gt; to relaunch failed/stale runs (&lt;strong&gt;36 MCP tools&lt;/strong&gt; now). The &lt;code&gt;agent/cli/&lt;/code&gt; package refactor with a refreshed terminal UI, the &lt;code&gt;mootdx&lt;/code&gt; no-token A-share loader, and a robustness pass across backtest / agent loop / sessions. &lt;code&gt;--version&lt;/code&gt; now always matches the installed package, fixing the 0.1.8 drift (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/156&quot;&gt;#156&lt;/a&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-31&lt;/strong&gt; 🔌 &lt;strong&gt;Connector-first broker architecture (IBKR + Robinhood)&lt;/strong&gt;: Trading access now starts from a selectable connector profile instead of separate broker/live entry points. &lt;code&gt;vibe-trading connector list/use/check/account/positions/orders/quote/history&lt;/code&gt; and the MCP &lt;code&gt;trading_*&lt;/code&gt; tools share the same selected profile, where paper/live is an attribute of the connector. IBKR can be used immediately through a local read-only TWS / IB Gateway profile, while the official IBKR remote MCP path is seeded as an OAuth &lt;code&gt;mcp.read&lt;/code&gt; probe until stable read tool names are available. Robinhood Agentic Trading remains the bounded live MCP connector behind OAuth, a committed mandate, order guard, audit ledger, and instant halt.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-30&lt;/strong&gt; 🧰 &lt;strong&gt;Robustness pass — backtest, agent loop, sessions&lt;/strong&gt;: LLM-generated signal engines now pass pre-flight interface validation before instantiation, catching circular self-imports, a missing &lt;code&gt;generate()&lt;/code&gt;, non-defaulted &lt;code&gt;__init__&lt;/code&gt; args, and wrong return types with actionable JSON errors instead of raw tracebacks (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/149&quot;&gt;#149&lt;/a&gt;); a follow-up routes source-level AST validation errors through the same clean JSON envelope. The agent loop no longer burns all 50 iterations into a &lt;code&gt;failed&lt;/code&gt; status with no output — it mirrors the swarm worker&#39;s wrap-up nudge at 80% of the iteration budget and drops tool definitions on the last iteration to force a final text answer (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/148&quot;&gt;#148&lt;/a&gt;), guarded to fire only mid-run so it never displaces research-goal context. Session message writes now &lt;code&gt;flush + fsync&lt;/code&gt; each append so expensive AI responses survive a mid-write crash, and the read path skips corrupted JSONL lines (logging the first 200 chars for recovery) instead of 500-ing the whole &lt;code&gt;/messages&lt;/code&gt; endpoint (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/147&quot;&gt;#147&lt;/a&gt;). The Web composer also fixes IME Enter handling so a composition-confirming Enter no longer submits mid-word (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/146&quot;&gt;#146&lt;/a&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-29&lt;/strong&gt; 🔐 &lt;strong&gt;Robinhood Agentic Trading support (opt-in, bounded autonomy)&lt;/strong&gt;: Adds support for Robinhood Agentic Trading (remote MCP, OAuth). Off and read-only by default; the agent acts only inside a user-committed mandate (symbols / order size / exposure / leverage / daily cap), with a filesystem-level instant kill switch, preemptive flatten, mandate auto-expiry, a full audit ledger, and a persistent autonomous runner. No custody, no venue — the broker holds funds and executes; we only relay intent. Experimental / use at your own risk.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-28&lt;/strong&gt; 🧪 &lt;strong&gt;Swarm safety + strict alpha gate + worker MCP&lt;/strong&gt;: Swarm DAG blocks downstream tasks when upstream fails (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/145&quot;&gt;#145&lt;/a&gt;). New &lt;code&gt;run_bench_strict()&lt;/code&gt; adds a same-universe random control + OOS split to catch factors that just track market beta (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/143&quot;&gt;#143&lt;/a&gt;, thanks @Soli22de). Swarm workers can call operator-configured external MCP servers, with trust boundary pinned (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/142&quot;&gt;#142&lt;/a&gt;, thanks @shadowinlife).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-27&lt;/strong&gt; 📊 &lt;strong&gt;mootdx A-share data source + output polish&lt;/strong&gt;: New &lt;code&gt;mootdx&lt;/code&gt; loader speaks the native 通达信 TCP protocol for A-share OHLCV (no auth, no IP rate-limit, daily + intraday with 25-page walk-back pagination), slotting between tushare and akshare in the fallback chain (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/107&quot;&gt;#107&lt;/a&gt;). CCXT loader now reads &lt;code&gt;HTTP_PROXY/HTTPS_PROXY/ALL_PROXY&lt;/code&gt; so Binance/OKX public data works from restricted networks (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/126&quot;&gt;#126&lt;/a&gt;, thanks @ruok808). Final-answer rendering also dropped the ugly full-width &lt;code&gt;---&lt;/code&gt; horizontal separators on CLI and Web: the system prompt now nudges the agent toward markdown tables and &lt;code&gt;##&lt;/code&gt; headings, the CLI renderer strips standalone HRs as defense-in-depth, and the chat bubble hides any &lt;code&gt;&amp;lt;hr&amp;gt;&lt;/code&gt; that slips through (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/139&quot;&gt;#139&lt;/a&gt;, thanks @sdwxm188).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-26&lt;/strong&gt; ✅ &lt;strong&gt;Research Goal lifecycle closure&lt;/strong&gt;: Goal mode now behaves like a real task runner: Web UI goal creation creates or binds the session and immediately sends the kickoff turn; active goals can be continued, edited, cancelled, and completed across Web/API/CLI/MCP; and the agent advances from the current goal snapshot (criteria, evidence, claims, open items) instead of only the original prompt. Covered-but-still-active goals now enter an audit/status update instead of stopping silently, with regression coverage across backend, CLI, MCP, and frontend events.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-25&lt;/strong&gt; 🧼 &lt;strong&gt;Cleaner chat UI + composer workflow&lt;/strong&gt;: The Web UI keeps chat focused on the next action: upload, swarm, and research-goal modes now live behind the composer &lt;code&gt;+&lt;/code&gt; menu instead of floating panels. Active context appears above the input as compact chips, and goal details expand inline only when needed. The UI also drops the old custom i18n layer in favor of direct English copy, gates Full Report cards to report-worthy runs, and hardens local dev startup/status reporting for reliable browser smoke tests.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-24&lt;/strong&gt; 🎯 &lt;strong&gt;Research Goal runtime&lt;/strong&gt;: Added a session-scoped Research Goal layer across backend, CLI, API/MCP, SSE, and Web UI. Goals persist claims, acceptance criteria, evidence rows, budgets, and completion policy; agent tools can create goals and attach evidence; &lt;code&gt;/goal&lt;/code&gt; gives the CLI a direct entry point; REST/MCP expose goal snapshots and evidence writes; SSE keeps chat clients fresh. Follow-up audit fixes locked down verified evidence, blocked live-trading risk tiers through agent tools, wired CLI-created goals into later turns, cleaned goal ledgers on session deletion, enabled replay-all, and fixed cross-session frontend races.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-23&lt;/strong&gt; 🖥️ &lt;strong&gt;Interactive CLI refresh&lt;/strong&gt;: The terminal front door now opens with a larger Vibe-Trading banner, a cleaner prompt divider, prior-turn recap, post-run timing, and a Claude Code-style activity rail for live agent work. Tool calls, web/data fetches, shell-style actions, Markdown answers, and pipe tables render in a more readable transcript, while piped or non-TTY runs keep plain-text output for automation. Generated CLI screenshots are now treated as local artifacts instead of committed docs files, keeping the repository lighter.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-22&lt;/strong&gt; 🧭 &lt;strong&gt;Swarm recovery + MCP keepalive&lt;/strong&gt;: Swarm status now reconciles from live task files on every read, so API/MCP/SSE/list views recover crashed or stale runs instead of showing permanent &lt;code&gt;running&lt;/code&gt; snapshots. &lt;code&gt;run_swarm&lt;/code&gt; sends MCP progress heartbeats while it polls, with a fixed first frame of &lt;code&gt;swarm_started run_id=&amp;lt;id&amp;gt;&lt;/code&gt; for clients that reconnect after transport drops; workers now heartbeat through LLM streaming, grounding fetches, and tool execution. The stale-run reaper uses per-run thresholds and derives terminal status from task states, &lt;code&gt;SwarmTool&lt;/code&gt; no longer cancels a still-running team just because its wait budget elapsed, and MCP clients can call &lt;code&gt;reap_stale_runs()&lt;/code&gt; for explicit cleanup. Today&#39;s DX pass also refreshed provider default models and aligned CI syntax checks with the new &lt;code&gt;agent/cli/&lt;/code&gt; package. 22 new regressions cover hydration, terminal recovery, stale reaping, keepalive cadence, env parsing, and heartbeat wiring; the full swarm/MCP suite is at 169 passed, 4 skipped.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-21&lt;/strong&gt; 🧱 &lt;strong&gt;CLI package refactor&lt;/strong&gt;: &lt;code&gt;agent/cli.py&lt;/code&gt; (3216 LOC) split into the &lt;code&gt;agent/cli/&lt;/code&gt; package — interactive front door, slash router, Rich components, plus a &lt;code&gt;_legacy.py&lt;/code&gt; shim that preserves every subcommand and re-exports every public symbol so &lt;code&gt;cli.cmd_*&lt;/code&gt; / &lt;code&gt;cli._INIT_ENV_PATH&lt;/code&gt; / &lt;code&gt;cli.Confirm&lt;/code&gt; keep working. New FastAPI middleware serves the SPA shell when a browser opens &lt;code&gt;/runs/{id}&lt;/code&gt; or &lt;code&gt;/correlation&lt;/code&gt; directly; same narrowing landed in the Vite dev proxy. Version unified via &lt;code&gt;cli/_version.py&lt;/code&gt; (no more drift between &lt;code&gt;--version&lt;/code&gt; and the banner), &lt;code&gt;python -m cli&lt;/code&gt; restored via &lt;code&gt;__main__.py&lt;/code&gt;, and the chat-gate narrowed so &lt;code&gt;chat --help&lt;/code&gt; / &lt;code&gt;chat extra&lt;/code&gt; reach legacy argparse instead of being swallowed by the REPL.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-20&lt;/strong&gt; 🔬 &lt;strong&gt;Hypothesis Registry CLI&lt;/strong&gt;: Closes the CLI side of the Hypothesis Registry shipped backend-only on 2026-05-16. &lt;code&gt;vibe-trading hypothesis list&lt;/code&gt; prints a Rich table or JSON (&lt;code&gt;--status&lt;/code&gt; filter, &lt;code&gt;--limit&lt;/code&gt;); &lt;code&gt;show &amp;lt;id&amp;gt;&lt;/code&gt; renders a detail panel including linked run cards; &lt;code&gt;invalidate &amp;lt;id&amp;gt; --note &quot;...&quot;&lt;/code&gt; flips status to &lt;code&gt;rejected&lt;/code&gt; while preserving prior invalidation notes when &lt;code&gt;--note&lt;/code&gt; is omitted. Honors the existing &lt;code&gt;VIBE_TRADING_HYPOTHESES_PATH&lt;/code&gt; env override and adds a per-invocation &lt;code&gt;--path&lt;/code&gt;. 22 new tests cover wiring, JSON output, status filter, limit, missing-id errors, and note persistence.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-19&lt;/strong&gt; ✨ &lt;strong&gt;Live tool feedback + graceful cancel&lt;/strong&gt;: Long-running tools (backtests, large PDFs, swarm workers) no longer look frozen. Each tool call now emits a 3-second heartbeat plus structured per-stage progress — &lt;code&gt;run_backtest&lt;/code&gt; shows phase markers (&lt;code&gt;validate&lt;/code&gt; / &lt;code&gt;simulate&lt;/code&gt; / &lt;code&gt;finalize&lt;/code&gt;), &lt;code&gt;read_document&lt;/code&gt; ticks per page on PDF or per sheet on Excel, &lt;code&gt;read_url&lt;/code&gt; marks &lt;code&gt;fetch&lt;/code&gt; / &lt;code&gt;parse&lt;/code&gt;. The CLI Rich Live dashboard renders a Unicode spinner, ASCII progress bar, ETA, and stacks up to 3 parallel tools keyed by name; the frontend chat ships a new &lt;code&gt;ToolProgressIndicator&lt;/code&gt; with rAF-coalesced renders, ARIA &lt;code&gt;role=&quot;status&quot;&lt;/code&gt; + hidden native &lt;code&gt;&amp;lt;progress&amp;gt;&lt;/code&gt; for screen readers, and a determinate &lt;code&gt;ProgressRing&lt;/code&gt; SVG when total is known. First &lt;code&gt;Ctrl+C&lt;/code&gt; during a CLI run now calls &lt;code&gt;agent.cancel()&lt;/code&gt; for graceful exit (current step finishes, trace closes cleanly); a second within 2s force-quits. Reusable primitives extracted along the way: &lt;code&gt;ProgressBar.tsx&lt;/code&gt; and &lt;code&gt;lib/tools.ts&lt;/code&gt; (shared tool-name i18n).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-18&lt;/strong&gt; 🧹 &lt;strong&gt;Cleanup pass + three latent bug fixes&lt;/strong&gt;: &lt;code&gt;CompositeEngine&lt;/code&gt; no longer misroutes bare Chinese-futures codes like &lt;code&gt;RB2410&lt;/code&gt; to &lt;code&gt;GlobalFuturesEngine&lt;/code&gt; — &lt;code&gt;_is_china_futures&lt;/code&gt; moved into a shared &lt;code&gt;_market_hooks&lt;/code&gt; module with a case-normalized product table and a non-CN exchange guard, plus 9 new regression cases. Session FTS5 indexes now persist timestamps so cross-session search can sort by date; the same path also fixed a re-upsert that was wall-clocking every session&#39;s &lt;code&gt;started_at&lt;/code&gt;. The Vite dev-mode proxy gained the missing &lt;code&gt;/alpha&lt;/code&gt; entry so the AlphaZoo page resolves on &lt;code&gt;npm run dev&lt;/code&gt;. &lt;code&gt;tests/test_e2e_harness_v2.py&lt;/code&gt; (real-LLM e2e suite) is now gated behind &lt;code&gt;VIBE_TRADING_RUN_LIVE_E2E=1&lt;/code&gt; so CI no longer changes shape based on env-key presence. Ruff &lt;code&gt;per-file-ignores&lt;/code&gt; added for the factor zoo (3783 → 0 F401 noise), frontend tsconfig enables &lt;code&gt;noUnusedLocals&lt;/code&gt; / &lt;code&gt;noUnusedParameters&lt;/code&gt; as regression guards, and 76 unused &lt;code&gt;vw = vwap(...)&lt;/code&gt; boilerplate lines were dropped from &lt;code&gt;gtja191&lt;/code&gt; alphas. Net &lt;strong&gt;-918 LOC&lt;/strong&gt;.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-17&lt;/strong&gt; 🧬 &lt;strong&gt;Alpha Zoo v1 (0.1.8)&lt;/strong&gt;: 452 pre-built quant alphas across 4 zoos — &lt;code&gt;qlib158&lt;/code&gt; (Microsoft Qlib, Apache-2 attribution), &lt;code&gt;alpha101&lt;/code&gt; (Kakushadze 101 Formulaic Alphas, paper rewrite from arXiv:1601.00991), &lt;code&gt;gtja191&lt;/code&gt; (Guotai Junan 2014 short-horizon factor report), and &lt;code&gt;academic&lt;/code&gt; (Fama-French 5 + Carhart price-based proxies). One-line CLI to bench any zoo on your universe: &lt;code&gt;vibe-trading alpha bench --zoo gtja191 --universe csi300 --period 2018-2025&lt;/code&gt;. Ships with AST purity gate, lookahead-guard test, &lt;code&gt;pytest-socket&lt;/code&gt; network kill-switch, per-zoo &lt;a href=&quot;http://LICENSE.md&quot;&gt;LICENSE.md&lt;/a&gt;, and a Developer Certificate of Origin (DCO) workflow for community PRs. Auto-rendered Alpha Library at &lt;a href=&quot;https://vibetrading.wiki/alpha-library/&quot;&gt;vibetrading.wiki/alpha-library/&lt;/a&gt; + research-lab post &lt;a href=&quot;https://vibetrading.wiki/research-lab/posts/alpha-191-in-2026.html&quot;&gt;Which of the 191 GTJA alphas still work in 2026?&lt;/a&gt;.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-16&lt;/strong&gt; 🧪 &lt;strong&gt;Research spine update&lt;/strong&gt;: Added a backend Hypothesis Registry with &lt;code&gt;create_hypothesis&lt;/code&gt;, &lt;code&gt;update_hypothesis&lt;/code&gt;, &lt;code&gt;link_backtest&lt;/code&gt;, and &lt;code&gt;search_hypotheses&lt;/code&gt;; external-content readers now attach warning-only &lt;code&gt;security_warnings&lt;/code&gt;; and Shadow Account scanning now uses deterministic OHLCV feature evaluation instead of the old calendar-phase stub.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-15&lt;/strong&gt; 🪪 The run detail page now surfaces the Trust Layer run card alongside metrics and artifacts, completing the UI side of the &lt;code&gt;run_card.json&lt;/code&gt; work landed on 2026-05-12. &lt;code&gt;PersistentMemory.add()&lt;/code&gt; was also hardened on length, empty/whitespace-only names, and C0/C1 control bytes from the #108/#109/#110 triage (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/112&quot;&gt;#112&lt;/a&gt;, thanks @Teerapat-Vatpitak).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-14&lt;/strong&gt; 🌐 the public wiki is now live at &lt;a href=&quot;https://vibetrading.wiki/&quot;&gt;vibetrading.wiki&lt;/a&gt; with docs, tutorials, Research Lab, and Alpha Library sections deployed through Cloudflare Pages. Persistent memory is also inspectable from the CLI via &lt;code&gt;vibe-trading memory list/show/search/forget&lt;/code&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/102&quot;&gt;#102&lt;/a&gt;, thanks @Teerapat-Vatpitak), and memory tokenization/slugs now support Thai, Arabic, Hebrew, and Cyrillic text (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/104&quot;&gt;#104&lt;/a&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-13&lt;/strong&gt; 🧭 Swarm runs now ground workers with fetched market data and cleaner persisted reports (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/93&quot;&gt;#93&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/84&quot;&gt;#84&lt;/a&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-12&lt;/strong&gt; 🧾 Backtests now emit &lt;code&gt;run_card.json&lt;/code&gt; and &lt;code&gt;run_card.md&lt;/code&gt; alongside artifacts for reproducible research runs.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-11&lt;/strong&gt; 🧭 &lt;strong&gt;Memory slugs, swarm accounting, and CLI preflight&lt;/strong&gt;: Persistent memory now preserves CJK characters when generating file slugs, preventing silent filename collisions for Chinese/Japanese/Korean notes (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/95&quot;&gt;#95&lt;/a&gt;, thanks @voidborne-d). Swarm run totals now prefer provider-reported token usage with the existing estimate fallback (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/94&quot;&gt;#94&lt;/a&gt;, thanks @Teerapat-Vatpitak), and the CLI run UI gained a startup preflight check for common environment issues (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/96&quot;&gt;#96&lt;/a&gt;, thanks @ykykj).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-10&lt;/strong&gt; 🧱 &lt;strong&gt;Regression guardrails + run metadata&lt;/strong&gt;: Memory recall now treats underscores as token boundaries, so snake_case saved memories such as &lt;code&gt;mcp_wiring_test&lt;/code&gt; match natural-language queries like &quot;mcp wiring&quot; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/87&quot;&gt;#87&lt;/a&gt;, thanks @hp083625). The MCP server has a subprocess smoke test covering initialize → &lt;code&gt;tools/list&lt;/code&gt; → &lt;code&gt;tools/call&lt;/code&gt; to guard the first-call deadlock path (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/86&quot;&gt;#86&lt;/a&gt;), while low-risk hardening landed for Windows path-sensitive tests, API best-effort exception handling, backtest &lt;code&gt;run_dir&lt;/code&gt; allowed-root validation, and SwarmRun provider/model metadata (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/88&quot;&gt;#88&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/90&quot;&gt;#90&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/91&quot;&gt;#91&lt;/a&gt;, &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/92&quot;&gt;#92&lt;/a&gt;, thanks @Teerapat-Vatpitak).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-09&lt;/strong&gt; 🛡️ &lt;strong&gt;API path hardening + MCP server stability&lt;/strong&gt;: API run/session routes now validate path IDs before lookup, rejecting malformed newline-containing parameters and pinning the behavior in the auth/security regression suite (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/80&quot;&gt;#80&lt;/a&gt;, thanks @SJoon99). The MCP server now pre-warms the tool registry on the main thread before serving &lt;code&gt;tools/call&lt;/code&gt;, avoiding a first-call deadlock in lazy tool discovery (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/85&quot;&gt;#85&lt;/a&gt;, thanks @Teerapat-Vatpitak). The Vite dev proxy also honors &lt;code&gt;VITE_API_URL&lt;/code&gt; for non-default backend targets (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/82&quot;&gt;#82&lt;/a&gt;, thanks @voidborne-d).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-08&lt;/strong&gt; 🧾 &lt;strong&gt;Tushare statement fields in filters&lt;/strong&gt;: A-share daily backtests can now request PIT-safe financial statement fields through &lt;code&gt;fundamental_fields&lt;/code&gt;, so signal engines can screen on &lt;code&gt;income_total_revenue&lt;/code&gt;, &lt;code&gt;income_n_income&lt;/code&gt;, &lt;code&gt;balancesheet_total_hldr_eqy_exc_min_int&lt;/code&gt;, &lt;code&gt;fina_indicator_roe&lt;/code&gt;, and similar table-prefixed columns after their announcement/disclosure dates (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/76&quot;&gt;#76&lt;/a&gt;, thanks @mrbob-git). Follow-up hardening makes explicit statement-field requests fail fast if Tushare enrichment cannot run, instead of silently falling back to raw price bars (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/77&quot;&gt;#77&lt;/a&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-07&lt;/strong&gt; 📈 &lt;strong&gt;Tushare fundamentals + community triage&lt;/strong&gt;: Added a point-in-time &lt;code&gt;TushareFundamentalProvider&lt;/code&gt; contract for fundamental research workflows, with regression coverage for the project &lt;code&gt;TUSHARE_TOKEN&lt;/code&gt; environment path (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/74&quot;&gt;#74&lt;/a&gt;). Community triage also clarified that Vibe-Trading keeps rapid iteration focused on one UI language for now, avoids adding redundant search dependencies while DuckDuckGo-backed &lt;code&gt;web_search&lt;/code&gt; is already bundled, and treats unofficial hosted deployments as untrusted places for API keys or data-source tokens.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-06&lt;/strong&gt; 🚀 &lt;strong&gt;v0.1.7 released&lt;/strong&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/releases/tag/v0.1.7&quot;&gt;Release notes&lt;/a&gt;, &lt;code&gt;pip install -U vibe-trading-ai&lt;/code&gt;): Security-boundary hardening is now published on PyPI and ClawHub, covering safer API/read/upload/file/URL/generated-code/shell-tool/Docker defaults while keeping localhost CLI/Web UI workflows low-friction. This cycle also includes Web UI Settings, correlation heatmap, OpenAI Codex OAuth, A-share pre-ST filtering, interactive CLI UX, swarm preset inspection, dividend analysis, dev workflow polish, and audited frontend build-dependency floors. Thanks to the 0.1.7 contributors and to lemi9090 (S2W) for coordinated security validation.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-05&lt;/strong&gt; 🛡️ &lt;strong&gt;Security boundary follow-up&lt;/strong&gt;: Completes the remaining security-boundary hardening around explicit CORS origins, Settings credential indicators, web URL reading, and Shadow Account code generation, with regression tests added for each path. Normal localhost CLI/Web UI workflows stay the same; remote deployments should continue using &lt;code&gt;API_AUTH_KEY&lt;/code&gt; and explicit trusted origins.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-04&lt;/strong&gt; 🖥️ &lt;strong&gt;Interactive CLI UX + CI cleanup&lt;/strong&gt;: Interactive mode now has a live bottom status bar showing provider/model, session duration, last-run latency, and cumulative tool-call stats, plus prompt history navigation and cursor editing with arrow keys via &lt;code&gt;prompt_toolkit&lt;/code&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/69&quot;&gt;#69&lt;/a&gt;). The CLI still falls back to Rich prompts when &lt;code&gt;prompt_toolkit&lt;/code&gt; or a TTY is unavailable. CI path expectations were also aligned with the hardened file-import sandbox and cross-platform &lt;code&gt;/tmp&lt;/code&gt; resolution, returning main to green (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/commit/bb67dc7cfcc11553c57d8962bee56381dca43758&quot;&gt;&lt;code&gt;bb67dc7&lt;/code&gt;&lt;/a&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-03&lt;/strong&gt; 🛡️ &lt;strong&gt;Security hardening patch&lt;/strong&gt;: Tightens default API authentication for non-local deployments, protects sensitive run/session/swarm reads, restricts upload and local file-reading boundaries, gates shell-capable tools by entry point, validates generated strategy loading before import, and runs the Docker image as a non-root user with a localhost-only published port by default. Local CLI and localhost Web UI workflows remain low-friction; remote API/Web deployments should set &lt;code&gt;API_AUTH_KEY&lt;/code&gt;.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-02&lt;/strong&gt; 🧭 &lt;strong&gt;Dividend analysis + sharper roadmap&lt;/strong&gt;: Added the &lt;code&gt;dividend-analysis&lt;/code&gt; skill for income stocks, payout sustainability, dividend growth, shareholder yield, ex-dividend mechanics, and yield-trap checks, pinned by bundled-skill regression tests. The public roadmap now focuses on upcoming work: Research Autopilot, Data Bridge, Options Lab, Portfolio Studio, Alpha Zoo, Research Delivery, Trust Layer, and Community sharing.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-05-01&lt;/strong&gt; 🔥 &lt;strong&gt;Correlation heatmap + OpenAI Codex OAuth + A-share pre-ST filter&lt;/strong&gt;: New correlation dashboard/API computes rolling return correlations and renders an ECharts heatmap for portfolio and symbol analysis (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/64&quot;&gt;#64&lt;/a&gt;). OpenAI Codex provider support now uses ChatGPT OAuth via &lt;code&gt;vibe-trading provider login openai-codex&lt;/code&gt;, with Settings metadata and adapter regression tests (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/65&quot;&gt;#65&lt;/a&gt;). Added and hardened the &lt;code&gt;ashare-pre-st-filter&lt;/code&gt; skill for A-share ST/*ST risk screening, including Sina penalty relevance filtering so securities-account mentions do not inflate E2 counts (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/63&quot;&gt;#63&lt;/a&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-04-30&lt;/strong&gt; ⚙️ &lt;strong&gt;Web UI Settings + validation CLI hardening&lt;/strong&gt;: New Settings page for LLM provider/model, base URL, reasoning effort, and data source credentials, backed by local/auth-protected settings APIs and data-driven provider metadata (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/57&quot;&gt;#57&lt;/a&gt;). Also hardens &lt;code&gt;python -m backtest.validation &amp;lt;run_dir&amp;gt;&lt;/code&gt; so missing, blank, malformed, non-existent, and non-directory inputs fail with clear operator-facing messages before validation starts (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/60&quot;&gt;#60&lt;/a&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-04-28&lt;/strong&gt; 🚀 &lt;strong&gt;v0.1.6 released&lt;/strong&gt; (&lt;code&gt;pip install -U vibe-trading-ai&lt;/code&gt;): Fixes &lt;code&gt;vibe-trading --swarm-presets&lt;/code&gt; returning empty after &lt;code&gt;pip install&lt;/code&gt; / &lt;code&gt;uv tool install&lt;/code&gt; (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/55&quot;&gt;#55&lt;/a&gt;) — preset YAMLs now bundled inside the &lt;code&gt;src.swarm&lt;/code&gt; package and pinned by a 6-test regression suite. Plus AKShare loader correctly routes ETFs (&lt;code&gt;510300.SH&lt;/code&gt;) and forex (&lt;code&gt;USDCNH&lt;/code&gt;) to the right endpoints with hardened registry fallback. Rolls up everything since v0.1.5: benchmark comparison panel, &lt;code&gt;/upload&lt;/code&gt; streaming + size limits, Futu loader (HK + A-share), vnpy export skill, security hardening, frontend lazy loading (688KB → 262KB).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-04-27&lt;/strong&gt; 📊 &lt;strong&gt;Benchmark panel + upload safety&lt;/strong&gt;: Backtest output now ships a benchmark comparison panel (ticker / benchmark return / excess return / information ratio) with yfinance-backed resolution for SPY, CSI 300, etc. (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/48&quot;&gt;#48&lt;/a&gt;). Plus &lt;code&gt;/upload&lt;/code&gt; streams the request body in 1 MB chunks and aborts past &lt;code&gt;MAX_UPLOAD_SIZE&lt;/code&gt;, bounding memory under oversized/malformed clients (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/53&quot;&gt;#53&lt;/a&gt;) — pinned by a 4-case regression suite.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-04-22&lt;/strong&gt; 🛡️ &lt;strong&gt;Hardening + new integrations&lt;/strong&gt;: Path containment enforced in &lt;code&gt;safe_path&lt;/code&gt; + journal/shadow tool sandbox, &lt;code&gt;MANIFEST.in&lt;/code&gt; ships &lt;code&gt;.env.example&lt;/code&gt; / tests / Docker files in sdist, route-level lazy loading shrinks frontend initial bundle 688KB → 262KB. Plus Futu data loader for HK &amp;amp; A-share equities (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/47&quot;&gt;#47&lt;/a&gt;) and vnpy CtaTemplate export skill (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/46&quot;&gt;#46&lt;/a&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-04-21&lt;/strong&gt; 🛡️ &lt;strong&gt;Workspace + docs&lt;/strong&gt;: Relative &lt;code&gt;run_dir&lt;/code&gt; normalized to active run dir (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/43&quot;&gt;#43&lt;/a&gt;). README usage examples (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/45&quot;&gt;#45&lt;/a&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-04-20&lt;/strong&gt; 🔌 &lt;strong&gt;Reasoning + Swarm&lt;/strong&gt;: &lt;code&gt;reasoning_content&lt;/code&gt; preserved across all &lt;code&gt;ChatOpenAI&lt;/code&gt; paths — Kimi / DeepSeek / Qwen thinking work end-to-end (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/39&quot;&gt;#39&lt;/a&gt;). Swarm streaming + clean Ctrl+C (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/42&quot;&gt;#42&lt;/a&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-04-19&lt;/strong&gt; 📦 &lt;strong&gt;v0.1.5&lt;/strong&gt;: Published to PyPI &amp;amp; ClawHub. &lt;code&gt;python-multipart&lt;/code&gt; CVE floor bump, 5 new MCP tools wired (&lt;code&gt;analyze_trade_journal&lt;/code&gt; + 4 shadow-account tools), &lt;code&gt;pattern_recognition&lt;/code&gt; → &lt;code&gt;pattern&lt;/code&gt; registry fix, Docker dep parity, SKILL manifest synced (22 MCP tools / 71 skills).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-04-18&lt;/strong&gt; 👥 &lt;strong&gt;Shadow Account&lt;/strong&gt;: Extract your strategy rules from a broker journal → backtest the shadow across markets → 8-section HTML/PDF report showing exactly how much you leave on the table (rule violations, early exits, missed signals, counterfactual trades). 4 new tools, 1 skill, 32 tools total. Trade Journal + Shadow Account samples now live in the web UI welcome screen.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-04-17&lt;/strong&gt; 📊 &lt;strong&gt;Trade Journal Analyzer + Universal File Reader&lt;/strong&gt;: Upload broker exports (同花顺/东财/富途/generic CSV) → auto trading profile (holding days, win rate, PnL ratio, drawdown) + 4 bias diagnostics (disposition effect, overtrading, chasing momentum, anchoring). &lt;code&gt;read_document&lt;/code&gt; now dispatches PDF, Word, Excel, PowerPoint, images (OCR), and 40+ text formats behind one unified call.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-04-16&lt;/strong&gt; 🧠 &lt;strong&gt;Agent Harness&lt;/strong&gt;: Persistent cross-session memory, FTS5 session search, self-evolving skills (full CRUD), 5-layer context compression, read/write tool batching. 27 tools, 107 new tests.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-04-15&lt;/strong&gt; 🤖 &lt;strong&gt;&lt;a href=&quot;http://Z.ai&quot;&gt;Z.ai&lt;/a&gt; + MiniMax&lt;/strong&gt;: &lt;a href=&quot;http://Z.ai&quot;&gt;Z.ai&lt;/a&gt; provider (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/35&quot;&gt;#35&lt;/a&gt;), MiniMax temperature fix + model update (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/33&quot;&gt;#33&lt;/a&gt;). 13 providers.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-04-14&lt;/strong&gt; 🔧 &lt;strong&gt;MCP Stability&lt;/strong&gt;: Fixed backtest tool &lt;code&gt;Connection closed&lt;/code&gt; error on stdio transport (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/32&quot;&gt;#32&lt;/a&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-04-13&lt;/strong&gt; 🌐 &lt;strong&gt;Cross-Market Composite Backtest&lt;/strong&gt;: New &lt;code&gt;CompositeEngine&lt;/code&gt; backtests mixed-market portfolios (e.g. A-shares + crypto) with shared capital pool and per-market rules. Also fixed swarm template variable fallback and frontend timeout.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-04-12&lt;/strong&gt; 🌍 &lt;strong&gt;Multi-Platform Export&lt;/strong&gt;: &lt;code&gt;/pine&lt;/code&gt; exports strategies to TradingView (Pine Script v6), TDX (通达信/同花顺/东方财富), and MetaTrader 5 (MQL5) in one command.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-04-11&lt;/strong&gt; 🛡️ &lt;strong&gt;Reliability &amp;amp; DX&lt;/strong&gt;: &lt;code&gt;vibe-trading init&lt;/code&gt; .env bootstrap (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/19&quot;&gt;#19&lt;/a&gt;), preflight checks, runtime data-source fallback, hardened backtest engine. Multi-language README (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/pull/21&quot;&gt;#21&lt;/a&gt;).&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-04-10&lt;/strong&gt; 📦 &lt;strong&gt;v0.1.4&lt;/strong&gt;: Docker fix (&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues/8&quot;&gt;#8&lt;/a&gt;), &lt;code&gt;web_search&lt;/code&gt; MCP tool, 12 LLM providers, &lt;code&gt;akshare&lt;/code&gt;/&lt;code&gt;ccxt&lt;/code&gt; deps. Published to PyPI and ClawHub.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-04-09&lt;/strong&gt; 📊 &lt;strong&gt;Backtest Wave 2&lt;/strong&gt;: ChinaFutures, GlobalFutures, Forex, Options v2 engines. Monte Carlo, Bootstrap CI, Walk-Forward validation.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;2026-04-08&lt;/strong&gt; 🔧 &lt;strong&gt;Multi-market backtest&lt;/strong&gt; with per-market rules, Pine Script v6 export, 5 data sources with auto-fallback.&lt;/p&gt; &lt;/li&gt; 
 &lt;/ul&gt; 
&lt;/details&gt; 
&lt;hr /&gt; 
&lt;h2&gt;✨ Key Features&lt;/h2&gt; 
&lt;div align=&quot;center&quot;&gt; 
 &lt;table align=&quot;center&quot; width=&quot;94%&quot; style=&quot;width:94%; margin-left:auto; margin-right:auto;&quot;&gt; 
  &lt;tbody&gt;
   &lt;tr&gt; 
    &lt;td align=&quot;center&quot; width=&quot;50%&quot; valign=&quot;top&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/assets/feature-self-improving-trading-agent.png&quot; height=&quot;130&quot; alt=&quot;Self-improving trading agent&quot; /&gt;&lt;br /&gt; &lt;h3&gt;🔍 Self-Improving Trading Agent&lt;/h3&gt; 
     &lt;div align=&quot;left&quot;&gt;
       • Natural-language market research
      &lt;br /&gt; • Strategy drafts and file/web analysis
      &lt;br /&gt; • Memory-backed workflows 
     &lt;/div&gt; &lt;/td&gt; 
    &lt;td align=&quot;center&quot; width=&quot;50%&quot; valign=&quot;top&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/assets/feature-multi-agent-trading-teams.png&quot; height=&quot;130&quot; alt=&quot;Multi-agent trading teams&quot; /&gt;&lt;br /&gt; &lt;h3&gt;🐝 Multi-Agent Trading Teams&lt;/h3&gt; 
     &lt;div align=&quot;left&quot;&gt;
       • Investment, quant, crypto, and risk teams
      &lt;br /&gt; • Streaming progress and persisted reports
      &lt;br /&gt; • Workers grounded with fetched market data 
     &lt;/div&gt; &lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td align=&quot;center&quot; width=&quot;50%&quot; valign=&quot;top&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/assets/feature-cross-market-data-backtesting.png&quot; height=&quot;130&quot; alt=&quot;Cross-market data and backtesting&quot; /&gt;&lt;br /&gt; &lt;h3&gt;📊 Cross-Market Data &amp;amp; Backtesting&lt;/h3&gt; 
     &lt;div align=&quot;left&quot;&gt;
       • A / HK / US / Canada / India / Korea equities, crypto, futures, and forex
      &lt;br /&gt; • Data fallback and composite backtests
      &lt;br /&gt; • PIT data, validation, and run cards 
     &lt;/div&gt; &lt;/td&gt; 
    &lt;td align=&quot;center&quot; width=&quot;50%&quot; valign=&quot;top&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/assets/feature-shadow-account.png&quot; height=&quot;130&quot; alt=&quot;Shadow Account&quot; /&gt;&lt;br /&gt; &lt;h3&gt;👥 Shadow Account&lt;/h3&gt; 
     &lt;div align=&quot;left&quot;&gt;
       • Broker-journal behavior diagnostics
      &lt;br /&gt; • Rule-based Shadow Account comparisons
      &lt;br /&gt; • Exportable audit reports and strategy code 
     &lt;/div&gt; &lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt;
 &lt;/table&gt; 
&lt;/div&gt; 
&lt;h2&gt;💡 What Is Vibe-Trading?&lt;/h2&gt; 
&lt;p&gt;Vibe-Trading is an open-source research workspace for turning finance questions into runnable analysis. It connects natural-language prompts to market-data loaders, strategy generation, backtest engines, reports, exports, and persistent research memory.&lt;/p&gt; 
&lt;p&gt;It is designed for research, simulation, and backtesting — and, when you choose, autonomous trading through a broker you authorize yourself (e.g. Robinhood Agentic Trading). It holds no funds and never trades outside the limits you set, and you can halt it instantly.&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;✨ What You Can Do&lt;/h2&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Task&lt;/th&gt; 
   &lt;th&gt;Output&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Ask a trading question&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Market research with tools, data, documents, and reusable session context.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Backtest a strategy idea&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Strategy code, metrics, benchmark context, validation artifacts, and run cards.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Review your own trades&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Broker-journal parsing, behavior diagnostics, rule extraction, and Shadow Account comparisons.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Read documents &amp;amp; charts&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Parse PDF / DOCX / XLSX / PPTX / images with pluggable OCR (&lt;code&gt;read_document&lt;/code&gt;), and read chart screenshots semantically with a vision model (&lt;code&gt;analyze_image&lt;/code&gt;).&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Read institutional filings &amp;amp; fund books&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;SEC 13F manager books with quarter-over-quarter position diffs, ETF constituents across markets, event-contract implied probability, and arXiv / OpenAlex factor extraction — all read-only, on free public sources.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Improve repeated research&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Persistent memory and editable skills turn useful routines into reusable workflows.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Run analyst teams&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Multi-agent research reviews for investment, quant, crypto, macro, and risk workflows.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Put research into IM channels&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Run the same session runtime through WebSocket, Telegram, Slack, Discord, Matrix, WhatsApp, Signal, QQ/NapCat, WeChat/WeCom, Feishu/Lark, DingTalk, Teams, email, and Mochat with CLI, REST, and Web UI controls.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Ship usable artifacts&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Reports, TradingView Pine Script, TDX, MetaTrader 5, MCP tools, and later research sessions.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Bench a pre-built alpha zoo&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;One-line IC + alive/reversed/dead categorisation across 462 alphas (Qlib 158 + Kakushadze 101 + GTJA 191 + academic + PIT-safe fundamental) on your universe.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Spot correlation regimes&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;An edge-density + hysteresis timeline on the &lt;code&gt;/correlation&lt;/code&gt; surface showing when markets fuse into one bloc — descriptive risk context, not a signal.&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;hr /&gt; 
&lt;h2&gt;⚡ Quick Example&lt;/h2&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install vibe-trading-ai

# Natural-language research
vibe-trading run -p &quot;Backtest a BTC-USDT 20/50 moving-average strategy for 2024, summarize return and drawdown, then export the report&quot;

# Bench a pre-built alpha zoo (one line)
vibe-trading alpha bench --zoo gtja191 --universe csi300 --period 2018-2025 --top 20
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vibe-trading --upload trades_export.csv
vibe-trading run -p &quot;Analyze my trading behavior, extract my shadow strategy, and compare it with my actual trades&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr /&gt; 
&lt;h2&gt;👥 Shadow Account&lt;/h2&gt; 
&lt;p&gt;Shadow Account starts from your own trading records instead of a generic strategy template.&lt;/p&gt; 
&lt;p&gt;Upload a broker export, let the agent summarize your behavior, then compare the actual trading path with a rule-based shadow strategy.&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Step&lt;/th&gt; 
   &lt;th&gt;Agent output&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;1. Read your journal&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Parses broker exports from 同花顺, 东方财富, 富途, and generic CSV formats.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;2. Profile your behavior&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Holding days, win rate, PnL ratio, drawdown, disposition effect, overtrading, momentum chasing, and anchoring checks.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;3. Extract your rules&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Turns recurring entries/exits into an explicit strategy profile instead of a hand-wavy summary.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;4. Run the shadow&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Backtests the extracted rules and highlights rule breaks, early exits, missed signals, and alternative trade paths.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;5. Deliver the report&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Produces an HTML/PDF report that can be inspected, archived, or refined in a later session.&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vibe-trading --upload trades_export.csv
vibe-trading run -p &quot;Analyze my trading behavior, extract my shadow strategy, and compare it with my actual trades&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr /&gt; 
&lt;h2&gt;🧪 Research Workflow&lt;/h2&gt; 
&lt;p&gt;Most runs follow the same evidence path: route the request, load the right market context, execute tools, validate outputs, and keep the artifacts inspectable.&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Layer&lt;/th&gt; 
   &lt;th&gt;What happens&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Plan&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Selects the relevant finance skills, tools, data sources, and swarm preset when useful.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Ground&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Pulls A-shares, HK/US/Canada equities, crypto, futures, forex, documents, or web context through the available loaders.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Execute&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Generates testable strategy code, runs tools, and uses the matching backtest engine or analysis workflow.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Validate&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Adds metrics, benchmark comparison, Monte Carlo, Bootstrap, Walk-Forward, run cards, and warnings where applicable.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Deliver&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Returns reports, artifacts, tool traces, and exports for TradingView, TDX, MetaTrader 5, MCP clients, or later sessions.&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;hr /&gt; 
&lt;h2&gt;📡 Data Sources &amp;amp; Smart Fallback&lt;/h2&gt; 
&lt;p&gt;One &lt;code&gt;get_market_data&lt;/code&gt; call, &lt;strong&gt;23 free market-data sources&lt;/strong&gt; (plus the optional &lt;strong&gt;QVeris&lt;/strong&gt; premium marketplace). Set &lt;code&gt;source: &quot;auto&quot;&lt;/code&gt; — the loader picks by symbol, then walks a per-market chain ordered by &lt;strong&gt;IP-ban risk&lt;/strong&gt;: never-banned public sources first, throttled / key-gated ones last. Zero config, no single point of failure.&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Source&lt;/th&gt; 
   &lt;th&gt;Markets&lt;/th&gt; 
   &lt;th&gt;Auth&lt;/th&gt; 
   &lt;th&gt;Role&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;tencent&lt;/code&gt; · &lt;code&gt;mootdx&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;A-share + HK&lt;/td&gt; 
   &lt;td&gt;none&lt;/td&gt; 
   &lt;td&gt;never IP-banned (&lt;code&gt;mootdx&lt;/code&gt; = 通达信 TCP)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;eastmoney&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;A / US / HK&lt;/td&gt; 
   &lt;td&gt;none&lt;/td&gt; 
   &lt;td&gt;OHLCV + deep fundamentals &amp;amp; flow tools (throttled)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;baostock&lt;/code&gt; · &lt;code&gt;akshare&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;A (+ US/HK/futures/macro/fx)&lt;/td&gt; 
   &lt;td&gt;none&lt;/td&gt; 
   &lt;td&gt;free fallbacks&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;tushare&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;A / HK / futures / fund / macro&lt;/td&gt; 
   &lt;td&gt;token&lt;/td&gt; 
   &lt;td&gt;richest A-share&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;yahoo&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;US / HK / Canada&lt;/td&gt; 
   &lt;td&gt;none&lt;/td&gt; 
   &lt;td&gt;direct chart/quotes/options; TSX &lt;code&gt;.TO&lt;/code&gt; / TSXV &lt;code&gt;.V&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;sina&lt;/code&gt; · &lt;code&gt;stooq&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;US&lt;/td&gt; 
   &lt;td&gt;none&lt;/td&gt; 
   &lt;td&gt;K-line to 1984 · EOD CSV&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;yfinance&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;US / HK / Canada&lt;/td&gt; 
   &lt;td&gt;none&lt;/td&gt; 
   &lt;td&gt;wrapper; TSX &lt;code&gt;.TO&lt;/code&gt; / TSXV &lt;code&gt;.V&lt;/code&gt; pass through&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;longbridge&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;US / HK&lt;/td&gt; 
   &lt;td&gt;App Key + App Secret + Access Token&lt;/td&gt; 
   &lt;td&gt;optional historical OHLCV source; install the optional SDK&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;finnhub&lt;/code&gt; · &lt;code&gt;alphavantage&lt;/code&gt; · &lt;code&gt;tiingo&lt;/code&gt; · &lt;code&gt;fmp&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;US&lt;/td&gt; 
   &lt;td&gt;key&lt;/td&gt; 
   &lt;td&gt;optional providers&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;qveris&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;global multi-asset&lt;/td&gt; 
   &lt;td&gt;key · credits&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;premium marketplace&lt;/strong&gt; — 63+ providers via one key (explicit-only, never in auto fallback)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;okx&lt;/code&gt; · &lt;code&gt;ccxt&lt;/code&gt; · &lt;code&gt;binance&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;crypto&lt;/td&gt; 
   &lt;td&gt;none&lt;/td&gt; 
   &lt;td&gt;OKX + 100+ exchanges + Binance historical / USD-M perps&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;futu&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;HK / A&lt;/td&gt; 
   &lt;td&gt;OpenD&lt;/td&gt; 
   &lt;td&gt;optional local FutuOpenD&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;mt5&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;forex / metals&lt;/td&gt; 
   &lt;td&gt;MT5 terminal&lt;/td&gt; 
   &lt;td&gt;MetaTrader 5 (Exness-style) forex / metal bars, 1m–1D&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;pykrx&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Korea (KRX: KOSPI/KOSDAQ)&lt;/td&gt; 
   &lt;td&gt;none&lt;/td&gt; 
   &lt;td&gt;daily KOSPI / KOSDAQ bars for &lt;code&gt;.KS&lt;/code&gt; / &lt;code&gt;.KQ&lt;/code&gt; (optional &lt;code&gt;krx&lt;/code&gt; extra)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;india_broker&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;India (NSE/BSE)&lt;/td&gt; 
   &lt;td&gt;broker login&lt;/td&gt; 
   &lt;td&gt;read-only Shoonya / Dhan bars for &lt;code&gt;.NS&lt;/code&gt; / &lt;code&gt;.BO&lt;/code&gt; (fallback-chain tail)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;local&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;any&lt;/td&gt; 
   &lt;td&gt;none&lt;/td&gt; 
   &lt;td&gt;your own CSV / Parquet / DuckDB via &lt;code&gt;local:&lt;/code&gt; prefix&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;&lt;strong&gt;Fallback chains (by IP-ban risk):&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;A-share&lt;/strong&gt; → &lt;code&gt;tencent&lt;/code&gt; · &lt;code&gt;mootdx&lt;/code&gt; · &lt;code&gt;eastmoney&lt;/code&gt; · &lt;code&gt;baostock&lt;/code&gt; · &lt;code&gt;akshare&lt;/code&gt; · &lt;code&gt;tushare&lt;/code&gt; · &lt;code&gt;local&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;US&lt;/strong&gt; → &lt;code&gt;yahoo&lt;/code&gt; · &lt;code&gt;stooq&lt;/code&gt; · &lt;code&gt;sina&lt;/code&gt; · &lt;code&gt;eastmoney&lt;/code&gt; · &lt;code&gt;yfinance&lt;/code&gt; · &lt;code&gt;tiingo&lt;/code&gt; · &lt;code&gt;fmp&lt;/code&gt; · &lt;code&gt;finnhub&lt;/code&gt; · &lt;code&gt;alphavantage&lt;/code&gt; · &lt;code&gt;longbridge&lt;/code&gt; · &lt;code&gt;akshare&lt;/code&gt; · &lt;code&gt;local&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;HK&lt;/strong&gt; → &lt;code&gt;tencent&lt;/code&gt; · &lt;code&gt;eastmoney&lt;/code&gt; · &lt;code&gt;yahoo&lt;/code&gt; · &lt;code&gt;futu&lt;/code&gt; · &lt;code&gt;akshare&lt;/code&gt; · &lt;code&gt;yfinance&lt;/code&gt; · &lt;code&gt;tushare&lt;/code&gt; · &lt;code&gt;longbridge&lt;/code&gt; · &lt;code&gt;local&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;India (NSE/BSE)&lt;/strong&gt; → &lt;code&gt;yahoo&lt;/code&gt; · &lt;code&gt;yfinance&lt;/code&gt; · &lt;code&gt;india_broker&lt;/code&gt; · &lt;code&gt;local&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Korea (KOSPI/KOSDAQ)&lt;/strong&gt; → &lt;code&gt;pykrx&lt;/code&gt; · &lt;code&gt;yahoo&lt;/code&gt; · &lt;code&gt;yfinance&lt;/code&gt; · &lt;code&gt;local&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Crypto&lt;/strong&gt; → &lt;code&gt;okx&lt;/code&gt; · &lt;code&gt;ccxt&lt;/code&gt; · &lt;code&gt;binance&lt;/code&gt; · &lt;code&gt;yfinance&lt;/code&gt; · &lt;code&gt;local&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Forex / metals&lt;/strong&gt; → &lt;code&gt;mt5&lt;/code&gt; · &lt;code&gt;yfinance&lt;/code&gt; · &lt;code&gt;akshare&lt;/code&gt; · &lt;code&gt;local&lt;/code&gt; &amp;nbsp;·&amp;nbsp; &lt;em&gt;(futures / fund / macro → &lt;code&gt;tushare&lt;/code&gt;/&lt;code&gt;akshare&lt;/code&gt; → &lt;code&gt;local&lt;/code&gt;)&lt;/em&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Using Longbridge explicitly&lt;/h3&gt; 
&lt;p&gt;Longbridge is an optional US/HK historical OHLCV loader. Install its SDK with:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install &quot;vibe-trading-ai[longbridge]&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Configure the three credentials in &lt;code&gt;.env&lt;/code&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-dotenv&quot;&gt;LONGBRIDGE_APP_KEY=...
LONGBRIDGE_APP_SECRET=...
LONGBRIDGE_ACCESS_TOKEN=...
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;For a backtest, set &lt;code&gt;source&lt;/code&gt; in &lt;code&gt;config.json&lt;/code&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;codes&quot;: [&quot;QQQ.US&quot;],
  &quot;start_date&quot;: &quot;2025-01-01&quot;,
  &quot;end_date&quot;: &quot;2025-01-10&quot;,
  &quot;interval&quot;: &quot;1D&quot;,
  &quot;source&quot;: &quot;longbridge&quot;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;In an Agent conversation, ask explicitly: &lt;strong&gt;&quot;Use Longbridge to fetch &lt;a href=&quot;http://QQQ.US&quot;&gt;QQQ.US&lt;/a&gt; historical data.&quot;&lt;/strong&gt; The explicit source request is separate from &lt;code&gt;source: &quot;auto&quot;&lt;/code&gt;; &lt;code&gt;auto&lt;/code&gt; keeps the normal per-market fallback chain.&lt;/p&gt; 
&lt;p&gt;Beyond OHLCV, &lt;strong&gt;22 read-only data tools&lt;/strong&gt; reach into fundamentals &amp;amp; flow — fund flow, dragon-tiger, northbound, margin, block trades, shareholder count, lockup, sector, research reports, news, SEC filings, financial statements, options chains, stock profile, market screening, symbol search, macro, iwencai, institutional holdings (13F), ETF look-through, prediction markets, and research papers — all exposed over MCP. An explicit &lt;code&gt;local:&lt;/code&gt; symbol never silently falls back to a network source.&lt;/p&gt; 
&lt;!-- QVERIS-START --&gt; 
&lt;h3&gt;💎 Optional premium data — QVeris&lt;/h3&gt; 
&lt;img src=&quot;https://www.qveris.com/logo-color.png&quot; alt=&quot;QVeris&quot; height=&quot;36&quot; /&gt; 
&lt;p&gt;&lt;strong&gt;Data: free routing or premium, your choice.&lt;/strong&gt; Free stays the default: 23 built-in sources with ban-risk fallback, no key, no cost. Premium via QVeris adds 10,000+ capabilities (per QVeris) across 63+ providers for options Greeks, premium fundamentals, China/HK/global data, macro, crypto, news, and filings; failed calls are not charged. Enable it in Settings -&amp;gt; QVeris or &lt;code&gt;vibe-trading data mode paid&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;&lt;em&gt;QVeris disclosure: &lt;a href=&quot;https://qveris.ai/?ref=Vyjjo5G_1cAHJA&quot;&gt;signing up through the Vibe-Trading referral link&lt;/a&gt; gets you &lt;strong&gt;+1,000 bonus credits&lt;/strong&gt; and supports the project.&lt;/em&gt;&lt;/p&gt; 
&lt;!-- QVERIS-END --&gt; 
&lt;hr /&gt; 
&lt;h2&gt;🔩 Detailed Capabilities&lt;/h2&gt; 
&lt;p&gt;Detailed inventories are folded below to keep the main README scannable. Open them when you want to inspect the available building blocks.&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;Finance Skill Library&lt;/b&gt; &lt;sub&gt;89 skills across 9 categories&lt;/sub&gt;&lt;/summary&gt; 
 &lt;ul&gt; 
  &lt;li&gt;📊 89 specialized finance skills organized into 9 categories&lt;/li&gt; 
  &lt;li&gt;🌐 Complete coverage from traditional markets to crypto &amp;amp; DeFi&lt;/li&gt; 
  &lt;li&gt;🔬 Comprehensive capabilities spanning data sourcing to quantitative research&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Category&lt;/th&gt; 
    &lt;th&gt;Skills&lt;/th&gt; 
    &lt;th&gt;Examples&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Data Source&lt;/td&gt; 
    &lt;td&gt;10&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;data-routing&lt;/code&gt;, &lt;code&gt;tushare&lt;/code&gt;, &lt;code&gt;yfinance&lt;/code&gt;, &lt;code&gt;okx-market&lt;/code&gt;, &lt;code&gt;akshare&lt;/code&gt;, &lt;code&gt;mootdx&lt;/code&gt;, &lt;code&gt;ccxt&lt;/code&gt;, &lt;code&gt;eastmoney&lt;/code&gt;, &lt;code&gt;sec-edgar&lt;/code&gt;, &lt;code&gt;qveris&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Strategy&lt;/td&gt; 
    &lt;td&gt;19&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;strategy-generate&lt;/code&gt;, &lt;code&gt;cross-market-strategy&lt;/code&gt;, &lt;code&gt;technical-basic&lt;/code&gt;, &lt;code&gt;candlestick&lt;/code&gt;, &lt;code&gt;ichimoku&lt;/code&gt;, &lt;code&gt;elliott-wave&lt;/code&gt;, &lt;code&gt;smc&lt;/code&gt;, &lt;code&gt;multi-factor&lt;/code&gt;, &lt;code&gt;ml-strategy&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Analysis&lt;/td&gt; 
    &lt;td&gt;23&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;factor-research&lt;/code&gt;, &lt;code&gt;correlation-regime&lt;/code&gt;, &lt;code&gt;macro-analysis&lt;/code&gt;, &lt;code&gt;global-macro&lt;/code&gt;, &lt;code&gt;valuation-model&lt;/code&gt;, &lt;code&gt;investor-lenses&lt;/code&gt;, &lt;code&gt;credit-analysis&lt;/code&gt;, &lt;code&gt;dividend-analysis&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Asset Class&lt;/td&gt; 
    &lt;td&gt;9&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;options-strategy&lt;/code&gt;, &lt;code&gt;options-advanced&lt;/code&gt;, &lt;code&gt;convertible-bond&lt;/code&gt;, &lt;code&gt;etf-analysis&lt;/code&gt;, &lt;code&gt;asset-allocation&lt;/code&gt;, &lt;code&gt;sector-rotation&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Crypto&lt;/td&gt; 
    &lt;td&gt;7&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;perp-funding-basis&lt;/code&gt;, &lt;code&gt;liquidation-heatmap&lt;/code&gt;, &lt;code&gt;stablecoin-flow&lt;/code&gt;, &lt;code&gt;defi-yield&lt;/code&gt;, &lt;code&gt;onchain-analysis&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Flow&lt;/td&gt; 
    &lt;td&gt;8&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;hk-connect-flow&lt;/code&gt;, &lt;code&gt;us-etf-flow&lt;/code&gt;, &lt;code&gt;edgar-sec-filings&lt;/code&gt;, &lt;code&gt;financial-statement&lt;/code&gt;, &lt;code&gt;adr-hshare&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Tool&lt;/td&gt; 
    &lt;td&gt;10&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;backtest-diagnose&lt;/code&gt;, &lt;code&gt;report-generate&lt;/code&gt;, &lt;code&gt;pine-script&lt;/code&gt;, &lt;code&gt;doc-reader&lt;/code&gt;, &lt;code&gt;web-reader&lt;/code&gt;, &lt;code&gt;vnpy-export&lt;/code&gt;, &lt;code&gt;trade-journal&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Research&lt;/td&gt; 
    &lt;td&gt;2&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;alpha-zoo&lt;/code&gt;, &lt;code&gt;strategy-dev-manager&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Risk Analysis&lt;/td&gt; 
    &lt;td&gt;1&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;ashare-pre-st-filter&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;Custom Data Source&lt;/b&gt; &lt;sub&gt;register your own historical OHLCV loader&lt;/sub&gt;&lt;/summary&gt; 
 &lt;p&gt;Need a market or vendor we don&#39;t ship a loader for? Add your own historical-bar loader and select it with &lt;code&gt;source=&quot;&amp;lt;name&amp;gt;&quot;&lt;/code&gt;. The steps edit package source, so run from a clone (&lt;code&gt;pip install -e .&lt;/code&gt;).&lt;/p&gt; 
 &lt;ol&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;Write the loader&lt;/strong&gt; — create &lt;code&gt;agent/backtest/loaders/&amp;lt;name&amp;gt;_loader.py&lt;/code&gt; with a class that satisfies &lt;code&gt;DataLoaderProtocol&lt;/code&gt; (duck-typed, no base class needed) and is tagged with &lt;code&gt;@register&lt;/code&gt;:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import pandas as pd
from backtest.loaders.registry import register

@register
class DataLoader:
    name = &quot;mysource&quot;            # the value you pass as source=
    markets = {&quot;us_equity&quot;}      # a_share/us_equity/hk_equity/crypto/futures/fund/macro/forex
    requires_auth = False

    def is_available(self) -&amp;gt; bool:
        return True              # token present? network reachable?

    def fetch(self, codes, start_date, end_date, *, interval=&quot;1D&quot;, fields=None):
        # return {symbol: DataFrame indexed by trade_date,
        #         columns: open, high, low, close, volume}
        ...
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;Register the module&lt;/strong&gt; so &lt;code&gt;@register&lt;/code&gt; fires — add &lt;code&gt;&quot;backtest.loaders.&amp;lt;name&amp;gt;_loader&quot;&lt;/code&gt; to &lt;code&gt;_loader_modules&lt;/code&gt; in &lt;code&gt;agent/backtest/loaders/registry.py&lt;/code&gt;.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;Allow the name&lt;/strong&gt; through config validation — add &lt;code&gt;&quot;mysource&quot;&lt;/code&gt; to &lt;code&gt;_VALID_SOURCES&lt;/code&gt; in &lt;code&gt;agent/backtest/runner.py&lt;/code&gt;.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;em&gt;(Optional)&lt;/em&gt; slot it into a market&#39;s &lt;code&gt;FALLBACK_CHAINS&lt;/code&gt; in &lt;code&gt;registry.py&lt;/code&gt; so &lt;code&gt;source=&quot;auto&quot;&lt;/code&gt; can reach it.&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;Use it&lt;/strong&gt; — &lt;code&gt;source=&quot;mysource&quot;&lt;/code&gt; in a backtest config, or via the CLI / agent.&lt;/p&gt; &lt;/li&gt; 
 &lt;/ol&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;Real-time ticks / order-book depth are out of scope for loaders&lt;/strong&gt; — the loader layer is point-in-time historical bars only. Live market data flows through the broker connectors instead: &lt;code&gt;okx&lt;/code&gt; / &lt;code&gt;binance&lt;/code&gt; / &lt;code&gt;ccxt&lt;/code&gt; for crypto, &lt;code&gt;futu&lt;/code&gt; / &lt;code&gt;tiger&lt;/code&gt; for equities.&lt;/p&gt; 
 &lt;/blockquote&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;Broker Connectors&lt;/b&gt; &lt;sub&gt;12 brokers — read + paper, bounded-live where supported&lt;/sub&gt;&lt;/summary&gt; 
 &lt;p&gt;Connector-first profiles. Most do read + paper-account order placement — IBKR is read-only, Robinhood is live-only (no paper account), and Trading 212 refuses order placement entirely, paper included; live order placement is bounded by a user-defined mandate (symbol allowlist, order-size / exposure caps, daily trade cap, instant kill switch) and never holds funds — the broker executes. Order-placing tools stay off MCP (agent + CLI only). Research / backtest paths are structurally barred from any live endpoint.&lt;/p&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Broker&lt;/th&gt; 
    &lt;th&gt;Markets&lt;/th&gt; 
    &lt;th&gt;Capabilities&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;IBKR&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;global&lt;/td&gt; 
    &lt;td&gt;local TWS / Gateway, read-only&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;Robinhood&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;US&lt;/td&gt; 
    &lt;td&gt;Agentic MCP (desktop OAuth) — read + bounded live&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;Tiger&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;US / HK / A&lt;/td&gt; 
    &lt;td&gt;read + paper + bounded live&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;Alpaca&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;US&lt;/td&gt; 
    &lt;td&gt;read + paper + bounded live (+ TAP credential-isolation mode)&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;OKX&lt;/strong&gt; · &lt;strong&gt;Binance&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;crypto&lt;/td&gt; 
    &lt;td&gt;read + paper + bounded live&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;Futu&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;HK / US / A&lt;/td&gt; 
    &lt;td&gt;read + paper + bounded live&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;MetaTrader 5&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;forex / CFD&lt;/td&gt; 
    &lt;td&gt;read + paper + bounded live (Exness-style; demo ⇔ paper identity guard)&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;Longbridge&lt;/strong&gt; · &lt;strong&gt;Dhan&lt;/strong&gt; · &lt;strong&gt;Shoonya&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;US / HK · India (NSE/BSE)&lt;/td&gt; 
    &lt;td&gt;read + paper only — no runtime paper/live discriminator, so live order placement is hard-refused&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;Trading 212&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;UK / EU&lt;/td&gt; 
    &lt;td&gt;fully read-only — &lt;code&gt;place_order&lt;/code&gt; / &lt;code&gt;cancel_order&lt;/code&gt; hard-refuse even paper&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
 &lt;p&gt;Paper-vs-live is a &lt;strong&gt;structural per-broker runtime guard&lt;/strong&gt; (account-id format, host separation, demo flag, or trade environment), never a config flag the agent can flip. A broker exposing no such discriminator is capped at paper + read-only.&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;Preset Trading Teams&lt;/b&gt; &lt;sub&gt;30 swarm presets&lt;/sub&gt;&lt;/summary&gt; 
 &lt;ul&gt; 
  &lt;li&gt;🏢 30 ready-to-use agent teams&lt;/li&gt; 
  &lt;li&gt;⚡ Pre-configured finance workflows&lt;/li&gt; 
  &lt;li&gt;🎯 Investment, trading &amp;amp; risk management presets&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Preset&lt;/th&gt; 
    &lt;th&gt;Workflow&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;investment_committee&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Bull/bear debate → risk review → PM final call&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;global_equities_desk&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;A-share + HK/US + crypto researcher → global strategist&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;crypto_trading_desk&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Funding/basis + liquidation + flow → risk manager&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;earnings_research_desk&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Fundamental + revision + options → earnings strategist&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;macro_rates_fx_desk&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Rates + FX + commodity → macro PM&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;quant_strategy_desk&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Screening + factor research → backtest → risk audit&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;technical_analysis_panel&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Classic TA + Ichimoku + harmonic + Elliott + SMC → consensus&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;risk_committee&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Drawdown + tail risk + regime review → sign-off&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;global_allocation_committee&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;A-shares + crypto + HK/US → cross-market allocation&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
 &lt;p&gt;&lt;sub&gt;Plus 20+ additional specialist presets — run vibe-trading --swarm-presets to explore all. Bring your own: drop preset YAMLs into &lt;code&gt;~/.vibe-trading/swarm/presets/&lt;/code&gt; — they are listed alongside the bundled roster (same-name files override it, like user skills) and survive upgrades.&lt;/sub&gt;&lt;/p&gt;  
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;Alpha Zoo&lt;/b&gt; &lt;sub&gt;462 pre-built quant alphas across 5 families&lt;/sub&gt;&lt;/summary&gt; 
 &lt;ul&gt; 
  &lt;li&gt;🧬 462 cross-sectional alphas, lookahead-banned at the operator layer&lt;/li&gt; 
  &lt;li&gt;📈 IC + IR + alive/reversed/dead categorisation in one CLI command&lt;/li&gt; 
  &lt;li&gt;🔬 AST purity gate + 300-row lookahead sentinel test + &lt;code&gt;pytest-socket&lt;/code&gt; network kill-switch&lt;/li&gt; 
  &lt;li&gt;📦 Apache-2 attribution for Qlib; per-zoo &lt;code&gt;LICENSE.md&lt;/code&gt; declaring formulas as mathematical content&lt;/li&gt; 
  &lt;li&gt;🤝 Developer Certificate of Origin (DCO) sign-off workflow for community PRs&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Zoo&lt;/th&gt; 
    &lt;th&gt;Count&lt;/th&gt; 
    &lt;th&gt;Source&lt;/th&gt; 
    &lt;th&gt;License&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;qlib158&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;154&lt;/td&gt; 
    &lt;td&gt;Microsoft Qlib &lt;code&gt;Alpha158&lt;/code&gt; (Apache-2.0, commit-pinned)&lt;/td&gt; 
    &lt;td&gt;Apache-2.0&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;alpha101&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;101&lt;/td&gt; 
    &lt;td&gt;Kakushadze (2015), &quot;101 Formulaic Alphas&quot;, arXiv:1601.00991&lt;/td&gt; 
    &lt;td&gt;Formulas are mathematical content&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;gtja191&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;191&lt;/td&gt; 
    &lt;td&gt;Guotai Junan (2014), &quot;191 Short-period Trading Alpha Factors&quot;&lt;/td&gt; 
    &lt;td&gt;Formulas are mathematical content&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;academic&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;12&lt;/td&gt; 
    &lt;td&gt;Fama-French 5 + Carhart momentum + Jegadeesh reversal + George-Hwang 52-week-high + Amihud illiquidity + Harvey-Siddique skew + Frazzini-Pedersen betting-against-beta + correlation-rewiring stability (price-based proxies)&lt;/td&gt; 
    &lt;td&gt;Public academic literature&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;fundamental&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;4&lt;/td&gt; 
    &lt;td&gt;PIT-safe SEC company facts — earnings yield, ROE, gross profitability, asset growth (filed-date anchored)&lt;/td&gt; 
    &lt;td&gt;Public financial data&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
 &lt;p&gt;Run &lt;code&gt;vibe-trading alpha list&lt;/code&gt; to browse, &lt;code&gt;vibe-trading alpha show &amp;lt;id&amp;gt;&lt;/code&gt; for formulas + source, &lt;code&gt;vibe-trading alpha bench --zoo X --universe Y --period Z&lt;/code&gt; to score a whole zoo, and &lt;code&gt;vibe-trading alpha compare --all&lt;/code&gt; to rank zoos side by side.&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;Backtest Engines&lt;/b&gt; &lt;sub&gt;9 engines + options portfolio, cross-market composite&lt;/sub&gt;&lt;/summary&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Engine&lt;/th&gt; 
    &lt;th&gt;Market&lt;/th&gt; 
    &lt;th&gt;Notes&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;ChinaA&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;A-share&lt;/td&gt; 
    &lt;td&gt;T+1, price limits, pre-ST filter&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;GlobalEquity&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;US / HK / Canada&lt;/td&gt; 
    &lt;td&gt;same-session trading; market-specific lots, ticks, and costs&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;IndiaEquity&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;India (NSE/BSE)&lt;/td&gt; 
    &lt;td&gt;T+1, circuit bands, config-driven STT / stamp / SEBI / GST cost stack&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;KoreaEquity&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;Korea (KRX: KOSPI/KOSDAQ)&lt;/td&gt; 
    &lt;td&gt;long-only, ±30% band judged at execution time on the unified tick grid, 2026 0.20% transaction tax&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;Crypto&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;crypto spot / USD-M perps&lt;/td&gt; 
    &lt;td&gt;funding settlements, execution/mark split&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;ChinaFutures&lt;/strong&gt; · &lt;strong&gt;GlobalFutures&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;futures&lt;/td&gt; 
    &lt;td&gt;margin, contract multipliers&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;Forex&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;FX / metals&lt;/td&gt; 
    &lt;td&gt;via the &lt;code&gt;mt5&lt;/code&gt; loader&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;Composite&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;cross-market&lt;/td&gt; 
    &lt;td&gt;one shared capital pool across markets (&lt;code&gt;source=&quot;auto&quot;&lt;/code&gt;)&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;options_portfolio&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;options&lt;/td&gt; 
    &lt;td&gt;multi-leg, Greeks, payoff/scenario&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
 &lt;p&gt;Intraday bars: 1m / 5m / 15m / 30m / 1H / 4H / 1D. 15 metrics + benchmark comparison, &lt;strong&gt;5 portfolio optimizers&lt;/strong&gt; (equal-volatility / risk-parity / mean-variance / max-diversification / turnover-aware), and 3 validation tools (Monte Carlo / Bootstrap / Walk-Forward).&lt;/p&gt; 
&lt;/details&gt; 
&lt;h2&gt;🎬 Demo&lt;/h2&gt; 
&lt;div align=&quot;center&quot;&gt; 
 &lt;table&gt; 
  &lt;tbody&gt;
   &lt;tr&gt; 
    &lt;td width=&quot;50%&quot;&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/user-attachments/assets/4e4dcb80-7358-4b9a-92f0-1e29612e6e86&quot;&gt;https://github.com/user-attachments/assets/4e4dcb80-7358-4b9a-92f0-1e29612e6e86&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
    &lt;td width=&quot;50%&quot;&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/user-attachments/assets/3754a414-c3ee-464f-b1e8-78e1a74fbd30&quot;&gt;https://github.com/user-attachments/assets/3754a414-c3ee-464f-b1e8-78e1a74fbd30&lt;/a&gt;&lt;/p&gt; &lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td colspan=&quot;2&quot; align=&quot;center&quot;&gt;&lt;sub&gt;☝️ Natural-language backtest &amp;amp; multi-agent swarm debate — Web UI + CLI&lt;/sub&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt;
 &lt;/table&gt; 
&lt;/div&gt; 
&lt;hr /&gt; 
&lt;h2&gt;🚀 Quick Start&lt;/h2&gt; 
&lt;h3&gt;One-line install (PyPI)&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install vibe-trading-ai
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Then run a first research task:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vibe-trading init
vibe-trading run -p &quot;Backtest a BTC-USDT 20/50 moving-average strategy for 2024 and summarize return and drawdown&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;Upgrading from an older version?&lt;/strong&gt; 0.1.10 moved to LangChain 1.x. If imports break after &lt;code&gt;pip install -U vibe-trading-ai&lt;/code&gt; over a pre-0.1.10 install (e.g. langgraph fails to import), recreate the venv or run &lt;code&gt;pip install --force-reinstall vibe-trading-ai&lt;/code&gt;. A fresh install is unaffected.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;Package name vs commands:&lt;/strong&gt; The PyPI package is &lt;code&gt;vibe-trading-ai&lt;/code&gt;. Once installed, you get three commands:&lt;/p&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Command&lt;/th&gt; 
    &lt;th&gt;Purpose&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;vibe-trading&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Interactive CLI / TUI&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;vibe-trading serve&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Launch FastAPI web server&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;vibe-trading-mcp&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Start MCP server (for Claude Desktop, OpenClaw, Cursor, etc.)&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
&lt;/blockquote&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vibe-trading init              # interactive .env setup
vibe-trading                   # launch CLI
vibe-trading serve --port 8899 # launch web UI
vibe-trading-mcp               # start MCP server (stdio)
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Or choose a path&lt;/h3&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Path&lt;/th&gt; 
   &lt;th&gt;Best for&lt;/th&gt; 
   &lt;th&gt;Time&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;A. Docker&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Try it now, zero local setup&lt;/td&gt; 
   &lt;td&gt;2 min&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;B. Local install&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Development, full CLI access&lt;/td&gt; 
   &lt;td&gt;5 min&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;C. MCP plugin&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Plug into your existing agent&lt;/td&gt; 
   &lt;td&gt;3 min&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;D. ClawHub&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;One command, no cloning&lt;/td&gt; 
   &lt;td&gt;1 min&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h3&gt;Prerequisites&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;An &lt;strong&gt;LLM API key&lt;/strong&gt; from any supported provider — or run locally with &lt;strong&gt;Ollama&lt;/strong&gt; (no key needed)&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Python 3.11+&lt;/strong&gt; for Path B&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Docker&lt;/strong&gt; for Path A&lt;/li&gt; 
 &lt;li&gt;OpenAI Codex can also be used with ChatGPT OAuth: set &lt;code&gt;LANGCHAIN_PROVIDER=openai-codex&lt;/code&gt;, then run &lt;code&gt;vibe-trading provider login openai-codex&lt;/code&gt;. This does not use &lt;code&gt;OPENAI_API_KEY&lt;/code&gt;.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;Supported LLM providers:&lt;/strong&gt; OpenRouter, Requesty, OpenAI, Anthropic (native Messages API), DeepSeek, Gemini, Groq, DashScope/Qwen, Zhipu, Moonshot/Kimi, MiniMax, SiliconFlow (CN + Global), Xiaomi MIMO, iFlytek Spark, &lt;a href=&quot;http://Z.ai&quot;&gt;Z.ai&lt;/a&gt;, NVIDIA NIM, ModelScope, Ollama (local). When no &lt;code&gt;*_BASE_URL&lt;/code&gt; is set, each provider falls back to its canonical endpoint, so just a key is enough. See &lt;code&gt;.env.example&lt;/code&gt; for config.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; All markets work without any API keys thanks to automatic fallback. yfinance/Yahoo (HK/US/Canada), OKX (crypto), mootdx (A-shares, TCP-direct, no IP throttle), and AKShare (A-shares, US, HK, futures, forex) are all free. Tushare token is optional — mootdx is the preferred no-token A-share fallback, with AKShare as a broader backup.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h3&gt;Path A: Docker (zero setup)&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/HKUDS/Vibe-Trading.git
cd Vibe-Trading
cp agent/.env.example agent/.env
# Edit agent/.env — uncomment your LLM provider and set API key
docker compose up --build
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Open &lt;code&gt;http://localhost:8899&lt;/code&gt;. Backend + frontend in one container.&lt;/p&gt; 
&lt;p&gt;Docker publishes the backend on &lt;code&gt;127.0.0.1:8899&lt;/code&gt; by default and runs the app as a non-root container user. If you intentionally expose the API beyond your own machine, set a strong &lt;code&gt;API_AUTH_KEY&lt;/code&gt; and send &lt;code&gt;Authorization: Bearer &amp;lt;key&amp;gt;&lt;/code&gt; from clients.&lt;/p&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-note&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-info mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Note&lt;/p&gt;
 &lt;p&gt;&lt;strong&gt;Using Ollama with Docker:&lt;/strong&gt; the container reaches a host-side Ollama via &lt;code&gt;host.docker.internal&lt;/code&gt;, not &lt;code&gt;localhost&lt;/code&gt; (inside the container &lt;code&gt;localhost&lt;/code&gt; is the container itself). &lt;code&gt;docker-compose.yml&lt;/code&gt; defaults &lt;code&gt;OLLAMA_BASE_URL&lt;/code&gt; to &lt;code&gt;http://host.docker.internal:11434&lt;/code&gt;; export &lt;code&gt;OLLAMA_BASE_URL&lt;/code&gt; (or set it in a top-level &lt;code&gt;.env&lt;/code&gt;) to point elsewhere. This relies on the &lt;code&gt;host-gateway&lt;/code&gt; mapping in &lt;code&gt;extra_hosts&lt;/code&gt;, which requires &lt;strong&gt;Docker Engine ≥ 20.10 / Compose v2&lt;/strong&gt; (provided automatically on Docker Desktop).&lt;/p&gt; 
&lt;/div&gt; 
&lt;p&gt;Your data survives updates: persistent memory, the cross-session search index, user-created skills, shadow accounts, broker connector config, web sessions, backtest runs, swarm history, and uploads all live in named Docker volumes, so &lt;code&gt;git pull &amp;amp;&amp;amp; docker compose up --build&lt;/code&gt; keeps them. They are deleted only by &lt;code&gt;docker compose down -v&lt;/code&gt;.&lt;/p&gt; 
&lt;h3&gt;Path B: Local install&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/HKUDS/Vibe-Trading.git
cd Vibe-Trading
python -m venv .venv

# Activate
source .venv/bin/activate          # Linux / macOS
# .venv\Scripts\activate.bat       # Windows CMD
# .venv\Scripts\Activate.ps1       # Windows PowerShell

pip install -e .
cp agent/.env.example agent/.env   # Edit — set your LLM provider API key
vibe-trading                       # Launch interactive TUI
&lt;/code&gt;&lt;/pre&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-note&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-info mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Note&lt;/p&gt;
 &lt;p&gt;&lt;strong&gt;On Windows:&lt;/strong&gt; &lt;code&gt;cp&lt;/code&gt; is a PowerShell alias for &lt;code&gt;Copy-Item&lt;/code&gt;, so the snippets above work as-is in PowerShell. CMD has no &lt;code&gt;cp&lt;/code&gt; — use &lt;code&gt;copy agent\.env.example agent\.env&lt;/code&gt; instead (this applies to the Docker snippet above too). If PowerShell refuses to run &lt;code&gt;Activate.ps1&lt;/code&gt;, run &lt;code&gt;Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned&lt;/code&gt; first; it applies to that shell session only.&lt;/p&gt; 
&lt;/div&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;Start web UI (optional)&lt;/b&gt;&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Terminal 1: API server
vibe-trading serve --port 8899

# Terminal 2: Frontend dev server
cd frontend &amp;amp;&amp;amp; npm install &amp;amp;&amp;amp; npm run dev  # requires Node &amp;gt;= 22.22
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;Open &lt;code&gt;http://localhost:5899&lt;/code&gt;. The frontend proxies API calls to &lt;code&gt;localhost:8899&lt;/code&gt;.&lt;/p&gt; 
 &lt;p&gt;&lt;strong&gt;Production mode (single server):&lt;/strong&gt;&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd frontend &amp;amp;&amp;amp; npm run build &amp;amp;&amp;amp; cd ..
vibe-trading serve --port 8899     # FastAPI serves dist/ as static files
&lt;/code&gt;&lt;/pre&gt; 
 &lt;div class=&quot;markdown-alert markdown-alert-note&quot;&gt;
  &lt;p class=&quot;markdown-alert-title&quot;&gt;
   &lt;svg class=&quot;octicon octicon-info mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
    &lt;path d=&quot;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;
   &lt;/svg&gt;Note&lt;/p&gt;
  &lt;p&gt;&lt;code&gt;vibe-trading serve&lt;/code&gt; binds &lt;code&gt;0.0.0.0&lt;/code&gt; and is loopback-only by default: opening the UI on the &lt;strong&gt;same machine&lt;/strong&gt; (&lt;code&gt;http://localhost:8899&lt;/code&gt;) works with zero config. If you browse from &lt;strong&gt;another machine, a VM host, or a phone on your LAN&lt;/strong&gt;, sensitive endpoints return &lt;code&gt;403&lt;/code&gt; and the chat shows &quot;Remote API access requires an API key&quot; — set a strong &lt;code&gt;API_AUTH_KEY&lt;/code&gt; in &lt;code&gt;agent/.env&lt;/code&gt;, restart, and enter the same key once in &lt;strong&gt;Settings&lt;/strong&gt;. (Docker Desktop&#39;s host gateway: set &lt;code&gt;VIBE_TRADING_TRUST_DOCKER_LOOPBACK=1&lt;/code&gt; with the default &lt;code&gt;127.0.0.1&lt;/code&gt; port bind.)&lt;/p&gt; 
 &lt;/div&gt; 
&lt;/details&gt; 
&lt;h3&gt;Path C: MCP plugin&lt;/h3&gt; 
&lt;p&gt;See &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/#-mcp-plugin&quot;&gt;MCP Plugin&lt;/a&gt; section below.&lt;/p&gt; 
&lt;h3&gt;Path D: ClawHub (one command)&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npx clawhub@latest install vibe-trading --force
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The skill + MCP config is downloaded into your agent&#39;s skills directory. See &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/#-mcp-plugin&quot;&gt;ClawHub install&lt;/a&gt; for details.&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;🧠 Environment Variables&lt;/h2&gt; 
&lt;p&gt;Copy &lt;code&gt;agent/.env.example&lt;/code&gt; to &lt;code&gt;agent/.env&lt;/code&gt; and uncomment the provider block you want. Each provider needs 3-4 variables:&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Variable&lt;/th&gt; 
   &lt;th style=&quot;text-align:center&quot;&gt;Required&lt;/th&gt; 
   &lt;th&gt;Description&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;LANGCHAIN_PROVIDER&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt; 
   &lt;td&gt;Provider name (&lt;code&gt;openrouter&lt;/code&gt;, &lt;code&gt;deepseek&lt;/code&gt;, &lt;code&gt;groq&lt;/code&gt;, &lt;code&gt;ollama&lt;/code&gt;, etc.)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;&amp;lt;PROVIDER&amp;gt;_API_KEY&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;Yes*&lt;/td&gt; 
   &lt;td&gt;API key (&lt;code&gt;OPENROUTER_API_KEY&lt;/code&gt;, &lt;code&gt;DEEPSEEK_API_KEY&lt;/code&gt;, etc.)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;&amp;lt;PROVIDER&amp;gt;_BASE_URL&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt; 
   &lt;td&gt;API endpoint URL&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;LANGCHAIN_MODEL_NAME&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt; 
   &lt;td&gt;Model name (e.g. &lt;code&gt;deepseek-v4-pro&lt;/code&gt;)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;TUSHARE_TOKEN&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;No&lt;/td&gt; 
   &lt;td&gt;Tushare Pro token for A-share data (falls back to AKShare)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;TIMEOUT_SECONDS&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;No&lt;/td&gt; 
   &lt;td&gt;LLM call timeout, default 120s&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;API_AUTH_KEY&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;Recommended for network deployments&lt;/td&gt; 
   &lt;td&gt;Bearer token required when the API is reachable from non-local clients&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;VIBE_TRADING_ENABLE_SHELL_TOOLS&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;No&lt;/td&gt; 
   &lt;td&gt;Explicit opt-in for shell-capable tools in remote API/MCP-SSE style deployments&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;VIBE_TRADING_ALLOWED_FILE_ROOTS&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;No&lt;/td&gt; 
   &lt;td&gt;Extra comma-separated roots for document and broker-journal imports&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;VIBE_TRADING_ALLOWED_RUN_ROOTS&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;No&lt;/td&gt; 
   &lt;td&gt;Extra comma-separated roots for generated-code run directories&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;VIBE_TW_STOCK_DB&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;No&lt;/td&gt; 
   &lt;td&gt;Path to a Taiwan-market SQLite snapshot; the read-only &lt;code&gt;taiwan_stock_data&lt;/code&gt; tool registers only when it is schema-valid&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;VIBE_TRADING_EXTRA_CORS_ORIGINS&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;No&lt;/td&gt; 
   &lt;td&gt;Comma-separated origins &lt;strong&gt;added&lt;/strong&gt; to the loopback CORS defaults (&lt;code&gt;CORS_ORIGINS&lt;/code&gt; replaces them instead)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;CONTENT_FILTER_WARNING_THRESHOLD&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;No&lt;/td&gt; 
   &lt;td&gt;Content-filter warning ratio threshold (default 0.05 = 5%). When the ratio of LLM responses blocked by content moderation exceeds this, the run card warns you to switch providers.&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;&lt;sub&gt;* Ollama does not require an API key. OpenAI Codex uses ChatGPT OAuth and stores tokens via &lt;code&gt;oauth-cli-kit&lt;/code&gt;, not in &lt;code&gt;agent/.env&lt;/code&gt;.&lt;/sub&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Free data (no key needed):&lt;/strong&gt; A-shares via AKShare, HK/US/Canada equities via Yahoo/yfinance, crypto via OKX, 100+ crypto exchanges via CCXT. The system automatically selects the best available source for each market.&lt;/p&gt; 
&lt;h3&gt;🎯 Recommended Models&lt;/h3&gt; 
&lt;p&gt;Vibe-Trading is a tool-heavy agent — skills, backtests, memory, and swarms all flow through tool calls. Model choice directly decides whether the agent &lt;em&gt;uses&lt;/em&gt; its tools or fabricates answers from training data.&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Tier&lt;/th&gt; 
   &lt;th&gt;Examples&lt;/th&gt; 
   &lt;th&gt;When to use&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Best&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;anthropic/claude-opus-4.7&lt;/code&gt;, &lt;code&gt;anthropic/claude-sonnet-4.6&lt;/code&gt;, &lt;code&gt;openai/gpt-5.5-pro&lt;/code&gt;, &lt;code&gt;google/gemini-3.5-flash&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Complex swarms (3+ agents), long research sessions, paper-grade analysis&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Sweet spot&lt;/strong&gt; (default)&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;deepseek-v4-pro&lt;/code&gt;, &lt;code&gt;deepseek/deepseek-v4-pro&lt;/code&gt;, &lt;code&gt;x-ai/grok-4.20&lt;/code&gt;, &lt;code&gt;z-ai/glm-5.1&lt;/code&gt;, &lt;code&gt;moonshotai/kimi-k2.6&lt;/code&gt;, &lt;code&gt;qwen/qwen3-max-thinking&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Daily driver — reliable tool-calling at ~1/10 the cost&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Avoid for agent use&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;*-nano&lt;/code&gt;, &lt;code&gt;*-flash-lite&lt;/code&gt;, &lt;code&gt;*-coder-next&lt;/code&gt;, small / distilled variants&lt;/td&gt; 
   &lt;td&gt;Tool-calling is unreliable — the agent will appear to &quot;answer from memory&quot; instead of loading skills or running backtests&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;The default &lt;code&gt;agent/.env.example&lt;/code&gt; ships with DeepSeek official API + &lt;code&gt;deepseek-v4-pro&lt;/code&gt;; OpenRouter users can use &lt;code&gt;deepseek/deepseek-v4-pro&lt;/code&gt;.&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;🖥 CLI Reference&lt;/h2&gt; 
&lt;p&gt;The interactive TUI (&lt;code&gt;vibe-trading&lt;/code&gt;) now uses a terminal-native transcript: a startup banner, prompt rule, previous-turn recap, live activity rail, Markdown/table rendering, and run timing all stay in the CLI. Non-interactive invocations such as &lt;code&gt;vibe-trading run&lt;/code&gt;, pipes, and &lt;code&gt;--json&lt;/code&gt; remain script-friendly.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vibe-trading               # interactive TUI
vibe-trading run -p &quot;...&quot;  # single run
vibe-trading serve         # API server
vibe-trading alpha list    # browse 462 pre-built alphas; show / bench / compare / export-manifest sub-commands available
vibe-trading playbook list # five scheduled-research templates; show / create sub-commands available
vibe-trading channels status --local  # inspect IM channel config and install hints
vibe-trading provider doctor  # print redacted provider/proxy/package diagnostics
&lt;/code&gt;&lt;/pre&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;Slash commands inside TUI&lt;/b&gt;&lt;/summary&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Command&lt;/th&gt; 
    &lt;th&gt;Description&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/help&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Show keyboard shortcuts and command list&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/model&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Switch LLM provider and model&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/memory&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Show / manage persistent memory&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/history&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Browse and resume prior sessions&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/goal&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Start / inspect a finance research goal&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/search&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Full-text search across all sessions&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/swarm&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Multi-agent presets (committee / quant / risk)&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/skill&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;List / load / unload skills&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/show&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Show prior run by id&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/clear&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Clear current conversation&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/pine&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Export current strategy as Pine Script&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/journal&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Analyze trade journal CSV&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/shadow&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Train / view shadow account&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/export&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Export current session (md / json)&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/debug&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Toggle debug panel (token usage / latency)&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/comps&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Comparable company analysis (peer multiples -&amp;gt; implied range)&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/dcf&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Discounted cash flow valuation with sensitivity grid&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/attrib&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Brinson-Fachler attribution (allocation vs selection)&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/memo&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Investment memo — thesis, variant view, scenarios, kill criteria&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/earnings&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Earnings review — surprise bridge from revenue to EPS&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/screen&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Systematic idea screen — hypothesis, funnel, survivor queue&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/playbook&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Scheduled research templates (list / run / schedule)&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/connector&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Trading connector profiles (status / start / halt)&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/halt&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Kill switch — halt ALL live trading now&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/resume&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Clear the kill switch (re-enable live trading)&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/data&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Data routing mode&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/quit&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Exit (also: q, exit, :q)&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;Single run &amp;amp; flags&lt;/b&gt;&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vibe-trading run -p &quot;Backtest BTC-USDT MACD strategy, last 30 days&quot;
vibe-trading run -p &quot;Analyze AAPL momentum&quot; --json
vibe-trading run -f strategy.txt
echo &quot;Backtest 000001.SZ RSI&quot; | vibe-trading run
&lt;/code&gt;&lt;/pre&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vibe-trading -p &quot;your prompt&quot;
vibe-trading --skills
vibe-trading --swarm-presets
vibe-trading --swarm-run investment_committee &#39;{&quot;topic&quot;:&quot;BTC outlook&quot;}&#39;
vibe-trading --list
vibe-trading --show &amp;lt;run_id&amp;gt;
vibe-trading --code &amp;lt;run_id&amp;gt;
vibe-trading --pine &amp;lt;run_id&amp;gt;           # Export indicators (TradingView + TDX + MT5)
vibe-trading --trace &amp;lt;run_id&amp;gt;
vibe-trading --continue &amp;lt;run_id&amp;gt; &quot;refine the strategy&quot;
vibe-trading --upload report.pdf
&lt;/code&gt;&lt;/pre&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vibe-trading alpha list --zoo gtja191 --limit 10
vibe-trading alpha show gtja191_171
vibe-trading alpha bench --zoo gtja191 --universe csi300 --period 2018-2025 --top 20
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;IM channels&lt;/b&gt;&lt;/summary&gt; 
 &lt;p&gt;IM channel adapters connect outside chat apps to the same session runtime used by the Web UI and CLI. Configure enabled adapters under &lt;code&gt;channels&lt;/code&gt; in &lt;code&gt;~/.vibe-trading/agent.json&lt;/code&gt;; SDK-backed adapters are optional extras, and missing SDKs report recovery hints instead of crashing the runtime.&lt;/p&gt; 
 &lt;p&gt;For long-running channel tasks, tune the central assistant-reply wait budget with &lt;code&gt;replyTimeoutS&lt;/code&gt; (seconds, default &lt;code&gt;600&lt;/code&gt;):&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;channels&quot;: {
    &quot;replyTimeoutS&quot;: 1800,
    &quot;feishu&quot;: {
      &quot;enabled&quot;: true
    }
  }
}
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;This controls how long the shared channel runtime waits for the agent session to produce an assistant message; adapter HTTP/socket timeouts remain adapter-specific.&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vibe-trading channels status --local   # inspect config and missing SDK hints without API
vibe-trading channels status           # query the running API runtime
vibe-trading channels start            # start enabled adapters through the API
vibe-trading channels stop             # stop enabled adapters through the API
vibe-trading channels login weixin     # run an adapter login hook when needed
vibe-trading channels pairing --channel telegram list
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;The built-in adapters cover &lt;code&gt;websocket&lt;/code&gt;, &lt;code&gt;telegram&lt;/code&gt;, &lt;code&gt;slack&lt;/code&gt;, &lt;code&gt;discord&lt;/code&gt;, &lt;code&gt;matrix&lt;/code&gt;, &lt;code&gt;whatsapp&lt;/code&gt;, &lt;code&gt;signal&lt;/code&gt;, &lt;code&gt;qq&lt;/code&gt;, &lt;code&gt;napcat&lt;/code&gt;, &lt;code&gt;weixin&lt;/code&gt;, &lt;code&gt;wecom&lt;/code&gt;, &lt;code&gt;feishu&lt;/code&gt;, &lt;code&gt;dingtalk&lt;/code&gt;, &lt;code&gt;msteams&lt;/code&gt;, &lt;code&gt;email&lt;/code&gt;, and &lt;code&gt;mochat&lt;/code&gt;. Use narrow extras such as &lt;code&gt;pip install &quot;vibe-trading-ai[telegram]&quot;&lt;/code&gt;, or install the full channel set with &lt;code&gt;pip install &quot;vibe-trading-ai[channels]&quot;&lt;/code&gt;.&lt;/p&gt; 
 &lt;p&gt;&lt;strong&gt;In-chat slash commands&lt;/strong&gt; (channel-agnostic, work in all 16 adapters):&lt;/p&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Command&lt;/th&gt; 
    &lt;th&gt;Description&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/new&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Reset the current session — the next message starts a fresh conversation&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/reset&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Alias for &lt;code&gt;/new&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/newsession&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Alias for &lt;code&gt;/new&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;/pairing list&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Show pending sender-pairing requests (operators only)&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
 &lt;p&gt;Commands are case-insensitive and must be sent as the entire message (e.g. &lt;code&gt;hello /new&lt;/code&gt; is treated as a regular message, not a reset).&lt;/p&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;strong&gt;&lt;code&gt;/pairing&lt;/code&gt; is operator-gated.&lt;/strong&gt; In-chat pairing-control commands are rejected unless the sender is listed as an operator — set &lt;code&gt;channels.operators&lt;/code&gt; (cross-channel authority) or a channel section&#39;s own &lt;code&gt;operators&lt;/code&gt; list in your channels config. With no operators configured, in-chat &lt;code&gt;/pairing&lt;/code&gt; is refused (fail-closed) and pairing is managed only through the authenticated CLI (&lt;code&gt;vibe-trading channels pairing …&lt;/code&gt;) and the auth-gated REST endpoint. This prevents any allow-listed group member from taking over pairing across channels.&lt;/p&gt; 
 &lt;/blockquote&gt; 
&lt;/details&gt; 
&lt;hr /&gt; 
&lt;h2&gt;💡 Examples&lt;/h2&gt; 
&lt;h3&gt;Strategy &amp;amp; Backtesting&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Moving average crossover on US equities
vibe-trading run -p &quot;Backtest a 20/50-day moving average crossover on AAPL for the past year, show Sharpe ratio and max drawdown&quot;

# RSI mean-reversion on crypto
vibe-trading run -p &quot;Test RSI(14) mean-reversion on BTC-USDT: buy below 30, sell above 70, last 6 months&quot;

# Multi-factor strategy on A-shares
vibe-trading run -p &quot;Backtest a momentum + value + quality multi-factor strategy on CSI 300 constituents over 2 years&quot;

# After backtesting, export to TradingView / TDX / MetaTrader 5
vibe-trading --pine &amp;lt;run_id&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;Bench a pre-built alpha zoo&lt;/strong&gt; (one line):&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vibe-trading alpha bench --zoo gtja191 --universe csi300 --period 2018-2025 --top 20
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;Browse the catalogue&lt;/strong&gt; and inspect a single alpha:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vibe-trading alpha list --zoo gtja191 --theme reversal --limit 10
vibe-trading alpha show gtja191_171
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;Compose a multi-factor signal&lt;/strong&gt; from the zoo (Python):&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from src.skills.multi_factor.zoo_signal_engine import ZooSignalEngine
engine = ZooSignalEngine.from_zoo([&quot;gtja191_171&quot;, &quot;gtja191_111&quot;, &quot;gtja191_163&quot;])
panel = ...  # your wide OHLCV panel
signal = engine.compute_signal(panel)
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Market Research&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Equity deep-dive
vibe-trading run -p &quot;Research NVDA: earnings trend, analyst consensus, option flow, and key risks for next quarter&quot;

# Macro analysis
vibe-trading run -p &quot;Analyze the current Fed rate path, USD strength, and impact on EM equities and gold&quot;

# Crypto on-chain
vibe-trading run -p &quot;Deep dive BTC on-chain: whale flows, exchange balances, miner activity, and funding rates&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Swarm Workflows&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Bull/bear debate on a stock
vibe-trading --swarm-run investment_committee &#39;{&quot;topic&quot;: &quot;Is TSLA a buy at current levels?&quot;}&#39;

# Quant strategy from screening to backtest
vibe-trading --swarm-run quant_strategy_desk &#39;{&quot;universe&quot;: &quot;S&amp;amp;P 500&quot;, &quot;horizon&quot;: &quot;3 months&quot;}&#39;

# Crypto desk: funding + liquidation + flow → risk manager
vibe-trading --swarm-run crypto_trading_desk &#39;{&quot;asset&quot;: &quot;ETH-USDT&quot;, &quot;timeframe&quot;: &quot;1w&quot;}&#39;

# Global macro portfolio allocation
vibe-trading --swarm-run macro_rates_fx_desk &#39;{&quot;focus&quot;: &quot;Fed pivot impact on EM bonds&quot;}&#39;
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Cross-Session Memory&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Save your preferences once
vibe-trading run -p &quot;Remember: I prefer RSI-based strategies, max 10% drawdown, hold period 5–20 days&quot;

# The agent recalls them in future sessions automatically
vibe-trading run -p &quot;Build a crypto strategy that fits my risk profile&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Upload &amp;amp; Analyze Documents&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Analyze a broker export or earnings report
vibe-trading --upload trades_export.csv
vibe-trading run -p &quot;Profile my trading behavior and identify any biases&quot;

vibe-trading --upload NVDA_Q1_earnings.pdf
vibe-trading run -p &quot;Summarize the key risks and beats/misses from this earnings report&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr /&gt; 
&lt;h2&gt;🌐 API Server&lt;/h2&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vibe-trading serve --port 8899
&lt;/code&gt;&lt;/pre&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Method&lt;/th&gt; 
   &lt;th&gt;Endpoint&lt;/th&gt; 
   &lt;th&gt;Description&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/runs&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;List runs&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/runs/{run_id}&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Run details&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/runs/{run_id}/pine&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Multi-platform indicator export&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/sessions&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Create session&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/sessions/{id}/messages&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Send message&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/sessions/{id}/events&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;SSE event stream&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/upload&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Upload PDF/file&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/swarm/presets&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;List swarm presets&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/swarm/runs&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Start swarm run&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/swarm/runs/{id}/events&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Swarm SSE stream&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/alpha/list&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;List alphas (filter by zoo/theme/universe)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/alpha/{alpha_id}&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Alpha metadata + source code&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/alpha/bench&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Start a bench job (returns &lt;code&gt;job_id&lt;/code&gt;)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/alpha/bench/{job_id}/stream&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;SSE progress stream&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/settings/llm&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Read Web UI LLM settings&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;PUT&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/settings/llm&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Update local LLM settings&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/settings/data-sources&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Read local data source settings&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;PUT&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/settings/data-sources&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Update local data source settings&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/channels/status&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Read IM channel runtime and adapter status&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/channels/start&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Start configured IM channel adapters&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/channels/stop&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Stop configured IM channel adapters&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/channels/pairing/command&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Run a sender-pairing command against the shared store&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/scheduled-runs&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Create a scheduled research job (interval-ms or cron)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/scheduled-runs&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;List scheduled jobs&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;DELETE&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/scheduled-runs/{job_id}&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Cancel a scheduled job&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/scheduled-runs/playbooks&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;List the research templates&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/scheduled-runs/playbooks/{slug}&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Show one template, with its variables&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/scheduled-runs/playbooks/{slug}&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Schedule a job from a template&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/sessions/{id}/cancel&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Stop the session&#39;s in-flight run (recorded as cancelled, not failed)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/sessions/{id}/title/auto&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Summarize the first exchange into a session title (never overwrites a manual rename)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/correlation/regime&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Correlation edge-density regime timeline&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/agents.json&lt;/code&gt; · &lt;code&gt;POST&lt;/code&gt; &lt;code&gt;/v1/query&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;OpenBB Workspace bridge — registered only with the optional &lt;code&gt;openbb&lt;/code&gt; extra; &lt;code&gt;/v1/query&lt;/code&gt; requires auth&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;Interactive docs are available at &lt;code&gt;http://localhost:8899/docs&lt;/code&gt; in keyless loopback development mode. When &lt;code&gt;API_AUTH_KEY&lt;/code&gt; is configured, &lt;code&gt;/docs&lt;/code&gt; and &lt;code&gt;/redoc&lt;/code&gt; are disabled; authenticated tooling can fetch &lt;code&gt;/openapi.json&lt;/code&gt; with an &lt;code&gt;Authorization: Bearer &amp;lt;key&amp;gt;&lt;/code&gt; header.&lt;/p&gt; 
&lt;h3&gt;Security defaults&lt;/h3&gt; 
&lt;p&gt;For localhost development, &lt;code&gt;vibe-trading serve&lt;/code&gt; keeps the browser workflow simple. For any non-local client, sensitive API endpoints require &lt;code&gt;API_AUTH_KEY&lt;/code&gt;; use &lt;code&gt;Authorization: Bearer &amp;lt;key&amp;gt;&lt;/code&gt; for JSON/upload requests. Browser EventSource streams are handled by the Web UI after you enter the same key once in Settings.&lt;/p&gt; 
&lt;p&gt;Shell-capable process tools (&lt;code&gt;bash&lt;/code&gt; / &lt;code&gt;background_run&lt;/code&gt; / &lt;code&gt;cancel_background&lt;/code&gt;) are enabled only for the interactive local CLI. Every other surface — the HTTP/SSE API and the MCP server on &lt;strong&gt;all&lt;/strong&gt; transports (stdio included) — keeps them off unless you explicitly opt in with &lt;code&gt;VIBE_TRADING_ENABLE_SHELL_TOOLS=1&lt;/code&gt; (or pass &lt;code&gt;--enable-shell-tools&lt;/code&gt; to &lt;code&gt;vibe-trading-mcp&lt;/code&gt;). Transport type never implicitly grants shell access. &lt;code&gt;cancel_background&lt;/code&gt; stops only the tracked task ID returned by &lt;code&gt;background_run&lt;/code&gt;; broad Python process-name termination is refused because it could terminate Vibe-Trading itself. Document and journal readers are limited to upload/import roots by default; place files under &lt;code&gt;~/.vibe-trading/uploads&lt;/code&gt;, &lt;code&gt;~/.vibe-trading/runs&lt;/code&gt;, &lt;code&gt;./uploads&lt;/code&gt;, &lt;code&gt;./data&lt;/code&gt; (or the legacy &lt;code&gt;agent/uploads&lt;/code&gt; / &lt;code&gt;agent/runs&lt;/code&gt;), or add a dedicated directory through &lt;code&gt;VIBE_TRADING_ALLOWED_FILE_ROOTS&lt;/code&gt;. Sessions, runs, swarm runs, uploads, and the &lt;code&gt;sessions.db&lt;/code&gt; index live under &lt;code&gt;~/.vibe-trading&lt;/code&gt; (relocatable via the &lt;code&gt;VIBE_TRADING_HOME&lt;/code&gt; shell environment variable); pre-existing history is moved there automatically on first run.&lt;/p&gt; 
&lt;p&gt;Generated backtest code runs as a local Python subprocess and can make network requests through the configured market-data loaders. Its environment is intentionally narrow: the runner keeps OS/Python basics, proxy/certificate settings, &lt;code&gt;VIBE_TRADING_ALLOWED_RUN_ROOTS&lt;/code&gt;, and read-only market-data keys such as &lt;code&gt;TUSHARE_TOKEN&lt;/code&gt;, &lt;code&gt;FMP_API_KEY&lt;/code&gt;, &lt;code&gt;FRED_API_KEY&lt;/code&gt;, and &lt;code&gt;VIBE_TRADING_IWENCAI_KEY&lt;/code&gt;. It does not pass LLM provider keys, API auth tokens, shell-tool switches, broker trading secrets, or live/advisory toggles to generated strategy code by default.&lt;/p&gt; 
&lt;h3&gt;Web UI Settings&lt;/h3&gt; 
&lt;p&gt;The Web UI Settings page lets local users update the LLM provider/model, base URL, generation parameters, reasoning effort, and optional market data credentials such as the Tushare token. Settings are persisted to &lt;code&gt;agent/.env&lt;/code&gt;; provider defaults are loaded from &lt;code&gt;agent/src/providers/llm_providers.json&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;Settings reads are side-effect free: &lt;code&gt;GET /settings/llm&lt;/code&gt; and &lt;code&gt;GET /settings/data-sources&lt;/code&gt; never create &lt;code&gt;agent/.env&lt;/code&gt;, and they only return project-relative paths. Settings reads and writes can expose credential state or update credentials/runtime environment, so they require &lt;code&gt;API_AUTH_KEY&lt;/code&gt; when configured. If &lt;code&gt;API_AUTH_KEY&lt;/code&gt; is unset for dev mode, settings access is accepted only from loopback clients.&lt;/p&gt; 
&lt;p&gt;The same Settings page includes an &lt;strong&gt;IM Channels&lt;/strong&gt; panel for local operators. It polls &lt;code&gt;/channels/status&lt;/code&gt;, shows configured/enabled/available/loaded/running states, surfaces adapter recovery hints, and can start or stop the configured channel runtime without going back to the terminal.&lt;/p&gt; 
&lt;h3&gt;Scheduled research&lt;/h3&gt; 
&lt;p&gt;Run a research prompt or backtest on a repeating schedule — from the &lt;strong&gt;Scheduled&lt;/strong&gt; page in the web UI or over REST. The background executor is &lt;strong&gt;off by default&lt;/strong&gt; — start the server with &lt;code&gt;VIBE_TRADING_ENABLE_SCHEDULER=1&lt;/code&gt; to enable it:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;VIBE_TRADING_ENABLE_SCHEDULER=1 vibe-trading serve --port 8899
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Then create jobs over REST. &lt;code&gt;schedule&lt;/code&gt; is either a bare integer (interval in &lt;strong&gt;milliseconds&lt;/strong&gt;) or a 5-field cron expression (&lt;code&gt;min hour dom mon dow&lt;/code&gt;; each field takes &lt;code&gt;*&lt;/code&gt;, &lt;code&gt;*/n&lt;/code&gt;, numbers, comma lists, or low-high ranges like &lt;code&gt;1-5&lt;/code&gt;). Cron runs on the wall clock of the job&#39;s optional &lt;code&gt;timezone&lt;/code&gt; (an IANA key), so the cadence holds across DST transitions — a spring-forward gap time is skipped, and a fall-back ambiguous time runs once, at its first occurrence. Jobs without a &lt;code&gt;timezone&lt;/code&gt; keep plain UTC semantics:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# every 6 hours (cron)
curl -X POST http://localhost:8899/scheduled-runs \
  -H &quot;Content-Type: application/json&quot; \
  -d &#39;{&quot;prompt&quot;:&quot;Scan CSI300 for momentum breakouts and backtest the top 5&quot;,&quot;schedule&quot;:&quot;0 */6 * * *&quot;}&#39;

# weekdays at 23:30 Auckland wall time — DST-proof
curl -X POST http://localhost:8899/scheduled-runs \
  -H &quot;Content-Type: application/json&quot; \
  -d &#39;{&quot;prompt&quot;:&quot;Pre-open scan of NZX names&quot;,&quot;schedule&quot;:&quot;30 23 * * 1-5&quot;,&quot;timezone&quot;:&quot;Pacific/Auckland&quot;}&#39;

# list / cancel
curl http://localhost:8899/scheduled-runs
curl -X DELETE http://localhost:8899/scheduled-runs/&amp;lt;job_id&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Each fire runs the &lt;code&gt;prompt&lt;/code&gt; through a fresh agent session (optional backtest parameters go in &lt;code&gt;config&lt;/code&gt;), and jobs persist under &lt;code&gt;~/.vibe-trading/&lt;/code&gt; so they survive restarts. Without the flag, the &lt;code&gt;/scheduled-runs&lt;/code&gt; endpoints still record jobs but nothing fires. Add &lt;code&gt;-H &quot;Authorization: Bearer &amp;lt;key&amp;gt;&quot;&lt;/code&gt; to each call when &lt;code&gt;API_AUTH_KEY&lt;/code&gt; is set.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Five ready-to-schedule templates&lt;/strong&gt; ship with the scheduler — &lt;code&gt;premarket-brief&lt;/code&gt;, &lt;code&gt;earnings-season-tracker&lt;/code&gt;, &lt;code&gt;portfolio-checkup&lt;/code&gt;, &lt;code&gt;a-share-money-flow&lt;/code&gt;, &lt;code&gt;institutional-holdings-diff&lt;/code&gt;. Each states the data a run needs in plain language instead of naming tools, so a template keeps working as the tool surface grows, and each is required to name a missing input rather than fill it from memory. Reach them from the CLI, over REST, or with &lt;code&gt;/playbook&lt;/code&gt; in the TUI:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vibe-trading playbook list                     # the five templates
vibe-trading playbook show premarket-brief     # body, declared variables, suggested cadence
vibe-trading playbook create premarket-brief \
  --var home_market=&quot;US equities&quot; --var watchlist=&quot;AAPL, MSFT, NVDA&quot; \
  --timezone America/New_York

curl http://localhost:8899/scheduled-runs/playbooks
curl http://localhost:8899/scheduled-runs/playbooks/premarket-brief
curl -X POST http://localhost:8899/scheduled-runs/playbooks/premarket-brief \
  -H &quot;Content-Type: application/json&quot; \
  -d &#39;{&quot;variables&quot;:{&quot;home_market&quot;:&quot;US equities&quot;,&quot;watchlist&quot;:&quot;AAPL, MSFT, NVDA&quot;}}&#39;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Posting &lt;code&gt;{}&lt;/code&gt; schedules a template on its own suggested cadence with its declared defaults. The rendered body becomes the job prompt verbatim, and an undeclared variable is rejected rather than silently ignored.&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;🔌 MCP Plugin&lt;/h2&gt; 
&lt;p&gt;Vibe-Trading exposes 64 MCP tools for any MCP-compatible client. Runs as a stdio subprocess — no server setup needed. Core research tools work with zero API keys for HK/US/crypto; trading connector tools use the selected connector profile, and &lt;code&gt;run_swarm&lt;/code&gt; needs an LLM key.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Environment variables:&lt;/strong&gt; the client spawns the server itself, so a shell &lt;code&gt;export&lt;/code&gt; never reaches it — set them in the client&#39;s &lt;code&gt;env&lt;/code&gt; block. Generated backtest code is sandboxed to the allowed run roots, so writing results into a workspace of your own needs &lt;code&gt;VIBE_TRADING_ALLOWED_RUN_ROOTS&lt;/code&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;mcpServers&quot;: {
    &quot;vibe-trading&quot;: {
      &quot;command&quot;: &quot;vibe-trading-mcp&quot;,
      &quot;env&quot;: { &quot;VIBE_TRADING_ALLOWED_RUN_ROOTS&quot;: &quot;C:\\Users\\me\\research&quot; }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;Claude Desktop&lt;/b&gt;&lt;/summary&gt; 
 &lt;p&gt;Add to &lt;code&gt;claude_desktop_config.json&lt;/code&gt;:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;mcpServers&quot;: {
    &quot;vibe-trading&quot;: {
      &quot;command&quot;: &quot;vibe-trading-mcp&quot;
    }
  }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;OpenClaw&lt;/b&gt;&lt;/summary&gt; 
 &lt;p&gt;Add to &lt;code&gt;~/.openclaw/config.yaml&lt;/code&gt;:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;skills:
  - name: vibe-trading
    command: vibe-trading-mcp
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;For a first research-only smoke test, confirm tool discovery and run a market data or backtest request before selecting a trading connector profile. Core research tools can run without broker credentials; connector-backed &lt;code&gt;trading_*&lt;/code&gt; tools should be used only after you intentionally select and check a connector profile. &lt;code&gt;run_swarm&lt;/code&gt; requires an LLM key.&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;Cursor / Windsurf / other MCP clients&lt;/b&gt;&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vibe-trading-mcp                   # stdio (default)
vibe-trading-mcp --transport http  # Streamable HTTP (current MCP spec default) at http://127.0.0.1:8900/mcp
vibe-trading-mcp --transport sse   # legacy SSE (deprecated) for older clients
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;For HTTP clients (QwenPaw, and any client that negotiates by POSTing an &lt;code&gt;InitializeRequest&lt;/code&gt;), use &lt;code&gt;--transport http&lt;/code&gt; and point the client at the single &lt;code&gt;/mcp&lt;/code&gt; endpoint — e.g. &lt;code&gt;http://127.0.0.1:8900/mcp&lt;/code&gt;. Do &lt;strong&gt;not&lt;/strong&gt; point an HTTP client at &lt;code&gt;/sse&lt;/code&gt;; that path belongs to the deprecated two-endpoint SSE transport and will return &lt;code&gt;405 Method Not Allowed&lt;/code&gt; on &lt;code&gt;POST&lt;/code&gt;. Override the bind address with &lt;code&gt;--host&lt;/code&gt; / &lt;code&gt;--port&lt;/code&gt;.&lt;/p&gt; 
&lt;/details&gt; 
&lt;p&gt;&lt;strong&gt;MCP tools exposed (64):&lt;/strong&gt; &lt;code&gt;list_skills&lt;/code&gt;, &lt;code&gt;load_skill&lt;/code&gt;, &lt;code&gt;start_research_goal&lt;/code&gt;, &lt;code&gt;get_research_goal&lt;/code&gt;, &lt;code&gt;add_goal_evidence&lt;/code&gt;, &lt;code&gt;update_research_goal_status&lt;/code&gt;, &lt;code&gt;backtest&lt;/code&gt;, &lt;code&gt;factor_analysis&lt;/code&gt;, &lt;code&gt;alpha_zoo&lt;/code&gt;, &lt;code&gt;alpha_bench&lt;/code&gt;, &lt;code&gt;analyze_options&lt;/code&gt;, &lt;code&gt;analyze_options_payoff&lt;/code&gt;, &lt;code&gt;pattern_recognition&lt;/code&gt;, &lt;code&gt;read_url&lt;/code&gt;, &lt;code&gt;read_document&lt;/code&gt;, &lt;code&gt;web_search&lt;/code&gt;, &lt;code&gt;write_file&lt;/code&gt;, &lt;code&gt;read_file&lt;/code&gt;, &lt;code&gt;trading_connections&lt;/code&gt;, &lt;code&gt;trading_select_connection&lt;/code&gt;, &lt;code&gt;trading_check&lt;/code&gt;, &lt;code&gt;trading_account&lt;/code&gt;, &lt;code&gt;trading_positions&lt;/code&gt;, &lt;code&gt;trading_orders&lt;/code&gt;, &lt;code&gt;trading_quote&lt;/code&gt;, &lt;code&gt;trading_history&lt;/code&gt;, &lt;code&gt;list_swarm_presets&lt;/code&gt;, &lt;code&gt;run_swarm&lt;/code&gt;, &lt;code&gt;get_market_data&lt;/code&gt;, &lt;code&gt;get_fund_flow&lt;/code&gt;, &lt;code&gt;get_dragon_tiger&lt;/code&gt;, &lt;code&gt;get_northbound_flow&lt;/code&gt;, &lt;code&gt;get_margin_trading&lt;/code&gt;, &lt;code&gt;get_block_trades&lt;/code&gt;, &lt;code&gt;get_shareholder_count&lt;/code&gt;, &lt;code&gt;get_lockup_expiry&lt;/code&gt;, &lt;code&gt;get_sector_info&lt;/code&gt;, &lt;code&gt;get_research_reports&lt;/code&gt;, &lt;code&gt;get_stock_news&lt;/code&gt;, &lt;code&gt;get_sec_filings&lt;/code&gt;, &lt;code&gt;get_financial_statements&lt;/code&gt;, &lt;code&gt;get_options_chain&lt;/code&gt;, &lt;code&gt;get_stock_profile&lt;/code&gt;, &lt;code&gt;screen_market&lt;/code&gt;, &lt;code&gt;search_symbol&lt;/code&gt;, &lt;code&gt;get_macro_series&lt;/code&gt;, &lt;code&gt;iwencai_search&lt;/code&gt;, &lt;code&gt;qveris_search&lt;/code&gt;, &lt;code&gt;qveris_inspect&lt;/code&gt;, &lt;code&gt;qveris_execute&lt;/code&gt;, &lt;code&gt;get_institutional_holdings&lt;/code&gt;, &lt;code&gt;etf_holdings&lt;/code&gt;, &lt;code&gt;prediction_market&lt;/code&gt;, &lt;code&gt;research_papers&lt;/code&gt;, &lt;code&gt;get_swarm_status&lt;/code&gt;, &lt;code&gt;get_run_result&lt;/code&gt;, &lt;code&gt;list_runs&lt;/code&gt;, &lt;code&gt;reap_stale_runs&lt;/code&gt;, &lt;code&gt;retry_run&lt;/code&gt;, &lt;code&gt;analyze_trade_journal&lt;/code&gt;, &lt;code&gt;extract_shadow_strategy&lt;/code&gt;, &lt;code&gt;run_shadow_backtest&lt;/code&gt;, &lt;code&gt;render_shadow_report&lt;/code&gt;, &lt;code&gt;scan_shadow_signals&lt;/code&gt;.&lt;/p&gt; 
&lt;h3&gt;SWARM external MCP tools&lt;/h3&gt; 
&lt;p&gt;&lt;code&gt;run_swarm&lt;/code&gt; workers can call operator-approved tools from external MCP servers. Configure the server-side allowlist in &lt;code&gt;VIBE_TRADING_SWARM_AGENT_CONFIG&lt;/code&gt;, &lt;code&gt;~/.vibe-trading/swarm-agent.json&lt;/code&gt;, or the fallback &lt;code&gt;~/.vibe-trading/agent.json&lt;/code&gt;; then list remote tools in a swarm preset using the local MCP wrapper name, such as &lt;code&gt;mcp_internal_kb_search&lt;/code&gt;. Caller-provided &lt;code&gt;variables&lt;/code&gt; stay template data only and cannot inject MCP URLs, commands, environment variables, or allowlist overrides.&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;Install from ClawHub (one command)&lt;/b&gt;&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npx clawhub@latest install vibe-trading --force
&lt;/code&gt;&lt;/pre&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;&lt;code&gt;--force&lt;/code&gt; is required because the skill references external APIs, which triggers VirusTotal&#39;s automated scan. The code is fully open-source and safe to inspect.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;p&gt;This downloads the skill + MCP config into your agent&#39;s skills directory. No cloning needed.&lt;/p&gt; 
 &lt;p&gt;Browse on ClawHub: &lt;a href=&quot;https://clawhub.ai/skills/vibe-trading&quot;&gt;clawhub.ai/skills/vibe-trading&lt;/a&gt;&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;OpenSpace — self-evolving skills&lt;/b&gt;&lt;/summary&gt; 
 &lt;p&gt;All 89 finance skills are published on &lt;a href=&quot;https://open-space.cloud&quot;&gt;open-space.cloud&lt;/a&gt; and evolve autonomously through OpenSpace&#39;s self-evolution engine.&lt;/p&gt; 
 &lt;p&gt;To use with OpenSpace, add both MCP servers to your agent config:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;mcpServers&quot;: {
    &quot;openspace&quot;: {
      &quot;command&quot;: &quot;openspace-mcp&quot;,
      &quot;toolTimeout&quot;: 600,
      &quot;env&quot;: {
        &quot;OPENSPACE_HOST_SKILL_DIRS&quot;: &quot;/path/to/vibe-trading/agent/src/skills&quot;,
        &quot;OPENSPACE_WORKSPACE&quot;: &quot;/path/to/OpenSpace&quot;
      }
    },
    &quot;vibe-trading&quot;: {
      &quot;command&quot;: &quot;vibe-trading-mcp&quot;
    }
  }
}
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;OpenSpace will auto-discover all 89 skills, enabling auto-fix, auto-improve, and community sharing. Search for Vibe-Trading skills via &lt;code&gt;search_skills(&quot;finance backtest&quot;)&lt;/code&gt; in any OpenSpace-connected agent.&lt;/p&gt; 
&lt;/details&gt; 
&lt;hr /&gt; 
&lt;h3&gt;MetaTrader 5 (Exness and other MT5 brokers)&lt;/h3&gt; 
&lt;p&gt;Connects to a &lt;strong&gt;locally running MT5 terminal&lt;/strong&gt; through the official &lt;code&gt;MetaTrader5&lt;/code&gt; package (&lt;strong&gt;Windows only&lt;/strong&gt;):&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install &quot;vibe-trading-ai[mt5]&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Configure &lt;code&gt;~/.vibe-trading/mt5.json&lt;/code&gt; (create it yourself; &lt;code&gt;chmod 600&lt;/code&gt; where supported):&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;login&quot;: 12345678,
  &quot;password&quot;: &quot;...&quot;,
  &quot;server&quot;: &quot;Exness-MT5Trial8&quot;,
  &quot;symbol_suffix&quot;: &quot;m&quot;,
  &quot;max_order_volume&quot;: 1.0,
  &quot;max_order_notional_usd&quot;: 10000
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Then:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vibe-trading connector use mt5-paper-sdk
vibe-trading connector check
vibe-trading connector account
vibe-trading connector quote EURUSD
vibe-trading connector history EURUSD
&lt;/code&gt;&lt;/pre&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Profile&lt;/th&gt; 
   &lt;th&gt;Account&lt;/th&gt; 
   &lt;th&gt;Orders&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;mt5-paper-sdk&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;demo&lt;/td&gt; 
   &lt;td&gt;read-only&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;mt5-live-sdk-readonly&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;real&lt;/td&gt; 
   &lt;td&gt;read-only&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;mt5-paper-trade&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;demo&lt;/td&gt; 
   &lt;td&gt;direct placement (connector per-order size guards apply)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;mt5-live-trade&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;real&lt;/td&gt; 
   &lt;td&gt;mandate + kill-switch gated&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;Safety boundary: &lt;strong&gt;&quot;paper&quot; means the broker&#39;s own demo account&lt;/strong&gt;, re-verified on every call — the terminal reports &lt;code&gt;account_info().trade_mode&lt;/code&gt; and the logged-in account number, so pointing a paper profile at a real-money account (or the reverse) is refused outright. MT5 sizes orders in &lt;strong&gt;lots&lt;/strong&gt; (1 lot EURUSD = 100,000 EUR); the live mandate gate prices lots through the connector&#39;s USD hook, and the connector&#39;s own &lt;code&gt;max_order_volume&lt;/code&gt; / &lt;code&gt;max_order_notional_usd&lt;/code&gt; guards apply on demo as well as live, failing closed when a notional cannot be priced. On hedging accounts (the Exness default), note that an opposing order &lt;strong&gt;opens a hedge position&lt;/strong&gt; — close by ticket instead (pass the position ticket to &lt;code&gt;trading_cancel_order&lt;/code&gt;) so the fill is pinned to that position and can only reduce exposure. Rollback / halt path: the kill switch blocks new live orders, while cancellation stays available and is written to the audit log. Mandate limits are denominated in USD; a non-USD account currency is margined by the broker in its own currency.&lt;/p&gt; 
&lt;p&gt;The &lt;code&gt;mt5&lt;/code&gt; market-data loader — the head of the forex fallback chain — shares this same &lt;code&gt;mt5.json&lt;/code&gt;. With no such file it attaches read-only to the most recently used terminal that is already logged in.&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;🔌 eToro Public API Connector&lt;/h2&gt; 
&lt;p&gt;Connects to &lt;a href=&quot;https://builders.etoro.com/&quot;&gt;eToro&#39;s Public API&lt;/a&gt; for demo and real accounts via API key pair (&lt;code&gt;x-api-key&lt;/code&gt; + &lt;code&gt;x-user-key&lt;/code&gt;). Demo and real environments are separated structurally: demo keys only reach &lt;code&gt;/demo&lt;/code&gt; API paths.&lt;/p&gt; 
&lt;p&gt;Configure &lt;code&gt;~/.vibe-trading/etoro.json&lt;/code&gt; (create it yourself; &lt;code&gt;chmod 600&lt;/code&gt; where supported):&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;api_key&quot;: &quot;YOUR_PUBLIC_API_KEY&quot;,
  &quot;user_key&quot;: &quot;YOUR_USER_KEY&quot;,
  &quot;profile&quot;: &quot;paper&quot;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Alternatively set &lt;code&gt;ETORO_API_KEY&lt;/code&gt; and &lt;code&gt;ETORO_USER_KEY&lt;/code&gt; in &lt;code&gt;~/.vibe-trading/.env&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;Then:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vibe-trading connector use etoro-paper-sdk
vibe-trading connector check
vibe-trading connector account
vibe-trading connector positions
vibe-trading connector quote BTC
&lt;/code&gt;&lt;/pre&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Profile&lt;/th&gt; 
   &lt;th&gt;Account&lt;/th&gt; 
   &lt;th&gt;Orders&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;etoro-paper-sdk&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;demo&lt;/td&gt; 
   &lt;td&gt;read-only&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;etoro-live-sdk-readonly&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;real&lt;/td&gt; 
   &lt;td&gt;read-only&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;etoro-paper-trade&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;demo&lt;/td&gt; 
   &lt;td&gt;direct placement on demo paths&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;etoro-live-trade&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;real&lt;/td&gt; 
   &lt;td&gt;mandate + kill-switch gated&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;Symbol lookup uses eToro&#39;s &lt;code&gt;internalSymbolFull&lt;/code&gt; search (e.g. &lt;code&gt;BTC&lt;/code&gt; → instrument id &lt;code&gt;100000&lt;/code&gt;). Use the &lt;code&gt;etoro_search_instruments&lt;/code&gt; agent tool to resolve tickers before trading.&lt;/p&gt; 
&lt;p&gt;Safety boundary: demo and real are path-separated and key-bound (&lt;code&gt;paper_guard: path_separated_key_bound&lt;/code&gt;). Live risk-increasing actions (open and copy-start/increase) require an authorized mandate, a clear halt state, and a verified USD account for copy-notional enforcement. Validated full and partial position closes, open-order cancellation, and copy close remain available when halted and are audit-logged. Cancelling a pending close or editing position stops is paper-only: the live path fails closed because those operations can increase exposure or transfer extra margin without enough API data to quantify the incremental USD risk. Copy amounts are denominated in the eToro account currency, and every copy start/adjust requires a caller-supplied 1-35 character URL-safe reference id for polling. eToro-specific write tools (&lt;code&gt;etoro_close_position&lt;/code&gt;, &lt;code&gt;etoro_copy_*&lt;/code&gt;, etc.) are agent tools only — not exposed via MCP or CLI. Rollback: revert the connector commit(s) or disable profiles; halt blocks new live risk-increasing actions.&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;🔌 Loading Tools from External MCP Servers (MCP Client Mode)&lt;/h2&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;This is the opposite direction from the MCP Plugin above.&lt;/strong&gt; The MCP Plugin lets &lt;em&gt;other&lt;/em&gt; agents call Vibe-Trading tools. This section lets the &lt;em&gt;built-in&lt;/em&gt; Vibe-Trading agent call tools from &lt;em&gt;your&lt;/em&gt; external MCP servers.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h3&gt;Quick start&lt;/h3&gt; 
&lt;p&gt;Create &lt;code&gt;~/.vibe-trading/agent.json&lt;/code&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;mcpServers&quot;: {
    &quot;my-server&quot;: {
      &quot;command&quot;: &quot;uvx&quot;,
      &quot;args&quot;: [&quot;my-mcp-server&quot;]
    }
  }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Run any CLI command — tools from ordinary external servers are automatically injected into the agent&#39;s registry after local tools:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vibe-trading run &quot;use my-server to do X&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Official IBKR MCP read-only probe&lt;/h3&gt; 
&lt;p&gt;Vibe-Trading can connect directly to Interactive Brokers&#39; official remote MCP endpoint in read-only mode. Add this to &lt;code&gt;~/.vibe-trading/agent.json&lt;/code&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;mcpServers&quot;: {
    &quot;ibkr&quot;: {
      &quot;type&quot;: &quot;streamableHttp&quot;,
      &quot;url&quot;: &quot;https://api.ibkr.com/v1/api/mcp&quot;,
      &quot;auth&quot;: {
        &quot;type&quot;: &quot;oauth&quot;,
        &quot;scopes&quot;: [&quot;mcp.read&quot;],
        &quot;clientName&quot;: &quot;Vibe-Trading&quot;,
        &quot;cacheDir&quot;: &quot;~/.vibe-trading/live/ibkr/oauth&quot;
      },
      &quot;enabledTools&quot;: [&quot;*&quot;]
    }
  }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Then start the browser OAuth flow:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vibe-trading connector authorize ibkr-live-official-mcp-readonly
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The wildcard is accepted only for IBKR&#39;s &lt;code&gt;mcp.read&lt;/code&gt; probe. Authorizing this profile confirms access to IBKR&#39;s official read scope; generic &lt;code&gt;trading_account&lt;/code&gt; and &lt;code&gt;trading_positions&lt;/code&gt; calls stay disabled until IBKR publishes stable read tool names that Vibe-Trading can map safely. A config that adds &lt;code&gt;mcp.write&lt;/code&gt; must pin an explicit tool allowlist and still passes through the live order guard.&lt;/p&gt; 
&lt;p&gt;If IBKR issues a pre-registered OAuth client, add &lt;code&gt;clientId&lt;/code&gt; and &lt;code&gt;clientSecret&lt;/code&gt; inside &lt;code&gt;auth&lt;/code&gt;.&lt;/p&gt; 
&lt;h3&gt;Trading connectors: fastest path&lt;/h3&gt; 
&lt;p&gt;For users who cannot wait for IBKR OAuth client approval, connect to a local TWS or IB Gateway session. Credentials stay inside IBKR&#39;s desktop app; Vibe- Trading only connects to &lt;code&gt;127.0.0.1&lt;/code&gt; and exposes it as a connector profile.&lt;/p&gt; 
&lt;p&gt;Install the optional SDK:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install &quot;vibe-trading-ai[ibkr]&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Open TWS paper trading or IB Gateway paper, enable API socket clients, then run:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vibe-trading connector list
vibe-trading connector use ibkr-paper-local
vibe-trading connector configure ibkr-paper-local --yes
vibe-trading connector check
vibe-trading connector account
vibe-trading connector positions
vibe-trading connector orders
vibe-trading connector quote AAPL
vibe-trading connector history AAPL --duration &quot;30 D&quot; --bar-size &quot;1 day&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Default local ports:&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;App&lt;/th&gt; 
   &lt;th&gt;Paper&lt;/th&gt; 
   &lt;th&gt;Live read-only&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;TWS&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;7497&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;7496&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;IB Gateway&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;4002&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;4001&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;The agent exposes connector-scoped tools named &lt;code&gt;trading_connections&lt;/code&gt;, &lt;code&gt;trading_select_connection&lt;/code&gt;, &lt;code&gt;trading_check&lt;/code&gt;, &lt;code&gt;trading_account&lt;/code&gt;, &lt;code&gt;trading_positions&lt;/code&gt;, &lt;code&gt;trading_orders&lt;/code&gt;, &lt;code&gt;trading_quote&lt;/code&gt;, and &lt;code&gt;trading_history&lt;/code&gt;. Live-broker raw MCP tools are not registered directly as &lt;code&gt;mcp_&amp;lt;broker&amp;gt;_*&lt;/code&gt;. No IBKR order-placement tool is registered.&lt;/p&gt; 
&lt;h3&gt;🔐 TAP Mode — full credential isolation &amp;amp; human-approved writes&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;Opt-in, off by default.&lt;/strong&gt; If the &lt;code&gt;TAP_*&lt;/code&gt; variables below are unset, the connector behaves exactly as before (direct broker SDK) — nothing changes.&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://tap.human.tech&quot;&gt;TAP&lt;/a&gt; (Tool Authorization Protocol) is a credential proxy: the agent never holds the raw broker API secret, and consequential writes are gated on &lt;strong&gt;human approval&lt;/strong&gt;. With TAP mode on, &lt;strong&gt;every&lt;/strong&gt; Alpaca call — order placement, cancel, and the reads (account/positions/orders/quote/bars) — is sent to the TAP proxy&#39;s &lt;code&gt;/forward&lt;/code&gt; endpoint instead of the broker SDK; TAP injects the real key server-side, then forwards upstream.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;The agent process holds &lt;strong&gt;no Alpaca key at all&lt;/strong&gt; — and doesn&#39;t even need &lt;code&gt;alpaca-py&lt;/code&gt; — because the whole egress goes through TAP. The secret is referenced by name (&lt;code&gt;&amp;lt;CREDENTIAL:alpaca.key_id&amp;gt;&lt;/code&gt;) and TAP substitutes it.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Writes block on human approval.&lt;/strong&gt; An order or cancel cannot reach the broker without a human approving it; even a prompt-injected &quot;buy now&quot; is held, and denying it means it never reaches Alpaca. Orders carry a deterministic &lt;code&gt;client_order_id&lt;/code&gt;, so an approval-race retry is deduplicated rather than double-placed.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Reads auto-approve.&lt;/strong&gt; Account/positions/orders/quote/bars are GETs that TAP forwards without a human step — this is credential &lt;em&gt;isolation&lt;/em&gt; (no key in the process), not a gate, so there&#39;s ~zero added friction.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;allowed_hosts&lt;/code&gt; on the TAP credential pins where the key may be sent, so a tampered target is rejected (403) before injection.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong&gt;Enable it:&lt;/strong&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;In the TAP dashboard, create a &lt;strong&gt;multi-secret&lt;/strong&gt; credential named &lt;code&gt;alpaca&lt;/code&gt; holding your Alpaca key pair as fields &lt;code&gt;key_id&lt;/code&gt; and &lt;code&gt;secret_key&lt;/code&gt;, assigned to your agent, with allowed hosts &lt;code&gt;paper-api.alpaca.markets&lt;/code&gt; (or the live host &lt;code&gt;api.alpaca.markets&lt;/code&gt;) &lt;strong&gt;and&lt;/strong&gt; &lt;code&gt;data.alpaca.markets&lt;/code&gt; (the market-data host used by quote/bars). Use &lt;strong&gt;separate TAP credentials for paper and live&lt;/strong&gt; (e.g. &lt;code&gt;alpaca-paper&lt;/code&gt; / &lt;code&gt;alpaca-live&lt;/code&gt;, selected via &lt;code&gt;TAP_ALPACA_CREDENTIAL&lt;/code&gt;), each with &lt;code&gt;allowed_hosts&lt;/code&gt; pinned to its own API host — TAP then structurally refuses to send the paper key to the live host and vice versa, keeping the paper/live separation crisp end to end.&lt;/li&gt; 
 &lt;li&gt;Add to &lt;code&gt;agent/.env&lt;/code&gt;:&lt;/li&gt; 
&lt;/ol&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Variable&lt;/th&gt; 
   &lt;th style=&quot;text-align:center&quot;&gt;Required&lt;/th&gt; 
   &lt;th&gt;Description&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;TAP_PROXY_URL&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt; 
   &lt;td&gt;TAP proxy base URL (e.g. &lt;code&gt;https://proxy.tap.human.tech&lt;/code&gt;)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;TAP_AGENT_KEY&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;Yes&lt;/td&gt; 
   &lt;td&gt;Your TAP agent API key (secret)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;TAP_ALPACA_CREDENTIAL&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;No&lt;/td&gt; 
   &lt;td&gt;TAP credential name for Alpaca (default &lt;code&gt;alpaca&lt;/code&gt;)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;TAP_APPROVAL_TIMEOUT&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;No&lt;/td&gt; 
   &lt;td&gt;Seconds to wait for a human decision (default &lt;code&gt;300&lt;/code&gt;)&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;When a write is placed, approve or deny it in your TAP channel (Telegram / dashboard). An approved order/cancel is forwarded to Alpaca; a denied or timed-out one returns an error and is &lt;strong&gt;never sent&lt;/strong&gt;.&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;Known limitation — approval race.&lt;/strong&gt; If the human approves right at the &lt;code&gt;TAP_APPROVAL_TIMEOUT&lt;/code&gt; boundary, TAP may forward the order while the poll has already given up: the gate then reports an error even though the order reached the broker, and the &lt;code&gt;max_trades_per_day&lt;/code&gt; counter under-counts by one. The deterministic &lt;code&gt;client_order_id&lt;/code&gt; keeps a retry from double-placing that order; if you rely on a tight trades-per-day cap, check open orders after a TAP timeout error before retrying.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;strong&gt;Scope:&lt;/strong&gt; covers Alpaca &lt;strong&gt;order placement, cancel, and all five reads&lt;/strong&gt; — the full connector egress, so the process holds no key on any path. HMAC-signed brokers (Binance/OKX) are follow-ups (client-side signing doesn&#39;t fit pure egress injection). The hooks are additive — they live inside the Alpaca connector and leave the live mandate gate unchanged.&lt;/p&gt; 
&lt;h3&gt;Config reference&lt;/h3&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Field&lt;/th&gt; 
   &lt;th&gt;Type&lt;/th&gt; 
   &lt;th&gt;Default&lt;/th&gt; 
   &lt;th&gt;Description&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;type&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;string&lt;/td&gt; 
   &lt;td&gt;inferred for stdio; required for HTTP&lt;/td&gt; 
   &lt;td&gt;Omit for stdio, or set to &lt;code&gt;sse&lt;/code&gt; / &lt;code&gt;streamableHttp&lt;/code&gt; for URL-based servers.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;command&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;string&lt;/td&gt; 
   &lt;td&gt;required for stdio&lt;/td&gt; 
   &lt;td&gt;Executable to spawn for stdio servers. Invalid for &lt;code&gt;sse&lt;/code&gt; / &lt;code&gt;streamableHttp&lt;/code&gt; servers.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;args&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;array&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;[]&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Command-line arguments for stdio servers only.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;env&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;object&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;{}&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Extra environment variables merged into the subprocess env for stdio servers only.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;url&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;string&lt;/td&gt; 
   &lt;td&gt;required for &lt;code&gt;sse&lt;/code&gt; / &lt;code&gt;streamableHttp&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Remote SSE / streamable HTTP endpoint URL. Not used for stdio servers.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;headers&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;object&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;{}&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Extra HTTP headers for &lt;code&gt;sse&lt;/code&gt; / &lt;code&gt;streamableHttp&lt;/code&gt; servers only.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;toolTimeout&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;number&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;30&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Per-tool call timeout in seconds&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;initTimeout&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;number&lt;/td&gt; 
   &lt;td&gt;unset (&lt;code&gt;max(toolTimeout, 30)&lt;/code&gt;)&lt;/td&gt; 
   &lt;td&gt;MCP initialize / OAuth authorization timeout in seconds. Use this for slow browser authorization without widening ordinary tool calls.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;enabledTools&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;array&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;[&quot;*&quot;]&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Tool allowlist. Use &lt;code&gt;[&quot;*&quot;]&lt;/code&gt; to expose all tools from the server&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;Config file location: &lt;code&gt;~/.vibe-trading/agent.json&lt;/code&gt; (JSON or YAML).&lt;/p&gt; 
&lt;p&gt;For URL-based transports, &lt;code&gt;type&lt;/code&gt; is required. The agent no longer guesses between SSE and streamable HTTP from the URL suffix.&lt;/p&gt; 
&lt;h3&gt;Per-session overrides (API)&lt;/h3&gt; 
&lt;p&gt;When creating a session via the API you can pass &lt;code&gt;mcpServers&lt;/code&gt; inside &lt;code&gt;session.config&lt;/code&gt; to extend or override the global config for that session only:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;config&quot;: {
    &quot;mcpServers&quot;: {
      &quot;research-server&quot;: {
        &quot;command&quot;: &quot;uvx&quot;,
        &quot;args&quot;: [&quot;research-mcp&quot;],
        &quot;enabledTools&quot;: [&quot;search&quot;, &quot;fetch&quot;]
      }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Tool naming&lt;/h3&gt; 
&lt;p&gt;Ordinary remote tools are exposed with stable names: &lt;code&gt;mcp_&amp;lt;server&amp;gt;_&amp;lt;tool&amp;gt;&lt;/code&gt;. Live-broker MCP servers stay behind the &lt;code&gt;trading_*&lt;/code&gt; connector surface.&lt;/p&gt; 
&lt;p&gt;If two server names produce the same ASCII-safe local prefix (e.g. &lt;code&gt;foo-bar&lt;/code&gt; and &lt;code&gt;foo_bar&lt;/code&gt; both become &lt;code&gt;foo_bar&lt;/code&gt;), a deterministic hash suffix is appended at the server-segment level so names remain unique. The operator receives a warning:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;WARNING: Configured MCP server &#39;foo-bar&#39; collides with another server after local name
normalization. Using local tool prefix &#39;mcp_foo_bar_&amp;lt;hash&amp;gt;_&amp;lt;tool&amp;gt;&#39; to keep generated
tool names unique. Rename the server in agent config if you want a different prefix.
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;v1 limits&lt;/h3&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Limit&lt;/th&gt; 
   &lt;th&gt;Detail&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Transport&lt;/td&gt; 
   &lt;td&gt;stdio, SSE, and streamable HTTP&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Execution&lt;/td&gt; 
   &lt;td&gt;serial only — MCP tools never enter the parallel readonly path&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Surfaces&lt;/td&gt; 
   &lt;td&gt;tools only (resources and prompts excluded in v1)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Hot reload&lt;/td&gt; 
   &lt;td&gt;not supported — restart the process to pick up config changes&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Swarm path&lt;/td&gt; 
   &lt;td&gt;MCP tools are not available inside Swarm worker registries in v1&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;hr /&gt; 
&lt;h2&gt;📁 Project Structure&lt;/h2&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;Click to expand&lt;/b&gt;&lt;/summary&gt; 
 &lt;pre&gt;&lt;code&gt;Vibe-Trading/
├── agent/                          # Backend (Python)
│   ├── cli/                        # CLI package — interactive TUI + subcommands
│   ├── api_server.py               # FastAPI server — runs, sessions, upload, swarm, SSE
│   ├── mcp_server.py               # MCP server — 64 tools for OpenClaw / Claude Desktop
│   │
│   ├── src/
│   │   ├── agent/                  # ReAct agent core
│   │   │   ├── loop.py             #   5-layer compression + read/write tool batching
│   │   │   ├── context.py          #   system prompt + auto-recall from persistent memory
│   │   │   ├── skills.py           #   skill loader (89 bundled + user-created via CRUD)
│   │   │   ├── tools.py            #   tool base class + registry
│   │   │   ├── memory.py           #   lightweight workspace state per run
│   │   │   ├── frontmatter.py      #   shared YAML frontmatter parser
│   │   │   └── trace.py            #   execution trace writer
│   │   │
│   │   ├── memory/                 # Cross-session persistent memory
│   │   │   └── persistent.py       #   file-based memory (~/.vibe-trading/memory/)
│   │   │
│   │   ├── tools/                  # 68 auto-discovered agent tools
│   │   │   ├── backtest_tool.py    #   run backtests
│   │   │   ├── remember_tool.py    #   cross-session memory (save/recall/forget)
│   │   │   ├── skill_writer_tool.py #  skill CRUD (save/patch/delete/file)
│   │   │   ├── session_search_tool.py # FTS5 cross-session search
│   │   │   ├── swarm_tool.py       #   launch swarm teams
│   │   │   ├── web_search_tool.py  #   DuckDuckGo web search
│   │   │   └── ...                 #   bash, file I/O, factor analysis, options, alpha browser + bench, etc.
│   │   │
│   │   ├── factors/                # Alpha Zoo — 462 alphas across 5 families
│   │   │   ├── base.py             #   19 operators (rank/scale/ts_*/delta/decay_linear/safe_div/vwap)
│   │   │   ├── registry.py         #   AST-only metadata load + lazy compute + sanity gates
│   │   │   ├── bench_runner.py     #   IC + alive/reversed/dead categorisation
│   │   │   └── zoo/                #   qlib158 (154) + alpha101 (101) + gtja191 (191) + academic (12) + fundamental (4)
│   │   │
│   │   ├── api/                    # FastAPI route modules
│   │   │   └── alpha_routes.py     #   /alpha/list, /alpha/{id}, /alpha/bench, SSE stream
│   │   │
│   │   ├── skills/                 # 89 finance skills in 9 categories (SKILL.md each)
│   │   ├── swarm/                  # Swarm DAG execution engine
│   │   │   └── presets/            #   30 swarm preset YAML definitions
│   │   ├── session/                # Multi-turn chat + FTS5 session search
│   │   └── providers/              # LLM provider abstraction
│   │
│   └── backtest/                   # Backtest engines
│       ├── engines/                #   8 engines + composite cross-market engine + options_portfolio
│       ├── loaders/                #   24 sources: tushare, okx, binance, yfinance, akshare, baostock, tencent, mootdx, ccxt, futu, pykrx, local, eastmoney, sina, stooq, yahoo, finnhub, alphavantage, tiingo, fmp, longbridge, mt5, qveris, india_broker
│       │   ├── base.py             #   DataLoader Protocol
│       │   └── registry.py         #   Registry + auto-fallback chains
│       └── optimizers/             #   MVO, equal vol, max div, risk parity
│
├── frontend/                       # Web UI (React 19 + Vite + TypeScript)
│   └── src/
│       ├── pages/                  #   Home, Agent, AlphaZoo, RunDetail, Compare, Correlation, Settings
│       ├── components/             #   chat, charts, layout
│       └── stores/                 #   Zustand state management
│
├── Dockerfile                      # Multi-stage build
├── docker-compose.yml              # One-command deploy
├── pyproject.toml                  # Package config + CLI entrypoint
├── tools/                          # Repo-level CI helpers
│   └── ci_grep_gates.sh            # rejects yaml.load / trademark / per-stock-data leaks
└── LICENSE                         # MIT
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;hr /&gt; 
&lt;h2&gt;🏛 Ecosystem&lt;/h2&gt; 
&lt;p&gt;Vibe-Trading is part of the &lt;strong&gt;&lt;a href=&quot;https://github.com/HKUDS&quot;&gt;HKUDS&lt;/a&gt;&lt;/strong&gt; agent ecosystem:&lt;/p&gt; 
&lt;table&gt; 
 &lt;tbody&gt;
  &lt;tr&gt; 
   &lt;td align=&quot;center&quot; width=&quot;20%&quot;&gt; &lt;a href=&quot;https://github.com/HKUDS/nanobot&quot;&gt;&lt;b&gt;NanoBot&lt;/b&gt;&lt;/a&gt;&lt;br /&gt; &lt;sub&gt;Ultra-Lightweight Personal AI Assistant&lt;/sub&gt; &lt;/td&gt; 
   &lt;td align=&quot;center&quot; width=&quot;20%&quot;&gt; &lt;a href=&quot;https://github.com/HKUDS/AI-Trader&quot;&gt;&lt;b&gt;AI-Trader&lt;/b&gt;&lt;/a&gt;&lt;br /&gt; &lt;sub&gt;Agent-Native Signal &amp;amp; Copy Trading Platform&lt;/sub&gt; &lt;/td&gt; 
   &lt;td align=&quot;center&quot; width=&quot;20%&quot;&gt; &lt;a href=&quot;https://github.com/HKUDS/CLI-Anything&quot;&gt;&lt;b&gt;CLI-Anything&lt;/b&gt;&lt;/a&gt;&lt;br /&gt; &lt;sub&gt;Making All Software Agent-Native&lt;/sub&gt; &lt;/td&gt; 
   &lt;td align=&quot;center&quot; width=&quot;20%&quot;&gt; &lt;a href=&quot;https://github.com/HKUDS/OpenSpace&quot;&gt;&lt;b&gt;OpenSpace&lt;/b&gt;&lt;/a&gt;&lt;br /&gt; &lt;sub&gt;Self-Evolving AI Agent Skills&lt;/sub&gt; &lt;/td&gt; 
   &lt;td align=&quot;center&quot; width=&quot;20%&quot;&gt; &lt;a href=&quot;https://github.com/HKUDS/ClawTeam&quot;&gt;&lt;b&gt;ClawTeam&lt;/b&gt;&lt;/a&gt;&lt;br /&gt; &lt;sub&gt;Agent Swarm Intelligence&lt;/sub&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt;
&lt;/table&gt; 
&lt;hr /&gt; 
&lt;h2&gt;🗺 Roadmap&lt;/h2&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;We ship in phases. Items move to &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues&quot;&gt;Issues&lt;/a&gt; when work begins.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Phase&lt;/th&gt; 
   &lt;th&gt;Feature&lt;/th&gt; 
   &lt;th&gt;Status&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Trust Layer&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Reproducible run cards are emitted and shown in Run Detail; v1 adds tool traces and citations&lt;/td&gt; 
   &lt;td&gt;v0 Shipped&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Hypothesis Registry&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Durable research hypotheses with lifecycle status, data sources, skills, run-card links, and invalidation notes&lt;/td&gt; 
   &lt;td&gt;Backend MVP Shipped&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Research Autopilot&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Manual-first research loop: hypothesis → deterministic backtest → evidence report&lt;/td&gt; 
   &lt;td&gt;Phase 1–3 Shipped&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Data Bridge&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Bring-your-own data: local CSV/Parquet/SQL connectors with schema mapping&lt;/td&gt; 
   &lt;td&gt;Local loader Shipped&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Options Lab&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Vol surface, Greeks dashboard, payoff/scenario explorer&lt;/td&gt; 
   &lt;td&gt;Analytic payoff/scenario tool &lt;strong&gt;Shipped&lt;/strong&gt;; surface/dashboard Planned&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Portfolio Studio&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Risk x-ray, constraints, turnover-aware optimizer, rebalance notes&lt;/td&gt; 
   &lt;td&gt;Turnover-aware optimizer &lt;strong&gt;Shipped 0.1.11&lt;/strong&gt;; rest Planned&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Alpha Zoo&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;462 pre-built alphas (Qlib 158 + Kakushadze 101 + GTJA 191 + academic + fundamental) with one-line bench, agent integration, and Web UI&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Shipped 0.1.8&lt;/strong&gt;, extended through 0.1.12&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Strategy Development Manager&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Register papers / broker research as factors &amp;amp; strategies with a persistent store + automated IC/Sharpe decay lifecycle&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Shipped 0.1.11&lt;/strong&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Correlation Regime&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Edge-density + hysteresis regime timeline layered on &lt;code&gt;/correlation&lt;/code&gt; — spot when markets fuse into one bloc&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Shipped 0.1.12&lt;/strong&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Research Delivery&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Scheduled briefs and live research sessions through Slack / Telegram / email-style IM channels&lt;/td&gt; 
   &lt;td&gt;Scheduler + IM Runtime Shipped&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Community&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Shareable skills, presets, and strategy cards&lt;/td&gt; 
   &lt;td&gt;Exploring&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Contributing&lt;/h2&gt; 
&lt;p&gt;We welcome contributions! See &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/CONTRIBUTING.md&quot;&gt;CONTRIBUTING.md&lt;/a&gt; for guidelines.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Good first issues&lt;/strong&gt; are tagged with &lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22&quot;&gt;&lt;code&gt;good first issue&lt;/code&gt;&lt;/a&gt; — pick one and get started.&lt;/p&gt; 
&lt;p&gt;Want to contribute something bigger? Check the &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/#-roadmap&quot;&gt;Roadmap&lt;/a&gt; above and open an issue to discuss before starting.&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Contributors&lt;/h2&gt; 
&lt;p&gt;Thanks to everyone who has contributed to Vibe-Trading!&lt;/p&gt; 
&lt;p&gt;Recent v0.1.12 cycle contributors and credits:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;@santhreal — a 30-PR correctness sweep: strict-JSON / finite-number hardening across metrics, factors, pattern, and options (#764/#765/#766/#767/#739/#740/#744), loader correctness (#761 yahoo 1m bars), and session / journal robustness (#762/#763/#768/#769/#770)&lt;/li&gt; 
 &lt;li&gt;@xkam7ar — broad reliability across packaging, web, scheduler, swarm, and CLI (#584), cancellation before the first AgentLoop iteration (#641, closes #638), QVeris session budget + atomic credit accounting (#685/#686), CI / OOS gates (#630/#632), and journal month-filter / side-parse fixes (#626/#628)&lt;/li&gt; 
 &lt;li&gt;@shadowinlife — the Strategy Development Manager skill (#457, closes #455), pluggable OCR + LLM-vision extraction (#548), centralized provider credentials (#563), the 80× signal-alignment vectorization (#698), and swarm MCP-discovery caching (#704)&lt;/li&gt; 
 &lt;li&gt;@ebujinovch — the correlation regime timeline endpoint + UI (#756, closes #719) and its &lt;code&gt;correlation-regime&lt;/code&gt; skill (#557), plus the &lt;code&gt;academic_corr_rewire&lt;/code&gt; factor (#705)&lt;/li&gt; 
 &lt;li&gt;@honginp — Binance USD-M routing with execution/mark separation (#470/#716) and the maintenance-bracket decouple that keeps &lt;code&gt;-PERP&lt;/code&gt; backtests zero-credential (#757)&lt;/li&gt; 
 &lt;li&gt;@StaniellG — the MetaTrader 5 (Exness) broker connector + &lt;code&gt;mt5&lt;/code&gt; data source (#481)&lt;/li&gt; 
 &lt;li&gt;@tyj147454413-cmd — the Binance fallback loader (#643), bounded OKX history with rate-limit handling (#644), and codex stream-failure classification (#663)&lt;/li&gt; 
 &lt;li&gt;@Marnie0415 — composite sub-engine fallback for unknown symbols (#734) and the frontend &lt;code&gt;insertBefore&lt;/code&gt; streaming DOM-race fix (#717)&lt;/li&gt; 
 &lt;li&gt;@YZY0108 — the look-ahead-bias fix across all five portfolio optimizers (#487)&lt;/li&gt; 
 &lt;li&gt;@UNHNQ — the SiliconFlow CN + Global providers (#565)&lt;/li&gt; 
 &lt;li&gt;@FenjuFu — the iFlytek Spark provider (#537)&lt;/li&gt; 
 &lt;li&gt;@jelech — the native Anthropic Messages API adapter (#695)&lt;/li&gt; 
 &lt;li&gt;@octo-patch — MiniMax regional API endpoints (#731)&lt;/li&gt; 
 &lt;li&gt;@Thibaultjaigu — the Requesty OpenAI-compatible gateway provider (#474)&lt;/li&gt; 
 &lt;li&gt;@Robin1987China — realized portfolio turnover metrics for every optimizer (#478)&lt;/li&gt; 
 &lt;li&gt;@YogeshModi24 — the Frazzini-Pedersen betting-against-beta academic factor (#480)&lt;/li&gt; 
 &lt;li&gt;@0xZKnw — opt-in TAP mode for Alpaca (#377)&lt;/li&gt; 
 &lt;li&gt;@sambazhu — the fundamental zoo &lt;code&gt;_VALID_ZOOS&lt;/code&gt; whitelist (#707)&lt;/li&gt; 
 &lt;li&gt;@nareshkps — Robinhood connector &lt;code&gt;account_number&lt;/code&gt; wiring (#726)&lt;/li&gt; 
 &lt;li&gt;@darkknight4563 — user swarm-presets directory discovery (#570)&lt;/li&gt; 
 &lt;li&gt;@MikeCer — IBKR thread-local connection pool + snapshot quotes (#636)&lt;/li&gt; 
 &lt;li&gt;@Shizoqua — &lt;code&gt;local&lt;/code&gt; loader interval resampling (#467)&lt;/li&gt; 
 &lt;li&gt;@roberttidball — FastMCP transport import compatibility (#469)&lt;/li&gt; 
 &lt;li&gt;@yxhuang — bare-ticker resolution in the correlation matrix (#472, closes #471)&lt;/li&gt; 
 &lt;li&gt;@Bortlesboat — stale &lt;code&gt;OPENAI_BASE_URL&lt;/code&gt; provider-switch fix (#484, closes #482)&lt;/li&gt; 
 &lt;li&gt;@ananaymital — preflight &lt;code&gt;EnvConfig&lt;/code&gt; stale-cache fix (#479, closes #477)&lt;/li&gt; 
 &lt;li&gt;@GabbaTauchi — reported the native zai streaming / base-URL bug (#758)&lt;/li&gt; 
 &lt;li&gt;@warren618 / Haozhe Wu — the correlation regime backend integration, the zai provider streaming + base-URL resolution fix (#758), release integration, and open-PR/issue triage&lt;/li&gt; 
&lt;/ul&gt; 
&lt;details&gt; 
 &lt;summary&gt;v0.1.11 cycle contributors&lt;/summary&gt; 
 &lt;ul&gt; 
  &lt;li&gt;@shadowinlife — the &lt;code&gt;api_server&lt;/code&gt; modularization capstone (1,103 → 371 lines, #424 closing #331), centralized env config with the AST CI gate (#440), loader &lt;code&gt;fetch()&lt;/code&gt; protocol conformance (#437), and the Strategy Development Manager RFC in review (#455/#457) — 12 merged PRs this cycle&lt;/li&gt; 
  &lt;li&gt;@Robin1987China — Research Autopilot Phase 3 loop closure (#267), 4 canonical academic alphas (#277), Shadow Account PIT-safe entry conditions (#302/#314/#316), the turnover-aware portfolio optimizer (#466), scheduled-research route tests (#452), and test-coverage batches for trade-journal / pattern / loader layers (#268/#269/#276)&lt;/li&gt; 
  &lt;li&gt;@muku314115 — first-class Indian equity (NSE/BSE) support: the &lt;code&gt;IndiaEquityEngine&lt;/code&gt;, cost stack, &lt;code&gt;.NS&lt;/code&gt;/&lt;code&gt;.BO&lt;/code&gt; routing, and the &lt;code&gt;india_broker&lt;/code&gt; bridge (#305)&lt;/li&gt; 
  &lt;li&gt;@mvanhorn — the end-to-end scheduled-research executor (#278), the Trading 212 read-only connector (#321), OpenAI default-model resolution (#319), and Robinhood config validation (#320)&lt;/li&gt; 
  &lt;li&gt;@fei-moss — the &lt;code&gt;analyze_image&lt;/code&gt; vision tool (#464), NapCat DM pairing (#463), and the IM-media allowed-roots report (#465)&lt;/li&gt; 
  &lt;li&gt;@sambazhu — the value-investing toolkit: financial-rigor + report-audit tools, 4 skills, and the &lt;code&gt;value_investing_committee&lt;/code&gt; preset (#407/#408)&lt;/li&gt; 
  &lt;li&gt;@Elfsa-Miranda — the evidence-bound alpha research pipeline exploration (#405/#416, since re-scoped into #442)&lt;/li&gt; 
  &lt;li&gt;@Hinotoi-agent — loopback CSRF rejection (#293) and authenticated remote same-origin UI requests (#304)&lt;/li&gt; 
  &lt;li&gt;@dpersek — configurable IM reply timeout (#413) and the provider-preflight redirect fix (#404)&lt;/li&gt; 
  &lt;li&gt;@digger-yu — cross-platform &lt;code&gt;setup&lt;/code&gt;/&lt;code&gt;dev&lt;/code&gt; commands (#292) and dev-dependency pre-checks (#349)&lt;/li&gt; 
  &lt;li&gt;@skloxo — tilde expansion + file-roots safety fallback (#299) and reactive zh-CN localization (#301)&lt;/li&gt; 
  &lt;li&gt;@kadaliao — the beginner tutorial (#393) and Alpha Library social cards (#396)&lt;/li&gt; 
  &lt;li&gt;@morluto — CLI resume first-message preservation (#448) and the Codex OAuth default model (#446)&lt;/li&gt; 
  &lt;li&gt;@yxhuang — the Kimi for Coding provider (#435) and the precise #433 diagnosis behind the governance-stack revert&lt;/li&gt; 
  &lt;li&gt;@isaveall — the &lt;code&gt;validation.json&lt;/code&gt; artifacts-dir fix (#429) and clearer &lt;code&gt;--swarm-run&lt;/code&gt; errors (#428)&lt;/li&gt; 
  &lt;li&gt;@mustafakamal88 — timezone-aware UTC timestamps (#397)&lt;/li&gt; 
  &lt;li&gt;@irfanallana-oss — the zero-size order guard in &lt;code&gt;trading_place_order&lt;/code&gt; (#417)&lt;/li&gt; 
  &lt;li&gt;@Shizoqua — the central OHLC-invariant loader guard (#274)&lt;/li&gt; 
  &lt;li&gt;@hobostay — SSRF-guard hardening for CGNAT/mesh ranges + the QQ media redirect fix (#389)&lt;/li&gt; 
  &lt;li&gt;@aeonframework — Pillow / langchain CVE floor bumps (#390)&lt;/li&gt; 
  &lt;li&gt;@hannibal-lee — the pandas version-constraint fix (#329)&lt;/li&gt; 
  &lt;li&gt;@MarkfuGod — dynamic data-source counts + token-gated microcompaction (#296)&lt;/li&gt; 
  &lt;li&gt;@gyx09212214-prog — strict JSON validation outputs (#306)&lt;/li&gt; 
  &lt;li&gt;@LemonCANDY42 — the backtest report library (#224)&lt;/li&gt; 
  &lt;li&gt;@fanfpy — Longbridge Decimal→float serialization (#459)&lt;/li&gt; 
  &lt;li&gt;@asahikiko — packaged &lt;a href=&quot;http://SKILL.md&quot;&gt;SKILL.md&lt;/a&gt; capability-count sync + the manifest guard test (#461)&lt;/li&gt; 
  &lt;li&gt;@wison1717-maker — the mandate second-confirmation dialog + unified error toasts (#453)&lt;/li&gt; 
  &lt;li&gt;@imsankz — opencode provider mappings (#444)&lt;/li&gt; 
  &lt;li&gt;@flash1234pku — the tushare reference code-fence fix (#449)&lt;/li&gt; 
  &lt;li&gt;@Penn-Live — the Docker startup route-iteration crash report (#450)&lt;/li&gt; 
  &lt;li&gt;@warren618 / Haozhe Wu — the fundamental factor layer (PIT-safe SEC panels), the QVeris premium track, the IM channel runtime, India-equity integration review, CN search fallbacks, and release integration&lt;/li&gt; 
 &lt;/ul&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;v0.1.10 cycle contributors&lt;/summary&gt; 
 &lt;ul&gt; 
  &lt;li&gt;@Hinotoi-agent — a security-hardening wave: local-shutdown auth (#241), loopback-host rebinding rejection (#242), agent shell-tool opt-in (#243), settings-write auth (#245), mandate proposal-id containment (#256), persistent-memory type validation (#257), and MCP swarm run-id containment (#258)&lt;/li&gt; 
  &lt;li&gt;@mvanhorn — the opt-in local data cache (#177), Gemini thoughtSignature round-trip over OpenAI-compat tool calls (#176), the custom data loader guide (#194), and the glm/zhipu provider alias + model-name inference (#247)&lt;/li&gt; 
  &lt;li&gt;@gyx09212214-prog — loader robustness for malformed crypto/RSSHub timeout env vars (#227, #240), requested yfinance end-date inclusion (#226), strict run-card JSON for non-finite metrics (#238), and ddgs retry-fallback coverage (#239)&lt;/li&gt; 
  &lt;li&gt;@BillDin — swarm agent status in the chat UI (#188), explicit preset-name handling (#189), the loader-backed market-data tool for swarm workers (#199), and preset-context continuations (#200)&lt;/li&gt; 
  &lt;li&gt;@Robin1987China — the Research Autopilot goal-hypothesis bridge (#260), the local CSV/Parquet/DuckDB data loader (#252), and an assistant-prefill fix + configurable Kimi User-Agent (#248)&lt;/li&gt; 
  &lt;li&gt;@LemonCANDY42 — the read-only runtime status dashboard (#210), persisted AgentLoop usage artifacts (#223), and opt-in Run Detail chart payloads (#225)&lt;/li&gt; 
  &lt;li&gt;@zwrong — the trace.jsonl overhaul with zero truncation + offload (#206) and session-id on exit + &lt;code&gt;resume &amp;lt;session-id&amp;gt;&lt;/code&gt; (#218)&lt;/li&gt; 
  &lt;li&gt;@forge-builder — the AI contributor guide (#173) and the OpenClaw MCP research-only smoke-test docs (#165)&lt;/li&gt; 
  &lt;li&gt;@skloxo — Chinese (zh-CN) frontend localization (adopted from #217)&lt;/li&gt; 
  &lt;li&gt;@LeeCQiang — Chinese docstrings across all 452 Alpha Zoo factors (#180)&lt;/li&gt; 
  &lt;li&gt;@KaiLuettmann — GHCR pre-built image publishing on release (#187)&lt;/li&gt; 
  &lt;li&gt;@ngoanpv — Gemini thought_signature preservation through the AgentLoop dict path (#184)&lt;/li&gt; 
  &lt;li&gt;@ShahNewazKhan — Docker host-Ollama reachability via host.docker.internal (#196)&lt;/li&gt; 
  &lt;li&gt;@sambazhu — frontend sync of completed chat attempts (#236)&lt;/li&gt; 
  &lt;li&gt;@bhlt — baostock-native code format support (#230)&lt;/li&gt; 
  &lt;li&gt;@octo-patch — MiniMax M3 default model upgrade (#162)&lt;/li&gt; 
  &lt;li&gt;@warren618 / Haozhe Wu — the global data layer (8 sources + 18 read-only data tools), the 10 broker SDK connectors, the alpha-compare full stack, the provider-reliability overhaul, multi-engine web_search fallback, responsive Stop + SSE reconnect, and release integration&lt;/li&gt; 
 &lt;/ul&gt; 
&lt;/details&gt; 
&lt;a href=&quot;https://github.com/HKUDS/Vibe-Trading/graphs/contributors&quot;&gt; &lt;img src=&quot;https://contrib.rocks/image?repo=HKUDS/Vibe-Trading&quot; /&gt; &lt;/a&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Disclaimer&lt;/h2&gt; 
&lt;p&gt;Vibe-Trading is research and trading software. It is not investment advice, holds no funds, and runs no execution venue. Trading through a broker channel you explicitly authorize (e.g. Robinhood Agentic Trading) happens only within the limits you set and which you can halt at any time. This broker-trading capability is experimental and not verified by us against a real broker account — use it at your own risk. Past performance does not guarantee future results.&lt;/p&gt; 
&lt;h2&gt;License&lt;/h2&gt; 
&lt;p&gt;MIT License — see &lt;a href=&quot;https://raw.githubusercontent.com/HKUDS/Vibe-Trading/main/LICENSE&quot;&gt;LICENSE&lt;/a&gt;&lt;/p&gt; 
&lt;hr /&gt; 
&lt;p align=&quot;center&quot;&gt; ⭐ If &lt;b&gt;Vibe-Trading&lt;/b&gt; helps your research, a star helps more people find it. &lt;/p&gt; 
&lt;hr /&gt; 
&lt;p align=&quot;center&quot;&gt; Thanks for visiting &lt;b&gt;Vibe-Trading&lt;/b&gt; ✨ &lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://visitor-badge.laobi.icu/badge?page_id=HKUDS.Vibe-Trading&amp;amp;style=flat&quot; alt=&quot;visitors&quot; /&gt; &lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/83300a058894fe7a71cf6548383c477fea33f105be96dbcc1ae0e8edf4d4b2ec/HKUDS/Vibe-Trading" medium="image" />
      
    </item>
    
    <item>
      <title>Graphify-Labs/graphify</title>
      <link>https://github.com/Graphify-Labs/graphify</link>
      <description>&lt;p&gt;Turn any codebase, with its docs, SQL schemas, configs, and PDFs, into a queryable knowledge graph. A /graphify skill for Claude Code, Cursor, Codex, and Gemini CLI: local deterministic AST parsing, every edge explained, no vector store.&lt;/p&gt;&lt;hr&gt;&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://graphify.com&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/logo.png&quot; width=&quot;300&quot; height=&quot;140&quot; alt=&quot;Graphify&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://trendshift.io/repositories/25296?utm_source=repository-badge&amp;amp;utm_medium=badge&amp;amp;utm_campaign=badge-repository-25296&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;img src=&quot;https://trendshift.io/api/badge/repositories/25296&quot; alt=&quot;Graphify-Labs%2Fgraphify | Trendshift&quot; width=&quot;250&quot; height=&quot;55&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
&lt;div align=&quot;center&quot;&gt; 
 &lt;details&gt;
  &lt;summary&gt;&lt;b&gt;Read this in other languages&lt;/b&gt;&lt;/summary&gt; 
  &lt;p&gt;🇺🇸 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/README.md&quot;&gt;English&lt;/a&gt; | 🇨🇳 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.zh-CN.md&quot;&gt;简体中文&lt;/a&gt; | 🇯🇵 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.ja-JP.md&quot;&gt;日本語&lt;/a&gt; | 🇰🇷 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.ko-KR.md&quot;&gt;한국어&lt;/a&gt; | 🇩🇪 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.de-DE.md&quot;&gt;Deutsch&lt;/a&gt; | 🇫🇷 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.fr-FR.md&quot;&gt;Français&lt;/a&gt; | 🇪🇸 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.es-ES.md&quot;&gt;Español&lt;/a&gt; | 🇮🇳 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.hi-IN.md&quot;&gt;हिन्दी&lt;/a&gt; | 🇧🇷 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.pt-BR.md&quot;&gt;Português&lt;/a&gt; | 🇷🇺 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.ru-RU.md&quot;&gt;Русский&lt;/a&gt; | 🇸🇦 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.ar-SA.md&quot;&gt;العربية&lt;/a&gt; | 🇮🇷 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.fa-IR.md&quot;&gt;فارسی&lt;/a&gt; | 🇮🇹 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.it-IT.md&quot;&gt;Italiano&lt;/a&gt; | 🇵🇱 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.pl-PL.md&quot;&gt;Polski&lt;/a&gt; | 🇳🇱 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.nl-NL.md&quot;&gt;Nederlands&lt;/a&gt; | 🇹🇷 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.tr-TR.md&quot;&gt;Türkçe&lt;/a&gt; | 🇺🇦 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.uk-UA.md&quot;&gt;Українська&lt;/a&gt; | 🇻🇳 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.vi-VN.md&quot;&gt;Tiếng Việt&lt;/a&gt; | 🇮🇩 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.id-ID.md&quot;&gt;Bahasa Indonesia&lt;/a&gt; | 🇸🇪 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.sv-SE.md&quot;&gt;Svenska&lt;/a&gt; | 🇬🇷 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.el-GR.md&quot;&gt;Ελληνικά&lt;/a&gt; | 🇷🇴 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.ro-RO.md&quot;&gt;Română&lt;/a&gt; | 🇨🇿 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.cs-CZ.md&quot;&gt;Čeština&lt;/a&gt; | 🇫🇮 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.fi-FI.md&quot;&gt;Suomi&lt;/a&gt; | 🇩🇰 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.da-DK.md&quot;&gt;Dansk&lt;/a&gt; | 🇳🇴 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.no-NO.md&quot;&gt;Norsk&lt;/a&gt; | 🇭🇺 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.hu-HU.md&quot;&gt;Magyar&lt;/a&gt; | 🇹🇭 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.th-TH.md&quot;&gt;ภาษาไทย&lt;/a&gt; | 🇺🇿 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.uz-UZ.md&quot;&gt;Oʻzbekcha&lt;/a&gt; | 🇹🇼 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.zh-TW.md&quot;&gt;繁體中文&lt;/a&gt; | 🇵🇭 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.fil-PH.md&quot;&gt;Filipino&lt;/a&gt; | 🇮🇱 &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/translations/README.he-IL.md&quot;&gt;עברית&lt;/a&gt;&lt;/p&gt; 
 &lt;/details&gt; 
&lt;/div&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://pypi.org/project/graphifyy/&quot;&gt;&lt;img src=&quot;https://img.shields.io/pypi/v/graphifyy&quot; alt=&quot;PyPI&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://pepy.tech/project/graphifyy&quot;&gt;&lt;img src=&quot;https://img.shields.io/pepy/dt/graphifyy?color=blue&amp;amp;label=downloads&quot; alt=&quot;Downloads&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://discord.gg/598Ad9zQZ&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Discord-Join-5865F2?style=flat&amp;amp;logo=discord&amp;amp;logoColor=white&quot; alt=&quot;Discord&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.linkedin.com/company/graphify-labs&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/LinkedIn-Graphify%20Labs-0077B5?logo=linkedin&quot; alt=&quot;LinkedIn&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.ycombinator.com/companies/graphify-labs&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Y%20Combinator-S26-F0652F?style=flat&amp;amp;logo=ycombinator&amp;amp;logoColor=white&quot; alt=&quot;YC S26&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;b&gt;Early access to the graphify platform is open before the public v1 launch: &lt;a href=&quot;https://app.graphify.com/login&quot;&gt;app.graphify.com&lt;/a&gt;&lt;/b&gt; &lt;/p&gt; 
&lt;p&gt;Type &lt;code&gt;/graphify&lt;/code&gt; in your AI coding assistant and it maps your entire project (code, docs, PDFs, images, videos) into a &lt;strong&gt;knowledge graph&lt;/strong&gt; you can &lt;strong&gt;query instead of grepping&lt;/strong&gt; through files.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Code maps for free, fully local.&lt;/strong&gt; Code is parsed with tree-sitter AST: deterministic, no LLM, nothing leaves your machine. (Docs, PDFs, images and video use your assistant&#39;s model, or a configured API key, for a semantic pass.)&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Every edge is explained.&lt;/strong&gt; Each connection is tagged &lt;code&gt;EXTRACTED&lt;/code&gt; (explicit in the source) or &lt;code&gt;INFERRED&lt;/code&gt; (resolved by graphify), so you can tell what was read directly from what was inferred.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Not a vector index.&lt;/strong&gt; No embeddings, no vector store: a real graph you traverse. Ask a question, trace the path between two things, or explain one concept.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;Want this always-on, updating in the background across your code, docs, and meetings rather than only on demand? That is what we are building at &lt;strong&gt;&lt;a href=&quot;https://graphify.com&quot;&gt;graphify.com&lt;/a&gt;&lt;/strong&gt;, and early access is open now at &lt;strong&gt;&lt;a href=&quot;https://app.graphify.com/login&quot;&gt;app.graphify.com&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/graph-hero.png&quot; alt=&quot;graphify&#39;s interactive graph.html showing the FastAPI codebase as a force-directed knowledge graph with a legend of detected communities&quot; width=&quot;900&quot; /&gt; &lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;em&gt;The FastAPI codebase mapped by graphify. Every node is a concept, colors are detected communities, and the whole thing is clickable in graph.html.&lt;/em&gt; &lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Get started&lt;/strong&gt; (30 seconds):&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;uv tool install graphifyy      # install the CLI (or: pipx install graphifyy)
graphify install               # register the skill with your AI assistant
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Then, in your AI assistant:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/graphify .
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;That&#39;s it. You get &lt;strong&gt;three files&lt;/strong&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;graphify-out/
├── graph.html       open in any browser — click nodes, filter, search
├── GRAPH_REPORT.md  the highlights: key concepts, surprising connections, suggested questions
└── graph.json       the full graph — query it anytime without re-reading your files
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;Works in&lt;/strong&gt; Claude Code, Cursor, Codex, Gemini CLI, GitHub Copilot, and 15+ more — &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/#install&quot;&gt;pick your platform&lt;/a&gt;.&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;See it in action&lt;/h2&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/demo-path.svg?sanitize=true&quot; alt=&quot;graphify path query: a terminal asks for the shortest path between FastAPI and ModelField, and the answer lights up hop by hop across the knowledge graph&quot; width=&quot;900&quot; /&gt; &lt;/p&gt; 
&lt;p&gt;Once the graph is built you query it instead of reading files. Real output, graphify run on the FastAPI codebase shown above:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;$ graphify explain &quot;APIRouter&quot;
Node: APIRouter
  Source:    routing.py L2210
  Community: 2
  Degree:    47

Connections (47):
  --&amp;gt; RequestValidationError [uses] [INFERRED]
  --&amp;gt; Dependant [uses] [INFERRED]
  --&amp;gt; .get() [method] [EXTRACTED]
  &amp;lt;-- __init__.py [imports] [EXTRACTED]
  ...

$ graphify path &quot;FastAPI&quot; &quot;ModelField&quot;
Shortest path (3 hops):
  FastAPI --uses--&amp;gt; DefaultPlaceholder &amp;lt;--references-- get_request_handler() --references--&amp;gt; ModelField
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Every edge carries a &lt;strong&gt;confidence tag&lt;/strong&gt; (&lt;code&gt;EXTRACTED&lt;/code&gt; = explicit in the source, &lt;code&gt;INFERRED&lt;/code&gt; = derived by resolution), so you can tell what was read directly from what was inferred. &lt;code&gt;graphify query &quot;&amp;lt;question&amp;gt;&quot;&lt;/code&gt; returns a scoped subgraph for a plain-language question, and &lt;code&gt;graphify path A B&lt;/code&gt; traces how any two things connect.&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;What it does&lt;/h2&gt; 
&lt;p&gt;What you get out of the box:&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Capability&lt;/th&gt; 
   &lt;th&gt;What you get&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;God nodes&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;The most-connected concepts, so you see what everything flows through&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Communities&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;The graph split into subsystems (Leiden), with LLM-free labels&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Cross-file links&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;calls&lt;/code&gt; / &lt;code&gt;imports&lt;/code&gt; / &lt;code&gt;inherits&lt;/code&gt; / &lt;code&gt;mixes_in&lt;/code&gt; resolved across ~40 languages via tree-sitter AST&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Query, path, explain&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Ask a question, trace the path between two things, or explain one concept, all against &lt;code&gt;graph.json&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Rationale + doc refs&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;# NOTE:&lt;/code&gt; / &lt;code&gt;# WHY:&lt;/code&gt; comments and ADR/RFC citations become first-class nodes linked to the code&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Beyond code&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Docs, PDFs, images, and video/audio all map into the same graph&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Local-first&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Code is parsed locally with tree-sitter (no LLM, nothing leaves your machine); only the semantic pass over docs/media calls a backend, and only if you configure one&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Benchmarks&lt;/h2&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Benchmark&lt;/th&gt; 
   &lt;th&gt;Metric&lt;/th&gt; 
   &lt;th&gt;graphify&lt;/th&gt; 
   &lt;th&gt;Field&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;LOCOMO (n=300)&lt;/td&gt; 
   &lt;td&gt;recall@10&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;0.497&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;mem0 0.048, supermemory 0.149&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;LOCOMO (n=300)&lt;/td&gt; 
   &lt;td&gt;QA accuracy&lt;/td&gt; 
   &lt;td&gt;45.3%&lt;/td&gt; 
   &lt;td&gt;supermemory 49.7%, mem0 27.3%&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;LongMemEval-S (n=50)&lt;/td&gt; 
   &lt;td&gt;QA accuracy&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;76%&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;tied with dense RAG&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Graph build&lt;/td&gt; 
   &lt;td&gt;LLM credits&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;per-token for most systems&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;Every system ran on the same harness with the same model and budgets, scored by a judge blind-validated against a second judge (90.6% agreement, Cohen&#39;s kappa 0.81). Full per-system tables, the code-intelligence result, and reproduction commands: &lt;strong&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/BENCHMARKS.md&quot;&gt;BENCHMARKS.md&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Prerequisites&lt;/h2&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Requirement&lt;/th&gt; 
   &lt;th&gt;Minimum&lt;/th&gt; 
   &lt;th&gt;Check&lt;/th&gt; 
   &lt;th&gt;Install&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Python&lt;/td&gt; 
   &lt;td&gt;3.10+&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;python --version&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://www.python.org/downloads/&quot;&gt;python.org&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;uv &lt;em&gt;(recommended)&lt;/em&gt;&lt;/td&gt; 
   &lt;td&gt;any&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;uv --version&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;curl -LsSf https://astral.sh/uv/install.sh | sh&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;pipx &lt;em&gt;(alternative)&lt;/em&gt;&lt;/td&gt; 
   &lt;td&gt;any&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;pipx --version&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;pip install pipx&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;&lt;strong&gt;macOS quick install (Homebrew):&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;brew install python@3.12 uv
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;Windows quick install:&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;winget install astral-sh.uv
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;Ubuntu/Debian:&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install python3.12 python3-pip pipx
# or install uv:
curl -LsSf https://astral.sh/uv/install.sh | sh
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Install&lt;/h2&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;Official package:&lt;/strong&gt; The PyPI package is &lt;code&gt;graphifyy&lt;/code&gt; (double-y). Other &lt;code&gt;graphify*&lt;/code&gt; packages on PyPI are not affiliated. The CLI command is still &lt;code&gt;graphify&lt;/code&gt;.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;strong&gt;Step 1 — install the package:&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Recommended (isolated env; if &#39;graphify&#39; isn&#39;t found after, run: uv tool update-shell):
uv tool install graphifyy

# Alternatives:
pipx install graphifyy
pip install graphifyy  # may need PATH setup — see note below
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;Step 2 — register the skill with your AI assistant:&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;graphify install
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;That&#39;s it. Open your AI assistant and type &lt;code&gt;/graphify .&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;To install the assistant skill into the current repository instead of your user profile, add &lt;code&gt;--project&lt;/code&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;graphify install --project
graphify install --project --platform codex
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Project-scoped installs write under the current directory, for example &lt;code&gt;.claude/skills/graphify/SKILL.md&lt;/code&gt; or &lt;code&gt;.agents/skills/graphify/SKILL.md&lt;/code&gt; (plus a &lt;code&gt;references/&lt;/code&gt; sidecar the skill loads on demand), and print a &lt;code&gt;git add&lt;/code&gt; hint for files that can be committed. Per-platform commands that support project-scoped installs accept the same flag, for example &lt;code&gt;graphify claude install --project&lt;/code&gt; or &lt;code&gt;graphify codex install --project&lt;/code&gt;.&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;PowerShell note:&lt;/strong&gt; Use &lt;code&gt;graphify .&lt;/code&gt; not &lt;code&gt;/graphify .&lt;/code&gt; — the leading slash is a path separator in PowerShell.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;&lt;code&gt;graphify: command not found&lt;/code&gt;?&lt;/strong&gt; &lt;code&gt;uv tool install&lt;/code&gt; / &lt;code&gt;pipx install&lt;/code&gt; put the &lt;code&gt;graphify&lt;/code&gt; command in their tool bin dir (&lt;code&gt;~/.local/bin&lt;/code&gt;). If your shell can&#39;t find it right after install — common on a fresh macOS + zsh setup — that dir isn&#39;t on your &lt;code&gt;PATH&lt;/code&gt; yet: run &lt;code&gt;uv tool update-shell&lt;/code&gt; (or &lt;code&gt;pipx ensurepath&lt;/code&gt;), then open a new terminal. With plain &lt;code&gt;pip&lt;/code&gt;, add &lt;code&gt;~/.local/bin&lt;/code&gt; (Linux) or &lt;code&gt;~/Library/Python/3.x/bin&lt;/code&gt; (Mac) to your PATH, or run &lt;code&gt;python -m graphify&lt;/code&gt;.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;Running with &lt;code&gt;uvx&lt;/code&gt; / &lt;code&gt;uv tool run&lt;/code&gt; instead of installing?&lt;/strong&gt; Name the package, not the command: &lt;code&gt;uvx --from graphifyy graphify install&lt;/code&gt;. Plain &lt;code&gt;uvx graphify …&lt;/code&gt; fails (&lt;code&gt;No solution found … no versions of graphify&lt;/code&gt;) because &lt;code&gt;uv tool run&lt;/code&gt; reads the first word as a &lt;em&gt;package&lt;/em&gt;, and the package is &lt;code&gt;graphifyy&lt;/code&gt; — the &lt;code&gt;graphify&lt;/code&gt; command lives inside it.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;Avoid &lt;code&gt;pip install&lt;/code&gt; on Mac/Windows&lt;/strong&gt; if possible. The skill resolves Python at runtime from &lt;code&gt;graphify-out/.graphify_python&lt;/code&gt;; if that points to a different environment than where &lt;code&gt;pip&lt;/code&gt; installed the package, you&#39;ll get &lt;code&gt;ModuleNotFoundError: No module named &#39;graphify&#39;&lt;/code&gt;. &lt;code&gt;uv tool install&lt;/code&gt; and &lt;code&gt;pipx install&lt;/code&gt; isolate the package in their own env and avoid this entirely.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;Git hooks and uv tool / pipx:&lt;/strong&gt; &lt;code&gt;graphify hook install&lt;/code&gt; embeds the current interpreter path directly into the hook scripts at install time, so the post-commit hook fires correctly even in GUI git clients and CI runners where &lt;code&gt;~/.local/bin&lt;/code&gt; is not on PATH. If you reinstall or upgrade graphify, re-run &lt;code&gt;graphify hook install&lt;/code&gt; to refresh the embedded path.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;Strict mode (Claude Code):&lt;/strong&gt; &lt;code&gt;graphify install --project --strict&lt;/code&gt; makes the assistant actually use the graph. The default install &lt;em&gt;nudges&lt;/em&gt; it to run &lt;code&gt;graphify query&lt;/code&gt; before reading files; strict mode &lt;em&gt;blocks&lt;/em&gt; the first raw source read of a session and redirects it to the graph, then reverts to the nudge (so it fires at most once per session and never gets stuck). Toggle at runtime with &lt;code&gt;GRAPHIFY_HOOK_STRICT=1&lt;/code&gt;/&lt;code&gt;0&lt;/code&gt;; the default install is unchanged (soft nudge).&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;Pick your platform&lt;/b&gt; (20+ assistants, click to expand)&lt;/summary&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Platform&lt;/th&gt; 
    &lt;th&gt;Install command&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Claude Code (Linux/Mac)&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;graphify install&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Claude Code (Windows)&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;graphify install&lt;/code&gt; (auto-detected) or &lt;code&gt;graphify install --platform windows&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;CodeBuddy&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;graphify install --platform codebuddy&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Codex&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;graphify install --platform codex&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;OpenCode&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;graphify install --platform opencode&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Kilo Code&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;graphify install --platform kilo&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;GitHub Copilot CLI&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;graphify install --platform copilot&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;VS Code Copilot Chat&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;graphify vscode install&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Aider&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;graphify install --platform aider&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;OpenClaw&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;graphify install --platform claw&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Factory Droid&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;graphify install --platform droid&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Trae&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;graphify install --platform trae&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Trae CN&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;graphify install --platform trae-cn&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Gemini CLI&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;graphify install --platform gemini&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Hermes&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;graphify install --platform hermes&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Kimi Code&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;graphify install --platform kimi&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Amp&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;graphify amp install&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Agent Skills (cross-framework)&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;graphify install --platform agents&lt;/code&gt; (alias &lt;code&gt;--platform skills&lt;/code&gt;)&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Kiro IDE/CLI&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;graphify kiro install&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Pi coding agent&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;graphify install --platform pi&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Cursor&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;graphify cursor install&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Devin CLI&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;graphify devin install&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;Google Antigravity&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;graphify antigravity install&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
 &lt;p&gt;Codex users also need &lt;code&gt;multi_agent = true&lt;/code&gt; under &lt;code&gt;[features]&lt;/code&gt; in &lt;code&gt;~/.codex/config.toml&lt;/code&gt; for parallel extraction. CodeBuddy uses the same Agent tool and PreToolUse hook mechanism as Claude Code. Factory Droid uses the &lt;code&gt;Task&lt;/code&gt; tool for parallel subagent dispatch. OpenClaw and Aider use sequential extraction (parallel agent support is still early on those platforms). Trae uses the Agent tool for parallel subagent dispatch and does &lt;strong&gt;not&lt;/strong&gt; support &lt;code&gt;PreToolUse&lt;/code&gt; hooks, so &lt;a href=&quot;http://AGENTS.md&quot;&gt;AGENTS.md&lt;/a&gt; is the always-on mechanism.&lt;/p&gt; 
 &lt;p&gt;&lt;code&gt;--platform agents&lt;/code&gt; (alias &lt;code&gt;--platform skills&lt;/code&gt;) targets the generic cross-framework &lt;a href=&quot;https://github.com/anthropics/skills&quot;&gt;Agent-Skills&lt;/a&gt; locations: the spec&#39;s user-global &lt;code&gt;~/.agents/skills/&lt;/code&gt; (read by &lt;code&gt;npx skills&lt;/code&gt; and spec-compliant frameworks) for a global install, and &lt;code&gt;./.agents/skills/&lt;/code&gt; for a project (&lt;code&gt;--project&lt;/code&gt;) install. The bare &lt;code&gt;graphify install&lt;/code&gt; stays single-platform (Claude Code) by design — use the named &lt;code&gt;agents&lt;/code&gt; platform when you want the skill discoverable by any framework that reads &lt;code&gt;.agents/skills&lt;/code&gt;.&lt;/p&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;Codex uses &lt;code&gt;$graphify&lt;/code&gt; instead of &lt;code&gt;/graphify&lt;/code&gt;.&lt;/p&gt; 
 &lt;/blockquote&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;b&gt;Optional extras&lt;/b&gt; (install only what you need)&lt;/summary&gt; 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Extra&lt;/th&gt; 
    &lt;th&gt;What it adds&lt;/th&gt; 
    &lt;th&gt;Install&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;pdf&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;PDF extraction&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;uv tool install &quot;graphifyy[pdf]&quot;&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;office&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;.docx&lt;/code&gt; and &lt;code&gt;.xlsx&lt;/code&gt; support&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;uv tool install &quot;graphifyy[office]&quot;&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;google&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Google Sheets rendering&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;uv tool install &quot;graphifyy[google]&quot;&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;video&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Video/audio transcription (faster-whisper + yt-dlp)&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;uv tool install &quot;graphifyy[video]&quot;&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;mcp&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;MCP stdio server&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;uv tool install &quot;graphifyy[mcp]&quot;&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;neo4j&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Neo4j push support&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;uv tool install &quot;graphifyy[neo4j]&quot;&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;falkordb&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;FalkorDB push support&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;uv tool install &quot;graphifyy[falkordb]&quot;&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;svg&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;SVG graph export&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;uv tool install &quot;graphifyy[svg]&quot;&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;leiden&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Leiden community detection (Python &amp;lt; 3.13 only)&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;uv tool install &quot;graphifyy[leiden]&quot;&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;ollama&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Ollama local inference&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;uv tool install &quot;graphifyy[ollama]&quot;&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;openai&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;OpenAI / OpenAI-compatible APIs&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;uv tool install &quot;graphifyy[openai]&quot;&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;gemini&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Google Gemini API&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;uv tool install &quot;graphifyy[gemini]&quot;&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;anthropic&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Anthropic Claude API (&lt;code&gt;--backend claude&lt;/code&gt;, uses &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;)&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;uv tool install &quot;graphifyy[anthropic]&quot;&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;bedrock&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;AWS Bedrock (uses IAM, no API key)&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;uv tool install &quot;graphifyy[bedrock]&quot;&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;azure&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Azure OpenAI Service (&lt;code&gt;--backend azure&lt;/code&gt;, uses &lt;code&gt;AZURE_OPENAI_API_KEY&lt;/code&gt; + &lt;code&gt;AZURE_OPENAI_ENDPOINT&lt;/code&gt;)&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;uv tool install &quot;graphifyy[openai]&quot;&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;sql&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;SQL schema extraction&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;uv tool install &quot;graphifyy[sql]&quot;&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;postgres&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Live PostgreSQL introspection (&lt;code&gt;--postgres DSN&lt;/code&gt;)&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;uv tool install &quot;graphifyy[postgres]&quot;&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;dm&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;BYOND DreamMaker &lt;code&gt;.dm&lt;/code&gt;/&lt;code&gt;.dme&lt;/code&gt; AST extraction (may need a C compiler + &lt;code&gt;python3-dev&lt;/code&gt; if no wheel matches your platform)&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;uv tool install &quot;graphifyy[dm]&quot;&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;terraform&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Terraform / HCL &lt;code&gt;.tf&lt;/code&gt;/&lt;code&gt;.tfvars&lt;/code&gt;/&lt;code&gt;.hcl&lt;/code&gt; AST extraction&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;uv tool install &quot;graphifyy[terraform]&quot;&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;pascal&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Pascal / Delphi &lt;code&gt;.pas&lt;/code&gt;/&lt;code&gt;.dpr&lt;/code&gt;/&lt;code&gt;.dpk&lt;/code&gt;/&lt;code&gt;.inc&lt;/code&gt; AST extraction (more accurate &lt;code&gt;calls&lt;/code&gt;/&lt;code&gt;inherits&lt;/code&gt; edges; falls back to a regex extractor when absent)&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;uv tool install &quot;graphifyy[pascal]&quot;&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;chinese&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Chinese query segmentation (jieba)&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;uv tool install &quot;graphifyy[chinese]&quot;&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;code&gt;all&lt;/code&gt;&lt;/td&gt; 
    &lt;td&gt;Everything above&lt;/td&gt; 
    &lt;td&gt;&lt;code&gt;uv tool install &quot;graphifyy[all]&quot;&lt;/code&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
&lt;/details&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Make your assistant always use the graph&lt;/h2&gt; 
&lt;p&gt;Run this once in your project after building a graph:&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Platform&lt;/th&gt; 
   &lt;th&gt;Command&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Claude Code&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;graphify claude install&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;CodeBuddy&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;graphify codebuddy install&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Codex&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;graphify codex install&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;OpenCode&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;graphify opencode install&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Kilo Code&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;graphify kilo install&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;GitHub Copilot CLI&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;graphify copilot install&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;VS Code Copilot Chat&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;graphify vscode install&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Aider&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;graphify aider install&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;OpenClaw&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;graphify claw install&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Factory Droid&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;graphify droid install&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Trae&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;graphify trae install&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Trae CN&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;graphify trae-cn install&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Cursor&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;graphify cursor install&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Gemini CLI&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;graphify gemini install&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Hermes&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;graphify hermes install&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Kimi Code&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;graphify install --platform kimi&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Amp&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;graphify amp install&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Agent Skills (cross-framework)&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;graphify agents install&lt;/code&gt; (alias &lt;code&gt;graphify skills install&lt;/code&gt;)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Kiro IDE/CLI&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;graphify kiro install&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Pi coding agent&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;graphify pi install&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Devin CLI&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;graphify devin install&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Google Antigravity&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;graphify antigravity install&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;This writes a small config file that tells your assistant to consult the knowledge graph for codebase questions, preferring scoped queries like &lt;code&gt;graphify query &quot;&amp;lt;question&amp;gt;&quot;&lt;/code&gt; over reading the full report or grepping raw files.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Hook platforms&lt;/strong&gt; (Claude Code, Gemini CLI): a hook fires automatically before search-style tool calls (and, on Claude Code, before reading source files one by one via the Read/Glob tools) and nudges your assistant toward the graph path.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Instruction-file platforms&lt;/strong&gt; (Codex, OpenCode, Cursor, etc.): persistent instruction files (&lt;code&gt;AGENTS.md&lt;/code&gt;, &lt;code&gt;.cursor/rules/&lt;/code&gt;, etc.) provide the same query-first guidance.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;code&gt;GRAPH_REPORT.md&lt;/code&gt; is still available for broad architecture review.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;CodeBuddy&lt;/strong&gt; does the same two things as Claude Code: writes a &lt;code&gt;CODEBUDDY.md&lt;/code&gt; section telling CodeBuddy to read &lt;code&gt;graphify-out/GRAPH_REPORT.md&lt;/code&gt; before answering architecture questions, and installs &lt;code&gt;PreToolUse&lt;/code&gt; hooks (&lt;code&gt;.codebuddy/settings.json&lt;/code&gt;) that fire before Bash search commands and file reads, nudging toward &lt;code&gt;graphify query&lt;/code&gt; instead.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Codex&lt;/strong&gt; writes to &lt;code&gt;AGENTS.md&lt;/code&gt;, which is what actually carries the always-on graph guidance on this platform. &lt;code&gt;graphify codex install&lt;/code&gt; also registers a &lt;code&gt;PreToolUse&lt;/code&gt; hook in &lt;code&gt;.codex/hooks.json&lt;/code&gt; (&lt;code&gt;graphify hook-check&lt;/code&gt;), but that entry is deliberately a &lt;strong&gt;no-op&lt;/strong&gt;: Codex Desktop rejects &lt;code&gt;hookSpecificOutput.additionalContext&lt;/code&gt; on &lt;code&gt;PreToolUse&lt;/code&gt;, so emitting a nudge there would break Bash tool calls. Unlike Claude Code, where the hook (&lt;code&gt;graphify hook-guard&lt;/code&gt;) does the nudging, on Codex the hook fires and intentionally does nothing, and &lt;code&gt;AGENTS.md&lt;/code&gt; is the always-on mechanism.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Kilo Code&lt;/strong&gt; installs the Graphify skill to &lt;code&gt;~/.config/kilo/skills/graphify/SKILL.md&lt;/code&gt; and a native &lt;code&gt;/graphify&lt;/code&gt; command to &lt;code&gt;~/.config/kilo/command/graphify.md&lt;/code&gt;. &lt;code&gt;graphify kilo install&lt;/code&gt; also writes &lt;code&gt;AGENTS.md&lt;/code&gt; plus a native &lt;code&gt;tool.execute.before&lt;/code&gt; plugin (&lt;code&gt;.kilo/plugins/graphify.js&lt;/code&gt; + &lt;code&gt;.kilo/kilo.json&lt;/code&gt; or &lt;code&gt;.kilo/kilo.jsonc&lt;/code&gt; registration) so Kilo gets the same always-on graph reminder behavior through native &lt;code&gt;.kilo&lt;/code&gt; config.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt; writes &lt;code&gt;.cursor/rules/graphify.mdc&lt;/code&gt; with &lt;code&gt;alwaysApply: true&lt;/code&gt;, so Cursor includes it in every conversation automatically, no hook needed.&lt;/p&gt; 
&lt;p&gt;To remove graphify from all platforms at once: &lt;code&gt;graphify uninstall&lt;/code&gt; (add &lt;code&gt;--purge&lt;/code&gt; to also delete &lt;code&gt;graphify-out/&lt;/code&gt;). Or use the per-platform command (e.g. &lt;code&gt;graphify claude uninstall&lt;/code&gt;).&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;What&#39;s in the report&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;God nodes&lt;/strong&gt; — the most-connected concepts in your project. Everything flows through these.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Surprising connections&lt;/strong&gt; — links between things that live in different files or modules. Ranked by how unexpected they are.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;The &quot;why&quot;&lt;/strong&gt; — inline comments (&lt;code&gt;# NOTE:&lt;/code&gt;, &lt;code&gt;# WHY:&lt;/code&gt;, &lt;code&gt;# HACK:&lt;/code&gt;), docstrings, and design rationale from docs are extracted as separate nodes linked to the code they explain.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Suggested questions&lt;/strong&gt; — 4–5 questions the graph is uniquely positioned to answer.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Confidence tags&lt;/strong&gt; — every inferred relationship is marked &lt;code&gt;EXTRACTED&lt;/code&gt;, &lt;code&gt;INFERRED&lt;/code&gt;, or &lt;code&gt;AMBIGUOUS&lt;/code&gt;. You always know what was found vs guessed.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;hr /&gt; 
&lt;h2&gt;What files it handles&lt;/h2&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Type&lt;/th&gt; 
   &lt;th&gt;Extensions&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Code (36 tree-sitter grammars)&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;.py .ts .mts .cts .js .jsx .tsx .mjs .go .rs .java .c .cpp .cc .cxx .h .hpp .cu .cuh .metal .rb .cs .kt .kts .scala .php .swift .lua .luau .toc .zig .ps1 .psm1 .psd1 .ex .exs .m .mm .jl .vue .svelte .astro .groovy .gradle .dart .v .sv .svh .sql .f .f90 .f95 .f03 .f08 .pas .pp .dpr .dpk .lpr .inc .dfm .lfm .lpk .sh .bash .json .dm .dme .dmi .dmm .dmf .sln .slnx .csproj .fsproj .vbproj .xaml .razor .cshtml&lt;/code&gt; (&lt;code&gt;.dm&lt;/code&gt;/&lt;code&gt;.dme&lt;/code&gt; requires &lt;code&gt;uv tool install graphifyy[dm]&lt;/code&gt;; &lt;code&gt;.mts&lt;/code&gt;/&lt;code&gt;.cts&lt;/code&gt; reuse the TypeScript grammar, &lt;code&gt;.cc&lt;/code&gt;/&lt;code&gt;.cxx&lt;/code&gt; and CUDA &lt;code&gt;.cu&lt;/code&gt;/&lt;code&gt;.cuh&lt;/code&gt; and Metal &lt;code&gt;.metal&lt;/code&gt; reuse the C++ grammar)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Salesforce Apex&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;.cls .trigger&lt;/code&gt; (regex-based; classes, interfaces, enums, methods, triggers, SOQL/DML edges)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Terraform / HCL&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;.tf .tfvars .hcl&lt;/code&gt; (requires &lt;code&gt;uv tool install graphifyy[terraform]&lt;/code&gt;)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;MCP configs&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;.mcp.json&lt;/code&gt; &lt;code&gt;mcp.json&lt;/code&gt; &lt;code&gt;mcp_servers.json&lt;/code&gt; &lt;code&gt;claude_desktop_config.json&lt;/code&gt; — extracts server nodes, package refs, env var requirements&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Package manifests&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;apm.yml&lt;/code&gt; &lt;code&gt;pyproject.toml&lt;/code&gt; &lt;code&gt;go.mod&lt;/code&gt; &lt;code&gt;pom.xml&lt;/code&gt; — one canonical package node per package (by name) plus &lt;code&gt;depends_on&lt;/code&gt; edges, so a package referenced from many manifests is a single hub&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Docs&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;.md .mdx .qmd .html .txt .rst .yaml .yml&lt;/code&gt; (markdown &lt;code&gt;[text](./other.md)&lt;/code&gt; links and &lt;code&gt;[[wikilinks]]&lt;/code&gt; become &lt;code&gt;references&lt;/code&gt; edges between docs)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Office&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;.docx .xlsx&lt;/code&gt; (requires &lt;code&gt;uv tool install graphifyy[office]&lt;/code&gt;)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Google Workspace&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;.gdoc .gsheet .gslides&lt;/code&gt; (opt-in; requires &lt;code&gt;gws&lt;/code&gt; auth and &lt;code&gt;--google-workspace&lt;/code&gt;; Sheets need &lt;code&gt;uv tool install graphifyy[google]&lt;/code&gt;)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;PDFs&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;.pdf&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Images&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;.png .jpg .webp .gif&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Video / Audio&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;.mp4 .mov .mp3 .wav&lt;/code&gt; and more (requires &lt;code&gt;uv tool install graphifyy[video]&lt;/code&gt;)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;YouTube / URLs&lt;/td&gt; 
   &lt;td&gt;any video URL (requires &lt;code&gt;uv tool install graphifyy[video]&lt;/code&gt;)&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;Code is extracted &lt;strong&gt;locally with no API calls&lt;/strong&gt; (AST via tree-sitter). Everything else goes through your AI assistant&#39;s model API.&lt;/p&gt; 
&lt;p&gt;Google Drive for desktop &lt;code&gt;.gdoc&lt;/code&gt;, &lt;code&gt;.gsheet&lt;/code&gt;, and &lt;code&gt;.gslides&lt;/code&gt; files are shortcut pointers, not document content. To include native Google Docs, Sheets, and Slides in a headless extraction, install and authenticate the &lt;a href=&quot;https://github.com/googleworkspace/cli&quot;&gt;&lt;code&gt;gws&lt;/code&gt; CLI&lt;/a&gt;, then run:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;uv tool install &quot;graphifyy[google]&quot;  # needed for Google Sheets table rendering
gws auth login -s drive
graphify extract ./docs --google-workspace
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;You can also set &lt;code&gt;GRAPHIFY_GOOGLE_WORKSPACE=1&lt;/code&gt;. Graphify exports shortcuts into &lt;code&gt;graphify-out/converted/&lt;/code&gt; as Markdown sidecars, then extracts those files.&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Common commands&lt;/h2&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;/graphify .                        # build graph for current folder
/graphify ./docs --update          # re-extract only changed files
/graphify . --cluster-only         # rerun clustering without re-extracting
/graphify . --cluster-only --resolution 1.5      # more granular communities
/graphify . --cluster-only --exclude-hubs 99     # suppress utility super-hubs from god-node rankings
/graphify . --no-viz               # skip the HTML, just the report + JSON
/graphify . --wiki                 # build a markdown wiki from the graph
graphify export callflow-html      # Mermaid architecture/call-flow HTML (auto-regenerates on every git commit if hook is installed)

/graphify query &quot;what connects auth to the database?&quot;
/graphify path &quot;UserService&quot; &quot;DatabasePool&quot;
/graphify explain &quot;RateLimiter&quot;

/graphify add https://arxiv.org/abs/1706.03762   # fetch a paper and add it
/graphify add &amp;lt;youtube-url&amp;gt;                       # transcribe and add a video

graphify hook install              # auto-rebuild on git commit
graphify merge-graphs a.json b.json              # combine two graphs

graphify prs                       # PR dashboard: CI state, review status, worktree mapping
graphify prs 42                    # deep dive on PR #42 with graph impact
graphify prs --triage              # AI ranks your review queue (uses whatever backend is configured)
graphify prs --conflicts           # PRs sharing graph communities — merge-order risk
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;See the &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/#full-command-reference&quot;&gt;full command reference&lt;/a&gt; below.&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Ignoring files&lt;/h2&gt; 
&lt;p&gt;Create a &lt;code&gt;.graphifyignore&lt;/code&gt; in your project root — same syntax as &lt;code&gt;.gitignore&lt;/code&gt;, including &lt;code&gt;!&lt;/code&gt; negation.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;code&gt;.gitignore&lt;/code&gt; is respected automatically.&lt;/strong&gt; graphify reads the &lt;code&gt;.gitignore&lt;/code&gt; in each directory. If a &lt;code&gt;.graphifyignore&lt;/code&gt; is also present, the two are &lt;strong&gt;merged&lt;/strong&gt; — &lt;code&gt;.graphifyignore&lt;/code&gt; patterns are evaluated last, so they win on conflicts (including &lt;code&gt;!&lt;/code&gt; negations). Adding a &lt;code&gt;.graphifyignore&lt;/code&gt; only ever excludes more; it never re-includes a file your &lt;code&gt;.gitignore&lt;/code&gt; already excluded. Subdirectory scoping works the same way as git — an ignore file only affects its own subtree.&lt;/p&gt; 
&lt;p&gt;Pass &lt;code&gt;--no-gitignore&lt;/code&gt; to &lt;code&gt;graphify extract&lt;/code&gt; when git-ignored generated or transpiled code belongs in the graph. This disables &lt;code&gt;.gitignore&lt;/code&gt; and &lt;code&gt;.git/info/exclude&lt;/code&gt;; &lt;code&gt;.graphifyignore&lt;/code&gt; still applies.&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# .graphifyignore
node_modules/
dist/
*.generated.py

# only index src/, ignore everything else
*
!src/
!src/**
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Team setup&lt;/h2&gt; 
&lt;p&gt;&lt;code&gt;graphify-out/&lt;/code&gt; is meant to be committed to git so everyone on the team starts with a map.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Recommended &lt;code&gt;.gitignore&lt;/code&gt; additions:&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;graphify-out/cost.json        # local only
# graphify-out/cache/         # optional: commit for speed, skip to keep repo small
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;code&gt;manifest.json&lt;/code&gt; is now portable — keys are stored as relative paths and re-anchored on load, so committing it is safe and avoids a full rebuild on first checkout.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;strong&gt;Workflow:&lt;/strong&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;One person runs &lt;code&gt;/graphify .&lt;/code&gt; and commits &lt;code&gt;graphify-out/&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;Everyone pulls — their assistant reads the graph immediately.&lt;/li&gt; 
 &lt;li&gt;Run &lt;code&gt;graphify hook install&lt;/code&gt; to auto-rebuild after each commit (AST only, no API cost). This also sets up a git merge driver so &lt;code&gt;graph.json&lt;/code&gt; is never left with conflict markers — two devs committing in parallel get their graphs union-merged automatically.&lt;/li&gt; 
 &lt;li&gt;When docs or papers change, run &lt;code&gt;/graphify --update&lt;/code&gt; to refresh those nodes.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Using the graph directly&lt;/h2&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# query the graph from the terminal
graphify query &quot;show the auth flow&quot;
graphify query &quot;what connects DigestAuth to Response?&quot; --graph graphify-out/graph.json

# expose the graph as an MCP server (for repeated tool-call access)
python -m graphify.serve graphify-out/graph.json
python -m graphify.serve --graph graphify-out/graph.json  # --graph flag also accepted

# register with Kimi Code:
kimi mcp add --transport stdio graphify -- python -m graphify.serve graphify-out/graph.json

# or serve over HTTP so a whole team points at one URL (no local graphify needed):
python -m graphify.serve graphify-out/graph.json --transport http --port 8080
python -m graphify.serve graphify-out/graph.json --transport http --host 0.0.0.0 --api-key &quot;$SECRET&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The MCP server gives your assistant structured access: &lt;code&gt;query_graph&lt;/code&gt;, &lt;code&gt;get_node&lt;/code&gt;, &lt;code&gt;get_neighbors&lt;/code&gt;, &lt;code&gt;shortest_path&lt;/code&gt;, &lt;code&gt;list_prs&lt;/code&gt;, &lt;code&gt;get_pr_impact&lt;/code&gt;, &lt;code&gt;triage_prs&lt;/code&gt;.&lt;/p&gt; 
&lt;h3&gt;Shared HTTP server&lt;/h3&gt; 
&lt;p&gt;&lt;code&gt;--transport stdio&lt;/code&gt; (the default) spawns one local server per developer. &lt;code&gt;--transport http&lt;/code&gt; serves the same tools over the MCP Streamable HTTP transport, so a single shared process can serve the graph for the whole team — clients point their IDE MCP config at &lt;code&gt;http://&amp;lt;host&amp;gt;:8080/mcp&lt;/code&gt; instead of running graphify locally.&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Flag&lt;/th&gt; 
   &lt;th&gt;Default&lt;/th&gt; 
   &lt;th&gt;Purpose&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;--transport {stdio,http}&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;stdio&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Transport to serve on&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;--host&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;127.0.0.1&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;HTTP bind host (use &lt;code&gt;0.0.0.0&lt;/code&gt; to expose beyond localhost)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;--port&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;8080&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;HTTP bind port&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;--api-key&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;env &lt;code&gt;GRAPHIFY_API_KEY&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Require &lt;code&gt;Authorization: Bearer &amp;lt;key&amp;gt;&lt;/code&gt; (or &lt;code&gt;X-API-Key&lt;/code&gt;)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;--path&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;/mcp&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;HTTP mount path&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;--json-response&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;off&lt;/td&gt; 
   &lt;td&gt;Return plain JSON instead of SSE streams&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;--stateless&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;off&lt;/td&gt; 
   &lt;td&gt;No per-session state (for load-balanced / CI deployments)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;--session-timeout&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;3600&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Reap idle stateful sessions after N seconds (&lt;code&gt;0&lt;/code&gt; disables)&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;The default &lt;code&gt;127.0.0.1&lt;/code&gt; bind is loopback-only. Set &lt;code&gt;--host 0.0.0.0&lt;/code&gt; &lt;strong&gt;and&lt;/strong&gt; &lt;code&gt;--api-key&lt;/code&gt; together when exposing on a shared host. Run it in a container:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker build -t graphify .
docker run -p 8080:8080 -v &quot;$(pwd)/graphify-out:/data&quot; graphify \
  /data/graph.json --transport http --host 0.0.0.0 --api-key &quot;$SECRET&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;WSL / Linux note:&lt;/strong&gt; Ubuntu ships &lt;code&gt;python3&lt;/code&gt;, not &lt;code&gt;python&lt;/code&gt;. Use a venv to avoid conflicts:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;python3 -m venv .venv &amp;amp;&amp;amp; .venv/bin/pip install &quot;graphifyy[mcp]&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;/blockquote&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Environment variables&lt;/h2&gt; 
&lt;p&gt;These are only needed for &lt;strong&gt;headless / CI extraction&lt;/strong&gt; (&lt;code&gt;graphify extract&lt;/code&gt;). When running via the &lt;code&gt;/graphify&lt;/code&gt; skill inside your IDE, the model API is provided by your IDE session — no extra keys needed.&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Variable&lt;/th&gt; 
   &lt;th&gt;Used for&lt;/th&gt; 
   &lt;th&gt;When required&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Claude (Anthropic) backend&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;--backend claude&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Anthropic-compatible endpoint URL (LiteLLM proxy, gateways, ...)&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;--backend claude&lt;/code&gt; (default: &lt;code&gt;https://api.anthropic.com&lt;/code&gt;)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;ANTHROPIC_MODEL&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Model name for the Claude backend — for custom endpoints, use the model name/alias your server exposes&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;--backend claude&lt;/code&gt; (default: &lt;code&gt;claude-sonnet-4-6&lt;/code&gt;)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GEMINI_API_KEY&lt;/code&gt; or &lt;code&gt;GOOGLE_API_KEY&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Google Gemini backend&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;--backend gemini&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;OPENAI_API_KEY&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;OpenAI or OpenAI-compatible APIs&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;--backend openai&lt;/code&gt; (local servers accept any non-empty value)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;OPENAI_BASE_URL&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;OpenAI-compatible server URL (llama.cpp, vLLM, LM Studio, ...)&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;--backend openai&lt;/code&gt; (default: &lt;code&gt;https://api.openai.com/v1&lt;/code&gt;)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;OPENAI_MODEL&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Model name for the OpenAI backend — for self-hosted servers, use the model name/alias your server exposes (check its &lt;code&gt;/v1/models&lt;/code&gt; endpoint), e.g. &lt;code&gt;LFM2.5-8B-A1B-UD-Q4_K_XL&lt;/code&gt; for llama.cpp&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;--backend openai&lt;/code&gt; (default: &lt;code&gt;gpt-4.1-mini&lt;/code&gt;)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;DEEPSEEK_API_KEY&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;DeepSeek backend&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;--backend deepseek&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;MOONSHOT_API_KEY&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Kimi Code backend&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;--backend kimi&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;OLLAMA_BASE_URL&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Ollama local inference URL&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;--backend ollama&lt;/code&gt; (default: &lt;code&gt;http://localhost:11434&lt;/code&gt;)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;OLLAMA_MODEL&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Ollama model name&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;--backend ollama&lt;/code&gt; (default: auto-detect)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GRAPHIFY_OLLAMA_NUM_CTX&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Override Ollama KV-cache window size&lt;/td&gt; 
   &lt;td&gt;optional — auto-sized by default&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GRAPHIFY_OLLAMA_KEEP_ALIVE&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Minutes to keep Ollama model loaded&lt;/td&gt; 
   &lt;td&gt;optional — set &lt;code&gt;0&lt;/code&gt; to unload after each chunk&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;AZURE_OPENAI_API_KEY&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Azure OpenAI Service backend&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;--backend azure&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;AZURE_OPENAI_ENDPOINT&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Azure resource endpoint URL&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;--backend azure&lt;/code&gt; (required alongside API key)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;AZURE_OPENAI_API_VERSION&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Azure API version override&lt;/td&gt; 
   &lt;td&gt;optional — default &lt;code&gt;2024-12-01-preview&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;AZURE_OPENAI_DEPLOYMENT&lt;/code&gt; or &lt;code&gt;GRAPHIFY_AZURE_MODEL&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Azure deployment name&lt;/td&gt; 
   &lt;td&gt;optional — default &lt;code&gt;gpt-4o&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;AWS_*&lt;/code&gt; / &lt;code&gt;~/.aws/credentials&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;AWS Bedrock — standard credential chain&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;--backend bedrock&lt;/code&gt; (no API key, uses IAM)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GRAPHIFY_MAX_WORKERS&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;AST parallelism thread count&lt;/td&gt; 
   &lt;td&gt;optional — also &lt;code&gt;--max-workers&lt;/code&gt; flag&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GRAPHIFY_MAX_OUTPUT_TOKENS&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Raise output cap for dense corpora&lt;/td&gt; 
   &lt;td&gt;optional — e.g. &lt;code&gt;32768&lt;/code&gt; for large files&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GRAPHIFY_API_TIMEOUT&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Per-call timeout in seconds for HTTP, claude-cli, Anthropic SDK, and Bedrock backends (default: 600)&lt;/td&gt; 
   &lt;td&gt;optional — also &lt;code&gt;--api-timeout&lt;/code&gt; flag&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GRAPHIFY_MAX_RETRIES&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;How many times to retry a rate-limited (429) request before giving up (default: 6; honors &lt;code&gt;Retry-After&lt;/code&gt;)&lt;/td&gt; 
   &lt;td&gt;optional — raise for strict per-org limits (e.g. kimi); &lt;code&gt;0&lt;/code&gt; disables&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GRAPHIFY_FORCE&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Force graph rebuild even with fewer nodes&lt;/td&gt; 
   &lt;td&gt;optional — also &lt;code&gt;--force&lt;/code&gt; flag&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GRAPHIFY_GOOGLE_WORKSPACE&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Auto-enable Google Workspace export&lt;/td&gt; 
   &lt;td&gt;optional — set to &lt;code&gt;1&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GRAPHIFY_TRIAGE_BACKEND&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Backend for &lt;code&gt;graphify prs --triage&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;optional — auto-detected from available keys&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GRAPHIFY_TRIAGE_MODEL&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Model override for triage&lt;/td&gt; 
   &lt;td&gt;optional — e.g. &lt;code&gt;claude-opus-4-7&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GRAPHIFY_QUERY_LOG_ENABLE&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Set to &lt;code&gt;1&lt;/code&gt; to turn on the local query log at &lt;code&gt;~/.cache/graphify-queries.log&lt;/code&gt; (records each query/path/explain question + corpus path). Off by default — nothing is written unless you opt in (#1797)&lt;/td&gt; 
   &lt;td&gt;optional&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GRAPHIFY_QUERY_LOG&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Enable the query log and write it to this path instead of the default&lt;/td&gt; 
   &lt;td&gt;optional — off unless this or &lt;code&gt;_ENABLE&lt;/code&gt; is set&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GRAPHIFY_QUERY_LOG_DISABLE&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Set to &lt;code&gt;1&lt;/code&gt; to force the query log off (wins over the enable vars)&lt;/td&gt; 
   &lt;td&gt;optional&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GRAPHIFY_QUERY_LOG_RESPONSES&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;When the log is enabled, also record full subgraph responses (off by default)&lt;/td&gt; 
   &lt;td&gt;optional&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GRAPHIFY_MAX_GRAPH_BYTES&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Override the 512 MiB graph.json size cap — e.g. &lt;code&gt;700MB&lt;/code&gt;, &lt;code&gt;2GB&lt;/code&gt;, or plain bytes&lt;/td&gt; 
   &lt;td&gt;optional — useful for very large corpora&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GRAPHIFY_MAX_CONTEXTS&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Maximum number of non-default project graphs retained by one multi-project MCP server&lt;/td&gt; 
   &lt;td&gt;optional — default: &lt;code&gt;8&lt;/code&gt;; invalid values use &lt;code&gt;8&lt;/code&gt;, and values below &lt;code&gt;1&lt;/code&gt; use &lt;code&gt;1&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;GRAPHIFY_LLM_TEMPERATURE&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Override LLM temperature for semantic extraction — e.g. &lt;code&gt;0.7&lt;/code&gt;, or &lt;code&gt;none&lt;/code&gt; to omit&lt;/td&gt; 
   &lt;td&gt;optional — auto-omitted for o1/o3/o4/gpt-5 reasoning models&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Privacy&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Code files&lt;/strong&gt; — processed locally via tree-sitter. Nothing leaves your machine. A code-only corpus requires no API key — &lt;code&gt;graphify extract&lt;/code&gt; runs fully offline. On a mixed repo, add &lt;code&gt;--code-only&lt;/code&gt; to index just the code and skip the docs/PDFs/images that would otherwise need an LLM.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Video / audio&lt;/strong&gt; — transcribed locally with faster-whisper. Nothing leaves your machine.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Docs, PDFs, images&lt;/strong&gt; — sent to your AI assistant for semantic extraction (via the &lt;code&gt;/graphify&lt;/code&gt; skill, using whatever model your IDE session runs). Headless &lt;code&gt;graphify extract&lt;/code&gt; requires &lt;code&gt;GEMINI_API_KEY&lt;/code&gt; / &lt;code&gt;GOOGLE_API_KEY&lt;/code&gt; (Gemini), &lt;code&gt;MOONSHOT_API_KEY&lt;/code&gt; (Kimi), &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; (Claude), &lt;code&gt;OPENAI_API_KEY&lt;/code&gt; (OpenAI), &lt;code&gt;DEEPSEEK_API_KEY&lt;/code&gt; (DeepSeek), a running Ollama instance (&lt;code&gt;OLLAMA_BASE_URL&lt;/code&gt;), AWS credentials via the standard provider chain (Bedrock - no API key needed, uses IAM), or the &lt;code&gt;claude&lt;/code&gt; CLI binary (Claude Code - no API key needed, uses your Claude subscription). The &lt;code&gt;--dedup-llm&lt;/code&gt; flag uses the same key.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Data residency&lt;/strong&gt; — &lt;code&gt;graphify extract&lt;/code&gt; auto-detects which provider to use based on which API key is set (priority: Gemini → Kimi → Claude → OpenAI → DeepSeek → Azure → Bedrock → Ollama). For code with data-residency requirements, use &lt;code&gt;--backend ollama&lt;/code&gt; (fully local) or pass an explicit &lt;code&gt;--backend&lt;/code&gt; flag. Kimi (&lt;code&gt;MOONSHOT_API_KEY&lt;/code&gt;) routes to Moonshot AI servers in China.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;No telemetry&lt;/strong&gt;, no usage tracking, no analytics.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Query logging&lt;/strong&gt; — every &lt;code&gt;graphify query&lt;/code&gt;, &lt;code&gt;graphify path&lt;/code&gt;, &lt;code&gt;graphify explain&lt;/code&gt;, and MCP &lt;code&gt;query_graph&lt;/code&gt; call is logged to &lt;code&gt;~/.cache/graphify-queries.log&lt;/code&gt; in JSON Lines format (timestamp, question, corpus, nodes returned, duration). Full subgraph responses are &lt;strong&gt;not&lt;/strong&gt; stored by default. Set &lt;code&gt;GRAPHIFY_QUERY_LOG_DISABLE=1&lt;/code&gt; to opt out, or &lt;code&gt;GRAPHIFY_QUERY_LOG=/dev/null&lt;/code&gt; to silence without disabling the code path.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Troubleshooting&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;&lt;code&gt;graphify: command not found&lt;/code&gt; after installing&lt;/strong&gt; The CLI is installed but its bin directory isn&#39;t on your shell&#39;s &lt;code&gt;PATH&lt;/code&gt;. Pick the fix for how you installed:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;uv&lt;/strong&gt; (&lt;code&gt;uv tool install graphifyy&lt;/code&gt;): the command lands in uv&#39;s tool bin dir (&lt;code&gt;~/.local/bin&lt;/code&gt;), which a fresh macOS/zsh setup often doesn&#39;t have on &lt;code&gt;PATH&lt;/code&gt;. Run &lt;code&gt;uv tool update-shell&lt;/code&gt;, then open a new terminal. (Find the dir with &lt;code&gt;uv tool dir --bin&lt;/code&gt;.)&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;pipx&lt;/strong&gt; (&lt;code&gt;pipx install graphifyy&lt;/code&gt;): run &lt;code&gt;pipx ensurepath&lt;/code&gt;, then open a new terminal.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;pip&lt;/strong&gt; (&lt;code&gt;pip install graphifyy&lt;/code&gt;): pip installs scripts to a user bin dir that may not be on &lt;code&gt;PATH&lt;/code&gt; — add &lt;code&gt;~/Library/Python/3.x/bin&lt;/code&gt; (macOS) or &lt;code&gt;~/.local/bin&lt;/code&gt; (Linux) to your &lt;code&gt;PATH&lt;/code&gt; in &lt;code&gt;~/.zshrc&lt;/code&gt;/&lt;code&gt;~/.bashrc&lt;/code&gt;, or just run &lt;code&gt;python -m graphify&lt;/code&gt;.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong&gt;&lt;code&gt;uvx graphify …&lt;/code&gt; or &lt;code&gt;uv tool run graphify …&lt;/code&gt; fails to resolve &lt;code&gt;graphify&lt;/code&gt;&lt;/strong&gt; The PyPI package is &lt;code&gt;graphifyy&lt;/code&gt;; &lt;code&gt;graphify&lt;/code&gt; is only the command it provides. &lt;code&gt;uv tool run&lt;/code&gt; treats the first word as a &lt;em&gt;package name&lt;/em&gt;, so it looks for a package called &lt;code&gt;graphify&lt;/code&gt; and reports &lt;code&gt;No solution found … no versions of graphify&lt;/code&gt;. Name the package explicitly: &lt;code&gt;uvx --from graphifyy graphify install&lt;/code&gt; (same as &lt;code&gt;uv tool run --from graphifyy graphify install&lt;/code&gt;). Or &lt;code&gt;uv tool install graphifyy&lt;/code&gt; once and then call &lt;code&gt;graphify&lt;/code&gt; directly.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;code&gt;uv run --with graphifyy python -m graphify&lt;/code&gt; silently runs an older install&lt;/strong&gt; &lt;code&gt;uv run&lt;/code&gt; uses your &lt;em&gt;system&lt;/em&gt; Python, so if an older &lt;code&gt;graphifyy&lt;/code&gt; also lives there (e.g. a past &lt;code&gt;pip install graphifyy&lt;/code&gt;), Python can find that copy first on &lt;code&gt;sys.path&lt;/code&gt; and &lt;code&gt;--with graphifyy&lt;/code&gt; won&#39;t override it. It runs with no error, but you get the &lt;em&gt;old&lt;/em&gt; version&#39;s behavior — e.g. env overrides like &lt;code&gt;OPENAI_BASE_URL&lt;/code&gt; are silently ignored, so requests hit the default endpoint and fail with a 401 that looks like a bad key. The fingerprint is a &lt;code&gt;warning: skill is from graphify &amp;lt;newer&amp;gt;, package is &amp;lt;older&amp;gt;&lt;/code&gt; line — that means a different install was loaded, not just a stale skill. Check which copy actually loaded:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;python -c &quot;import graphify; print(graphify.__file__)&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Then run the installed command directly (it uses the uv-managed copy), or drop the stale system copy:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;uvx --from graphifyy graphify extract . --backend openai   # names the package explicitly
pip uninstall graphifyy                                    # or remove the old system install
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;code&gt;python -m graphify&lt;/code&gt; works but &lt;code&gt;graphify&lt;/code&gt; command doesn&#39;t&lt;/strong&gt; Your shell&#39;s &lt;code&gt;PATH&lt;/code&gt; doesn&#39;t include the bin directory the command was installed to. Prefer &lt;code&gt;uv tool install&lt;/code&gt; / &lt;code&gt;pipx install&lt;/code&gt; over plain &lt;code&gt;pip&lt;/code&gt;, then run &lt;code&gt;uv tool update-shell&lt;/code&gt; / &lt;code&gt;pipx ensurepath&lt;/code&gt; and open a new terminal (see the install notes above).&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;code&gt;/graphify .&lt;/code&gt; causes &quot;path not recognized&quot; in PowerShell&lt;/strong&gt; PowerShell treats a leading &lt;code&gt;/&lt;/code&gt; as a path separator. Use &lt;code&gt;graphify .&lt;/code&gt; (no slash) on Windows.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Graph has fewer nodes after &lt;code&gt;--update&lt;/code&gt; or rebuild&lt;/strong&gt; If a refactor deleted files, the old nodes linger. Pass &lt;code&gt;--force&lt;/code&gt; (or set &lt;code&gt;GRAPHIFY_FORCE=1&lt;/code&gt;) to overwrite even when the rebuild has fewer nodes.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;code&gt;extract&lt;/code&gt; exits with &quot;extraction was incomplete ... refusing to overwrite&quot;&lt;/strong&gt; When an extraction pass crashes or a walk can&#39;t fully read the corpus, the run would be smaller than a complete one, so &lt;code&gt;graphify extract&lt;/code&gt; refuses to overwrite a larger existing graph with the partial result (protecting your &lt;code&gt;graph.json&lt;/code&gt;). Fix the underlying failure and re-run, or pass &lt;code&gt;--allow-partial&lt;/code&gt; to overwrite anyway.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Graph has duplicate nodes for the same entity (ghost duplicates)&lt;/strong&gt; Ghost duplicates (same symbol appearing twice — once from AST extraction with a source location, once from semantic extraction without) are now automatically merged at build time. If you see this in a graph built before v0.8.33, run a full re-extract to clean up:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;graphify extract . --force
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;Ollama runs out of VRAM / context window exceeded&lt;/strong&gt; The KV-cache window is auto-sized but may be too large for your GPU. Reduce it:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;GRAPHIFY_OLLAMA_NUM_CTX=8192 graphify extract ./docs --backend ollama --token-budget 4000
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;code&gt;LLM returned invalid JSON&lt;/code&gt; / &lt;code&gt;Unterminated string&lt;/code&gt; warnings&lt;/strong&gt; The model&#39;s JSON response hit its output-token limit and was cut off mid-string. graphify auto-recovers (it splits the chunk and re-extracts the halves, and an oversized single document is first sliced at heading/paragraph boundaries so the whole file is still covered), so these warnings are noisy but not data loss. To reduce the churn, raise the output cap or shrink each chunk&#39;s output:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;GRAPHIFY_MAX_OUTPUT_TOKENS=16384 graphify extract . --mode deep   # lift the cap
graphify extract . --mode deep --token-budget 4000                # smaller input chunks -&amp;gt; smaller output
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;With a cloud gateway like OpenRouter, prefer &lt;code&gt;--backend openai&lt;/code&gt; (set &lt;code&gt;OPENAI_BASE_URL&lt;/code&gt;) over the Ollama shim — it&#39;s a cleaner OpenAI-compatible path. If the model has its own max-output ceiling, lowering &lt;code&gt;--token-budget&lt;/code&gt; is the reliable lever.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Graph HTML is too large to open in a browser (&amp;gt;5000 nodes)&lt;/strong&gt; Skip HTML generation and use the JSON directly:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;graphify cluster-only ./my-project --no-viz
graphify query &quot;...&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;code&gt;graph.json&lt;/code&gt; has conflict markers after two devs commit at once&lt;/strong&gt; Run &lt;code&gt;graphify hook install&lt;/code&gt; — it sets up a git merge driver that union-merges &lt;code&gt;graph.json&lt;/code&gt; automatically so conflicts never happen.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Extraction returns empty nodes/edges for docs or PDFs&lt;/strong&gt; Docs, PDFs, and images require an LLM call — code-only corpora need no key. Check that your API key is set and the backend is correct:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ANTHROPIC_API_KEY=sk-... graphify extract ./docs --backend claude
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;Skill version mismatch warning in your IDE&lt;/strong&gt; Your installed graphify version is different from the skill file. Update:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;uv tool upgrade graphifyy
graphify install  # overwrites the skill file
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;Claude Code prompt cache invalidated after every &lt;code&gt;graphify extract&lt;/code&gt;&lt;/strong&gt; Graphify writes output files (&lt;code&gt;graph.json&lt;/code&gt;, &lt;code&gt;graphify-out/&lt;/code&gt;) into the workspace. If those paths aren&#39;t ignored, every write invalidates Claude Code&#39;s prompt cache, forcing a full re-upload at cache-write rates on the next turn. Add them to &lt;code&gt;.claudeignore&lt;/code&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;# .claudeignore
graph.json
graphify-out/
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Full command reference&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;/graphify                          # run on current directory
/graphify ./raw                    # run on a specific folder
/graphify ./raw --mode deep        # more aggressive relationship extraction
graphify extract ./raw --code-only # index code only — local AST, no API key (skips docs/PDFs/images); an `extract` flag, not a skill flag
/graphify ./raw --update           # re-extract only changed files
/graphify ./raw --directed         # preserve edge direction
/graphify ./raw --cluster-only     # rerun clustering on existing graph
/graphify ./raw --no-viz           # skip HTML visualization
/graphify ./raw --obsidian         # generate Obsidian vault
/graphify ./raw --obsidian --obsidian-dir ~/vault  # write into an existing vault (never overwrites your own notes or .obsidian config)
/graphify ./raw --wiki             # build agent-crawlable markdown wiki
/graphify ./raw --svg              # export graph.svg
/graphify ./raw --graphml          # export for Gephi / yEd
/graphify ./raw --neo4j            # generate cypher.txt for Neo4j
/graphify ./raw --neo4j-push bolt://localhost:7687
/graphify ./raw --falkordb         # generate cypher.txt for FalkorDB
/graphify ./raw --falkordb-push falkordb://localhost:6379
/graphify ./raw --watch            # auto-sync as files change
/graphify ./raw --mcp              # start MCP stdio server

/graphify add https://arxiv.org/abs/1706.03762
/graphify add &amp;lt;video-url&amp;gt;
/graphify add https://... --author &quot;Name&quot; --contributor &quot;Name&quot;

/graphify query &quot;what connects attention to the optimizer?&quot;
/graphify query &quot;...&quot; --dfs --budget 1500
/graphify path &quot;DigestAuth&quot; &quot;Response&quot;
/graphify explain &quot;SwinTransformer&quot;

graphify save-result --question &quot;Q&quot; --answer &quot;A&quot; --nodes Foo Bar --outcome useful   # record how a Q&amp;amp;A turned out (work memory; outcome ∈ useful|dead_end|corrected)
graphify reflect                   # aggregate graphify-out/memory/ outcomes into reflections/LESSONS.md
graphify reflect --if-stale        # no-op when LESSONS.md is already newer than every input (cheap to run each session)
graphify reflect --out docs/LESSONS.md    # write the lessons doc somewhere else
graphify reflect --graph graphify-out/graph.json  # group lessons by community + write the work-memory overlay (.graphify_learning.json)
                                   # the overlay tags nodes preferred/tentative/contested (recency-weighted, with provenance);
                                   # graphify explain / query then show a &quot;Lesson:&quot; hint, flagged &quot;code changed — re-verify&quot; when the source moved on

graphify uninstall                 # remove from all platforms in one shot
graphify uninstall --purge         # also delete graphify-out/
graphify uninstall --project --platform codex  # remove project-scoped install files only

graphify hook install              # post-commit + post-checkout hooks
graphify hook uninstall
graphify hook status

# always-on assistant instructions - platform-specific
graphify claude install            # CLAUDE.md + PreToolUse hook (Claude Code)
graphify claude uninstall
graphify codebuddy install         # CODEBUDDY.md + PreToolUse hook (CodeBuddy)
graphify codebuddy uninstall
graphify codex install             # AGENTS.md + PreToolUse hook in .codex/hooks.json (Codex)
graphify opencode install          # AGENTS.md + tool.execute.before plugin (OpenCode)
graphify kilo install              # native Kilo skill + /graphify command + AGENTS.md + .kilo plugin
graphify kilo uninstall
graphify cursor install            # .cursor/rules/graphify.mdc (Cursor)
graphify cursor uninstall
graphify gemini install            # GEMINI.md + BeforeTool hook (Gemini CLI)
graphify gemini uninstall
graphify copilot install           # skill file (GitHub Copilot CLI)
graphify copilot uninstall
graphify aider install             # AGENTS.md (Aider)
graphify aider uninstall
graphify claw install              # AGENTS.md (OpenClaw)
graphify claw uninstall
graphify droid install             # AGENTS.md (Factory Droid)
graphify droid uninstall
graphify trae install              # AGENTS.md (Trae)
graphify trae uninstall
graphify trae-cn install           # AGENTS.md (Trae CN)
graphify trae-cn uninstall
graphify hermes install             # AGENTS.md + ~/.hermes/skills/ (Hermes)
graphify hermes uninstall
graphify amp install               # skill file (Amp)
graphify amp uninstall
graphify agents install            # ~/.agents/skills/ + AGENTS.md (cross-framework; alias: graphify skills)
graphify agents uninstall
graphify kiro install               # .kiro/skills/ + .kiro/steering/graphify.md (Kiro IDE/CLI)
graphify kiro uninstall
graphify pi install                # skill file (Pi coding agent)
graphify pi uninstall
graphify devin install             # skill file + .windsurf/rules/graphify.md (Devin CLI)
graphify devin uninstall
graphify antigravity install       # .agents/rules + .agents/workflows (Google Antigravity)
graphify antigravity uninstall

graphify extract ./docs                        # headless LLM extraction for CI (no IDE needed)
graphify extract ./docs --backend gemini       # explicit backend: gemini, kimi, claude, openai, deepseek, ollama, bedrock, or claude-cli
graphify extract ./docs --backend gemini --model gemini-3.1-pro-preview
graphify extract ./docs --backend ollama       # local Ollama (set OLLAMA_BASE_URL / OLLAMA_MODEL) - no API key needed for loopback
OPENAI_BASE_URL=http://localhost:8080/v1 OPENAI_MODEL=my-model graphify extract ./docs --backend openai   # any OpenAI-compatible server (llama.cpp, vLLM, LM Studio)
ANTHROPIC_BASE_URL=http://localhost:4000 ANTHROPIC_MODEL=my-model graphify extract ./docs --backend claude   # any Anthropic-compatible endpoint (LiteLLM proxy, gateways)
GRAPHIFY_OLLAMA_NUM_CTX=32768 graphify extract ./docs --backend ollama   # override KV-cache window (auto-sized by default)
GRAPHIFY_OLLAMA_KEEP_ALIVE=0 graphify extract ./docs --backend ollama    # unload model after each chunk (saves VRAM on small GPUs)
graphify extract ./docs --backend bedrock      # AWS Bedrock via IAM - no API key, uses AWS credential chain
graphify extract ./docs --backend claude-cli   # route through Claude Code CLI - no API key, uses your Claude subscription
graphify extract ./docs --backend azure        # Azure OpenAI (set AZURE_OPENAI_API_KEY + AZURE_OPENAI_ENDPOINT)
graphify extract ./docs --max-workers 16       # AST parallelism (also GRAPHIFY_MAX_WORKERS)
graphify extract --postgres &quot;postgresql://user:pass@host/db&quot;   # introspect live PostgreSQL schema directly
graphify extract ./my-workspace --cargo        # introspect Rust Cargo workspace dependencies directly
graphify extract ./docs --token-budget 30000   # smaller semantic chunks for local/small models
graphify extract ./docs --max-concurrency 2    # fewer parallel LLM calls (useful for local inference)
graphify extract ./docs --api-timeout 900      # longer HTTP timeout for slow local models (default 600s)
graphify extract ./docs --google-workspace     # export .gdoc/.gsheet/.gslides via gws before extraction
graphify extract ./src --no-gitignore          # include git-ignored source; still honor .graphifyignore
graphify extract ./docs --mode deep            # richer semantic extraction via extended system prompt
graphify extract ./docs --no-cluster           # raw extraction only, skip clustering
graphify extract ./docs --timing               # print per-stage wall-clock timings to stderr (also works on cluster-only)
graphify extract ./docs --force                # overwrite graph.json even if new graph has fewer nodes (use after refactors or to clear ghost duplicates)
graphify extract ./docs --dedup-llm            # LLM tiebreaker for ambiguous entity pairs (uses same API key)
graphify extract ./docs --global --as myrepo   # extract and register into the cross-project global graph
GRAPHIFY_MAX_OUTPUT_TOKENS=32768 graphify extract ./docs --backend claude  # raise output cap for dense corpora

graphify export callflow-html                       # graphify-out/&amp;lt;project&amp;gt;-callflow.html
graphify export callflow-html --max-sections 8      # cap generated architecture sections
graphify export callflow-html --output docs/arch.html
graphify export callflow-html ./some-repo/graphify-out

graphify global add graphify-out/graph.json --as myrepo   # register a project graph into ~/.graphify/global-graph.json
graphify global remove myrepo                         # remove a project from the global graph
graphify global list                                  # show all registered repos + node/edge counts
graphify global path                                  # print path to the global graph file

graphify prs                              # PR dashboard: CI, review, worktree, graph impact
graphify prs 42                           # deep dive on PR #42
graphify prs --triage                     # AI triage ranking (auto-detects backend from env)
graphify prs --worktrees                  # worktree → branch → PR mapping
graphify prs --conflicts                  # PRs sharing graph communities (merge-order risk)
graphify prs --base main                  # filter to PRs targeting a specific base branch
graphify prs --repo owner/repo            # run against a different GitHub repo
GRAPHIFY_TRIAGE_BACKEND=kimi graphify prs --triage   # use a specific backend for triage

graphify clone https://github.com/karpathy/nanoGPT
graphify merge-graphs a.json b.json --out merged.json
graphify --version                                    # print installed version
graphify watch ./src
graphify check-update ./src
graphify update ./src
graphify update ./src --no-cluster  # skip reclustering, write raw AST graph only
graphify update ./src --force       # overwrite even if new graph has fewer nodes
graphify cluster-only ./my-project
graphify cluster-only ./my-project --graph path/to/graph.json  # custom graph location
graphify cluster-only ./my-project --max-concurrency 16 --batch-size 200  # parallel community labeling (large graphs)
graphify cluster-only ./my-project --resolution 1.5            # more, smaller communities
graphify cluster-only ./my-project --exclude-hubs 99           # exclude p99 degree nodes from partitioning
graphify cluster-only ./my-project --no-label                  # keep &quot;Community N&quot; placeholders
graphify cluster-only ./my-project --backend=gemini            # backend for community naming
graphify cluster-only ./my-project --backend=gemini --model gemini-2.5-pro  # specific model
graphify label ./my-project                                    # (re)name communities with the configured backend
graphify label ./my-project --backend=openai --model gpt-4o   # force a specific backend and model
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;Community names:&lt;/strong&gt; inside an agent (Claude Code, Gemini CLI) the agent names communities itself. When you run the bare CLI, &lt;code&gt;cluster-only&lt;/code&gt; auto-names them with the configured backend (built-in or custom OpenAI-compatible provider) — pass &lt;code&gt;--no-label&lt;/code&gt; to keep &lt;code&gt;Community N&lt;/code&gt;, or run &lt;code&gt;graphify label&lt;/code&gt; to (re)generate names on demand.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Learn more&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/how-it-works.md&quot;&gt;How it works&lt;/a&gt; — the extraction pipeline, community detection, confidence scoring, benchmarks&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/ARCHITECTURE.md&quot;&gt;ARCHITECTURE.md&lt;/a&gt; — module breakdown, how to add a language&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/docs/docker-mcp-sqlite.md&quot;&gt;Optional integrations&lt;/a&gt; — Docker MCP Toolkit + SQLite&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://safishamsi.gumroad.com/l/qetvlo&quot;&gt;The Memory Layer&lt;/a&gt; — the book on the ideas behind graphify, the architecture end to end&lt;/li&gt; 
&lt;/ul&gt; 
&lt;hr /&gt; 
&lt;h2&gt;graphify Enterprise&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://graphify.com&quot;&gt;&lt;strong&gt;graphify Enterprise&lt;/strong&gt;&lt;/a&gt; is the always-on layer built on top of graphify — it applies the same graph approach to your entire working context: meetings, files, docs, and code, updating continuously in the background.&lt;/p&gt; 
&lt;p&gt;Built for people and teams whose work lives across hundreds of conversations and documents they can never fully reconstruct.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://graphify.com&quot;&gt;Join the waitlist at graphify.com&lt;/a&gt;.&lt;/strong&gt; Free trial launching soon.&lt;/p&gt; 
&lt;hr /&gt; 
&lt;details&gt; 
 &lt;summary&gt;Contributing&lt;/summary&gt; 
 &lt;h3&gt;Development setup&lt;/h3&gt; 
 &lt;p&gt;The project uses &lt;a href=&quot;https://docs.astral.sh/uv/&quot;&gt;uv&lt;/a&gt; for dev workflow. Install it once, then:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/safishamsi/graphify.git
cd graphify
git checkout v8                        # active development branch

# Create the project venv and install graphify + all extras + the dev group
# (pytest). uv installs the dev dependency group by default; pass --no-dev to
# skip it.
uv sync --all-extras
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;Verify the editable install:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;uv run graphify --version
uv run python -c &quot;import graphify; print(graphify.__file__)&quot;
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h3&gt;Running tests&lt;/h3&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;uv run pytest tests/ -q                # run the full suite
uv run pytest tests/test_extract.py -q # one module
uv run pytest tests/ -q -k &quot;python&quot;    # filter by name
&lt;/code&gt;&lt;/pre&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;macOS note: the test suite includes both &lt;code&gt;sample.f90&lt;/code&gt; and &lt;code&gt;sample.F90&lt;/code&gt; fixtures. These collide on case-insensitive HFS+ / APFS file systems. Run on Linux or in a Docker container if you need to test both Fortran variants simultaneously.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;h3&gt;Git workflow&lt;/h3&gt; 
 &lt;ul&gt; 
  &lt;li&gt;Active development happens on the &lt;code&gt;v8&lt;/code&gt; branch.&lt;/li&gt; 
  &lt;li&gt;Commit style: &lt;code&gt;fix: &amp;lt;description&amp;gt;&lt;/code&gt; / &lt;code&gt;feat: &amp;lt;description&amp;gt;&lt;/code&gt; / &lt;code&gt;docs: &amp;lt;description&amp;gt;&lt;/code&gt;&lt;/li&gt; 
  &lt;li&gt;Before opening a PR, run &lt;code&gt;uv run pytest tests/ -q&lt;/code&gt; and confirm it passes.&lt;/li&gt; 
  &lt;li&gt;Add a fixture file to &lt;code&gt;tests/fixtures/&lt;/code&gt; and tests to &lt;code&gt;tests/test_languages.py&lt;/code&gt; for any new language extractor.&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;h3&gt;What to contribute&lt;/h3&gt; 
 &lt;p&gt;&lt;strong&gt;Worked examples&lt;/strong&gt; are the most useful contribution. Run &lt;code&gt;/graphify&lt;/code&gt; on a real corpus, save the output to &lt;code&gt;worked/{slug}/&lt;/code&gt;, write an honest &lt;code&gt;review.md&lt;/code&gt; covering what the graph got right and wrong, and open a PR.&lt;/p&gt; 
 &lt;p&gt;&lt;strong&gt;Extraction bugs&lt;/strong&gt; — open an issue with the input file, the cache entry (&lt;code&gt;graphify-out/cache/&lt;/code&gt;), and what was missed or wrong.&lt;/p&gt; 
 &lt;p&gt;See &lt;a href=&quot;https://raw.githubusercontent.com/Graphify-Labs/graphify/v8/ARCHITECTURE.md&quot;&gt;ARCHITECTURE.md&lt;/a&gt; for module responsibilities and how to add a language.&lt;/p&gt; 
&lt;/details&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Community and links&lt;/h2&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://graphify.com&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Website-graphify.com-4c1?style=flat&amp;amp;logo=googlechrome&amp;amp;logoColor=white&quot; alt=&quot;Website&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://discord.gg/598Ad9zQZ&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Discord-Join-5865F2?style=flat&amp;amp;logo=discord&amp;amp;logoColor=white&quot; alt=&quot;Discord&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://x.com/graphify&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/X-graphify-000000?logo=x&amp;amp;logoColor=white&quot; alt=&quot;X&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/sponsors/safishamsi&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/sponsor-safishamsi-ea4aaa?logo=github-sponsors&quot; alt=&quot;Sponsor&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://safishamsi.gumroad.com/l/qetvlo&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Book-The%20Memory%20Layer-2ea44f?style=flat&amp;amp;logo=gitbook&amp;amp;logoColor=white&quot; alt=&quot;The Memory Layer&quot; /&gt;&lt;/a&gt; &lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/258c9cb2f9deab9891c1f11cb9dab6bd72befd2eda649f1df953948f0cce5163/Graphify-Labs/graphify" medium="image" />
      
    </item>
    
    <item>
      <title>usestrix/strix</title>
      <link>https://github.com/usestrix/strix</link>
      <description>&lt;p&gt;Open-source AI penetration testing tool to find and fix your app’s vulnerabilities.&lt;/p&gt;&lt;hr&gt;&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://strix.ai/&quot;&gt; &lt;img src=&quot;https://github.com/usestrix/.github/raw/main/imgs/cover.png&quot; alt=&quot;Strix Banner&quot; width=&quot;100%&quot; /&gt; &lt;/a&gt; &lt;/p&gt; 
&lt;div align=&quot;center&quot;&gt; 
 &lt;h1&gt;Strix&lt;/h1&gt; 
 &lt;h3&gt;The open-source AI pentesting tool. Autonomous AI hackers that find and fix your app’s vulnerabilities.&lt;/h3&gt; 
 &lt;br /&gt; 
 &lt;p&gt;&lt;a href=&quot;https://docs.strix.ai&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Docs-docs.strix.ai-2b9246?style=for-the-badge&amp;amp;logo=gitbook&amp;amp;logoColor=white&quot; alt=&quot;Docs&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://strix.ai&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Website-strix.ai-f0f0f0?style=for-the-badge&amp;amp;logoColor=000000&quot; alt=&quot;Website&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://discord.gg/strix-ai&quot;&gt;&lt;img src=&quot;https://dcbadge.limes.pink/api/server/strix-ai&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;a href=&quot;https://deepwiki.com/usestrix/strix&quot;&gt;&lt;img src=&quot;https://deepwiki.com/badge.svg?sanitize=true&quot; alt=&quot;Ask DeepWiki&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/usestrix/strix&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/usestrix/strix?style=flat-square&quot; alt=&quot;GitHub Stars&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://raw.githubusercontent.com/usestrix/strix/main/LICENSE&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/License-Apache%202.0-3b82f6?style=flat-square&quot; alt=&quot;License&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://pypi.org/project/strix-agent/&quot;&gt;&lt;img src=&quot;https://img.shields.io/pypi/v/strix-agent?style=flat-square&quot; alt=&quot;PyPI Version&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;a href=&quot;https://discord.gg/strix-ai&quot;&gt;&lt;img src=&quot;https://github.com/usestrix/.github/raw/main/imgs/Discord.png&quot; height=&quot;40&quot; alt=&quot;Join Discord&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://x.com/strix_ai&quot;&gt;&lt;img src=&quot;https://github.com/usestrix/.github/raw/main/imgs/X.png&quot; height=&quot;40&quot; alt=&quot;Follow on X&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;a href=&quot;https://trendshift.io/repositories/15362?utm_source=trendshift-badge&amp;amp;utm_medium=badge&amp;amp;utm_campaign=badge-trendshift-15362&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;img src=&quot;https://trendshift.io/api/badge/trendshift/repositories/15362/weekly&quot; alt=&quot;usestrix%2Fstrix | Trendshift&quot; width=&quot;250&quot; height=&quot;55&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://trendshift.io/repositories/15362&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://trendshift.io/api/badge/repositories/15362&quot; alt=&quot;usestrix/strix | Trendshift&quot; width=&quot;250&quot; height=&quot;55&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;/div&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-tip&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-light-bulb mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Tip&lt;/p&gt;
 &lt;p&gt;&lt;strong&gt;New!&lt;/strong&gt; Strix integrates seamlessly with GitHub Actions and CI/CD pipelines. Automatically scan for vulnerabilities on every pull request and block insecure code before it reaches production - &lt;a href=&quot;https://app.strix.ai&quot;&gt;Get started with no setup required&lt;/a&gt;.&lt;/p&gt; 
&lt;/div&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Strix Overview&lt;/h2&gt; 
&lt;p&gt;Strix are autonomous AI penetration testing agents that act just like real hackers - they run your code dynamically, find vulnerabilities, and validate them through actual proofs-of-concept. Built for developers and security teams who need fast, accurate security testing without the overhead of manual pentesting or the false positives of static analysis tools.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Key Capabilities:&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Full pentesting toolkit&lt;/strong&gt; - reconnaissance, exploitation, and validation out of the box&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Multi-agent orchestration&lt;/strong&gt; - teams of AI pentesters that collaborate and scale&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Real exploit validation&lt;/strong&gt; - working PoCs, not false positives like legacy vulnerability scanners&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Developer‑first CLI&lt;/strong&gt; - actionable findings with remediation guidance&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Auto‑fix &amp;amp; reporting&lt;/strong&gt; - generate patches and compliance-ready pentest reports&lt;/li&gt; 
&lt;/ul&gt; 
&lt;br /&gt; 
&lt;div align=&quot;center&quot;&gt; 
 &lt;a href=&quot;https://strix.ai&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/usestrix/strix/main/.github/screenshot.png&quot; alt=&quot;Strix Demo&quot; width=&quot;1000&quot; style=&quot;border-radius: 16px;&quot; /&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;h2&gt;Use Cases&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Application Security Testing&lt;/strong&gt; - Detect and validate critical vulnerabilities in your applications&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Rapid Penetration Testing&lt;/strong&gt; - Get penetration tests done in hours, not weeks, with compliance reports&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Bug Bounty Automation&lt;/strong&gt; - Automate bug bounty research and generate PoCs for faster reporting&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;CI/CD Integration&lt;/strong&gt; - Run tests in CI/CD to block vulnerabilities before reaching production&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;🚀 Quick Start&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Docker (running)&lt;/li&gt; 
 &lt;li&gt;An LLM API key from any &lt;a href=&quot;https://docs.strix.ai/llm-providers/overview&quot;&gt;supported provider&lt;/a&gt; (OpenAI, Anthropic, Google, etc.)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Installation &amp;amp; First Scan&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Install Strix
curl -sSL https://strix.ai/install | bash

# Configure your AI provider
export STRIX_LLM=&quot;openai/gpt-5.4&quot;
export LLM_API_KEY=&quot;your-api-key&quot;

# Run your first security assessment
strix --target ./app-directory
&lt;/code&gt;&lt;/pre&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-note&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-info mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Note&lt;/p&gt;
 &lt;p&gt;First run automatically pulls the sandbox Docker image. Results are saved to &lt;code&gt;strix_runs/&amp;lt;run-name&amp;gt;&lt;/code&gt;&lt;/p&gt; 
&lt;/div&gt; 
&lt;hr /&gt; 
&lt;h2&gt;☁️ Strix Platform&lt;/h2&gt; 
&lt;p&gt;Try the Strix full-stack penetration testing platform at &lt;strong&gt;&lt;a href=&quot;https://app.strix.ai&quot;&gt;app.strix.ai&lt;/a&gt;&lt;/strong&gt; - sign up for free, connect your repos and domains, and launch a pentest in minutes.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Validated findings with PoCs&lt;/strong&gt; - every vulnerability includes a working proof-of-concept exploit and reproduction steps&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;One-click autofix&lt;/strong&gt; - AI-generated security patches as ready-to-merge pull requests&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Continuous pentesting&lt;/strong&gt; - always-on vulnerability scanning that keeps pace with your deployments&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;DevSecOps integrations&lt;/strong&gt; - GitHub, GitLab, Bitbucket, Slack, Jira, Linear, and CI/CD pipelines&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Continuous learning&lt;/strong&gt; - AI that builds on past findings, adapts to your codebase, and reduces false positives over time&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;a href=&quot;https://app.strix.ai&quot;&gt;&lt;strong&gt;Start your first pentest →&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;🤖 Use Strix from Your Coding Agent&lt;/h2&gt; 
&lt;p&gt;Strix is agent-ready. Give Claude Code, Cursor, Codex, or any &lt;a href=&quot;https://agentskills.io&quot;&gt;SKILL.md-compatible&lt;/a&gt; agent the ability to run pentests, fix findings, and set up CI scanning:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npx skills add usestrix/strix
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This installs four skills: &lt;strong&gt;penetration-testing-with-strix&lt;/strong&gt; (run headless scans and read results), &lt;strong&gt;managed-pentesting-with-strix&lt;/strong&gt; (drive the managed &lt;a href=&quot;https://app.strix.ai&quot;&gt;app.strix.ai&lt;/a&gt; platform via REST — no local Docker or LLM key), &lt;strong&gt;fix-security-vulnerabilities-with-strix&lt;/strong&gt; (remediate + re-scan to verify), and &lt;strong&gt;ci-security-scanning-with-strix&lt;/strong&gt; (PR scanning in CI). Agents can run Strix two ways with the same engine — the open-source CLI locally, or the managed cloud when there&#39;s no local infra — and read &lt;a href=&quot;https://raw.githubusercontent.com/usestrix/strix/main/AGENTS.md&quot;&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/a&gt; for a quick reference, &lt;a href=&quot;https://docs.strix.ai/llms.txt&quot;&gt;docs.strix.ai/llms.txt&lt;/a&gt; for the CLI docs, and &lt;a href=&quot;https://docs.app.strix.ai&quot;&gt;docs.app.strix.ai&lt;/a&gt; for the API.&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;✨ Features&lt;/h2&gt; 
&lt;h3&gt;Agentic Pentesting Tools&lt;/h3&gt; 
&lt;p&gt;Strix agents come equipped with a comprehensive offensive security toolkit - the same tools used by professional penetration testers and ethical hackers:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;HTTP Interception Proxy&lt;/strong&gt; - Full request/response manipulation and analysis with Caido&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Browser Exploitation&lt;/strong&gt; - Automated browser for testing XSS, CSRF, clickjacking, and auth bypass flows&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Shell &amp;amp; Command Execution&lt;/strong&gt; - Interactive terminal for exploit development and post-exploitation&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Custom Exploit Runtime&lt;/strong&gt; - Python sandbox for writing and validating proof-of-concept exploits&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Reconnaissance &amp;amp; OSINT&lt;/strong&gt; - Automated attack surface mapping, subdomain enumeration, and fingerprinting&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Static &amp;amp; Dynamic Code Analysis&lt;/strong&gt; - SAST + DAST capabilities for comprehensive application security testing&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Vulnerability Knowledge Base&lt;/strong&gt; - Structured findings with CVSS scoring and OWASP classification&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Comprehensive Vulnerability Scanner&lt;/h3&gt; 
&lt;p&gt;Strix identifies, validates, and exploits a wide range of security vulnerabilities across the OWASP Top 10 and beyond:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Broken Access Control&lt;/strong&gt; - IDOR, privilege escalation, auth bypass&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Injection Attacks&lt;/strong&gt; - SQL injection, NoSQL injection, OS command injection, SSTI&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Server-Side Vulnerabilities&lt;/strong&gt; - SSRF, XXE, insecure deserialization, RCE&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Client-Side Attacks&lt;/strong&gt; - XSS (stored/reflected/DOM), prototype pollution, CSRF&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Business Logic Flaws&lt;/strong&gt; - Race conditions, payment manipulation, workflow bypass&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Authentication &amp;amp; Session&lt;/strong&gt; - JWT attacks, session fixation, credential stuffing vectors&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Infrastructure &amp;amp; Cloud&lt;/strong&gt; - Misconfigurations, exposed services, cloud security issues&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;API Security&lt;/strong&gt; - Broken authentication, mass assignment, rate limiting bypass&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Graph of Agents (Multi-Agent Pentesting)&lt;/h3&gt; 
&lt;p&gt;Advanced multi-agent orchestration for comprehensive automated penetration testing:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Distributed Pentesting&lt;/strong&gt; - Specialized AI agents for recon, exploitation, and post-exploitation&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Scalable Security Testing&lt;/strong&gt; - Parallel execution across multiple targets for fast, comprehensive coverage&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Dynamic Coordination&lt;/strong&gt; - Agents share discoveries, chain vulnerabilities, and collaborate like a red team&lt;/li&gt; 
&lt;/ul&gt; 
&lt;hr /&gt; 
&lt;h2&gt;🖥️ Local Web Viewer&lt;/h2&gt; 
&lt;p&gt;Every scan writes its results to disk as it runs. Bring them up in a local dashboard with a single command:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Open the most recent run
strix view

# ...or open a specific run by name
strix view my-run-name
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;strix view&lt;/code&gt; starts a lightweight local server (bound to &lt;code&gt;127.0.0.1&lt;/code&gt; on a random port) and opens your browser to a private, tokened link. Nothing leaves your machine: the dashboard reads the run&#39;s files straight off disk, with no cloud account or upload required. The UI ships prebuilt with Strix, so there is no extra install and no JS build step.&lt;/p&gt; 
&lt;h3&gt;What&#39;s in the dashboard&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Overview&lt;/strong&gt;: run status, target, and a severity breakdown of everything found so far.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Vulnerabilities&lt;/strong&gt;: each validated finding with its severity, details, and reproduction steps.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Agent graph&lt;/strong&gt;: a live map of the multi-agent team, showing which agent is doing what.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Steering&lt;/strong&gt;: send instructions to a live scan from the browser to redirect the agents mid-run.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;History&lt;/strong&gt;: browse past runs on this machine and jump between them.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Reports&lt;/strong&gt;: generate a shareable report and email it to yourself or your team.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Usage Examples&lt;/h2&gt; 
&lt;h3&gt;Basic Usage&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Scan a local codebase
strix --target ./app-directory

# Security review of a GitHub repository
strix --target https://github.com/org/repo

# Black-box web application assessment
strix --target https://your-app.com
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;API Testing (OpenAPI / Swagger / Postman)&lt;/h3&gt; 
&lt;p&gt;Point Strix at an API contract and it tests every declared endpoint instead of having to discover them by crawling. Pair the spec with the live base URL so the agent knows where to send traffic:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# OpenAPI / Swagger file (.json / .yaml)
strix --target ./openapi.yaml --target https://api.your-app.com

# Postman collection export
strix --target ./collection.postman_collection.json --target https://api.your-app.com

# Postman collection pulled live by id (no manual export)
export POSTMAN_API_KEY=&quot;PMAK-...&quot;
strix --target postman://&amp;lt;collection-uuid&amp;gt;

# ...with a Postman environment to resolve {{baseUrl}} / token variables
strix --target &quot;postman://&amp;lt;collection-uuid&amp;gt;?env=&amp;lt;environment-uuid&amp;gt;&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Advanced Testing Scenarios&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Grey-box authenticated testing
strix --target https://your-app.com --instruction &quot;Perform authenticated testing using credentials: user:pass&quot;

# Multi-target testing (source code + deployed app)
strix -t https://github.com/org/app -t https://your-app.com

# Targets from a file, one target per non-empty, non-comment line
strix --target-list ./targets.txt

# White-box source-aware scan (local repository)
strix --target ./app-directory --scan-mode standard

# Focused testing with custom instructions
strix --target api.your-app.com --instruction &quot;Focus on business logic flaws and IDOR vulnerabilities&quot;

# Provide detailed instructions through file (e.g., rules of engagement, scope, exclusions)
strix --target api.your-app.com --instruction-file ./instruction.md

# Force PR diff-scope against a specific base branch
strix -n --target ./ --scan-mode quick --scope-mode diff --diff-base origin/main
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Headless Mode&lt;/h3&gt; 
&lt;p&gt;Run Strix programmatically without interactive UI using the &lt;code&gt;-n/--non-interactive&lt;/code&gt; flag - perfect for servers and automated jobs. The CLI prints real-time vulnerability findings and the final report before exiting. Exits with non-zero code when vulnerabilities are found.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;strix -n --target https://your-app.com
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;CI/CD (GitHub Actions)&lt;/h3&gt; 
&lt;p&gt;Strix can be added to your pipeline to run a security test on pull requests with a lightweight GitHub Actions workflow:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;name: strix-penetration-test

on:
  pull_request:

jobs:
  security-scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0

      - name: Install Strix
        run: curl -sSL https://strix.ai/install | bash

      - name: Run Strix
        env:
          STRIX_LLM: ${{ secrets.STRIX_LLM }}
          LLM_API_KEY: ${{ secrets.LLM_API_KEY }}

        run: strix -n -t ./ --scan-mode quick
&lt;/code&gt;&lt;/pre&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-tip&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-light-bulb mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Tip&lt;/p&gt;
 &lt;p&gt;In CI pull request runs, Strix automatically scopes quick reviews to changed files. If diff-scope cannot resolve, ensure checkout uses full history (&lt;code&gt;fetch-depth: 0&lt;/code&gt;) or pass &lt;code&gt;--diff-base&lt;/code&gt; explicitly.&lt;/p&gt; 
&lt;/div&gt; 
&lt;h3&gt;Configuration&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;export STRIX_LLM=&quot;openai/gpt-5.4&quot;
export LLM_API_KEY=&quot;your-api-key&quot;

# Optional
export LLM_API_BASE=&quot;your-api-base-url&quot;  # if using a local model, e.g. Ollama, LMStudio
export PERPLEXITY_API_KEY=&quot;your-api-key&quot;  # for search capabilities
export STRIX_REASONING_EFFORT=&quot;high&quot;  # control thinking effort (default: high, quick scan: medium)
&lt;/code&gt;&lt;/pre&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-note&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-info mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Note&lt;/p&gt;
 &lt;p&gt;Strix automatically saves your configuration to &lt;code&gt;~/.strix/cli-config.json&lt;/code&gt;, so you don&#39;t have to re-enter it on every run.&lt;/p&gt; 
&lt;/div&gt; 
&lt;h4&gt;Sign in with a ChatGPT subscription&lt;/h4&gt; 
&lt;p&gt;Instead of a metered API key, you can run Strix on your ChatGPT Plus/Pro subscription:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;strix auth login chatgpt      # sign in with your ChatGPT account

export STRIX_LLM=&quot;chatgpt/gpt-5.4&quot;   # chatgpt/&amp;lt;model&amp;gt; runs on the subscription
strix --target ./app-directory

strix auth status             # show the active sign-in
strix auth logout             # forget the sign-in
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;Recommended models for best results:&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://openai.com/api/&quot;&gt;OpenAI GPT-5.4&lt;/a&gt; - &lt;code&gt;openai/gpt-5.4&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://claude.com/platform/api&quot;&gt;Anthropic Claude Sonnet 4.6&lt;/a&gt; - &lt;code&gt;anthropic/claude-sonnet-4-6&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://cloud.google.com/vertex-ai&quot;&gt;Google Gemini 3 Pro Preview&lt;/a&gt; - &lt;code&gt;vertex_ai/gemini-3-pro-preview&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;See the &lt;a href=&quot;https://docs.strix.ai/llm-providers/overview&quot;&gt;LLM Providers documentation&lt;/a&gt; for all supported providers including Vertex AI, Bedrock, Azure, and local models.&lt;/p&gt; 
&lt;h2&gt;Enterprise Pentesting&lt;/h2&gt; 
&lt;p&gt;Get the same Strix experience with &lt;a href=&quot;https://strix.ai/demo&quot;&gt;enterprise-grade&lt;/a&gt; controls: SSO (SAML/OIDC), custom compliance-ready penetration testing reports (SOC 2, ISO 27001, PCI DSS), dedicated support &amp;amp; SLA, custom deployment options (VPC/self-hosted), BYOK model support, and tailored AI pentesting agents optimized for your environment. &lt;a href=&quot;https://strix.ai/demo&quot;&gt;Learn more&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Documentation&lt;/h2&gt; 
&lt;p&gt;Full documentation is available at &lt;strong&gt;&lt;a href=&quot;https://docs.strix.ai&quot;&gt;docs.strix.ai&lt;/a&gt;&lt;/strong&gt; - including detailed guides for usage, CI/CD integrations, skills, and advanced configuration.&lt;/p&gt; 
&lt;h2&gt;Contributing&lt;/h2&gt; 
&lt;p&gt;We welcome contributions of code, docs, and new skills - check out our &lt;a href=&quot;https://docs.strix.ai/contributing&quot;&gt;Contributing Guide&lt;/a&gt; to get started or open a &lt;a href=&quot;https://github.com/usestrix/strix/pulls&quot;&gt;pull request&lt;/a&gt;/&lt;a href=&quot;https://github.com/usestrix/strix/issues&quot;&gt;issue&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Join Our Community&lt;/h2&gt; 
&lt;p&gt;Have questions? Found a bug? Want to contribute? &lt;strong&gt;&lt;a href=&quot;https://discord.gg/strix-ai&quot;&gt;Join our Discord!&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;h2&gt;Support the Project&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Love Strix?&lt;/strong&gt; Give us a ⭐ on GitHub!&lt;/p&gt; 
&lt;h2&gt;Acknowledgements&lt;/h2&gt; 
&lt;p&gt;Strix builds on the incredible work of open-source projects like &lt;a href=&quot;https://github.com/BerriAI/litellm&quot;&gt;LiteLLM&lt;/a&gt;, &lt;a href=&quot;https://github.com/caido/caido&quot;&gt;Caido&lt;/a&gt;, &lt;a href=&quot;https://github.com/projectdiscovery/nuclei&quot;&gt;Nuclei&lt;/a&gt;, &lt;a href=&quot;https://github.com/microsoft/playwright&quot;&gt;Playwright&lt;/a&gt;, and &lt;a href=&quot;https://github.com/charmbracelet/bubbletea&quot;&gt;Bubble Tea&lt;/a&gt;. Huge thanks to their maintainers!&lt;/p&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-warning&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-alert mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Warning&lt;/p&gt;
 &lt;p&gt;&lt;strong&gt;Authorized use only.&lt;/strong&gt; Strix actively tests the targets you point it at, so only run it against systems you own or have &lt;strong&gt;explicit, written permission&lt;/strong&gt; to test, and stay within the agreed scope. Unauthorized testing is illegal in most jurisdictions. You alone are responsible for obtaining authorization and complying with the law. Strix is provided &quot;as is&quot; with no warranty or liability for misuse.&lt;/p&gt; 
&lt;/div&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/b00fa5b3de1b0c140312b95d3715a90d834e16d097a3ed14a8347aa095d6e250/usestrix/strix" medium="image" />
      
    </item>
    
    <item>
      <title>MoonshotAI/kimi-cli</title>
      <link>https://github.com/MoonshotAI/kimi-cli</link>
      <description>&lt;p&gt;Kimi Code CLI is your next CLI agent.&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;Kimi CLI&lt;/h1&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/MoonshotAI/kimi-cli/graphs/commit-activity&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/commit-activity/w/MoonshotAI/kimi-cli&quot; alt=&quot;Commit Activity&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/MoonshotAI/kimi-cli/actions&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/check-runs/MoonshotAI/kimi-cli/main&quot; alt=&quot;Checks&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://pypi.org/project/kimi-cli/&quot;&gt;&lt;img src=&quot;https://img.shields.io/pypi/v/kimi-cli&quot; alt=&quot;Version&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://pypistats.org/packages/kimi-cli&quot;&gt;&lt;img src=&quot;https://img.shields.io/pypi/dw/kimi-cli&quot; alt=&quot;Downloads&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://deepwiki.com/MoonshotAI/kimi-cli&quot;&gt;&lt;img src=&quot;https://deepwiki.com/badge.svg?sanitize=true&quot; alt=&quot;Ask DeepWiki&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.kimi.com/code/&quot;&gt;Kimi Code&lt;/a&gt; | &lt;a href=&quot;https://moonshotai.github.io/kimi-cli/en/&quot;&gt;Documentation&lt;/a&gt; | &lt;a href=&quot;https://moonshotai.github.io/kimi-cli/zh/&quot;&gt;文档&lt;/a&gt;&lt;/p&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-important&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-report mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Important&lt;/p&gt;
 &lt;p&gt;&lt;strong&gt;Kimi CLI is evolving into &lt;a href=&quot;https://github.com/MoonshotAI/kimi-code&quot;&gt;Kimi Code CLI&lt;/a&gt;&lt;/strong&gt; — the next-generation terminal AI agent from the same team. Installing Kimi Code CLI automatically migrates your configuration and sessions. This project will be gradually wound down; the docs and existing installations remain available.&lt;/p&gt; 
&lt;/div&gt; 
&lt;p&gt;Kimi CLI is an AI agent that runs in the terminal, helping you complete software development tasks and terminal operations. It can read and edit code, execute shell commands, search and fetch web pages, and autonomously plan and adjust actions during execution.&lt;/p&gt; 
&lt;h2&gt;Getting Started&lt;/h2&gt; 
&lt;p&gt;See &lt;a href=&quot;https://moonshotai.github.io/kimi-cli/en/guides/getting-started.html&quot;&gt;Getting Started&lt;/a&gt; for how to install and start using Kimi CLI.&lt;/p&gt; 
&lt;h2&gt;Key Features&lt;/h2&gt; 
&lt;h3&gt;Shell command mode&lt;/h3&gt; 
&lt;p&gt;Kimi CLI is not only a coding agent, but also a shell. You can switch the shell command mode by pressing &lt;code&gt;Ctrl-X&lt;/code&gt;. In this mode, you can directly run shell commands without leaving Kimi CLI.&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/MoonshotAI/kimi-cli/main/docs/media/shell-mode.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-note&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-info mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Note&lt;/p&gt;
 &lt;p&gt;Built-in shell commands like &lt;code&gt;cd&lt;/code&gt; are not supported yet.&lt;/p&gt; 
&lt;/div&gt; 
&lt;h3&gt;VS Code extension&lt;/h3&gt; 
&lt;p&gt;Kimi CLI can be integrated with &lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;Visual Studio Code&lt;/a&gt; via the &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=moonshot-ai.kimi-code&quot;&gt;Kimi Code VS Code Extension&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/MoonshotAI/kimi-cli/main/docs/media/vscode.png&quot; alt=&quot;VS Code Extension&quot; /&gt;&lt;/p&gt; 
&lt;h3&gt;IDE integration via ACP&lt;/h3&gt; 
&lt;p&gt;Kimi CLI supports &lt;a href=&quot;https://github.com/agentclientprotocol/agent-client-protocol&quot;&gt;Agent Client Protocol&lt;/a&gt; out of the box. You can use it together with any ACP-compatible editor or IDE.&lt;/p&gt; 
&lt;p&gt;To use Kimi CLI with ACP clients, make sure to run Kimi CLI in the terminal and send &lt;code&gt;/login&lt;/code&gt; to complete the login first. Then, you can configure your ACP client to start Kimi CLI as an ACP agent server with command &lt;code&gt;kimi acp&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;For example, to use Kimi CLI with &lt;a href=&quot;https://zed.dev/&quot;&gt;Zed&lt;/a&gt; or &lt;a href=&quot;https://blog.jetbrains.com/ai/2025/12/bring-your-own-ai-agent-to-jetbrains-ides/&quot;&gt;JetBrains&lt;/a&gt;, add the following configuration to your &lt;code&gt;~/.config/zed/settings.json&lt;/code&gt; or &lt;code&gt;~/.jetbrains/acp.json&lt;/code&gt; file:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;agent_servers&quot;: {
    &quot;Kimi CLI&quot;: {
      &quot;type&quot;: &quot;custom&quot;,
      &quot;command&quot;: &quot;kimi&quot;,
      &quot;args&quot;: [&quot;acp&quot;],
      &quot;env&quot;: {}
    }
  }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Then you can create Kimi CLI threads in IDE&#39;s agent panel.&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/MoonshotAI/kimi-cli/main/docs/media/acp-integration.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt; 
&lt;h3&gt;Zsh integration&lt;/h3&gt; 
&lt;p&gt;You can use Kimi CLI together with Zsh, to empower your shell experience with AI agent capabilities.&lt;/p&gt; 
&lt;p&gt;Install the &lt;a href=&quot;https://github.com/MoonshotAI/zsh-kimi-cli&quot;&gt;zsh-kimi-cli&lt;/a&gt; plugin via:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;git clone https://github.com/MoonshotAI/zsh-kimi-cli.git \
  ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/kimi-cli
&lt;/code&gt;&lt;/pre&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-note&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-info mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Note&lt;/p&gt;
 &lt;p&gt;If you are using a plugin manager other than Oh My Zsh, you may need to refer to the plugin&#39;s README for installation instructions.&lt;/p&gt; 
&lt;/div&gt; 
&lt;p&gt;Then add &lt;code&gt;kimi-cli&lt;/code&gt; to your Zsh plugin list in &lt;code&gt;~/.zshrc&lt;/code&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;plugins=(... kimi-cli)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;After restarting Zsh, you can switch to agent mode by pressing &lt;code&gt;Ctrl-X&lt;/code&gt;.&lt;/p&gt; 
&lt;h3&gt;MCP support&lt;/h3&gt; 
&lt;p&gt;Kimi CLI supports MCP (Model Context Protocol) tools.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;code&gt;kimi mcp&lt;/code&gt; sub-command group&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;You can manage MCP servers with &lt;code&gt;kimi mcp&lt;/code&gt; sub-command group. For example:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;# Add streamable HTTP server:
kimi mcp add --transport http context7 https://mcp.context7.com/mcp --header &quot;CONTEXT7_API_KEY: ctx7sk-your-key&quot;

# Add streamable HTTP server with OAuth authorization:
kimi mcp add --transport http --auth oauth linear https://mcp.linear.app/mcp

# Add stdio server:
kimi mcp add --transport stdio chrome-devtools -- npx chrome-devtools-mcp@latest

# List added MCP servers:
kimi mcp list

# Remove an MCP server:
kimi mcp remove chrome-devtools

# Authorize an MCP server:
kimi mcp auth linear
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;Ad-hoc MCP configuration&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;Kimi CLI also supports ad-hoc MCP server configuration via CLI option.&lt;/p&gt; 
&lt;p&gt;Given an MCP config file in the well-known MCP config format like the following:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;mcpServers&quot;: {
    &quot;context7&quot;: {
      &quot;url&quot;: &quot;https://mcp.context7.com/mcp&quot;,
      &quot;headers&quot;: {
        &quot;CONTEXT7_API_KEY&quot;: &quot;YOUR_API_KEY&quot;
      }
    },
    &quot;chrome-devtools&quot;: {
      &quot;command&quot;: &quot;npx&quot;,
      &quot;args&quot;: [&quot;-y&quot;, &quot;chrome-devtools-mcp@latest&quot;]
    }
  }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Run &lt;code&gt;kimi&lt;/code&gt; with &lt;code&gt;--mcp-config-file&lt;/code&gt; option to connect to the specified MCP servers:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;kimi --mcp-config-file /path/to/mcp.json
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;More&lt;/h3&gt; 
&lt;p&gt;See more features in the &lt;a href=&quot;https://moonshotai.github.io/kimi-cli/en/&quot;&gt;Documentation&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Development&lt;/h2&gt; 
&lt;p&gt;To develop Kimi CLI, run:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;git clone https://github.com/MoonshotAI/kimi-cli.git
cd kimi-cli

make prepare  # prepare the development environment
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Then you can start working on Kimi CLI.&lt;/p&gt; 
&lt;p&gt;Refer to the following commands after you make changes:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;uv run kimi  # run Kimi CLI

make format  # format code
make check  # run linting and type checking
make test  # run tests
make test-kimi-cli  # run Kimi CLI tests only
make test-kosong  # run kosong tests only
make test-pykaos  # run pykaos tests only
make build-web  # build the web UI and sync it into the package (requires Node.js/npm)
make build  # build python packages
make build-bin  # build standalone binary
make help  # show all make targets
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Note: &lt;code&gt;make build&lt;/code&gt; and &lt;code&gt;make build-bin&lt;/code&gt; automatically run &lt;code&gt;make build-web&lt;/code&gt; to embed the web UI.&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/4e47be493756122c11eb25f65b87c7dc1d940c5c6a88d370e2490642d084288f/MoonshotAI/kimi-cli" medium="image" />
      
    </item>
    
    <item>
      <title>blader/humanizer</title>
      <link>https://github.com/blader/humanizer</link>
      <description>&lt;p&gt;Agent skill that removes signs of AI-generated writing from text&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;Humanizer&lt;/h1&gt; 
&lt;p&gt;&lt;a href=&quot;https://skills.sh/blader/humanizer&quot;&gt;&lt;img src=&quot;https://skills.sh/b/blader/humanizer&quot; alt=&quot;skills.sh installs&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;A portable agent skill that removes signs of AI-generated writing from text, making it sound more natural and human. It is plain Markdown, so it can run in any harness that supports skill-style instructions.&lt;/p&gt; 
&lt;h2&gt;Installation&lt;/h2&gt; 
&lt;h3&gt;Skills CLI&lt;/h3&gt; 
&lt;p&gt;Install globally with the cross-agent skills CLI so Humanizer is available in every project:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npx skills add blader/humanizer --global
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Update an existing install:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npx skills update humanizer --global
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To install globally into every supported agent harness:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npx skills add blader/humanizer --global --agent &#39;*&#39;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To target one configured harness, pass its agent name:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npx skills add blader/humanizer --global --agent &amp;lt;agent-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Omit &lt;code&gt;--global&lt;/code&gt; for a project-local install that can be committed and shared with collaborators. Start a new agent session or reload skills after installation.&lt;/p&gt; 
&lt;h3&gt;Claude Code plugin&lt;/h3&gt; 
&lt;p&gt;Claude Code users can also install Humanizer as a plugin:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/plugin marketplace add blader/humanizer
/plugin install humanizer@humanizer
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The skill is then invoked as &lt;code&gt;/humanizer:humanizer&lt;/code&gt;.&lt;/p&gt; 
&lt;h3&gt;Manual&lt;/h3&gt; 
&lt;p&gt;Any agent harness can use the skill directly because the runtime artifact is &lt;code&gt;SKILL.md&lt;/code&gt;. Install it wherever your harness expects skill directories, or copy &lt;code&gt;SKILL.md&lt;/code&gt; into an existing skill folder.&lt;/p&gt; 
&lt;p&gt;For example:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/blader/humanizer.git /path/to/your/skills/humanizer
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Or, if you already have this repo cloned:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;mkdir -p /path/to/your/skills/humanizer
cp SKILL.md /path/to/your/skills/humanizer/
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Usage&lt;/h2&gt; 
&lt;p&gt;Invoke the skill however your agent harness exposes installed skills. Common forms include a slash command or a direct request:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/humanizer

[paste your text here]
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code&gt;Please humanize this text: [your text]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Point it at a file and the skill rewrites it in place:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Humanize the prose in docs/launch-post.md
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Voice Calibration&lt;/h3&gt; 
&lt;p&gt;To match your personal writing style, provide a sample of your own writing:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/humanizer

Here&#39;s a sample of my writing for voice matching:
[paste 2-3 paragraphs of your own writing]

Now humanize this text:
[paste AI text to humanize]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The skill will analyze your sentence rhythm, word choices, and quirks, then apply them to the rewrite instead of producing generic &quot;clean&quot; output.&lt;/p&gt; 
&lt;h2&gt;Overview&lt;/h2&gt; 
&lt;p&gt;Based on &lt;a href=&quot;https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing&quot;&gt;Wikipedia&#39;s &quot;Signs of AI writing&quot;&lt;/a&gt; guide, maintained by WikiProject AI Cleanup. This comprehensive guide comes from observations of thousands of instances of AI-generated text.&lt;/p&gt; 
&lt;p&gt;The skill also includes a final &quot;obviously AI generated&quot; audit pass and a second rewrite, to catch lingering AI-isms in the first draft.&lt;/p&gt; 
&lt;p&gt;Rewrites follow a no-fabrication rule: they never add facts, names, dates, or citations that aren&#39;t in the source text. Specificity has to come from the source or the author, not from the rewrite.&lt;/p&gt; 
&lt;h3&gt;Key Insight from Wikipedia&lt;/h3&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&quot;LLMs use statistical algorithms to guess what should come next. The result tends toward the most statistically likely result that applies to the widest variety of cases.&quot;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h2&gt;33 Patterns Detected (with Before/After Examples)&lt;/h2&gt; 
&lt;h3&gt;Content Patterns&lt;/h3&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;#&lt;/th&gt; 
   &lt;th&gt;Pattern&lt;/th&gt; 
   &lt;th&gt;Before&lt;/th&gt; 
   &lt;th&gt;After&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;1&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Significance inflation&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;marking a pivotal moment in the evolution of...&quot;&lt;/td&gt; 
   &lt;td&gt;&quot;was established in 1989 as part of a wider decentralization&quot;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;2&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Notability name-dropping&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;cited in NYT, BBC, FT, and The Hindu&quot;&lt;/td&gt; 
   &lt;td&gt;Trim the list; keep only sourced context&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;3&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Superficial -ing analyses&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;symbolizing... reflecting... showcasing...&quot;&lt;/td&gt; 
   &lt;td&gt;Remove, or keep only what the source supports&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;4&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Promotional language&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;nestled within the breathtaking region&quot;&lt;/td&gt; 
   &lt;td&gt;&quot;is a town in the Gonder region&quot;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;5&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Vague attributions&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;Experts believe it plays a crucial role&quot;&lt;/td&gt; 
   &lt;td&gt;Name a real source or cut the claim&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;6&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Formulaic challenges&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;Despite challenges... continues to thrive&quot;&lt;/td&gt; 
   &lt;td&gt;Keep the sourced facts; cut the boosterism&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h3&gt;Language Patterns&lt;/h3&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;#&lt;/th&gt; 
   &lt;th&gt;Pattern&lt;/th&gt; 
   &lt;th&gt;Before&lt;/th&gt; 
   &lt;th&gt;After&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;7&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;AI vocabulary&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;Actually... additionally... testament... landscape... showcasing&quot;&lt;/td&gt; 
   &lt;td&gt;&quot;also... remain common&quot;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;8&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Copula avoidance&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;serves as... features... boasts&quot;&lt;/td&gt; 
   &lt;td&gt;&quot;is... has&quot;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;9&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Negative parallelisms / tailing negations&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;It&#39;s not just X, it&#39;s Y&quot;, &quot;..., no guessing&quot;&lt;/td&gt; 
   &lt;td&gt;State the point directly&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;10&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Rule of three&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;innovation, inspiration, and insights&quot;&lt;/td&gt; 
   &lt;td&gt;Use natural number of items&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;11&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Synonym cycling&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;protagonist... main character... central figure... hero&quot;&lt;/td&gt; 
   &lt;td&gt;&quot;protagonist&quot; (repeat when clearest)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;12&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;False ranges&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;from the Big Bang to dark matter&quot;&lt;/td&gt; 
   &lt;td&gt;List topics directly&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;13&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Passive voice / subjectless fragments&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;No configuration file needed&quot;&lt;/td&gt; 
   &lt;td&gt;Name the actor when it helps clarity&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h3&gt;Style Patterns&lt;/h3&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;#&lt;/th&gt; 
   &lt;th&gt;Pattern&lt;/th&gt; 
   &lt;th&gt;Before&lt;/th&gt; 
   &lt;th&gt;After&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;14&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Em/en dashes&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;institutions—not the people—yet this continues—&quot;&lt;/td&gt; 
   &lt;td&gt;Cut them: periods, commas, colons, or parentheses&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;15&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Boldface overuse&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;&lt;strong&gt;OKRs&lt;/strong&gt;, &lt;strong&gt;KPIs&lt;/strong&gt;, &lt;strong&gt;BMC&lt;/strong&gt;&quot;&lt;/td&gt; 
   &lt;td&gt;&quot;OKRs, KPIs, BMC&quot;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;16&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Inline-header lists&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;&lt;strong&gt;Performance:&lt;/strong&gt; Performance improved&quot;&lt;/td&gt; 
   &lt;td&gt;Convert to prose&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;17&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Title Case Headings&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;Strategic Negotiations And Partnerships&quot;&lt;/td&gt; 
   &lt;td&gt;&quot;Strategic negotiations and partnerships&quot;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;18&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Emojis&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;🚀 Launch Phase: 💡 Key Insight:&quot;&lt;/td&gt; 
   &lt;td&gt;Remove emojis&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;19&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Curly quotes&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;said “the project”&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;said &quot;the project&quot;&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;26&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Hyphenated word pairs&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;“cross-functional, data-driven, client-facing”&lt;/td&gt; 
   &lt;td&gt;Drop hyphens on common word pairs&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;27&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Persuasive authority tropes&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;At its core, what matters is...&quot;&lt;/td&gt; 
   &lt;td&gt;State the point directly&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;28&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Signposting announcements&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;Let&#39;s dive in&quot;, &quot;Here&#39;s what you need to know&quot;&lt;/td&gt; 
   &lt;td&gt;Start with the content&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;29&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Fragmented headers&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;## Performance&quot; + &quot;Speed matters.&quot;&lt;/td&gt; 
   &lt;td&gt;Let the heading do the work&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;30&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Diff-anchored writing&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;This function was added to replace...&quot;&lt;/td&gt; 
   &lt;td&gt;Describe what it does, not what changed&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;31&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Manufactured punchlines / staccato drama&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;It had no preference. No prior. No nostalgia.&quot;&lt;/td&gt; 
   &lt;td&gt;Use varied sentence lengths and concrete claims&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;32&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Aphorism formulas&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;Symmetry is the language of trust&quot;&lt;/td&gt; 
   &lt;td&gt;Replace the formula with the actual claim&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;33&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Conversational rhetorical openers&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;Honestly? It depends...&quot;&lt;/td&gt; 
   &lt;td&gt;Remove the fake-candid setup&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h3&gt;Communication Patterns&lt;/h3&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;#&lt;/th&gt; 
   &lt;th&gt;Pattern&lt;/th&gt; 
   &lt;th&gt;Before&lt;/th&gt; 
   &lt;th&gt;After&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;20&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Chatbot artifacts&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;I hope this helps! Let me know if...&quot;&lt;/td&gt; 
   &lt;td&gt;Remove entirely&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;21&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Cutoff disclaimers&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;While details are limited in available sources...&quot;&lt;/td&gt; 
   &lt;td&gt;Find sources or remove&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;22&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Sycophantic tone&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;Great question! You&#39;re absolutely right!&quot;&lt;/td&gt; 
   &lt;td&gt;Respond directly&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h3&gt;Filler and Hedging&lt;/h3&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;#&lt;/th&gt; 
   &lt;th&gt;Pattern&lt;/th&gt; 
   &lt;th&gt;Before&lt;/th&gt; 
   &lt;th&gt;After&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;23&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Filler phrases&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;In order to&quot;, &quot;Due to the fact that&quot;&lt;/td&gt; 
   &lt;td&gt;&quot;To&quot;, &quot;Because&quot;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;24&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Excessive hedging&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;could potentially possibly&quot;&lt;/td&gt; 
   &lt;td&gt;&quot;may&quot;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;25&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Generic conclusions&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&quot;The future looks bright&quot;&lt;/td&gt; 
   &lt;td&gt;Specific plans or facts&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h2&gt;Full Example&lt;/h2&gt; 
&lt;p&gt;&lt;em&gt;(Illustration note: the rewrite below adds specifics, like the month and the neighborhoods, that stand in for details the author would supply. In a real session those come from the user; the skill asks rather than invents.)&lt;/em&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Before (AI-sounding):&lt;/strong&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;I recently spent five unforgettable days in Lisbon, and let me tell you — this city completely stole my heart. From the moment I arrived, I knew I was somewhere truly special.&lt;/p&gt; 
 &lt;p&gt;Nestled along the banks of the Tagus River, Lisbon stands as a vibrant testament to Portugal&#39;s enduring spirit, where rich history and modern energy intertwine at every turn. Yes, the famous hills are challenging — my legs certainly felt it! — but every climb rewards you with breathtaking, panoramic views that make it all worthwhile.&lt;/p&gt; 
 &lt;p&gt;No trip would be complete without riding the iconic Tram 28, winding through the city&#39;s most historic neighborhoods. And the food? Simply divine. The original pastéis de nata at Pastéis de Belém are a beloved national treasure, and savoring one still warm was a moment I will never forget.&lt;/p&gt; 
 &lt;p&gt;But what truly makes Lisbon special isn&#39;t just the sights — it&#39;s the feeling. Wander a few steps off the main squares and you&#39;ll discover a quieter, more authentic side: sun-drenched alleys, charming tiled facades, and friendly locals going about their daily lives, inviting you to slow down and savor every moment.&lt;/p&gt; 
 &lt;p&gt;Of course, the must-see São Jorge Castle offers stunning views over the rooftops below. The queues can be long, but the experience is absolutely worth it for any history buff or curious traveler.&lt;/p&gt; 
 &lt;p&gt;Would I go back? Absolutely. Lisbon isn&#39;t just a place to visit — it&#39;s a place to fall in love with, again and again. If you&#39;re dreaming of your next getaway, this is one destination that promises memories to last a lifetime. ✨&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;strong&gt;After (Humanized):&lt;/strong&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;I spent five days in Lisbon last October and still have mixed feelings about it. Beautiful, yes. Also harder on the knees than anyone warned me.&lt;/p&gt; 
 &lt;p&gt;The hills are the whole story and somehow never make the brochures. My hotel was up in Alfama, which photographs beautifully and translates, in practice, to climbing what felt like a six-story staircase every time I wanted coffee. By the second day my calves had opinions. I started planning each walk around which way was downhill, which is a strange way to see a city but probably an honest one.&lt;/p&gt; 
 &lt;p&gt;Everyone says to ride Tram 28, so I did, wedged against a stranger&#39;s backpack for forty minutes while three tour groups filmed the same corner. I would walk the route next time, or go before breakfast. The custard tarts, though, earn the fuss. I had one at a plain little place in Graça, still warm, and for about thirty seconds I understood why people build trips around pastry.&lt;/p&gt; 
 &lt;p&gt;What I did not expect was how quiet the city gets away from the main squares. Two blocks uphill from any plaza it turns into laundry lines, chipped tile, open windows, and old men watching football with the sound turned up. That is the Lisbon I keep thinking about, not the castle.&lt;/p&gt; 
 &lt;p&gt;The castle is fine. The view is great, the queue is long, and I spent more time shuffling toward the entrance than looking at anything once I got inside. If I had only two days, I would trade it for an afternoon of getting lost.&lt;/p&gt; 
 &lt;p&gt;I would go back, but in spring and with better shoes. Lisbon does not bend over backward to make things easy for you. I think I liked that, even when my legs disagreed.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h2&gt;References&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing&quot;&gt;Wikipedia: Signs of AI writing&lt;/a&gt; - Primary source&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Wikipedia:WikiProject_AI_Cleanup&quot;&gt;WikiProject AI Cleanup&lt;/a&gt; - Maintaining organization&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Version History&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;2.9.1&lt;/strong&gt; - Improved distribution and portability: removed nonportable frontmatter and tool preapprovals, made global installation the documented default, added package validation, and removed the duplicated long-form example from the runtime prompt. No change to the 33 patterns.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;2.9.0&lt;/strong&gt; - Added a no-fabrication rule: rewrites may not invent facts, names, dates, or citations not present in the source, and every example that modeled invented specifics was re-cut to use only source information (fixes #187). Replaced paragraph-count parity with an information-over-shape rule, made a user&#39;s voice sample outrank the em dash ban, and added invocation modes (pasted text / file / embedded). No change to the 33 patterns.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;2.8.3&lt;/strong&gt; - Moved the skill version from the unsupported top-level frontmatter key to &lt;code&gt;metadata.version&lt;/code&gt; for Agent Skills and Claude compatibility. No change to the 33 patterns.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;2.8.2&lt;/strong&gt; - Replaced the full before/after example with a first-person Lisbon trip recap. The after now keeps the same topic, perspective, and rough length as the before while removing the AI tells without becoming clipped or slogan-like. No change to the 33 patterns.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;2.8.1&lt;/strong&gt; - Added cross-agent installation docs, optional Claude Code plugin packaging, and a compact secondhand-text false-positive guard. No change to the 33 patterns.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;2.8.0&lt;/strong&gt; - Added style/cadence patterns #31-33 for manufactured punchlines, aphorism formulas, and conversational rhetorical openers; expanded #20 to catch offer-to-continue chatbot closers. 33 patterns total.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;2.7.0&lt;/strong&gt; - Added pattern #30 (diff-anchored writing); made em/en dashes a hard cut rather than &quot;overuse&quot;; expanded #21 to cover speculative gap-filling (&quot;maintains a low profile&quot;). 30 patterns total.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;2.6.0&lt;/strong&gt; - Cleanup pass: consolidated the duplicated workflow sections, gated the personality guidance to content where voice is wanted, removed the model-fingerprinting subsection, and condensed the worked example. No change to the 29 patterns.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;2.5.1&lt;/strong&gt; - Added a passive-voice / subjectless-fragment rule, raising the total to 29 patterns&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;2.5.0&lt;/strong&gt; - Added patterns for persuasive framing, signposting, and fragmented headers; expanded negative parallelisms to cover tailing negations; tightened wording around em dash overuse; fixed frontmatter wording to use &quot;filler phrases&quot;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;2.4.0&lt;/strong&gt; - Added voice calibration: match the user&#39;s personal writing style from samples&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;2.3.0&lt;/strong&gt; - Added pattern #25: hyphenated word pair overuse&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;2.2.0&lt;/strong&gt; - Added a final &quot;obviously AI generated&quot; audit + second-pass rewrite prompts&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;2.1.1&lt;/strong&gt; - Fixed pattern #18 example (curly quotes vs straight quotes)&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;2.1.0&lt;/strong&gt; - Added before/after examples for all 24 patterns&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;2.0.0&lt;/strong&gt; - Complete rewrite based on raw Wikipedia article content&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;1.0.0&lt;/strong&gt; - Initial release&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;License&lt;/h2&gt; 
&lt;p&gt;MIT&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/633fa76c65c800f840b7df1edde4d773a2c2616039b5d17628dc6a28fb7a210e/blader/humanizer" medium="image" />
      
    </item>
    
    <item>
      <title>donnemartin/system-design-primer</title>
      <link>https://github.com/donnemartin/system-design-primer</link>
      <description>&lt;p&gt;Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;em&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/README.md&quot;&gt;English&lt;/a&gt; ∙ &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/README-ja.md&quot;&gt;日本語&lt;/a&gt; ∙ &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/README-zh-Hans.md&quot;&gt;简体中文&lt;/a&gt; ∙ &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/README-zh-TW.md&quot;&gt;繁體中文&lt;/a&gt; | &lt;a href=&quot;https://github.com/donnemartin/system-design-primer/issues/170&quot;&gt;العَرَبِيَّة‎&lt;/a&gt; ∙ &lt;a href=&quot;https://github.com/donnemartin/system-design-primer/issues/220&quot;&gt;বাংলা&lt;/a&gt; ∙ &lt;a href=&quot;https://github.com/donnemartin/system-design-primer/issues/40&quot;&gt;Português do Brasil&lt;/a&gt; ∙ &lt;a href=&quot;https://github.com/donnemartin/system-design-primer/issues/186&quot;&gt;Deutsch&lt;/a&gt; ∙ &lt;a href=&quot;https://github.com/donnemartin/system-design-primer/issues/130&quot;&gt;ελληνικά&lt;/a&gt; ∙ &lt;a href=&quot;https://github.com/donnemartin/system-design-primer/issues/272&quot;&gt;עברית&lt;/a&gt; ∙ &lt;a href=&quot;https://github.com/donnemartin/system-design-primer/issues/104&quot;&gt;Italiano&lt;/a&gt; ∙ &lt;a href=&quot;https://github.com/donnemartin/system-design-primer/issues/102&quot;&gt;한국어&lt;/a&gt; ∙ &lt;a href=&quot;https://github.com/donnemartin/system-design-primer/issues/110&quot;&gt;فارسی&lt;/a&gt; ∙ &lt;a href=&quot;https://github.com/donnemartin/system-design-primer/issues/68&quot;&gt;Polski&lt;/a&gt; ∙ &lt;a href=&quot;https://github.com/donnemartin/system-design-primer/issues/87&quot;&gt;русский язык&lt;/a&gt; ∙ &lt;a href=&quot;https://github.com/donnemartin/system-design-primer/issues/136&quot;&gt;Español&lt;/a&gt; ∙ &lt;a href=&quot;https://github.com/donnemartin/system-design-primer/issues/187&quot;&gt;ภาษาไทย&lt;/a&gt; ∙ &lt;a href=&quot;https://github.com/donnemartin/system-design-primer/issues/39&quot;&gt;Türkçe&lt;/a&gt; ∙ &lt;a href=&quot;https://github.com/donnemartin/system-design-primer/issues/127&quot;&gt;tiếng Việt&lt;/a&gt; ∙ &lt;a href=&quot;https://github.com/donnemartin/system-design-primer/issues/250&quot;&gt;Français&lt;/a&gt; | &lt;a href=&quot;https://github.com/donnemartin/system-design-primer/issues/28&quot;&gt;Add Translation&lt;/a&gt;&lt;/em&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Help &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/TRANSLATIONS.md&quot;&gt;translate&lt;/a&gt; this guide!&lt;/strong&gt;&lt;/p&gt; 
&lt;h1&gt;The System Design Primer&lt;/h1&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/jj3A5N8.png&quot; /&gt; &lt;br /&gt; &lt;/p&gt; 
&lt;h2&gt;Motivation&lt;/h2&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;Learn how to design large-scale systems.&lt;/p&gt; 
 &lt;p&gt;Prep for the system design interview.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h3&gt;Learn how to design large-scale systems&lt;/h3&gt; 
&lt;p&gt;Learning how to design scalable systems will help you become a better engineer.&lt;/p&gt; 
&lt;p&gt;System design is a broad topic. There are a &lt;strong&gt;vast number of resources scattered throughout the web&lt;/strong&gt; on system design principles.&lt;/p&gt; 
&lt;p&gt;This repo is an &lt;strong&gt;organized collection&lt;/strong&gt; of resources to help you learn how to build systems at scale.&lt;/p&gt; 
&lt;h3&gt;Learn from the open source community&lt;/h3&gt; 
&lt;p&gt;This is a continually updated, open source project.&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#contributing&quot;&gt;Contributions&lt;/a&gt; are welcome!&lt;/p&gt; 
&lt;h3&gt;Prep for the system design interview&lt;/h3&gt; 
&lt;p&gt;In addition to coding interviews, system design is a &lt;strong&gt;required component&lt;/strong&gt; of the &lt;strong&gt;technical interview process&lt;/strong&gt; at many tech companies.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Practice common system design interview questions&lt;/strong&gt; and &lt;strong&gt;compare&lt;/strong&gt; your results with &lt;strong&gt;sample solutions&lt;/strong&gt;: discussions, code, and diagrams.&lt;/p&gt; 
&lt;p&gt;Additional topics for interview prep:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#study-guide&quot;&gt;Study guide&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#how-to-approach-a-system-design-interview-question&quot;&gt;How to approach a system design interview question&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#system-design-interview-questions-with-solutions&quot;&gt;System design interview questions, &lt;strong&gt;with solutions&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#object-oriented-design-interview-questions-with-solutions&quot;&gt;Object-oriented design interview questions, &lt;strong&gt;with solutions&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#additional-system-design-interview-questions&quot;&gt;Additional system design interview questions&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Anki flashcards&lt;/h2&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/zdCAkB3.png&quot; /&gt; &lt;br /&gt; &lt;/p&gt; 
&lt;p&gt;The provided &lt;a href=&quot;https://apps.ankiweb.net/&quot;&gt;Anki flashcard decks&lt;/a&gt; use spaced repetition to help you retain key system design concepts.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/donnemartin/system-design-primer/tree/master/resources/flash_cards/System%20Design.apkg&quot;&gt;System design deck&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/donnemartin/system-design-primer/tree/master/resources/flash_cards/System%20Design%20Exercises.apkg&quot;&gt;System design exercises deck&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/donnemartin/system-design-primer/tree/master/resources/flash_cards/OO%20Design.apkg&quot;&gt;Object oriented design exercises deck&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Great for use while on-the-go.&lt;/p&gt; 
&lt;h3&gt;Coding Resource: Interactive Coding Challenges&lt;/h3&gt; 
&lt;p&gt;Looking for resources to help you prep for the &lt;a href=&quot;https://github.com/donnemartin/interactive-coding-challenges&quot;&gt;&lt;strong&gt;Coding Interview&lt;/strong&gt;&lt;/a&gt;?&lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/b4YtAEN.png&quot; /&gt; &lt;br /&gt; &lt;/p&gt; 
&lt;p&gt;Check out the sister repo &lt;a href=&quot;https://github.com/donnemartin/interactive-coding-challenges&quot;&gt;&lt;strong&gt;Interactive Coding Challenges&lt;/strong&gt;&lt;/a&gt;, which contains an additional Anki deck:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/donnemartin/interactive-coding-challenges/tree/master/anki_cards/Coding.apkg&quot;&gt;Coding deck&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Contributing&lt;/h2&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;Learn from the community.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;Feel free to submit pull requests to help:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Fix errors&lt;/li&gt; 
 &lt;li&gt;Improve sections&lt;/li&gt; 
 &lt;li&gt;Add new sections&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/donnemartin/system-design-primer/issues/28&quot;&gt;Translate&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Content that needs some polishing is placed &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#under-development&quot;&gt;under development&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;Review the &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/CONTRIBUTING.md&quot;&gt;Contributing Guidelines&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Index of system design topics&lt;/h2&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;Summaries of various system design topics, including pros and cons. &lt;strong&gt;Everything is a trade-off&lt;/strong&gt;.&lt;/p&gt; 
 &lt;p&gt;Each section contains links to more in-depth resources.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/jrUBAF7.png&quot; /&gt; &lt;br /&gt; &lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#system-design-topics-start-here&quot;&gt;System design topics: start here&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#step-1-review-the-scalability-video-lecture&quot;&gt;Step 1: Review the scalability video lecture&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#step-2-review-the-scalability-article&quot;&gt;Step 2: Review the scalability article&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#next-steps&quot;&gt;Next steps&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#performance-vs-scalability&quot;&gt;Performance vs scalability&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#latency-vs-throughput&quot;&gt;Latency vs throughput&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#availability-vs-consistency&quot;&gt;Availability vs consistency&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#cap-theorem&quot;&gt;CAP theorem&lt;/a&gt; 
    &lt;ul&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#cp---consistency-and-partition-tolerance&quot;&gt;CP - consistency and partition tolerance&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#ap---availability-and-partition-tolerance&quot;&gt;AP - availability and partition tolerance&lt;/a&gt;&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#consistency-patterns&quot;&gt;Consistency patterns&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#weak-consistency&quot;&gt;Weak consistency&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#eventual-consistency&quot;&gt;Eventual consistency&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#strong-consistency&quot;&gt;Strong consistency&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#availability-patterns&quot;&gt;Availability patterns&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#fail-over&quot;&gt;Fail-over&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#replication&quot;&gt;Replication&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#availability-in-numbers&quot;&gt;Availability in numbers&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#domain-name-system&quot;&gt;Domain name system&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#content-delivery-network&quot;&gt;Content delivery network&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#push-cdns&quot;&gt;Push CDNs&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#pull-cdns&quot;&gt;Pull CDNs&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#load-balancer&quot;&gt;Load balancer&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#active-passive&quot;&gt;Active-passive&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#active-active&quot;&gt;Active-active&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#layer-4-load-balancing&quot;&gt;Layer 4 load balancing&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#layer-7-load-balancing&quot;&gt;Layer 7 load balancing&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#horizontal-scaling&quot;&gt;Horizontal scaling&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#reverse-proxy-web-server&quot;&gt;Reverse proxy (web server)&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#load-balancer-vs-reverse-proxy&quot;&gt;Load balancer vs reverse proxy&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#application-layer&quot;&gt;Application layer&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#microservices&quot;&gt;Microservices&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#service-discovery&quot;&gt;Service discovery&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#database&quot;&gt;Database&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#relational-database-management-system-rdbms&quot;&gt;Relational database management system (RDBMS)&lt;/a&gt; 
    &lt;ul&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#master-slave-replication&quot;&gt;Master-slave replication&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#master-master-replication&quot;&gt;Master-master replication&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#federation&quot;&gt;Federation&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#sharding&quot;&gt;Sharding&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#denormalization&quot;&gt;Denormalization&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#sql-tuning&quot;&gt;SQL tuning&lt;/a&gt;&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#nosql&quot;&gt;NoSQL&lt;/a&gt; 
    &lt;ul&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#key-value-store&quot;&gt;Key-value store&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#document-store&quot;&gt;Document store&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#wide-column-store&quot;&gt;Wide column store&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#graph-database&quot;&gt;Graph Database&lt;/a&gt;&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#sql-or-nosql&quot;&gt;SQL or NoSQL&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#cache&quot;&gt;Cache&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#client-caching&quot;&gt;Client caching&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#cdn-caching&quot;&gt;CDN caching&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#web-server-caching&quot;&gt;Web server caching&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#database-caching&quot;&gt;Database caching&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#application-caching&quot;&gt;Application caching&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#caching-at-the-database-query-level&quot;&gt;Caching at the database query level&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#caching-at-the-object-level&quot;&gt;Caching at the object level&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#when-to-update-the-cache&quot;&gt;When to update the cache&lt;/a&gt; 
    &lt;ul&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#cache-aside&quot;&gt;Cache-aside&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#write-through&quot;&gt;Write-through&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#write-behind-write-back&quot;&gt;Write-behind (write-back)&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#refresh-ahead&quot;&gt;Refresh-ahead&lt;/a&gt;&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#asynchronism&quot;&gt;Asynchronism&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#message-queues&quot;&gt;Message queues&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#task-queues&quot;&gt;Task queues&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#back-pressure&quot;&gt;Back pressure&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#communication&quot;&gt;Communication&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#transmission-control-protocol-tcp&quot;&gt;Transmission control protocol (TCP)&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#user-datagram-protocol-udp&quot;&gt;User datagram protocol (UDP)&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#remote-procedure-call-rpc&quot;&gt;Remote procedure call (RPC)&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#representational-state-transfer-rest&quot;&gt;Representational state transfer (REST)&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#security&quot;&gt;Security&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#appendix&quot;&gt;Appendix&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#powers-of-two-table&quot;&gt;Powers of two table&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#latency-numbers-every-programmer-should-know&quot;&gt;Latency numbers every programmer should know&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#additional-system-design-interview-questions&quot;&gt;Additional system design interview questions&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#real-world-architectures&quot;&gt;Real world architectures&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#company-architectures&quot;&gt;Company architectures&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#company-engineering-blogs&quot;&gt;Company engineering blogs&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#under-development&quot;&gt;Under development&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#credits&quot;&gt;Credits&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#contact-info&quot;&gt;Contact info&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#license&quot;&gt;License&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Study guide&lt;/h2&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;Suggested topics to review based on your interview timeline (short, medium, long).&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/OfVllex.png&quot; alt=&quot;Imgur&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Q: For interviews, do I need to know everything here?&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;A: No, you don&#39;t need to know everything here to prepare for the interview&lt;/strong&gt;.&lt;/p&gt; 
&lt;p&gt;What you are asked in an interview depends on variables such as:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;How much experience you have&lt;/li&gt; 
 &lt;li&gt;What your technical background is&lt;/li&gt; 
 &lt;li&gt;What positions you are interviewing for&lt;/li&gt; 
 &lt;li&gt;Which companies you are interviewing with&lt;/li&gt; 
 &lt;li&gt;Luck&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;More experienced candidates are generally expected to know more about system design. Architects or team leads might be expected to know more than individual contributors. Top tech companies are likely to have one or more design interview rounds.&lt;/p&gt; 
&lt;p&gt;Start broad and go deeper in a few areas. It helps to know a little about various key system design topics. Adjust the following guide based on your timeline, experience, what positions you are interviewing for, and which companies you are interviewing with.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Short timeline&lt;/strong&gt; - Aim for &lt;strong&gt;breadth&lt;/strong&gt; with system design topics. Practice by solving &lt;strong&gt;some&lt;/strong&gt; interview questions.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Medium timeline&lt;/strong&gt; - Aim for &lt;strong&gt;breadth&lt;/strong&gt; and &lt;strong&gt;some depth&lt;/strong&gt; with system design topics. Practice by solving &lt;strong&gt;many&lt;/strong&gt; interview questions.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Long timeline&lt;/strong&gt; - Aim for &lt;strong&gt;breadth&lt;/strong&gt; and &lt;strong&gt;more depth&lt;/strong&gt; with system design topics. Practice by solving &lt;strong&gt;most&lt;/strong&gt; interview questions.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;&lt;/th&gt; 
   &lt;th&gt;Short&lt;/th&gt; 
   &lt;th&gt;Medium&lt;/th&gt; 
   &lt;th&gt;Long&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Read through the &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#index-of-system-design-topics&quot;&gt;System design topics&lt;/a&gt; to get a broad understanding of how systems work&lt;/td&gt; 
   &lt;td&gt;👍&lt;/td&gt; 
   &lt;td&gt;👍&lt;/td&gt; 
   &lt;td&gt;👍&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Read through a few articles in the &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#company-engineering-blogs&quot;&gt;Company engineering blogs&lt;/a&gt; for the companies you are interviewing with&lt;/td&gt; 
   &lt;td&gt;👍&lt;/td&gt; 
   &lt;td&gt;👍&lt;/td&gt; 
   &lt;td&gt;👍&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Read through a few &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#real-world-architectures&quot;&gt;Real world architectures&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;👍&lt;/td&gt; 
   &lt;td&gt;👍&lt;/td&gt; 
   &lt;td&gt;👍&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Review &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#how-to-approach-a-system-design-interview-question&quot;&gt;How to approach a system design interview question&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;👍&lt;/td&gt; 
   &lt;td&gt;👍&lt;/td&gt; 
   &lt;td&gt;👍&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Work through &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#system-design-interview-questions-with-solutions&quot;&gt;System design interview questions with solutions&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Some&lt;/td&gt; 
   &lt;td&gt;Many&lt;/td&gt; 
   &lt;td&gt;Most&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Work through &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#object-oriented-design-interview-questions-with-solutions&quot;&gt;Object-oriented design interview questions with solutions&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Some&lt;/td&gt; 
   &lt;td&gt;Many&lt;/td&gt; 
   &lt;td&gt;Most&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Review &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#additional-system-design-interview-questions&quot;&gt;Additional system design interview questions&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Some&lt;/td&gt; 
   &lt;td&gt;Many&lt;/td&gt; 
   &lt;td&gt;Most&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h2&gt;How to approach a system design interview question&lt;/h2&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;How to tackle a system design interview question.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;The system design interview is an &lt;strong&gt;open-ended conversation&lt;/strong&gt;. You are expected to lead it.&lt;/p&gt; 
&lt;p&gt;You can use the following steps to guide the discussion. To help solidify this process, work through the &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#system-design-interview-questions-with-solutions&quot;&gt;System design interview questions with solutions&lt;/a&gt; section using the following steps.&lt;/p&gt; 
&lt;h3&gt;Step 1: Outline use cases, constraints, and assumptions&lt;/h3&gt; 
&lt;p&gt;Gather requirements and scope the problem. Ask questions to clarify use cases and constraints. Discuss assumptions.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Who is going to use it?&lt;/li&gt; 
 &lt;li&gt;How are they going to use it?&lt;/li&gt; 
 &lt;li&gt;How many users are there?&lt;/li&gt; 
 &lt;li&gt;What does the system do?&lt;/li&gt; 
 &lt;li&gt;What are the inputs and outputs of the system?&lt;/li&gt; 
 &lt;li&gt;How much data do we expect to handle?&lt;/li&gt; 
 &lt;li&gt;How many requests per second do we expect?&lt;/li&gt; 
 &lt;li&gt;What is the expected read to write ratio?&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Step 2: Create a high level design&lt;/h3&gt; 
&lt;p&gt;Outline a high level design with all important components.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Sketch the main components and connections&lt;/li&gt; 
 &lt;li&gt;Justify your ideas&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Step 3: Design core components&lt;/h3&gt; 
&lt;p&gt;Dive into details for each core component. For example, if you were asked to &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/solutions/system_design/pastebin/README.md&quot;&gt;design a url shortening service&lt;/a&gt;, discuss:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Generating and storing a hash of the full url 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/solutions/system_design/pastebin/README.md&quot;&gt;MD5&lt;/a&gt; and &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/solutions/system_design/pastebin/README.md&quot;&gt;Base62&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;Hash collisions&lt;/li&gt; 
   &lt;li&gt;SQL or NoSQL&lt;/li&gt; 
   &lt;li&gt;Database schema&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;Translating a hashed url to the full url 
  &lt;ul&gt; 
   &lt;li&gt;Database lookup&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;API and object-oriented design&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Step 4: Scale the design&lt;/h3&gt; 
&lt;p&gt;Identify and address bottlenecks, given the constraints. For example, do you need the following to address scalability issues?&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Load balancer&lt;/li&gt; 
 &lt;li&gt;Horizontal scaling&lt;/li&gt; 
 &lt;li&gt;Caching&lt;/li&gt; 
 &lt;li&gt;Database sharding&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Discuss potential solutions and trade-offs. Everything is a trade-off. Address bottlenecks using &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#index-of-system-design-topics&quot;&gt;principles of scalable system design&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;Back-of-the-envelope calculations&lt;/h3&gt; 
&lt;p&gt;You might be asked to do some estimates by hand. Refer to the &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#appendix&quot;&gt;Appendix&lt;/a&gt; for the following resources:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://highscalability.com/blog/2011/1/26/google-pro-tip-use-back-of-the-envelope-calculations-to-choo.html&quot;&gt;Use back of the envelope calculations&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#powers-of-two-table&quot;&gt;Powers of two table&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#latency-numbers-every-programmer-should-know&quot;&gt;Latency numbers every programmer should know&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Source(s) and further reading&lt;/h3&gt; 
&lt;p&gt;Check out the following links to get a better idea of what to expect:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20210505130322/https://www.palantir.com/2011/10/how-to-rock-a-systems-design-interview/&quot;&gt;How to ace a systems design interview&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.hiredintech.com/system-design&quot;&gt;The system design interview&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=ZgdS0EUmn70&quot;&gt;Intro to Architecture and Systems Design Interviews&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://leetcode.com/discuss/career/229177/My-System-Design-Template&quot;&gt;System design template&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;System design interview questions with solutions&lt;/h2&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;Common system design interview questions with sample discussions, code, and diagrams.&lt;/p&gt; 
 &lt;p&gt;Solutions linked to content in the &lt;code&gt;solutions/&lt;/code&gt; folder.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Question&lt;/th&gt; 
   &lt;th&gt;&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design &lt;a href=&quot;http://Pastebin.com&quot;&gt;Pastebin.com&lt;/a&gt; (or &lt;a href=&quot;http://Bit.ly&quot;&gt;Bit.ly&lt;/a&gt;)&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/solutions/system_design/pastebin/README.md&quot;&gt;Solution&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design the Twitter timeline and search (or Facebook feed and search)&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/solutions/system_design/twitter/README.md&quot;&gt;Solution&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design a web crawler&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/solutions/system_design/web_crawler/README.md&quot;&gt;Solution&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design &lt;a href=&quot;http://Mint.com&quot;&gt;Mint.com&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/solutions/system_design/mint/README.md&quot;&gt;Solution&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design the data structures for a social network&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/solutions/system_design/social_graph/README.md&quot;&gt;Solution&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design a key-value store for a search engine&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/solutions/system_design/query_cache/README.md&quot;&gt;Solution&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design Amazon&#39;s sales ranking by category feature&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/solutions/system_design/sales_rank/README.md&quot;&gt;Solution&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design a system that scales to millions of users on AWS&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/solutions/system_design/scaling_aws/README.md&quot;&gt;Solution&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Add a system design question&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#contributing&quot;&gt;Contribute&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h3&gt;Design &lt;a href=&quot;http://Pastebin.com&quot;&gt;Pastebin.com&lt;/a&gt; (or &lt;a href=&quot;http://Bit.ly&quot;&gt;Bit.ly&lt;/a&gt;)&lt;/h3&gt; 
&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/solutions/system_design/pastebin/README.md&quot;&gt;View exercise and solution&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/4edXG0T.png&quot; alt=&quot;Imgur&quot; /&gt;&lt;/p&gt; 
&lt;h3&gt;Design the Twitter timeline and search (or Facebook feed and search)&lt;/h3&gt; 
&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/solutions/system_design/twitter/README.md&quot;&gt;View exercise and solution&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/jrUBAF7.png&quot; alt=&quot;Imgur&quot; /&gt;&lt;/p&gt; 
&lt;h3&gt;Design a web crawler&lt;/h3&gt; 
&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/solutions/system_design/web_crawler/README.md&quot;&gt;View exercise and solution&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/bWxPtQA.png&quot; alt=&quot;Imgur&quot; /&gt;&lt;/p&gt; 
&lt;h3&gt;Design &lt;a href=&quot;http://Mint.com&quot;&gt;Mint.com&lt;/a&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/solutions/system_design/mint/README.md&quot;&gt;View exercise and solution&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/V5q57vU.png&quot; alt=&quot;Imgur&quot; /&gt;&lt;/p&gt; 
&lt;h3&gt;Design the data structures for a social network&lt;/h3&gt; 
&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/solutions/system_design/social_graph/README.md&quot;&gt;View exercise and solution&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/cdCv5g7.png&quot; alt=&quot;Imgur&quot; /&gt;&lt;/p&gt; 
&lt;h3&gt;Design a key-value store for a search engine&lt;/h3&gt; 
&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/solutions/system_design/query_cache/README.md&quot;&gt;View exercise and solution&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/4j99mhe.png&quot; alt=&quot;Imgur&quot; /&gt;&lt;/p&gt; 
&lt;h3&gt;Design Amazon&#39;s sales ranking by category feature&lt;/h3&gt; 
&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/solutions/system_design/sales_rank/README.md&quot;&gt;View exercise and solution&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/MzExP06.png&quot; alt=&quot;Imgur&quot; /&gt;&lt;/p&gt; 
&lt;h3&gt;Design a system that scales to millions of users on AWS&lt;/h3&gt; 
&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/solutions/system_design/scaling_aws/README.md&quot;&gt;View exercise and solution&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/jj3A5N8.png&quot; alt=&quot;Imgur&quot; /&gt;&lt;/p&gt; 
&lt;h2&gt;Object-oriented design interview questions with solutions&lt;/h2&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;Common object-oriented design interview questions with sample discussions, code, and diagrams.&lt;/p&gt; 
 &lt;p&gt;Solutions linked to content in the &lt;code&gt;solutions/&lt;/code&gt; folder.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;Note: This section is under development&lt;/strong&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Question&lt;/th&gt; 
   &lt;th&gt;&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design a hash map&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/solutions/object_oriented_design/hash_table/hash_map.ipynb&quot;&gt;Solution&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design a least recently used cache&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/solutions/object_oriented_design/lru_cache/lru_cache.ipynb&quot;&gt;Solution&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design a call center&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/solutions/object_oriented_design/call_center/call_center.ipynb&quot;&gt;Solution&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design a deck of cards&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/solutions/object_oriented_design/deck_of_cards/deck_of_cards.ipynb&quot;&gt;Solution&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design a parking lot&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/solutions/object_oriented_design/parking_lot/parking_lot.ipynb&quot;&gt;Solution&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design a chat server&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/solutions/object_oriented_design/online_chat/online_chat.ipynb&quot;&gt;Solution&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design a circular array&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#contributing&quot;&gt;Contribute&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Add an object-oriented design question&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#contributing&quot;&gt;Contribute&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h2&gt;System design topics: start here&lt;/h2&gt; 
&lt;p&gt;New to system design?&lt;/p&gt; 
&lt;p&gt;First, you&#39;ll need a basic understanding of common principles, learning about what they are, how they are used, and their pros and cons.&lt;/p&gt; 
&lt;h3&gt;Step 1: Review the scalability video lecture&lt;/h3&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=-W9F__D3oY4&quot;&gt;Scalability Lecture at Harvard&lt;/a&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Topics covered: 
  &lt;ul&gt; 
   &lt;li&gt;Vertical scaling&lt;/li&gt; 
   &lt;li&gt;Horizontal scaling&lt;/li&gt; 
   &lt;li&gt;Caching&lt;/li&gt; 
   &lt;li&gt;Load balancing&lt;/li&gt; 
   &lt;li&gt;Database replication&lt;/li&gt; 
   &lt;li&gt;Database partitioning&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Step 2: Review the scalability article&lt;/h3&gt; 
&lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20221030091841/http://www.lecloud.net/tagged/scalability/chrono&quot;&gt;Scalability&lt;/a&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Topics covered: 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20220530193911/https://www.lecloud.net/post/7295452622/scalability-for-dummies-part-1-clones&quot;&gt;Clones&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20220602114024/https://www.lecloud.net/post/7994751381/scalability-for-dummies-part-2-database&quot;&gt;Databases&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20230126233752/https://www.lecloud.net/post/9246290032/scalability-for-dummies-part-3-cache&quot;&gt;Caches&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20220926171507/https://www.lecloud.net/post/9699762917/scalability-for-dummies-part-4-asynchronism&quot;&gt;Asynchronism&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Next steps&lt;/h3&gt; 
&lt;p&gt;Next, we&#39;ll look at high-level trade-offs:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Performance&lt;/strong&gt; vs &lt;strong&gt;scalability&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Latency&lt;/strong&gt; vs &lt;strong&gt;throughput&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Availability&lt;/strong&gt; vs &lt;strong&gt;consistency&lt;/strong&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Keep in mind that &lt;strong&gt;everything is a trade-off&lt;/strong&gt;.&lt;/p&gt; 
&lt;p&gt;Then we&#39;ll dive into more specific topics such as DNS, CDNs, and load balancers.&lt;/p&gt; 
&lt;h2&gt;Performance vs scalability&lt;/h2&gt; 
&lt;p&gt;A service is &lt;strong&gt;scalable&lt;/strong&gt; if it results in increased &lt;strong&gt;performance&lt;/strong&gt; in a manner proportional to resources added. Generally, increasing performance means serving more units of work, but it can also be to handle larger units of work, such as when datasets grow.&lt;sup&gt;&lt;a href=&quot;http://www.allthingsdistributed.com/2006/03/a_word_on_scalability.html&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt; 
&lt;p&gt;Another way to look at performance vs scalability:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;If you have a &lt;strong&gt;performance&lt;/strong&gt; problem, your system is slow for a single user.&lt;/li&gt; 
 &lt;li&gt;If you have a &lt;strong&gt;scalability&lt;/strong&gt; problem, your system is fast for a single user but slow under heavy load.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Source(s) and further reading&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.allthingsdistributed.com/2006/03/a_word_on_scalability.html&quot;&gt;A word on scalability&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.slideshare.net/jboner/scalability-availability-stability-patterns/&quot;&gt;Scalability, availability, stability, patterns&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Latency vs throughput&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Latency&lt;/strong&gt; is the time to perform some action or to produce some result.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Throughput&lt;/strong&gt; is the number of such actions or results per unit of time.&lt;/p&gt; 
&lt;p&gt;Generally, you should aim for &lt;strong&gt;maximal throughput&lt;/strong&gt; with &lt;strong&gt;acceptable latency&lt;/strong&gt;.&lt;/p&gt; 
&lt;h3&gt;Source(s) and further reading&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://community.cadence.com/cadence_blogs_8/b/fv/posts/understanding-latency-vs-throughput&quot;&gt;Understanding latency vs throughput&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Availability vs consistency&lt;/h2&gt; 
&lt;h3&gt;CAP theorem&lt;/h3&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/bgLMI2u.png&quot; /&gt; &lt;br /&gt; &lt;i&gt;&lt;a href=&quot;https://robertgreiner.com/cap-theorem-revisited&quot;&gt;Source: CAP theorem revisited&lt;/a&gt;&lt;/i&gt; &lt;/p&gt; 
&lt;p&gt;In a distributed computer system, you can only support two of the following guarantees:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Consistency&lt;/strong&gt; - Every read receives the most recent write or an error&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Availability&lt;/strong&gt; - Every request receives a response, without guarantee that it contains the most recent version of the information&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Partition Tolerance&lt;/strong&gt; - The system continues to operate despite arbitrary partitioning due to network failures&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;em&gt;Networks aren&#39;t reliable, so you&#39;ll need to support partition tolerance. You&#39;ll need to make a software tradeoff between consistency and availability.&lt;/em&gt;&lt;/p&gt; 
&lt;h4&gt;CP - consistency and partition tolerance&lt;/h4&gt; 
&lt;p&gt;Waiting for a response from the partitioned node might result in a timeout error. CP is a good choice if your business needs require atomic reads and writes.&lt;/p&gt; 
&lt;h4&gt;AP - availability and partition tolerance&lt;/h4&gt; 
&lt;p&gt;Responses return the most readily available version of the data available on any node, which might not be the latest. Writes might take some time to propagate when the partition is resolved.&lt;/p&gt; 
&lt;p&gt;AP is a good choice if the business needs to allow for &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#eventual-consistency&quot;&gt;eventual consistency&lt;/a&gt; or when the system needs to continue working despite external errors.&lt;/p&gt; 
&lt;h3&gt;Source(s) and further reading&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://robertgreiner.com/cap-theorem-revisited/&quot;&gt;CAP theorem revisited&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://ksat.me/a-plain-english-introduction-to-cap-theorem&quot;&gt;A plain english introduction to CAP theorem&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/henryr/cap-faq&quot;&gt;CAP FAQ&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=k-Yaq8AHlFA&quot;&gt;The CAP theorem&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Consistency patterns&lt;/h2&gt; 
&lt;p&gt;With multiple copies of the same data, we are faced with options on how to synchronize them so clients have a consistent view of the data. Recall the definition of consistency from the &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#cap-theorem&quot;&gt;CAP theorem&lt;/a&gt; - Every read receives the most recent write or an error.&lt;/p&gt; 
&lt;h3&gt;Weak consistency&lt;/h3&gt; 
&lt;p&gt;After a write, reads may or may not see it. A best effort approach is taken.&lt;/p&gt; 
&lt;p&gt;This approach is seen in systems such as memcached. Weak consistency works well in real time use cases such as VoIP, video chat, and realtime multiplayer games. For example, if you are on a phone call and lose reception for a few seconds, when you regain connection you do not hear what was spoken during connection loss.&lt;/p&gt; 
&lt;h3&gt;Eventual consistency&lt;/h3&gt; 
&lt;p&gt;After a write, reads will eventually see it (typically within milliseconds). Data is replicated asynchronously.&lt;/p&gt; 
&lt;p&gt;This approach is seen in systems such as DNS and email. Eventual consistency works well in highly available systems.&lt;/p&gt; 
&lt;h3&gt;Strong consistency&lt;/h3&gt; 
&lt;p&gt;After a write, reads will see it. Data is replicated synchronously.&lt;/p&gt; 
&lt;p&gt;This approach is seen in file systems and RDBMSes. Strong consistency works well in systems that need transactions.&lt;/p&gt; 
&lt;h3&gt;Source(s) and further reading&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://snarfed.org/transactions_across_datacenters_io.html&quot;&gt;Transactions across data centers&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Availability patterns&lt;/h2&gt; 
&lt;p&gt;There are two complementary patterns to support high availability: &lt;strong&gt;fail-over&lt;/strong&gt; and &lt;strong&gt;replication&lt;/strong&gt;.&lt;/p&gt; 
&lt;h3&gt;Fail-over&lt;/h3&gt; 
&lt;h4&gt;Active-passive&lt;/h4&gt; 
&lt;p&gt;With active-passive fail-over, heartbeats are sent between the active and the passive server on standby. If the heartbeat is interrupted, the passive server takes over the active&#39;s IP address and resumes service.&lt;/p&gt; 
&lt;p&gt;The length of downtime is determined by whether the passive server is already running in &#39;hot&#39; standby or whether it needs to start up from &#39;cold&#39; standby. Only the active server handles traffic.&lt;/p&gt; 
&lt;p&gt;Active-passive failover can also be referred to as master-slave failover.&lt;/p&gt; 
&lt;h4&gt;Active-active&lt;/h4&gt; 
&lt;p&gt;In active-active, both servers are managing traffic, spreading the load between them.&lt;/p&gt; 
&lt;p&gt;If the servers are public-facing, the DNS would need to know about the public IPs of both servers. If the servers are internal-facing, application logic would need to know about both servers.&lt;/p&gt; 
&lt;p&gt;Active-active failover can also be referred to as master-master failover.&lt;/p&gt; 
&lt;h3&gt;Disadvantage(s): failover&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;Fail-over adds more hardware and additional complexity.&lt;/li&gt; 
 &lt;li&gt;There is a potential for loss of data if the active system fails before any newly written data can be replicated to the passive.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Replication&lt;/h3&gt; 
&lt;h4&gt;Master-slave and master-master&lt;/h4&gt; 
&lt;p&gt;This topic is further discussed in the &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#database&quot;&gt;Database&lt;/a&gt; section:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#master-slave-replication&quot;&gt;Master-slave replication&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#master-master-replication&quot;&gt;Master-master replication&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Availability in numbers&lt;/h3&gt; 
&lt;p&gt;Availability is often quantified by uptime (or downtime) as a percentage of time the service is available. Availability is generally measured in number of 9s--a service with 99.99% availability is described as having four 9s.&lt;/p&gt; 
&lt;h4&gt;99.9% availability - three 9s&lt;/h4&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Duration&lt;/th&gt; 
   &lt;th&gt;Acceptable downtime&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Downtime per year&lt;/td&gt; 
   &lt;td&gt;8h 45min 57s&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Downtime per month&lt;/td&gt; 
   &lt;td&gt;43m 49.7s&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Downtime per week&lt;/td&gt; 
   &lt;td&gt;10m 4.8s&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Downtime per day&lt;/td&gt; 
   &lt;td&gt;1m 26.4s&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h4&gt;99.99% availability - four 9s&lt;/h4&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Duration&lt;/th&gt; 
   &lt;th&gt;Acceptable downtime&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Downtime per year&lt;/td&gt; 
   &lt;td&gt;52min 35.7s&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Downtime per month&lt;/td&gt; 
   &lt;td&gt;4m 23s&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Downtime per week&lt;/td&gt; 
   &lt;td&gt;1m 5s&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Downtime per day&lt;/td&gt; 
   &lt;td&gt;8.6s&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h4&gt;Availability in parallel vs in sequence&lt;/h4&gt; 
&lt;p&gt;If a service consists of multiple components prone to failure, the service&#39;s overall availability depends on whether the components are in sequence or in parallel.&lt;/p&gt; 
&lt;h6&gt;In sequence&lt;/h6&gt; 
&lt;p&gt;Overall availability decreases when two components with availability &amp;lt; 100% are in sequence:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Availability (Total) = Availability (Foo) * Availability (Bar)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;If both &lt;code&gt;Foo&lt;/code&gt; and &lt;code&gt;Bar&lt;/code&gt; each had 99.9% availability, their total availability in sequence would be 99.8%.&lt;/p&gt; 
&lt;h6&gt;In parallel&lt;/h6&gt; 
&lt;p&gt;Overall availability increases when two components with availability &amp;lt; 100% are in parallel:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Availability (Total) = 1 - (1 - Availability (Foo)) * (1 - Availability (Bar))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;If both &lt;code&gt;Foo&lt;/code&gt; and &lt;code&gt;Bar&lt;/code&gt; each had 99.9% availability, their total availability in parallel would be 99.9999%.&lt;/p&gt; 
&lt;h2&gt;Domain name system&lt;/h2&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/IOyLj4i.jpg&quot; /&gt; &lt;br /&gt; &lt;i&gt;&lt;a href=&quot;http://www.slideshare.net/srikrupa5/dns-security-presentation-issa&quot;&gt;Source: DNS security presentation&lt;/a&gt;&lt;/i&gt; &lt;/p&gt; 
&lt;p&gt;A Domain Name System (DNS) translates a domain name such as &lt;a href=&quot;http://www.example.com&quot;&gt;www.example.com&lt;/a&gt; to an IP address.&lt;/p&gt; 
&lt;p&gt;DNS is hierarchical, with a few authoritative servers at the top level. Your router or ISP provides information about which DNS server(s) to contact when doing a lookup. Lower level DNS servers cache mappings, which could become stale due to DNS propagation delays. DNS results can also be cached by your browser or OS for a certain period of time, determined by the &lt;a href=&quot;https://en.wikipedia.org/wiki/Time_to_live&quot;&gt;time to live (TTL)&lt;/a&gt;.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;NS record (name server)&lt;/strong&gt; - Specifies the DNS servers for your domain/subdomain.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;MX record (mail exchange)&lt;/strong&gt; - Specifies the mail servers for accepting messages.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;A record (address)&lt;/strong&gt; - Points a name to an IP address.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;CNAME (canonical)&lt;/strong&gt; - Points a name to another name or &lt;code&gt;CNAME&lt;/code&gt; (&lt;a href=&quot;http://example.com&quot;&gt;example.com&lt;/a&gt; to &lt;a href=&quot;http://www.example.com&quot;&gt;www.example.com&lt;/a&gt;) or to an &lt;code&gt;A&lt;/code&gt; record.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Services such as &lt;a href=&quot;https://www.cloudflare.com/dns/&quot;&gt;CloudFlare&lt;/a&gt; and &lt;a href=&quot;https://aws.amazon.com/route53/&quot;&gt;Route 53&lt;/a&gt; provide managed DNS services. Some DNS services can route traffic through various methods:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.jscape.com/blog/load-balancing-algorithms&quot;&gt;Weighted round robin&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;Prevent traffic from going to servers under maintenance&lt;/li&gt; 
   &lt;li&gt;Balance between varying cluster sizes&lt;/li&gt; 
   &lt;li&gt;A/B testing&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy-latency.html&quot;&gt;Latency-based&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy-geo.html&quot;&gt;Geolocation-based&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Disadvantage(s): DNS&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;Accessing a DNS server introduces a slight delay, although mitigated by caching described above.&lt;/li&gt; 
 &lt;li&gt;DNS server management could be complex and is generally managed by &lt;a href=&quot;http://superuser.com/questions/472695/who-controls-the-dns-servers/472729&quot;&gt;governments, ISPs, and large companies&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;DNS services have recently come under &lt;a href=&quot;http://dyn.com/blog/dyn-analysis-summary-of-friday-october-21-attack/&quot;&gt;DDoS attack&lt;/a&gt;, preventing users from accessing websites such as Twitter without knowing Twitter&#39;s IP address(es).&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Source(s) and further reading&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://technet.microsoft.com/en-us/library/dd197427(v=ws.10).aspx&quot;&gt;DNS architecture&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Domain_Name_System&quot;&gt;Wikipedia&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://support.dnsimple.com/categories/dns/&quot;&gt;DNS articles&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Content delivery network&lt;/h2&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/h9TAuGI.jpg&quot; /&gt; &lt;br /&gt; &lt;i&gt;&lt;a href=&quot;https://www.creative-artworks.eu/why-use-a-content-delivery-network-cdn/&quot;&gt;Source: Why use a CDN&lt;/a&gt;&lt;/i&gt; &lt;/p&gt; 
&lt;p&gt;A content delivery network (CDN) is a globally distributed network of proxy servers, serving content from locations closer to the user. Generally, static files such as HTML/CSS/JS, photos, and videos are served from CDN, although some CDNs such as Amazon&#39;s CloudFront support dynamic content. The site&#39;s DNS resolution will tell clients which server to contact.&lt;/p&gt; 
&lt;p&gt;Serving content from CDNs can significantly improve performance in two ways:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Users receive content from data centers close to them&lt;/li&gt; 
 &lt;li&gt;Your servers do not have to serve requests that the CDN fulfills&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Push CDNs&lt;/h3&gt; 
&lt;p&gt;Push CDNs receive new content whenever changes occur on your server. You take full responsibility for providing content, uploading directly to the CDN and rewriting URLs to point to the CDN. You can configure when content expires and when it is updated. Content is uploaded only when it is new or changed, minimizing traffic, but maximizing storage.&lt;/p&gt; 
&lt;p&gt;Sites with a small amount of traffic or sites with content that isn&#39;t often updated work well with push CDNs. Content is placed on the CDNs once, instead of being re-pulled at regular intervals.&lt;/p&gt; 
&lt;h3&gt;Pull CDNs&lt;/h3&gt; 
&lt;p&gt;Pull CDNs grab new content from your server when the first user requests the content. You leave the content on your server and rewrite URLs to point to the CDN. This results in a slower request until the content is cached on the CDN.&lt;/p&gt; 
&lt;p&gt;A &lt;a href=&quot;https://en.wikipedia.org/wiki/Time_to_live&quot;&gt;time-to-live (TTL)&lt;/a&gt; determines how long content is cached. Pull CDNs minimize storage space on the CDN, but can create redundant traffic if files expire and are pulled before they have actually changed.&lt;/p&gt; 
&lt;p&gt;Sites with heavy traffic work well with pull CDNs, as traffic is spread out more evenly with only recently-requested content remaining on the CDN.&lt;/p&gt; 
&lt;h3&gt;Disadvantage(s): CDN&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;CDN costs could be significant depending on traffic, although this should be weighed with additional costs you would incur not using a CDN.&lt;/li&gt; 
 &lt;li&gt;Content might be stale if it is updated before the TTL expires it.&lt;/li&gt; 
 &lt;li&gt;CDNs require changing URLs for static content to point to the CDN.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Source(s) and further reading&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://figshare.com/articles/Globally_distributed_content_delivery/6605972&quot;&gt;Globally distributed content delivery&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/system-design/pull-cdn-vs-push-cdn/&quot;&gt;The differences between push and pull CDNs&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Content_delivery_network&quot;&gt;Wikipedia&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Load balancer&lt;/h2&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/h81n9iK.png&quot; /&gt; &lt;br /&gt; &lt;i&gt;&lt;a href=&quot;http://horicky.blogspot.com/2010/10/scalable-system-design-patterns.html&quot;&gt;Source: Scalable system design patterns&lt;/a&gt;&lt;/i&gt; &lt;/p&gt; 
&lt;p&gt;Load balancers distribute incoming client requests to computing resources such as application servers and databases. In each case, the load balancer returns the response from the computing resource to the appropriate client. Load balancers are effective at:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Preventing requests from going to unhealthy servers&lt;/li&gt; 
 &lt;li&gt;Preventing overloading resources&lt;/li&gt; 
 &lt;li&gt;Helping to eliminate a single point of failure&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Load balancers can be implemented with hardware (expensive) or with software such as HAProxy.&lt;/p&gt; 
&lt;p&gt;Additional benefits include:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;SSL termination&lt;/strong&gt; - Decrypt incoming requests and encrypt server responses so backend servers do not have to perform these potentially expensive operations 
  &lt;ul&gt; 
   &lt;li&gt;Removes the need to install &lt;a href=&quot;https://en.wikipedia.org/wiki/X.509&quot;&gt;X.509 certificates&lt;/a&gt; on each server&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Session persistence&lt;/strong&gt; - Issue cookies and route a specific client&#39;s requests to same instance if the web apps do not keep track of sessions&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;To protect against failures, it&#39;s common to set up multiple load balancers, either in &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#active-passive&quot;&gt;active-passive&lt;/a&gt; or &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#active-active&quot;&gt;active-active&lt;/a&gt; mode.&lt;/p&gt; 
&lt;p&gt;Load balancers can route traffic based on various metrics, including:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Random&lt;/li&gt; 
 &lt;li&gt;Least loaded&lt;/li&gt; 
 &lt;li&gt;Session/cookies&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.g33kinfo.com/info/round-robin-vs-weighted-round-robin-lb&quot;&gt;Round robin or weighted round robin&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#layer-4-load-balancing&quot;&gt;Layer 4&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#layer-7-load-balancing&quot;&gt;Layer 7&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Layer 4 load balancing&lt;/h3&gt; 
&lt;p&gt;Layer 4 load balancers look at info at the &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#communication&quot;&gt;transport layer&lt;/a&gt; to decide how to distribute requests. Generally, this involves the source, destination IP addresses, and ports in the header, but not the contents of the packet. Layer 4 load balancers forward network packets to and from the upstream server, performing &lt;a href=&quot;https://web.archive.org/web/20240117134735/https://www.nginx.com/resources/glossary/layer-4-load-balancing/&quot;&gt;Network Address Translation (NAT)&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;Layer 7 load balancing&lt;/h3&gt; 
&lt;p&gt;Layer 7 load balancers look at the &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#communication&quot;&gt;application layer&lt;/a&gt; to decide how to distribute requests. This can involve contents of the header, message, and cookies. Layer 7 load balancers terminate network traffic, reads the message, makes a load-balancing decision, then opens a connection to the selected server. For example, a layer 7 load balancer can direct video traffic to servers that host videos while directing more sensitive user billing traffic to security-hardened servers.&lt;/p&gt; 
&lt;p&gt;At the cost of flexibility, layer 4 load balancing requires less time and computing resources than Layer 7, although the performance impact can be minimal on modern commodity hardware.&lt;/p&gt; 
&lt;h3&gt;Horizontal scaling&lt;/h3&gt; 
&lt;p&gt;Load balancers can also help with horizontal scaling, improving performance and availability. Scaling out using commodity machines is more cost efficient and results in higher availability than scaling up a single server on more expensive hardware, called &lt;strong&gt;Vertical Scaling&lt;/strong&gt;. It is also easier to hire for talent working on commodity hardware than it is for specialized enterprise systems.&lt;/p&gt; 
&lt;h4&gt;Disadvantage(s): horizontal scaling&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;Scaling horizontally introduces complexity and involves cloning servers 
  &lt;ul&gt; 
   &lt;li&gt;Servers should be stateless: they should not contain any user-related data like sessions or profile pictures&lt;/li&gt; 
   &lt;li&gt;Sessions can be stored in a centralized data store such as a &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#database&quot;&gt;database&lt;/a&gt; (SQL, NoSQL) or a persistent &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#cache&quot;&gt;cache&lt;/a&gt; (Redis, Memcached)&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;Downstream servers such as caches and databases need to handle more simultaneous connections as upstream servers scale out&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Disadvantage(s): load balancer&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;The load balancer can become a performance bottleneck if it does not have enough resources or if it is not configured properly.&lt;/li&gt; 
 &lt;li&gt;Introducing a load balancer to help eliminate a single point of failure results in increased complexity.&lt;/li&gt; 
 &lt;li&gt;A single load balancer is a single point of failure, configuring multiple load balancers further increases complexity.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Source(s) and further reading&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/&quot;&gt;NGINX architecture&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.haproxy.org/download/1.2/doc/architecture.txt&quot;&gt;HAProxy architecture guide&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20220530193911/https://www.lecloud.net/post/7295452622/scalability-for-dummies-part-1-clones&quot;&gt;Scalability&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Load_balancing_(computing)&quot;&gt;Wikipedia&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.nginx.com/resources/glossary/layer-4-load-balancing/&quot;&gt;Layer 4 load balancing&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.nginx.com/resources/glossary/layer-7-load-balancing/&quot;&gt;Layer 7 load balancing&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-listener-config.html&quot;&gt;ELB listener config&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Reverse proxy (web server)&lt;/h2&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/n41Azff.png&quot; /&gt; &lt;br /&gt; &lt;i&gt;&lt;a href=&quot;https://upload.wikimedia.org/wikipedia/commons/6/67/Reverse_proxy_h2g2bob.svg&quot;&gt;Source: Wikipedia&lt;/a&gt;&lt;/i&gt; &lt;br /&gt; &lt;/p&gt; 
&lt;p&gt;A reverse proxy is a web server that centralizes internal services and provides unified interfaces to the public. Requests from clients are forwarded to a server that can fulfill it before the reverse proxy returns the server&#39;s response to the client.&lt;/p&gt; 
&lt;p&gt;Additional benefits include:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Increased security&lt;/strong&gt; - Hide information about backend servers, blacklist IPs, limit number of connections per client&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Increased scalability and flexibility&lt;/strong&gt; - Clients only see the reverse proxy&#39;s IP, allowing you to scale servers or change their configuration&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;SSL termination&lt;/strong&gt; - Decrypt incoming requests and encrypt server responses so backend servers do not have to perform these potentially expensive operations 
  &lt;ul&gt; 
   &lt;li&gt;Removes the need to install &lt;a href=&quot;https://en.wikipedia.org/wiki/X.509&quot;&gt;X.509 certificates&lt;/a&gt; on each server&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Compression&lt;/strong&gt; - Compress server responses&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Caching&lt;/strong&gt; - Return the response for cached requests&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Static content&lt;/strong&gt; - Serve static content directly 
  &lt;ul&gt; 
   &lt;li&gt;HTML/CSS/JS&lt;/li&gt; 
   &lt;li&gt;Photos&lt;/li&gt; 
   &lt;li&gt;Videos&lt;/li&gt; 
   &lt;li&gt;Etc&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Load balancer vs reverse proxy&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;Deploying a load balancer is useful when you have multiple servers. Often, load balancers route traffic to a set of servers serving the same function.&lt;/li&gt; 
 &lt;li&gt;Reverse proxies can be useful even with just one web server or application server, opening up the benefits described in the previous section.&lt;/li&gt; 
 &lt;li&gt;Solutions such as NGINX and HAProxy can support both layer 7 reverse proxying and load balancing.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Disadvantage(s): reverse proxy&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;Introducing a reverse proxy results in increased complexity.&lt;/li&gt; 
 &lt;li&gt;A single reverse proxy is a single point of failure, configuring multiple reverse proxies (ie a &lt;a href=&quot;https://en.wikipedia.org/wiki/Failover&quot;&gt;failover&lt;/a&gt;) further increases complexity.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Source(s) and further reading&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.nginx.com/resources/glossary/reverse-proxy-vs-load-balancer/&quot;&gt;Reverse proxy vs load balancer&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/&quot;&gt;NGINX architecture&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.haproxy.org/download/1.2/doc/architecture.txt&quot;&gt;HAProxy architecture guide&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Reverse_proxy&quot;&gt;Wikipedia&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Application layer&lt;/h2&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/yB5SYwm.png&quot; /&gt; &lt;br /&gt; &lt;i&gt;&lt;a href=&quot;http://lethain.com/introduction-to-architecting-systems-for-scale/#platform_layer&quot;&gt;Source: Intro to architecting systems for scale&lt;/a&gt;&lt;/i&gt; &lt;/p&gt; 
&lt;p&gt;Separating out the web layer from the application layer (also known as platform layer) allows you to scale and configure both layers independently. Adding a new API results in adding application servers without necessarily adding additional web servers. The &lt;strong&gt;single responsibility principle&lt;/strong&gt; advocates for small and autonomous services that work together. Small teams with small services can plan more aggressively for rapid growth.&lt;/p&gt; 
&lt;p&gt;Workers in the application layer also help enable &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#asynchronism&quot;&gt;asynchronism&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;Microservices&lt;/h3&gt; 
&lt;p&gt;Related to this discussion are &lt;a href=&quot;https://en.wikipedia.org/wiki/Microservices&quot;&gt;microservices&lt;/a&gt;, which can be described as a suite of independently deployable, small, modular services. Each service runs a unique process and communicates through a well-defined, lightweight mechanism to serve a business goal. &lt;sup&gt;&lt;a href=&quot;https://smartbear.com/learn/api-design/what-are-microservices&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt; 
&lt;p&gt;Pinterest, for example, could have the following microservices: user profile, follower, feed, search, photo upload, etc.&lt;/p&gt; 
&lt;h3&gt;Service Discovery&lt;/h3&gt; 
&lt;p&gt;Systems such as &lt;a href=&quot;https://www.consul.io/docs/index.html&quot;&gt;Consul&lt;/a&gt;, &lt;a href=&quot;https://coreos.com/etcd/docs/latest&quot;&gt;Etcd&lt;/a&gt;, and &lt;a href=&quot;http://www.slideshare.net/sauravhaloi/introduction-to-apache-zookeeper&quot;&gt;Zookeeper&lt;/a&gt; can help services find each other by keeping track of registered names, addresses, and ports. &lt;a href=&quot;https://www.consul.io/intro/getting-started/checks.html&quot;&gt;Health checks&lt;/a&gt; help verify service integrity and are often done using an &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#hypertext-transfer-protocol-http&quot;&gt;HTTP&lt;/a&gt; endpoint. Both Consul and Etcd have a built in &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#key-value-store&quot;&gt;key-value store&lt;/a&gt; that can be useful for storing config values and other shared data.&lt;/p&gt; 
&lt;h3&gt;Disadvantage(s): application layer&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;Adding an application layer with loosely coupled services requires a different approach from an architectural, operations, and process viewpoint (vs a monolithic system).&lt;/li&gt; 
 &lt;li&gt;Microservices can add complexity in terms of deployments and operations.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Source(s) and further reading&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://lethain.com/introduction-to-architecting-systems-for-scale&quot;&gt;Intro to architecting systems for scale&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.puncsky.com/blog/2016-02-13-crack-the-system-design-interview&quot;&gt;Crack the system design interview&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Service-oriented_architecture&quot;&gt;Service oriented architecture&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.slideshare.net/sauravhaloi/introduction-to-apache-zookeeper&quot;&gt;Introduction to Zookeeper&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://cloudncode.wordpress.com/2016/07/22/msa-getting-started/&quot;&gt;Here&#39;s what you need to know about building microservices&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Database&lt;/h2&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/Xkm5CXz.png&quot; /&gt; &lt;br /&gt; &lt;i&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=kKjm4ehYiMs&quot;&gt;Source: Scaling up to your first 10 million users&lt;/a&gt;&lt;/i&gt; &lt;/p&gt; 
&lt;h3&gt;Relational database management system (RDBMS)&lt;/h3&gt; 
&lt;p&gt;A relational database like SQL is a collection of data items organized in tables.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;ACID&lt;/strong&gt; is a set of properties of relational database &lt;a href=&quot;https://en.wikipedia.org/wiki/Database_transaction&quot;&gt;transactions&lt;/a&gt;.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Atomicity&lt;/strong&gt; - Each transaction is all or nothing&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Consistency&lt;/strong&gt; - Any transaction will bring the database from one valid state to another&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Isolation&lt;/strong&gt; - Executing transactions concurrently has the same results as if the transactions were executed serially&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Durability&lt;/strong&gt; - Once a transaction has been committed, it will remain so&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;There are many techniques to scale a relational database: &lt;strong&gt;master-slave replication&lt;/strong&gt;, &lt;strong&gt;master-master replication&lt;/strong&gt;, &lt;strong&gt;federation&lt;/strong&gt;, &lt;strong&gt;sharding&lt;/strong&gt;, &lt;strong&gt;denormalization&lt;/strong&gt;, and &lt;strong&gt;SQL tuning&lt;/strong&gt;.&lt;/p&gt; 
&lt;h4&gt;Master-slave replication&lt;/h4&gt; 
&lt;p&gt;The master serves reads and writes, replicating writes to one or more slaves, which serve only reads. Slaves can also replicate to additional slaves in a tree-like fashion. If the master goes offline, the system can continue to operate in read-only mode until a slave is promoted to a master or a new master is provisioned.&lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/C9ioGtn.png&quot; /&gt; &lt;br /&gt; &lt;i&gt;&lt;a href=&quot;http://www.slideshare.net/jboner/scalability-availability-stability-patterns/&quot;&gt;Source: Scalability, availability, stability, patterns&lt;/a&gt;&lt;/i&gt; &lt;/p&gt; 
&lt;h5&gt;Disadvantage(s): master-slave replication&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;Additional logic is needed to promote a slave to a master.&lt;/li&gt; 
 &lt;li&gt;See &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#disadvantages-replication&quot;&gt;Disadvantage(s): replication&lt;/a&gt; for points related to &lt;strong&gt;both&lt;/strong&gt; master-slave and master-master.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Master-master replication&lt;/h4&gt; 
&lt;p&gt;Both masters serve reads and writes and coordinate with each other on writes. If either master goes down, the system can continue to operate with both reads and writes.&lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/krAHLGg.png&quot; /&gt; &lt;br /&gt; &lt;i&gt;&lt;a href=&quot;http://www.slideshare.net/jboner/scalability-availability-stability-patterns/&quot;&gt;Source: Scalability, availability, stability, patterns&lt;/a&gt;&lt;/i&gt; &lt;/p&gt; 
&lt;h5&gt;Disadvantage(s): master-master replication&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;You&#39;ll need a load balancer or you&#39;ll need to make changes to your application logic to determine where to write.&lt;/li&gt; 
 &lt;li&gt;Most master-master systems are either loosely consistent (violating ACID) or have increased write latency due to synchronization.&lt;/li&gt; 
 &lt;li&gt;Conflict resolution comes more into play as more write nodes are added and as latency increases.&lt;/li&gt; 
 &lt;li&gt;See &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#disadvantages-replication&quot;&gt;Disadvantage(s): replication&lt;/a&gt; for points related to &lt;strong&gt;both&lt;/strong&gt; master-slave and master-master.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h5&gt;Disadvantage(s): replication&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;There is a potential for loss of data if the master fails before any newly written data can be replicated to other nodes.&lt;/li&gt; 
 &lt;li&gt;Writes are replayed to the read replicas. If there are a lot of writes, the read replicas can get bogged down with replaying writes and can&#39;t do as many reads.&lt;/li&gt; 
 &lt;li&gt;The more read slaves, the more you have to replicate, which leads to greater replication lag.&lt;/li&gt; 
 &lt;li&gt;On some systems, writing to the master can spawn multiple threads to write in parallel, whereas read replicas only support writing sequentially with a single thread.&lt;/li&gt; 
 &lt;li&gt;Replication adds more hardware and additional complexity.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h5&gt;Source(s) and further reading: replication&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.slideshare.net/jboner/scalability-availability-stability-patterns/&quot;&gt;Scalability, availability, stability, patterns&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Multi-master_replication&quot;&gt;Multi-master replication&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Federation&lt;/h4&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/U3qV33e.png&quot; /&gt; &lt;br /&gt; &lt;i&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=kKjm4ehYiMs&quot;&gt;Source: Scaling up to your first 10 million users&lt;/a&gt;&lt;/i&gt; &lt;/p&gt; 
&lt;p&gt;Federation (or functional partitioning) splits up databases by function. For example, instead of a single, monolithic database, you could have three databases: &lt;strong&gt;forums&lt;/strong&gt;, &lt;strong&gt;users&lt;/strong&gt;, and &lt;strong&gt;products&lt;/strong&gt;, resulting in less read and write traffic to each database and therefore less replication lag. Smaller databases result in more data that can fit in memory, which in turn results in more cache hits due to improved cache locality. With no single central master serializing writes you can write in parallel, increasing throughput.&lt;/p&gt; 
&lt;h5&gt;Disadvantage(s): federation&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;Federation is not effective if your schema requires huge functions or tables.&lt;/li&gt; 
 &lt;li&gt;You&#39;ll need to update your application logic to determine which database to read and write.&lt;/li&gt; 
 &lt;li&gt;Joining data from two databases is more complex with a &lt;a href=&quot;http://stackoverflow.com/questions/5145637/querying-data-by-joining-two-tables-in-two-database-on-different-servers&quot;&gt;server link&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;Federation adds more hardware and additional complexity.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h5&gt;Source(s) and further reading: federation&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=kKjm4ehYiMs&quot;&gt;Scaling up to your first 10 million users&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Sharding&lt;/h4&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/wU8x5Id.png&quot; /&gt; &lt;br /&gt; &lt;i&gt;&lt;a href=&quot;http://www.slideshare.net/jboner/scalability-availability-stability-patterns/&quot;&gt;Source: Scalability, availability, stability, patterns&lt;/a&gt;&lt;/i&gt; &lt;/p&gt; 
&lt;p&gt;Sharding distributes data across different databases such that each database can only manage a subset of the data. Taking a users database as an example, as the number of users increases, more shards are added to the cluster.&lt;/p&gt; 
&lt;p&gt;Similar to the advantages of &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#federation&quot;&gt;federation&lt;/a&gt;, sharding results in less read and write traffic, less replication, and more cache hits. Index size is also reduced, which generally improves performance with faster queries. If one shard goes down, the other shards are still operational, although you&#39;ll want to add some form of replication to avoid data loss. Like federation, there is no single central master serializing writes, allowing you to write in parallel with increased throughput.&lt;/p&gt; 
&lt;p&gt;Common ways to shard a table of users is either through the user&#39;s last name initial or the user&#39;s geographic location.&lt;/p&gt; 
&lt;h5&gt;Disadvantage(s): sharding&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;You&#39;ll need to update your application logic to work with shards, which could result in complex SQL queries.&lt;/li&gt; 
 &lt;li&gt;Data distribution can become lopsided in a shard. For example, a set of power users on a shard could result in increased load to that shard compared to others. 
  &lt;ul&gt; 
   &lt;li&gt;Rebalancing adds additional complexity. A sharding function based on &lt;a href=&quot;http://www.paperplanes.de/2011/12/9/the-magic-of-consistent-hashing.html&quot;&gt;consistent hashing&lt;/a&gt; can reduce the amount of transferred data.&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;Joining data from multiple shards is more complex.&lt;/li&gt; 
 &lt;li&gt;Sharding adds more hardware and additional complexity.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h5&gt;Source(s) and further reading: sharding&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://highscalability.com/blog/2009/8/6/an-unorthodox-approach-to-database-design-the-coming-of-the.html&quot;&gt;The coming of the shard&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Shard_(database_architecture)&quot;&gt;Shard database architecture&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.paperplanes.de/2011/12/9/the-magic-of-consistent-hashing.html&quot;&gt;Consistent hashing&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Denormalization&lt;/h4&gt; 
&lt;p&gt;Denormalization attempts to improve read performance at the expense of some write performance. Redundant copies of the data are written in multiple tables to avoid expensive joins. Some RDBMS such as &lt;a href=&quot;https://en.wikipedia.org/wiki/PostgreSQL&quot;&gt;PostgreSQL&lt;/a&gt; and Oracle support &lt;a href=&quot;https://en.wikipedia.org/wiki/Materialized_view&quot;&gt;materialized views&lt;/a&gt; which handle the work of storing redundant information and keeping redundant copies consistent.&lt;/p&gt; 
&lt;p&gt;Once data becomes distributed with techniques such as &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#federation&quot;&gt;federation&lt;/a&gt; and &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#sharding&quot;&gt;sharding&lt;/a&gt;, managing joins across data centers further increases complexity. Denormalization might circumvent the need for such complex joins.&lt;/p&gt; 
&lt;p&gt;In most systems, reads can heavily outnumber writes 100:1 or even 1000:1. A read resulting in a complex database join can be very expensive, spending a significant amount of time on disk operations.&lt;/p&gt; 
&lt;h5&gt;Disadvantage(s): denormalization&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;Data is duplicated.&lt;/li&gt; 
 &lt;li&gt;Constraints can help redundant copies of information stay in sync, which increases complexity of the database design.&lt;/li&gt; 
 &lt;li&gt;A denormalized database under heavy write load might perform worse than its normalized counterpart.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h6&gt;Source(s) and further reading: denormalization&lt;/h6&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Denormalization&quot;&gt;Denormalization&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;SQL tuning&lt;/h4&gt; 
&lt;p&gt;SQL tuning is a broad topic and many &lt;a href=&quot;https://www.amazon.com/s/ref=nb_sb_noss_2?url=search-alias%3Daps&amp;amp;field-keywords=sql+tuning&quot;&gt;books&lt;/a&gt; have been written as reference.&lt;/p&gt; 
&lt;p&gt;It&#39;s important to &lt;strong&gt;benchmark&lt;/strong&gt; and &lt;strong&gt;profile&lt;/strong&gt; to simulate and uncover bottlenecks.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Benchmark&lt;/strong&gt; - Simulate high-load situations with tools such as &lt;a href=&quot;http://httpd.apache.org/docs/2.2/programs/ab.html&quot;&gt;ab&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Profile&lt;/strong&gt; - Enable tools such as the &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html&quot;&gt;slow query log&lt;/a&gt; to help track performance issues.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Benchmarking and profiling might point you to the following optimizations.&lt;/p&gt; 
&lt;h5&gt;Tighten up the schema&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;MySQL dumps to disk in contiguous blocks for fast access.&lt;/li&gt; 
 &lt;li&gt;Use &lt;code&gt;CHAR&lt;/code&gt; instead of &lt;code&gt;VARCHAR&lt;/code&gt; for fixed-length fields. 
  &lt;ul&gt; 
   &lt;li&gt;&lt;code&gt;CHAR&lt;/code&gt; effectively allows for fast, random access, whereas with &lt;code&gt;VARCHAR&lt;/code&gt;, you must find the end of a string before moving onto the next one.&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;Use &lt;code&gt;TEXT&lt;/code&gt; for large blocks of text such as blog posts. &lt;code&gt;TEXT&lt;/code&gt; also allows for boolean searches. Using a &lt;code&gt;TEXT&lt;/code&gt; field results in storing a pointer on disk that is used to locate the text block.&lt;/li&gt; 
 &lt;li&gt;Use &lt;code&gt;INT&lt;/code&gt; for larger numbers up to 2^32 or 4 billion.&lt;/li&gt; 
 &lt;li&gt;Use &lt;code&gt;DECIMAL&lt;/code&gt; for currency to avoid floating point representation errors.&lt;/li&gt; 
 &lt;li&gt;Avoid storing large &lt;code&gt;BLOBS&lt;/code&gt;, store the location of where to get the object instead.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;VARCHAR(255)&lt;/code&gt; is the largest number of characters that can be counted in an 8 bit number, often maximizing the use of a byte in some RDBMS.&lt;/li&gt; 
 &lt;li&gt;Set the &lt;code&gt;NOT NULL&lt;/code&gt; constraint where applicable to &lt;a href=&quot;http://stackoverflow.com/questions/1017239/how-do-null-values-affect-performance-in-a-database-search&quot;&gt;improve search performance&lt;/a&gt;.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h5&gt;Use good indices&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;Columns that you are querying (&lt;code&gt;SELECT&lt;/code&gt;, &lt;code&gt;GROUP BY&lt;/code&gt;, &lt;code&gt;ORDER BY&lt;/code&gt;, &lt;code&gt;JOIN&lt;/code&gt;) could be faster with indices.&lt;/li&gt; 
 &lt;li&gt;Indices are usually represented as self-balancing &lt;a href=&quot;https://en.wikipedia.org/wiki/B-tree&quot;&gt;B-tree&lt;/a&gt; that keeps data sorted and allows searches, sequential access, insertions, and deletions in logarithmic time.&lt;/li&gt; 
 &lt;li&gt;Placing an index can keep the data in memory, requiring more space.&lt;/li&gt; 
 &lt;li&gt;Writes could also be slower since the index also needs to be updated.&lt;/li&gt; 
 &lt;li&gt;When loading large amounts of data, it might be faster to disable indices, load the data, then rebuild the indices.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h5&gt;Avoid expensive joins&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#denormalization&quot;&gt;Denormalize&lt;/a&gt; where performance demands it.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h5&gt;Partition tables&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;Break up a table by putting hot spots in a separate table to help keep it in memory.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h5&gt;Tune the query cache&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;In some cases, the &lt;a href=&quot;https://dev.mysql.com/doc/refman/5.7/en/query-cache.html&quot;&gt;query cache&lt;/a&gt; could lead to &lt;a href=&quot;https://www.percona.com/blog/2016/10/12/mysql-5-7-performance-tuning-immediately-after-installation/&quot;&gt;performance issues&lt;/a&gt;.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h5&gt;Source(s) and further reading: SQL tuning&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://aiddroid.com/10-tips-optimizing-mysql-queries-dont-suck/&quot;&gt;Tips for optimizing MySQL queries&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/1217466/is-there-a-good-reason-i-see-varchar255-used-so-often-as-opposed-to-another-l&quot;&gt;Is there a good reason i see VARCHAR(255) used so often?&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/1017239/how-do-null-values-affect-performance-in-a-database-search&quot;&gt;How do null values affect performance?&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html&quot;&gt;Slow query log&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;NoSQL&lt;/h3&gt; 
&lt;p&gt;NoSQL is a collection of data items represented in a &lt;strong&gt;key-value store&lt;/strong&gt;, &lt;strong&gt;document store&lt;/strong&gt;, &lt;strong&gt;wide column store&lt;/strong&gt;, or a &lt;strong&gt;graph database&lt;/strong&gt;. Data is denormalized, and joins are generally done in the application code. Most NoSQL stores lack true ACID transactions and favor &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#eventual-consistency&quot;&gt;eventual consistency&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;BASE&lt;/strong&gt; is often used to describe the properties of NoSQL databases. In comparison with the &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#cap-theorem&quot;&gt;CAP Theorem&lt;/a&gt;, BASE chooses availability over consistency.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Basically available&lt;/strong&gt; - the system guarantees availability.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Soft state&lt;/strong&gt; - the state of the system may change over time, even without input.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Eventual consistency&lt;/strong&gt; - the system will become consistent over a period of time, given that the system doesn&#39;t receive input during that period.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;In addition to choosing between &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#sql-or-nosql&quot;&gt;SQL or NoSQL&lt;/a&gt;, it is helpful to understand which type of NoSQL database best fits your use case(s). We&#39;ll review &lt;strong&gt;key-value stores&lt;/strong&gt;, &lt;strong&gt;document stores&lt;/strong&gt;, &lt;strong&gt;wide column stores&lt;/strong&gt;, and &lt;strong&gt;graph databases&lt;/strong&gt; in the next section.&lt;/p&gt; 
&lt;h4&gt;Key-value store&lt;/h4&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;Abstraction: hash table&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;A key-value store generally allows for O(1) reads and writes and is often backed by memory or SSD. Data stores can maintain keys in &lt;a href=&quot;https://en.wikipedia.org/wiki/Lexicographical_order&quot;&gt;lexicographic order&lt;/a&gt;, allowing efficient retrieval of key ranges. Key-value stores can allow for storing of metadata with a value.&lt;/p&gt; 
&lt;p&gt;Key-value stores provide high performance and are often used for simple data models or for rapidly-changing data, such as an in-memory cache layer. Since they offer only a limited set of operations, complexity is shifted to the application layer if additional operations are needed.&lt;/p&gt; 
&lt;p&gt;A key-value store is the basis for more complex systems such as a document store, and in some cases, a graph database.&lt;/p&gt; 
&lt;h5&gt;Source(s) and further reading: key-value store&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Key-value_database&quot;&gt;Key-value database&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/4056093/what-are-the-disadvantages-of-using-a-key-value-table-over-nullable-columns-or&quot;&gt;Disadvantages of key-value stores&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://qnimate.com/overview-of-redis-architecture/&quot;&gt;Redis architecture&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://adayinthelifeof.nl/2011/02/06/memcache-internals/&quot;&gt;Memcached architecture&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Document store&lt;/h4&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;Abstraction: key-value store with documents stored as values&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;A document store is centered around documents (XML, JSON, binary, etc), where a document stores all information for a given object. Document stores provide APIs or a query language to query based on the internal structure of the document itself. &lt;em&gt;Note, many key-value stores include features for working with a value&#39;s metadata, blurring the lines between these two storage types.&lt;/em&gt;&lt;/p&gt; 
&lt;p&gt;Based on the underlying implementation, documents are organized by collections, tags, metadata, or directories. Although documents can be organized or grouped together, documents may have fields that are completely different from each other.&lt;/p&gt; 
&lt;p&gt;Some document stores like &lt;a href=&quot;https://www.mongodb.com/mongodb-architecture&quot;&gt;MongoDB&lt;/a&gt; and &lt;a href=&quot;https://blog.couchdb.org/2016/08/01/couchdb-2-0-architecture/&quot;&gt;CouchDB&lt;/a&gt; also provide a SQL-like language to perform complex queries. &lt;a href=&quot;http://www.read.seas.harvard.edu/~kohler/class/cs239-w08/decandia07dynamo.pdf&quot;&gt;DynamoDB&lt;/a&gt; supports both key-values and documents.&lt;/p&gt; 
&lt;p&gt;Document stores provide high flexibility and are often used for working with occasionally changing data.&lt;/p&gt; 
&lt;h5&gt;Source(s) and further reading: document store&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Document-oriented_database&quot;&gt;Document-oriented database&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.mongodb.com/mongodb-architecture&quot;&gt;MongoDB architecture&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://blog.couchdb.org/2016/08/01/couchdb-2-0-architecture/&quot;&gt;CouchDB architecture&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.elastic.co/blog/found-elasticsearch-from-the-bottom-up&quot;&gt;Elasticsearch architecture&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Wide column store&lt;/h4&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/n16iOGk.png&quot; /&gt; &lt;br /&gt; &lt;i&gt;&lt;a href=&quot;http://blog.grio.com/2015/11/sql-nosql-a-brief-history.html&quot;&gt;Source: SQL &amp;amp; NoSQL, a brief history&lt;/a&gt;&lt;/i&gt; &lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;Abstraction: nested map &lt;code&gt;ColumnFamily&amp;lt;RowKey, Columns&amp;lt;ColKey, Value, Timestamp&amp;gt;&amp;gt;&lt;/code&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;A wide column store&#39;s basic unit of data is a column (name/value pair). A column can be grouped in column families (analogous to a SQL table). Super column families further group column families. You can access each column independently with a row key, and columns with the same row key form a row. Each value contains a timestamp for versioning and for conflict resolution.&lt;/p&gt; 
&lt;p&gt;Google introduced &lt;a href=&quot;http://www.read.seas.harvard.edu/~kohler/class/cs239-w08/chang06bigtable.pdf&quot;&gt;Bigtable&lt;/a&gt; as the first wide column store, which influenced the open-source &lt;a href=&quot;https://www.edureka.co/blog/hbase-architecture/&quot;&gt;HBase&lt;/a&gt; often-used in the Hadoop ecosystem, and &lt;a href=&quot;http://docs.datastax.com/en/cassandra/3.0/cassandra/architecture/archIntro.html&quot;&gt;Cassandra&lt;/a&gt; from Facebook. Stores such as BigTable, HBase, and Cassandra maintain keys in lexicographic order, allowing efficient retrieval of selective key ranges.&lt;/p&gt; 
&lt;p&gt;Wide column stores offer high availability and high scalability. They are often used for very large data sets.&lt;/p&gt; 
&lt;h5&gt;Source(s) and further reading: wide column store&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://blog.grio.com/2015/11/sql-nosql-a-brief-history.html&quot;&gt;SQL &amp;amp; NoSQL, a brief history&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.read.seas.harvard.edu/~kohler/class/cs239-w08/chang06bigtable.pdf&quot;&gt;Bigtable architecture&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.edureka.co/blog/hbase-architecture/&quot;&gt;HBase architecture&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://docs.datastax.com/en/cassandra/3.0/cassandra/architecture/archIntro.html&quot;&gt;Cassandra architecture&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Graph database&lt;/h4&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/fNcl65g.png&quot; /&gt; &lt;br /&gt; &lt;i&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/File:GraphDatabase_PropertyGraph.png&quot;&gt;Source: Graph database&lt;/a&gt;&lt;/i&gt; &lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;Abstraction: graph&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;In a graph database, each node is a record and each arc is a relationship between two nodes. Graph databases are optimized to represent complex relationships with many foreign keys or many-to-many relationships.&lt;/p&gt; 
&lt;p&gt;Graphs databases offer high performance for data models with complex relationships, such as a social network. They are relatively new and are not yet widely-used; it might be more difficult to find development tools and resources. Many graphs can only be accessed with &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#representational-state-transfer-rest&quot;&gt;REST APIs&lt;/a&gt;.&lt;/p&gt; 
&lt;h5&gt;Source(s) and further reading: graph&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Graph_database&quot;&gt;Graph database&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://neo4j.com/&quot;&gt;Neo4j&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://blog.twitter.com/2010/introducing-flockdb&quot;&gt;FlockDB&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Source(s) and further reading: NoSQL&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/3342497/explanation-of-base-terminology&quot;&gt;Explanation of base terminology&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://medium.com/baqend-blog/nosql-databases-a-survey-and-decision-guidance-ea7823a822d#.wskogqenq&quot;&gt;NoSQL databases a survey and decision guidance&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20220602114024/https://www.lecloud.net/post/7994751381/scalability-for-dummies-part-2-database&quot;&gt;Scalability&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=qI_g07C_Q5I&quot;&gt;Introduction to NoSQL&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://horicky.blogspot.com/2009/11/nosql-patterns.html&quot;&gt;NoSQL patterns&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;SQL or NoSQL&lt;/h3&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/wXGqG5f.png&quot; /&gt; &lt;br /&gt; &lt;i&gt;&lt;a href=&quot;https://www.infoq.com/articles/Transition-RDBMS-NoSQL/&quot;&gt;Source: Transitioning from RDBMS to NoSQL&lt;/a&gt;&lt;/i&gt; &lt;/p&gt; 
&lt;p&gt;Reasons for &lt;strong&gt;SQL&lt;/strong&gt;:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Structured data&lt;/li&gt; 
 &lt;li&gt;Strict schema&lt;/li&gt; 
 &lt;li&gt;Relational data&lt;/li&gt; 
 &lt;li&gt;Need for complex joins&lt;/li&gt; 
 &lt;li&gt;Transactions&lt;/li&gt; 
 &lt;li&gt;Clear patterns for scaling&lt;/li&gt; 
 &lt;li&gt;More established: developers, community, code, tools, etc&lt;/li&gt; 
 &lt;li&gt;Lookups by index are very fast&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Reasons for &lt;strong&gt;NoSQL&lt;/strong&gt;:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Semi-structured data&lt;/li&gt; 
 &lt;li&gt;Dynamic or flexible schema&lt;/li&gt; 
 &lt;li&gt;Non-relational data&lt;/li&gt; 
 &lt;li&gt;No need for complex joins&lt;/li&gt; 
 &lt;li&gt;Store many TB (or PB) of data&lt;/li&gt; 
 &lt;li&gt;Very data intensive workload&lt;/li&gt; 
 &lt;li&gt;Very high throughput for IOPS&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Sample data well-suited for NoSQL:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Rapid ingest of clickstream and log data&lt;/li&gt; 
 &lt;li&gt;Leaderboard or scoring data&lt;/li&gt; 
 &lt;li&gt;Temporary data, such as a shopping cart&lt;/li&gt; 
 &lt;li&gt;Frequently accessed (&#39;hot&#39;) tables&lt;/li&gt; 
 &lt;li&gt;Metadata/lookup tables&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h5&gt;Source(s) and further reading: SQL or NoSQL&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=kKjm4ehYiMs&quot;&gt;Scaling up to your first 10 million users&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.sitepoint.com/sql-vs-nosql-differences/&quot;&gt;SQL vs NoSQL differences&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Cache&lt;/h2&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/Q6z24La.png&quot; /&gt; &lt;br /&gt; &lt;i&gt;&lt;a href=&quot;http://horicky.blogspot.com/2010/10/scalable-system-design-patterns.html&quot;&gt;Source: Scalable system design patterns&lt;/a&gt;&lt;/i&gt; &lt;/p&gt; 
&lt;p&gt;Caching improves page load times and can reduce the load on your servers and databases. In this model, the dispatcher will first lookup if the request has been made before and try to find the previous result to return, in order to save the actual execution.&lt;/p&gt; 
&lt;p&gt;Databases often benefit from a uniform distribution of reads and writes across its partitions. Popular items can skew the distribution, causing bottlenecks. Putting a cache in front of a database can help absorb uneven loads and spikes in traffic.&lt;/p&gt; 
&lt;h3&gt;Client caching&lt;/h3&gt; 
&lt;p&gt;Caches can be located on the client side (OS or browser), &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#reverse-proxy-web-server&quot;&gt;server side&lt;/a&gt;, or in a distinct cache layer.&lt;/p&gt; 
&lt;h3&gt;CDN caching&lt;/h3&gt; 
&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#content-delivery-network&quot;&gt;CDNs&lt;/a&gt; are considered a type of cache.&lt;/p&gt; 
&lt;h3&gt;Web server caching&lt;/h3&gt; 
&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#reverse-proxy-web-server&quot;&gt;Reverse proxies&lt;/a&gt; and caches such as &lt;a href=&quot;https://www.varnish-cache.org/&quot;&gt;Varnish&lt;/a&gt; can serve static and dynamic content directly. Web servers can also cache requests, returning responses without having to contact application servers.&lt;/p&gt; 
&lt;h3&gt;Database caching&lt;/h3&gt; 
&lt;p&gt;Your database usually includes some level of caching in a default configuration, optimized for a generic use case. Tweaking these settings for specific usage patterns can further boost performance.&lt;/p&gt; 
&lt;h3&gt;Application caching&lt;/h3&gt; 
&lt;p&gt;In-memory caches such as Memcached and Redis are key-value stores between your application and your data storage. Since the data is held in RAM, it is much faster than typical databases where data is stored on disk. RAM is more limited than disk, so &lt;a href=&quot;https://en.wikipedia.org/wiki/Cache_algorithms&quot;&gt;cache invalidation&lt;/a&gt; algorithms such as &lt;a href=&quot;https://en.wikipedia.org/wiki/Cache_replacement_policies#Least_recently_used_(LRU)&quot;&gt;least recently used (LRU)&lt;/a&gt; can help invalidate &#39;cold&#39; entries and keep &#39;hot&#39; data in RAM.&lt;/p&gt; 
&lt;p&gt;Redis has the following additional features:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Persistence option&lt;/li&gt; 
 &lt;li&gt;Built-in data structures such as sorted sets and lists&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;There are multiple levels you can cache that fall into two general categories: &lt;strong&gt;database queries&lt;/strong&gt; and &lt;strong&gt;objects&lt;/strong&gt;:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Row level&lt;/li&gt; 
 &lt;li&gt;Query-level&lt;/li&gt; 
 &lt;li&gt;Fully-formed serializable objects&lt;/li&gt; 
 &lt;li&gt;Fully-rendered HTML&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Generally, you should try to avoid file-based caching, as it makes cloning and auto-scaling more difficult.&lt;/p&gt; 
&lt;h3&gt;Caching at the database query level&lt;/h3&gt; 
&lt;p&gt;Whenever you query the database, hash the query as a key and store the result to the cache. This approach suffers from expiration issues:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Hard to delete a cached result with complex queries&lt;/li&gt; 
 &lt;li&gt;If one piece of data changes such as a table cell, you need to delete all cached queries that might include the changed cell&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Caching at the object level&lt;/h3&gt; 
&lt;p&gt;See your data as an object, similar to what you do with your application code. Have your application assemble the dataset from the database into a class instance or a data structure(s):&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Remove the object from cache if its underlying data has changed&lt;/li&gt; 
 &lt;li&gt;Allows for asynchronous processing: workers assemble objects by consuming the latest cached object&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Suggestions of what to cache:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;User sessions&lt;/li&gt; 
 &lt;li&gt;Fully rendered web pages&lt;/li&gt; 
 &lt;li&gt;Activity streams&lt;/li&gt; 
 &lt;li&gt;User graph data&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;When to update the cache&lt;/h3&gt; 
&lt;p&gt;Since you can only store a limited amount of data in cache, you&#39;ll need to determine which cache update strategy works best for your use case.&lt;/p&gt; 
&lt;h4&gt;Cache-aside&lt;/h4&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/ONjORqk.png&quot; /&gt; &lt;br /&gt; &lt;i&gt;&lt;a href=&quot;http://www.slideshare.net/tmatyashovsky/from-cache-to-in-memory-data-grid-introduction-to-hazelcast&quot;&gt;Source: From cache to in-memory data grid&lt;/a&gt;&lt;/i&gt; &lt;/p&gt; 
&lt;p&gt;The application is responsible for reading and writing from storage. The cache does not interact with storage directly. The application does the following:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Look for entry in cache, resulting in a cache miss&lt;/li&gt; 
 &lt;li&gt;Load entry from the database&lt;/li&gt; 
 &lt;li&gt;Add entry to cache&lt;/li&gt; 
 &lt;li&gt;Return entry&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def get_user(self, user_id):
    user = cache.get(&quot;user.{0}&quot;, user_id)
    if user is None:
        user = db.query(&quot;SELECT * FROM users WHERE user_id = {0}&quot;, user_id)
        if user is not None:
            key = &quot;user.{0}&quot;.format(user_id)
            cache.set(key, json.dumps(user))
    return user
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://memcached.org/&quot;&gt;Memcached&lt;/a&gt; is generally used in this manner.&lt;/p&gt; 
&lt;p&gt;Subsequent reads of data added to cache are fast. Cache-aside is also referred to as lazy loading. Only requested data is cached, which avoids filling up the cache with data that isn&#39;t requested.&lt;/p&gt; 
&lt;h5&gt;Disadvantage(s): cache-aside&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;Each cache miss results in three trips, which can cause a noticeable delay.&lt;/li&gt; 
 &lt;li&gt;Data can become stale if it is updated in the database. This issue is mitigated by setting a time-to-live (TTL) which forces an update of the cache entry, or by using write-through.&lt;/li&gt; 
 &lt;li&gt;When a node fails, it is replaced by a new, empty node, increasing latency.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Write-through&lt;/h4&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/0vBc0hN.png&quot; /&gt; &lt;br /&gt; &lt;i&gt;&lt;a href=&quot;http://www.slideshare.net/jboner/scalability-availability-stability-patterns/&quot;&gt;Source: Scalability, availability, stability, patterns&lt;/a&gt;&lt;/i&gt; &lt;/p&gt; 
&lt;p&gt;The application uses the cache as the main data store, reading and writing data to it, while the cache is responsible for reading and writing to the database:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Application adds/updates entry in cache&lt;/li&gt; 
 &lt;li&gt;Cache synchronously writes entry to data store&lt;/li&gt; 
 &lt;li&gt;Return&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Application code:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;set_user(12345, {&quot;foo&quot;:&quot;bar&quot;})
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Cache code:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def set_user(user_id, values):
    user = db.query(&quot;UPDATE Users WHERE id = {0}&quot;, user_id, values)
    cache.set(user_id, user)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Write-through is a slow overall operation due to the write operation, but subsequent reads of just written data are fast. Users are generally more tolerant of latency when updating data than reading data. Data in the cache is not stale.&lt;/p&gt; 
&lt;h5&gt;Disadvantage(s): write through&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;When a new node is created due to failure or scaling, the new node will not cache entries until the entry is updated in the database. Cache-aside in conjunction with write through can mitigate this issue.&lt;/li&gt; 
 &lt;li&gt;Most data written might never be read, which can be minimized with a TTL.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Write-behind (write-back)&lt;/h4&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/rgSrvjG.png&quot; /&gt; &lt;br /&gt; &lt;i&gt;&lt;a href=&quot;http://www.slideshare.net/jboner/scalability-availability-stability-patterns/&quot;&gt;Source: Scalability, availability, stability, patterns&lt;/a&gt;&lt;/i&gt; &lt;/p&gt; 
&lt;p&gt;In write-behind, the application does the following:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Add/update entry in cache&lt;/li&gt; 
 &lt;li&gt;Asynchronously write entry to the data store, improving write performance&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h5&gt;Disadvantage(s): write-behind&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;There could be data loss if the cache goes down prior to its contents hitting the data store.&lt;/li&gt; 
 &lt;li&gt;It is more complex to implement write-behind than it is to implement cache-aside or write-through.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Refresh-ahead&lt;/h4&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/kxtjqgE.png&quot; /&gt; &lt;br /&gt; &lt;i&gt;&lt;a href=&quot;http://www.slideshare.net/tmatyashovsky/from-cache-to-in-memory-data-grid-introduction-to-hazelcast&quot;&gt;Source: From cache to in-memory data grid&lt;/a&gt;&lt;/i&gt; &lt;/p&gt; 
&lt;p&gt;You can configure the cache to automatically refresh any recently accessed cache entry prior to its expiration.&lt;/p&gt; 
&lt;p&gt;Refresh-ahead can result in reduced latency vs read-through if the cache can accurately predict which items are likely to be needed in the future.&lt;/p&gt; 
&lt;h5&gt;Disadvantage(s): refresh-ahead&lt;/h5&gt; 
&lt;ul&gt; 
 &lt;li&gt;Not accurately predicting which items are likely to be needed in the future can result in reduced performance than without refresh-ahead.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Disadvantage(s): cache&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;Need to maintain consistency between caches and the source of truth such as the database through &lt;a href=&quot;https://en.wikipedia.org/wiki/Cache_algorithms&quot;&gt;cache invalidation&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;Cache invalidation is a difficult problem, there is additional complexity associated with when to update the cache.&lt;/li&gt; 
 &lt;li&gt;Need to make application changes such as adding Redis or memcached.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Source(s) and further reading&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.slideshare.net/tmatyashovsky/from-cache-to-in-memory-data-grid-introduction-to-hazelcast&quot;&gt;From cache to in-memory data grid&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://horicky.blogspot.com/2010/10/scalable-system-design-patterns.html&quot;&gt;Scalable system design patterns&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://lethain.com/introduction-to-architecting-systems-for-scale/&quot;&gt;Introduction to architecting systems for scale&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.slideshare.net/jboner/scalability-availability-stability-patterns/&quot;&gt;Scalability, availability, stability, patterns&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20230126233752/https://www.lecloud.net/post/9246290032/scalability-for-dummies-part-3-cache&quot;&gt;Scalability&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/Strategies.html&quot;&gt;AWS ElastiCache strategies&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Cache_(computing)&quot;&gt;Wikipedia&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Asynchronism&lt;/h2&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/54GYsSx.png&quot; /&gt; &lt;br /&gt; &lt;i&gt;&lt;a href=&quot;http://lethain.com/introduction-to-architecting-systems-for-scale/#platform_layer&quot;&gt;Source: Intro to architecting systems for scale&lt;/a&gt;&lt;/i&gt; &lt;/p&gt; 
&lt;p&gt;Asynchronous workflows help reduce request times for expensive operations that would otherwise be performed in-line. They can also help by doing time-consuming work in advance, such as periodic aggregation of data.&lt;/p&gt; 
&lt;h3&gt;Message queues&lt;/h3&gt; 
&lt;p&gt;Message queues receive, hold, and deliver messages. If an operation is too slow to perform inline, you can use a message queue with the following workflow:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;An application publishes a job to the queue, then notifies the user of job status&lt;/li&gt; 
 &lt;li&gt;A worker picks up the job from the queue, processes it, then signals the job is complete&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;The user is not blocked and the job is processed in the background. During this time, the client might optionally do a small amount of processing to make it seem like the task has completed. For example, if posting a tweet, the tweet could be instantly posted to your timeline, but it could take some time before your tweet is actually delivered to all of your followers.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://redis.io/&quot;&gt;Redis&lt;/a&gt;&lt;/strong&gt; is useful as a simple message broker but messages can be lost.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.rabbitmq.com/&quot;&gt;RabbitMQ&lt;/a&gt;&lt;/strong&gt; is popular but requires you to adapt to the &#39;AMQP&#39; protocol and manage your own nodes.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://aws.amazon.com/sqs/&quot;&gt;Amazon SQS&lt;/a&gt;&lt;/strong&gt; is hosted but can have high latency and has the possibility of messages being delivered twice.&lt;/p&gt; 
&lt;h3&gt;Task queues&lt;/h3&gt; 
&lt;p&gt;Tasks queues receive tasks and their related data, runs them, then delivers their results. They can support scheduling and can be used to run computationally-intensive jobs in the background.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.celeryproject.org/en/stable/&quot;&gt;Celery&lt;/a&gt;&lt;/strong&gt; has support for scheduling and primarily has python support.&lt;/p&gt; 
&lt;h3&gt;Back pressure&lt;/h3&gt; 
&lt;p&gt;If queues start to grow significantly, the queue size can become larger than memory, resulting in cache misses, disk reads, and even slower performance. &lt;a href=&quot;http://mechanical-sympathy.blogspot.com/2012/05/apply-back-pressure-when-overloaded.html&quot;&gt;Back pressure&lt;/a&gt; can help by limiting the queue size, thereby maintaining a high throughput rate and good response times for jobs already in the queue. Once the queue fills up, clients get a server busy or HTTP 503 status code to try again later. Clients can retry the request at a later time, perhaps with &lt;a href=&quot;https://en.wikipedia.org/wiki/Exponential_backoff&quot;&gt;exponential backoff&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;Disadvantage(s): asynchronism&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;Use cases such as inexpensive calculations and realtime workflows might be better suited for synchronous operations, as introducing queues can add delays and complexity.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Source(s) and further reading&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=1KRYH75wgy4&quot;&gt;It&#39;s all a numbers game&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://mechanical-sympathy.blogspot.com/2012/05/apply-back-pressure-when-overloaded.html&quot;&gt;Applying back pressure when overloaded&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Little%27s_law&quot;&gt;Little&#39;s law&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.quora.com/What-is-the-difference-between-a-message-queue-and-a-task-queue-Why-would-a-task-queue-require-a-message-broker-like-RabbitMQ-Redis-Celery-or-IronMQ-to-function&quot;&gt;What is the difference between a message queue and a task queue?&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Communication&lt;/h2&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/5KeocQs.jpg&quot; /&gt; &lt;br /&gt; &lt;i&gt;&lt;a href=&quot;http://www.escotal.com/osilayer.html&quot;&gt;Source: OSI 7 layer model&lt;/a&gt;&lt;/i&gt; &lt;/p&gt; 
&lt;h3&gt;Hypertext transfer protocol (HTTP)&lt;/h3&gt; 
&lt;p&gt;HTTP is a method for encoding and transporting data between a client and a server. It is a request/response protocol: clients issue requests and servers issue responses with relevant content and completion status info about the request. HTTP is self-contained, allowing requests and responses to flow through many intermediate routers and servers that perform load balancing, caching, encryption, and compression.&lt;/p&gt; 
&lt;p&gt;A basic HTTP request consists of a verb (method) and a resource (endpoint). Below are common HTTP verbs:&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Verb&lt;/th&gt; 
   &lt;th&gt;Description&lt;/th&gt; 
   &lt;th&gt;Idempotent*&lt;/th&gt; 
   &lt;th&gt;Safe&lt;/th&gt; 
   &lt;th&gt;Cacheable&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;GET&lt;/td&gt; 
   &lt;td&gt;Reads a resource&lt;/td&gt; 
   &lt;td&gt;Yes&lt;/td&gt; 
   &lt;td&gt;Yes&lt;/td&gt; 
   &lt;td&gt;Yes&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;POST&lt;/td&gt; 
   &lt;td&gt;Creates a resource or trigger a process that handles data&lt;/td&gt; 
   &lt;td&gt;No&lt;/td&gt; 
   &lt;td&gt;No&lt;/td&gt; 
   &lt;td&gt;Yes if response contains freshness info&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;PUT&lt;/td&gt; 
   &lt;td&gt;Creates or replace a resource&lt;/td&gt; 
   &lt;td&gt;Yes&lt;/td&gt; 
   &lt;td&gt;No&lt;/td&gt; 
   &lt;td&gt;No&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;PATCH&lt;/td&gt; 
   &lt;td&gt;Partially updates a resource&lt;/td&gt; 
   &lt;td&gt;No&lt;/td&gt; 
   &lt;td&gt;No&lt;/td&gt; 
   &lt;td&gt;Yes if response contains freshness info&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;DELETE&lt;/td&gt; 
   &lt;td&gt;Deletes a resource&lt;/td&gt; 
   &lt;td&gt;Yes&lt;/td&gt; 
   &lt;td&gt;No&lt;/td&gt; 
   &lt;td&gt;No&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;*Can be called many times without different outcomes.&lt;/p&gt; 
&lt;p&gt;HTTP is an application layer protocol relying on lower-level protocols such as &lt;strong&gt;TCP&lt;/strong&gt; and &lt;strong&gt;UDP&lt;/strong&gt;.&lt;/p&gt; 
&lt;h4&gt;Source(s) and further reading: HTTP&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.nginx.com/resources/glossary/http/&quot;&gt;What is HTTP?&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.quora.com/What-is-the-difference-between-HTTP-protocol-and-TCP-protocol&quot;&gt;Difference between HTTP and TCP&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://laracasts.com/discuss/channels/general-discussion/whats-the-differences-between-put-and-patch?page=1&quot;&gt;Difference between PUT and PATCH&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Transmission control protocol (TCP)&lt;/h3&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/JdAsdvG.jpg&quot; /&gt; &lt;br /&gt; &lt;i&gt;&lt;a href=&quot;http://www.wildbunny.co.uk/blog/2012/10/09/how-to-make-a-multi-player-game-part-1/&quot;&gt;Source: How to make a multiplayer game&lt;/a&gt;&lt;/i&gt; &lt;/p&gt; 
&lt;p&gt;TCP is a connection-oriented protocol over an &lt;a href=&quot;https://en.wikipedia.org/wiki/Internet_Protocol&quot;&gt;IP network&lt;/a&gt;. Connection is established and terminated using a &lt;a href=&quot;https://en.wikipedia.org/wiki/Handshaking&quot;&gt;handshake&lt;/a&gt;. All packets sent are guaranteed to reach the destination in the original order and without corruption through:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Sequence numbers and &lt;a href=&quot;https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Checksum_computation&quot;&gt;checksum fields&lt;/a&gt; for each packet&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Acknowledgement_(data_networks)&quot;&gt;Acknowledgement&lt;/a&gt; packets and automatic retransmission&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;If the sender does not receive a correct response, it will resend the packets. If there are multiple timeouts, the connection is dropped. TCP also implements &lt;a href=&quot;https://en.wikipedia.org/wiki/Flow_control_(data)&quot;&gt;flow control&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/Network_congestion#Congestion_control&quot;&gt;congestion control&lt;/a&gt;. These guarantees cause delays and generally result in less efficient transmission than UDP.&lt;/p&gt; 
&lt;p&gt;To ensure high throughput, web servers can keep a large number of TCP connections open, resulting in high memory usage. It can be expensive to have a large number of open connections between web server threads and say, a &lt;a href=&quot;https://memcached.org/&quot;&gt;memcached&lt;/a&gt; server. &lt;a href=&quot;https://en.wikipedia.org/wiki/Connection_pool&quot;&gt;Connection pooling&lt;/a&gt; can help in addition to switching to UDP where applicable.&lt;/p&gt; 
&lt;p&gt;TCP is useful for applications that require high reliability but are less time critical. Some examples include web servers, database info, SMTP, FTP, and SSH.&lt;/p&gt; 
&lt;p&gt;Use TCP over UDP when:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;You need all of the data to arrive intact&lt;/li&gt; 
 &lt;li&gt;You want to automatically make a best estimate use of the network throughput&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;User datagram protocol (UDP)&lt;/h3&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/yzDrJtA.jpg&quot; /&gt; &lt;br /&gt; &lt;i&gt;&lt;a href=&quot;http://www.wildbunny.co.uk/blog/2012/10/09/how-to-make-a-multi-player-game-part-1/&quot;&gt;Source: How to make a multiplayer game&lt;/a&gt;&lt;/i&gt; &lt;/p&gt; 
&lt;p&gt;UDP is connectionless. Datagrams (analogous to packets) are guaranteed only at the datagram level. Datagrams might reach their destination out of order or not at all. UDP does not support congestion control. Without the guarantees that TCP support, UDP is generally more efficient.&lt;/p&gt; 
&lt;p&gt;UDP can broadcast, sending datagrams to all devices on the subnet. This is useful with &lt;a href=&quot;https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol&quot;&gt;DHCP&lt;/a&gt; because the client has not yet received an IP address, thus preventing a way for TCP to stream without the IP address.&lt;/p&gt; 
&lt;p&gt;UDP is less reliable but works well in real time use cases such as VoIP, video chat, streaming, and realtime multiplayer games.&lt;/p&gt; 
&lt;p&gt;Use UDP over TCP when:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;You need the lowest latency&lt;/li&gt; 
 &lt;li&gt;Late data is worse than loss of data&lt;/li&gt; 
 &lt;li&gt;You want to implement your own error correction&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Source(s) and further reading: TCP and UDP&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://gafferongames.com/post/udp_vs_tcp/&quot;&gt;Networking for game programming&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.cyberciti.biz/faq/key-differences-between-tcp-and-udp-protocols/&quot;&gt;Key differences between TCP and UDP protocols&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/5970383/difference-between-tcp-and-udp&quot;&gt;Difference between TCP and UDP&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Transmission_Control_Protocol&quot;&gt;Transmission control protocol&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/User_Datagram_Protocol&quot;&gt;User datagram protocol&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.cs.bu.edu/~jappavoo/jappavoo.github.com/451/papers/memcache-fb.pdf&quot;&gt;Scaling memcache at Facebook&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Remote procedure call (RPC)&lt;/h3&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/iF4Mkb5.png&quot; /&gt; &lt;br /&gt; &lt;i&gt;&lt;a href=&quot;http://www.puncsky.com/blog/2016-02-13-crack-the-system-design-interview&quot;&gt;Source: Crack the system design interview&lt;/a&gt;&lt;/i&gt; &lt;/p&gt; 
&lt;p&gt;In an RPC, a client causes a procedure to execute on a different address space, usually a remote server. The procedure is coded as if it were a local procedure call, abstracting away the details of how to communicate with the server from the client program. Remote calls are usually slower and less reliable than local calls so it is helpful to distinguish RPC calls from local calls. Popular RPC frameworks include &lt;a href=&quot;https://developers.google.com/protocol-buffers/&quot;&gt;Protobuf&lt;/a&gt;, &lt;a href=&quot;https://thrift.apache.org/&quot;&gt;Thrift&lt;/a&gt;, and &lt;a href=&quot;https://avro.apache.org/docs/current/&quot;&gt;Avro&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;RPC is a request-response protocol:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Client program&lt;/strong&gt; - Calls the client stub procedure. The parameters are pushed onto the stack like a local procedure call.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Client stub procedure&lt;/strong&gt; - Marshals (packs) procedure id and arguments into a request message.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Client communication module&lt;/strong&gt; - OS sends the message from the client to the server.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Server communication module&lt;/strong&gt; - OS passes the incoming packets to the server stub procedure.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Server stub procedure&lt;/strong&gt; - Unmarshalls the results, calls the server procedure matching the procedure id and passes the given arguments.&lt;/li&gt; 
 &lt;li&gt;The server response repeats the steps above in reverse order.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Sample RPC calls:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;GET /someoperation?data=anId

POST /anotheroperation
{
  &quot;data&quot;:&quot;anId&quot;;
  &quot;anotherdata&quot;: &quot;another value&quot;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;RPC is focused on exposing behaviors. RPCs are often used for performance reasons with internal communications, as you can hand-craft native calls to better fit your use cases.&lt;/p&gt; 
&lt;p&gt;Choose a native library (aka SDK) when:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;You know your target platform.&lt;/li&gt; 
 &lt;li&gt;You want to control how your &quot;logic&quot; is accessed.&lt;/li&gt; 
 &lt;li&gt;You want to control how error control happens off your library.&lt;/li&gt; 
 &lt;li&gt;Performance and end user experience is your primary concern.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;HTTP APIs following &lt;strong&gt;REST&lt;/strong&gt; tend to be used more often for public APIs.&lt;/p&gt; 
&lt;h4&gt;Disadvantage(s): RPC&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;RPC clients become tightly coupled to the service implementation.&lt;/li&gt; 
 &lt;li&gt;A new API must be defined for every new operation or use case.&lt;/li&gt; 
 &lt;li&gt;It can be difficult to debug RPC.&lt;/li&gt; 
 &lt;li&gt;You might not be able to leverage existing technologies out of the box. For example, it might require additional effort to ensure &lt;a href=&quot;https://web.archive.org/web/20170608193645/http://etherealbits.com/2012/12/debunking-the-myths-of-rpc-rest/&quot;&gt;RPC calls are properly cached&lt;/a&gt; on caching servers such as &lt;a href=&quot;http://www.squid-cache.org/&quot;&gt;Squid&lt;/a&gt;.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Representational state transfer (REST)&lt;/h3&gt; 
&lt;p&gt;REST is an architectural style enforcing a client/server model where the client acts on a set of resources managed by the server. The server provides a representation of resources and actions that can either manipulate or get a new representation of resources. All communication must be stateless and cacheable.&lt;/p&gt; 
&lt;p&gt;There are four qualities of a RESTful interface:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Identify resources (URI in HTTP)&lt;/strong&gt; - use the same URI regardless of any operation.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Change with representations (Verbs in HTTP)&lt;/strong&gt; - use verbs, headers, and body.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Self-descriptive error message (status response in HTTP)&lt;/strong&gt; - Use status codes, don&#39;t reinvent the wheel.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://restcookbook.com/Basics/hateoas/&quot;&gt;HATEOAS&lt;/a&gt; (HTML interface for HTTP)&lt;/strong&gt; - your web service should be fully accessible in a browser.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Sample REST calls:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;GET /someresources/anId

PUT /someresources/anId
{&quot;anotherdata&quot;: &quot;another value&quot;}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;REST is focused on exposing data. It minimizes the coupling between client/server and is often used for public HTTP APIs. REST uses a more generic and uniform method of exposing resources through URIs, &lt;a href=&quot;https://github.com/for-GET/know-your-http-well/raw/master/headers.md&quot;&gt;representation through headers&lt;/a&gt;, and actions through verbs such as GET, POST, PUT, DELETE, and PATCH. Being stateless, REST is great for horizontal scaling and partitioning.&lt;/p&gt; 
&lt;h4&gt;Disadvantage(s): REST&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;With REST being focused on exposing data, it might not be a good fit if resources are not naturally organized or accessed in a simple hierarchy. For example, returning all updated records from the past hour matching a particular set of events is not easily expressed as a path. With REST, it is likely to be implemented with a combination of URI path, query parameters, and possibly the request body.&lt;/li&gt; 
 &lt;li&gt;REST typically relies on a few verbs (GET, POST, PUT, DELETE, and PATCH) which sometimes doesn&#39;t fit your use case. For example, moving expired documents to the archive folder might not cleanly fit within these verbs.&lt;/li&gt; 
 &lt;li&gt;Fetching complicated resources with nested hierarchies requires multiple round trips between the client and server to render single views, e.g. fetching content of a blog entry and the comments on that entry. For mobile applications operating in variable network conditions, these multiple roundtrips are highly undesirable.&lt;/li&gt; 
 &lt;li&gt;Over time, more fields might be added to an API response and older clients will receive all new data fields, even those that they do not need, as a result, it bloats the payload size and leads to larger latencies.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;RPC and REST calls comparison&lt;/h3&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Operation&lt;/th&gt; 
   &lt;th&gt;RPC&lt;/th&gt; 
   &lt;th&gt;REST&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Signup&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;POST&lt;/strong&gt; /signup&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;POST&lt;/strong&gt; /persons&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Resign&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;POST&lt;/strong&gt; /resign&lt;br /&gt;{&lt;br /&gt;&quot;personid&quot;: &quot;1234&quot;&lt;br /&gt;}&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;DELETE&lt;/strong&gt; /persons/1234&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Read a person&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;GET&lt;/strong&gt; /readPerson?personid=1234&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;GET&lt;/strong&gt; /persons/1234&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Read a person’s items list&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;GET&lt;/strong&gt; /readUsersItemsList?personid=1234&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;GET&lt;/strong&gt; /persons/1234/items&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Add an item to a person’s items&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;POST&lt;/strong&gt; /addItemToUsersItemsList&lt;br /&gt;{&lt;br /&gt;&quot;personid&quot;: &quot;1234&quot;;&lt;br /&gt;&quot;itemid&quot;: &quot;456&quot;&lt;br /&gt;}&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;POST&lt;/strong&gt; /persons/1234/items&lt;br /&gt;{&lt;br /&gt;&quot;itemid&quot;: &quot;456&quot;&lt;br /&gt;}&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Update an item&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;POST&lt;/strong&gt; /modifyItem&lt;br /&gt;{&lt;br /&gt;&quot;itemid&quot;: &quot;456&quot;;&lt;br /&gt;&quot;key&quot;: &quot;value&quot;&lt;br /&gt;}&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;PUT&lt;/strong&gt; /items/456&lt;br /&gt;{&lt;br /&gt;&quot;key&quot;: &quot;value&quot;&lt;br /&gt;}&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Delete an item&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;POST&lt;/strong&gt; /removeItem&lt;br /&gt;{&lt;br /&gt;&quot;itemid&quot;: &quot;456&quot;&lt;br /&gt;}&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;DELETE&lt;/strong&gt; /items/456&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;i&gt;&lt;a href=&quot;https://apihandyman.io/do-you-really-know-why-you-prefer-rest-over-rpc/&quot;&gt;Source: Do you really know why you prefer REST over RPC&lt;/a&gt;&lt;/i&gt; &lt;/p&gt; 
&lt;h4&gt;Source(s) and further reading: REST and RPC&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://apihandyman.io/do-you-really-know-why-you-prefer-rest-over-rpc/&quot;&gt;Do you really know why you prefer REST over RPC&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://programmers.stackexchange.com/a/181186&quot;&gt;When are RPC-ish approaches more appropriate than REST?&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/15056878/rest-vs-json-rpc&quot;&gt;REST vs JSON-RPC&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20170608193645/http://etherealbits.com/2012/12/debunking-the-myths-of-rpc-rest/&quot;&gt;Debunking the myths of RPC and REST&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.quora.com/What-are-the-drawbacks-of-using-RESTful-APIs&quot;&gt;What are the drawbacks of using REST&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.puncsky.com/blog/2016-02-13-crack-the-system-design-interview&quot;&gt;Crack the system design interview&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://code.facebook.com/posts/1468950976659943/&quot;&gt;Thrift&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://arstechnica.com/civis/viewtopic.php?t=1190508&quot;&gt;Why REST for internal use and not RPC&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Security&lt;/h2&gt; 
&lt;p&gt;This section could use some updates. Consider &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#contributing&quot;&gt;contributing&lt;/a&gt;!&lt;/p&gt; 
&lt;p&gt;Security is a broad topic. Unless you have considerable experience, a security background, or are applying for a position that requires knowledge of security, you probably won&#39;t need to know more than the basics:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Encrypt in transit and at rest.&lt;/li&gt; 
 &lt;li&gt;Sanitize all user inputs or any input parameters exposed to user to prevent &lt;a href=&quot;https://en.wikipedia.org/wiki/Cross-site_scripting&quot;&gt;XSS&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/SQL_injection&quot;&gt;SQL injection&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;Use parameterized queries to prevent SQL injection.&lt;/li&gt; 
 &lt;li&gt;Use the principle of &lt;a href=&quot;https://en.wikipedia.org/wiki/Principle_of_least_privilege&quot;&gt;least privilege&lt;/a&gt;.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Source(s) and further reading&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/shieldfy/API-Security-Checklist&quot;&gt;API security checklist&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/FallibleInc/security-guide-for-developers&quot;&gt;Security guide for developers&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.owasp.org/index.php/OWASP_Top_Ten_Cheat_Sheet&quot;&gt;OWASP top ten&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Appendix&lt;/h2&gt; 
&lt;p&gt;You&#39;ll sometimes be asked to do &#39;back-of-the-envelope&#39; estimates. For example, you might need to determine how long it will take to generate 100 image thumbnails from disk or how much memory a data structure will take. The &lt;strong&gt;Powers of two table&lt;/strong&gt; and &lt;strong&gt;Latency numbers every programmer should know&lt;/strong&gt; are handy references.&lt;/p&gt; 
&lt;h3&gt;Powers of two table&lt;/h3&gt; 
&lt;pre&gt;&lt;code&gt;Power           Exact Value         Approx Value        Bytes
---------------------------------------------------------------
7                             128
8                             256
10                           1024   1 thousand           1 KB
16                         65,536                       64 KB
20                      1,048,576   1 million            1 MB
30                  1,073,741,824   1 billion            1 GB
32                  4,294,967,296                        4 GB
40              1,099,511,627,776   1 trillion           1 TB
&lt;/code&gt;&lt;/pre&gt; 
&lt;h4&gt;Source(s) and further reading&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Power_of_two&quot;&gt;Powers of two&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Latency numbers every programmer should know&lt;/h3&gt; 
&lt;pre&gt;&lt;code&gt;Latency Comparison Numbers
--------------------------
L1 cache reference                           0.5 ns
Branch mispredict                            5   ns
L2 cache reference                           7   ns                      14x L1 cache
Mutex lock/unlock                           25   ns
Main memory reference                      100   ns                      20x L2 cache, 200x L1 cache
Compress 1K bytes with Zippy            10,000   ns       10 us
Send 1 KB bytes over 1 Gbps network     10,000   ns       10 us
Read 4 KB randomly from SSD*           150,000   ns      150 us          ~1GB/sec SSD
Read 1 MB sequentially from memory     250,000   ns      250 us
Round trip within same datacenter      500,000   ns      500 us
Read 1 MB sequentially from SSD*     1,000,000   ns    1,000 us    1 ms  ~1GB/sec SSD, 4X memory
HDD seek                            10,000,000   ns   10,000 us   10 ms  20x datacenter roundtrip
Read 1 MB sequentially from 1 Gbps  10,000,000   ns   10,000 us   10 ms  40x memory, 10X SSD
Read 1 MB sequentially from HDD     30,000,000   ns   30,000 us   30 ms 120x memory, 30X SSD
Send packet CA-&amp;gt;Netherlands-&amp;gt;CA    150,000,000   ns  150,000 us  150 ms

Notes
-----
1 ns = 10^-9 seconds
1 us = 10^-6 seconds = 1,000 ns
1 ms = 10^-3 seconds = 1,000 us = 1,000,000 ns
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Handy metrics based on numbers above:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Read sequentially from HDD at 30 MB/s&lt;/li&gt; 
 &lt;li&gt;Read sequentially from 1 Gbps Ethernet at 100 MB/s&lt;/li&gt; 
 &lt;li&gt;Read sequentially from SSD at 1 GB/s&lt;/li&gt; 
 &lt;li&gt;Read sequentially from main memory at 4 GB/s&lt;/li&gt; 
 &lt;li&gt;6-7 world-wide round trips per second&lt;/li&gt; 
 &lt;li&gt;2,000 round trips per second within a data center&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Latency numbers visualized&lt;/h4&gt; 
&lt;p&gt;&lt;img src=&quot;https://camo.githubusercontent.com/77f72259e1eb58596b564d1ad823af1853bc60a3/687474703a2f2f692e696d6775722e636f6d2f6b307431652e706e67&quot; alt=&quot;&quot; /&gt;&lt;/p&gt; 
&lt;h4&gt;Source(s) and further reading&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://gist.github.com/jboner/2841832&quot;&gt;Latency numbers every programmer should know - 1&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://gist.github.com/hellerbarde/2843375&quot;&gt;Latency numbers every programmer should know - 2&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.cs.cornell.edu/projects/ladis2009/talks/dean-keynote-ladis2009.pdf&quot;&gt;Designs, lessons, and advice from building large distributed systems&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://static.googleusercontent.com/media/research.google.com/en//people/jeff/stanford-295-talk.pdf&quot;&gt;Software Engineering Advice from Building Large-Scale Distributed Systems&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Additional system design interview questions&lt;/h3&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;Common system design interview questions, with links to resources on how to solve each.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Question&lt;/th&gt; 
   &lt;th&gt;Reference(s)&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design a file sync service like Dropbox&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=PE4gwstWhmc&quot;&gt;youtube.com&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design a search engine like Google&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://queue.acm.org/detail.cfm?id=988407&quot;&gt;queue.acm.org&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://programmers.stackexchange.com/questions/38324/interview-question-how-would-you-implement-google-search&quot;&gt;stackexchange.com&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.ardendertat.com/2012/01/11/implementing-search-engines/&quot;&gt;ardendertat.com&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://infolab.stanford.edu/~backrub/google.html&quot;&gt;stanford.edu&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design a scalable web crawler like Google&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://www.quora.com/How-can-I-build-a-web-crawler-from-scratch&quot;&gt;quora.com&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design Google docs&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://code.google.com/p/google-mobwrite/&quot;&gt;code.google.com&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://neil.fraser.name/writing/sync/&quot;&gt;neil.fraser.name&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design a key-value store like Redis&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://codecapsule.com/2012/11/07/ikvs-implementing-a-key-value-store-table-of-contents/&quot;&gt;codecapsule.com&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf&quot;&gt;allthingsdistributed.com&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design a cache system like Memcached&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://www.slideshare.net/oemebamo/introduction-to-memcached&quot;&gt;slideshare.net&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design a recommendation system like Amazon&#39;s&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://web.archive.org/web/20170406065247/http://tech.hulu.com/blog/2011/09/19/recommendation-system.html&quot;&gt;hulu.com&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://ijcai13.org/files/tutorial_slides/td3.pdf&quot;&gt;ijcai13.org&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design a tinyurl system like Bitly&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://n00tc0d3r.blogspot.com/&quot;&gt;n00tc0d3r.blogspot.com&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design a chat app like WhatsApp&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://highscalability.com/blog/2014/2/26/the-whatsapp-architecture-facebook-bought-for-19-billion.html&quot;&gt;highscalability.com&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design a picture sharing system like Instagram&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://highscalability.com/flickr-architecture&quot;&gt;highscalability.com&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://highscalability.com/blog/2011/12/6/instagram-architecture-14-million-users-terabytes-of-photos.html&quot;&gt;highscalability.com&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design the Facebook news feed function&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://www.quora.com/What-are-best-practices-for-building-something-like-a-News-Feed&quot;&gt;quora.com&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.quora.com/Activity-Streams/What-are-the-scaling-issues-to-keep-in-mind-while-developing-a-social-network-feed&quot;&gt;quora.com&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.slideshare.net/danmckinley/etsy-activity-feeds-architecture&quot;&gt;slideshare.net&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design the Facebook timeline function&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://www.facebook.com/note.php?note_id=10150468255628920&quot;&gt;facebook.com&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://highscalability.com/blog/2012/1/23/facebook-timeline-brought-to-you-by-the-power-of-denormaliza.html&quot;&gt;highscalability.com&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design the Facebook chat function&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://www.erlang-factory.com/upload/presentations/31/EugeneLetuchy-ErlangatFacebook.pdf&quot;&gt;erlang-factory.com&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.facebook.com/note.php?note_id=14218138919&amp;amp;id=9445547199&amp;amp;index=0&quot;&gt;facebook.com&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design a graph search function like Facebook&#39;s&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://www.facebook.com/notes/facebook-engineering/under-the-hood-building-out-the-infrastructure-for-graph-search/10151347573598920&quot;&gt;facebook.com&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.facebook.com/notes/facebook-engineering/under-the-hood-indexing-and-ranking-in-graph-search/10151361720763920&quot;&gt;facebook.com&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.facebook.com/notes/facebook-engineering/under-the-hood-the-natural-language-interface-of-graph-search/10151432733048920&quot;&gt;facebook.com&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design a content delivery network like CloudFlare&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://figshare.com/articles/Globally_distributed_content_delivery/6605972&quot;&gt;figshare.com&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design a trending topic system like Twitter&#39;s&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://www.michael-noll.com/blog/2013/01/18/implementing-real-time-trending-topics-in-storm/&quot;&gt;michael-noll.com&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://snikolov.wordpress.com/2012/11/14/early-detection-of-twitter-trends/&quot;&gt;snikolov .wordpress.com&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design a random ID generation system&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://blog.twitter.com/2010/announcing-snowflake&quot;&gt;blog.twitter.com&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/twitter/snowflake/&quot;&gt;github.com&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Return the top k requests during a time interval&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://www.cs.ucsb.edu/sites/default/files/documents/2005-23.pdf&quot;&gt;cs.ucsb.edu&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://davis.wpi.edu/xmdv/docs/EDBT11-diyang.pdf&quot;&gt;wpi.edu&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design a system that serves data from multiple data centers&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://highscalability.com/blog/2009/8/24/how-google-serves-data-from-multiple-datacenters.html&quot;&gt;highscalability.com&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design an online multiplayer card game&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://web.archive.org/web/20180929181117/http://www.indieflashblog.com/how-to-create-an-asynchronous-multiplayer-game.html&quot;&gt;indieflashblog.com&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://buildnewgames.com/real-time-multiplayer/&quot;&gt;buildnewgames.com&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design a garbage collection system&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://journal.stuffwithstuff.com/2013/12/08/babys-first-garbage-collector/&quot;&gt;stuffwithstuff.com&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://courses.cs.washington.edu/courses/csep521/07wi/prj/rick.pdf&quot;&gt;washington.edu&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design an API rate limiter&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://stripe.com/blog/rate-limiters&quot;&gt;https://stripe.com/blog/&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Design a Stock Exchange (like NASDAQ or Binance)&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://youtu.be/b1e4t2k2KJY&quot;&gt;Jane Street&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://around25.com/blog/building-a-trading-engine-for-a-crypto-exchange/&quot;&gt;Golang Implementation&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://bhomnick.net/building-a-simple-limit-order-in-go/&quot;&gt;Go Implementation&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Add a system design question&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#contributing&quot;&gt;Contribute&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h3&gt;Real world architectures&lt;/h3&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;Articles on how real world systems are designed.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;img src=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/images/TcUo2fw.png&quot; /&gt; &lt;br /&gt; &lt;i&gt;&lt;a href=&quot;https://www.infoq.com/presentations/Twitter-Timeline-Scalability&quot;&gt;Source: Twitter timelines at scale&lt;/a&gt;&lt;/i&gt; &lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Don&#39;t focus on nitty gritty details for the following articles, instead:&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Identify shared principles, common technologies, and patterns within these articles&lt;/li&gt; 
 &lt;li&gt;Study what problems are solved by each component, where it works, where it doesn&#39;t&lt;/li&gt; 
 &lt;li&gt;Review the lessons learned&lt;/li&gt; 
&lt;/ul&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Type&lt;/th&gt; 
   &lt;th&gt;System&lt;/th&gt; 
   &lt;th&gt;Reference(s)&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Data processing&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;MapReduce&lt;/strong&gt; - Distributed data processing from Google&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://static.googleusercontent.com/media/research.google.com/zh-CN/us/archive/mapreduce-osdi04.pdf&quot;&gt;research.google.com&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Data processing&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Spark&lt;/strong&gt; - Distributed data processing from Databricks&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://www.slideshare.net/AGrishchenko/apache-spark-architecture&quot;&gt;slideshare.net&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Data processing&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Storm&lt;/strong&gt; - Distributed data processing from Twitter&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://www.slideshare.net/previa/storm-16094009&quot;&gt;slideshare.net&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Data store&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Bigtable&lt;/strong&gt; - Distributed column-oriented database from Google&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://www.read.seas.harvard.edu/~kohler/class/cs239-w08/chang06bigtable.pdf&quot;&gt;harvard.edu&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Data store&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;HBase&lt;/strong&gt; - Open source implementation of Bigtable&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://www.slideshare.net/alexbaranau/intro-to-hbase&quot;&gt;slideshare.net&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Data store&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Cassandra&lt;/strong&gt; - Distributed column-oriented database from Facebook&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://www.slideshare.net/planetcassandra/cassandra-introduction-features-30103666&quot;&gt;slideshare.net&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Data store&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;DynamoDB&lt;/strong&gt; - Document-oriented database from Amazon&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://www.read.seas.harvard.edu/~kohler/class/cs239-w08/decandia07dynamo.pdf&quot;&gt;harvard.edu&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Data store&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;MongoDB&lt;/strong&gt; - Document-oriented database&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://www.slideshare.net/mdirolf/introduction-to-mongodb&quot;&gt;slideshare.net&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Data store&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Spanner&lt;/strong&gt; - Globally-distributed database from Google&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://research.google.com/archive/spanner-osdi2012.pdf&quot;&gt;research.google.com&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Data store&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Memcached&lt;/strong&gt; - Distributed memory caching system&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://www.slideshare.net/oemebamo/introduction-to-memcached&quot;&gt;slideshare.net&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Data store&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Redis&lt;/strong&gt; - Distributed memory caching system with persistence and value types&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://www.slideshare.net/dvirsky/introduction-to-redis&quot;&gt;slideshare.net&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;File system&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Google File System (GFS)&lt;/strong&gt; - Distributed file system&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://static.googleusercontent.com/media/research.google.com/zh-CN/us/archive/gfs-sosp2003.pdf&quot;&gt;research.google.com&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;File system&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Hadoop File System (HDFS)&lt;/strong&gt; - Open source implementation of GFS&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html&quot;&gt;apache.org&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Misc&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Chubby&lt;/strong&gt; - Lock service for loosely-coupled distributed systems from Google&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://static.googleusercontent.com/external_content/untrusted_dlcp/research.google.com/en/us/archive/chubby-osdi06.pdf&quot;&gt;research.google.com&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Misc&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Dapper&lt;/strong&gt; - Distributed systems tracing infrastructure&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/36356.pdf&quot;&gt;research.google.com&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Misc&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Kafka&lt;/strong&gt; - Pub/sub message queue from LinkedIn&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://www.slideshare.net/mumrah/kafka-talk-tri-hug&quot;&gt;slideshare.net&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Misc&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Zookeeper&lt;/strong&gt; - Centralized infrastructure and services enabling synchronization&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://www.slideshare.net/sauravhaloi/introduction-to-apache-zookeeper&quot;&gt;slideshare.net&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;/td&gt; 
   &lt;td&gt;Add an architecture&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#contributing&quot;&gt;Contribute&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h3&gt;Company architectures&lt;/h3&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Company&lt;/th&gt; 
   &lt;th&gt;Reference(s)&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Amazon&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://highscalability.com/amazon-architecture&quot;&gt;Amazon architecture&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Cinchcast&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://highscalability.com/blog/2012/7/16/cinchcast-architecture-producing-1500-hours-of-audio-every-d.html&quot;&gt;Producing 1,500 hours of audio every day&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;DataSift&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://highscalability.com/blog/2011/11/29/datasift-architecture-realtime-datamining-at-120000-tweets-p.html&quot;&gt;Realtime datamining At 120,000 tweets per second&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Dropbox&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=PE4gwstWhmc&quot;&gt;How we&#39;ve scaled Dropbox&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;ESPN&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://highscalability.com/blog/2013/11/4/espns-architecture-at-scale-operating-at-100000-duh-nuh-nuhs.html&quot;&gt;Operating At 100,000 duh nuh nuhs per second&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Google&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://highscalability.com/google-architecture&quot;&gt;Google architecture&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Instagram&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://highscalability.com/blog/2011/12/6/instagram-architecture-14-million-users-terabytes-of-photos.html&quot;&gt;14 million users, terabytes of photos&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://instagram-engineering.tumblr.com/post/13649370142/what-powers-instagram-hundreds-of-instances&quot;&gt;What powers Instagram&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;http://Justin.tv&quot;&gt;Justin.tv&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://highscalability.com/blog/2010/3/16/justintvs-live-video-broadcasting-architecture.html&quot;&gt;Justin.Tv&#39;s live video broadcasting architecture&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Facebook&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://cs.uwaterloo.ca/~brecht/courses/854-Emerging-2014/readings/key-value/fb-memcached-nsdi-2013.pdf&quot;&gt;Scaling memcached at Facebook&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://cs.uwaterloo.ca/~brecht/courses/854-Emerging-2014/readings/data-store/tao-facebook-distributed-datastore-atc-2013.pdf&quot;&gt;TAO: Facebook’s distributed data store for the social graph&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.usenix.org/legacy/event/osdi10/tech/full_papers/Beaver.pdf&quot;&gt;Facebook’s photo storage&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://highscalability.com/blog/2016/6/27/how-facebook-live-streams-to-800000-simultaneous-viewers.html&quot;&gt;How Facebook Live Streams To 800,000 Simultaneous Viewers&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Flickr&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://highscalability.com/flickr-architecture&quot;&gt;Flickr architecture&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Mailbox&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://highscalability.com/blog/2013/6/18/scaling-mailbox-from-0-to-one-million-users-in-6-weeks-and-1.html&quot;&gt;From 0 to one million users in 6 weeks&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Netflix&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://highscalability.com/blog/2015/11/9/a-360-degree-view-of-the-entire-netflix-stack.html&quot;&gt;A 360 Degree View Of The Entire Netflix Stack&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://highscalability.com/blog/2017/12/11/netflix-what-happens-when-you-press-play.html&quot;&gt;Netflix: What Happens When You Press Play?&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Pinterest&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://highscalability.com/blog/2013/4/15/scaling-pinterest-from-0-to-10s-of-billions-of-page-views-a.html&quot;&gt;From 0 To 10s of billions of page views a month&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://highscalability.com/blog/2012/5/21/pinterest-architecture-update-18-million-visitors-10x-growth.html&quot;&gt;18 million visitors, 10x growth, 12 employees&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Playfish&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://highscalability.com/blog/2010/9/21/playfishs-social-gaming-architecture-50-million-monthly-user.html&quot;&gt;50 million monthly users and growing&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;PlentyOfFish&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://highscalability.com/plentyoffish-architecture&quot;&gt;PlentyOfFish architecture&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Salesforce&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://highscalability.com/blog/2013/9/23/salesforce-architecture-how-they-handle-13-billion-transacti.html&quot;&gt;How they handle 1.3 billion transactions a day&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Stack Overflow&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://highscalability.com/blog/2009/8/5/stack-overflow-architecture.html&quot;&gt;Stack Overflow architecture&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;TripAdvisor&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://highscalability.com/blog/2011/6/27/tripadvisor-architecture-40m-visitors-200m-dynamic-page-view.html&quot;&gt;40M visitors, 200M dynamic page views, 30TB data&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Tumblr&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://highscalability.com/blog/2012/2/13/tumblr-architecture-15-billion-page-views-a-month-and-harder.html&quot;&gt;15 billion page views a month&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Twitter&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://highscalability.com/scaling-twitter-making-twitter-10000-percent-faster&quot;&gt;Making Twitter 10000 percent faster&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://highscalability.com/blog/2011/12/19/how-twitter-stores-250-million-tweets-a-day-using-mysql.html&quot;&gt;Storing 250 million tweets a day using MySQL&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://highscalability.com/blog/2013/7/8/the-architecture-twitter-uses-to-deal-with-150m-active-users.html&quot;&gt;150M active users, 300K QPS, a 22 MB/S firehose&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.infoq.com/presentations/Twitter-Timeline-Scalability&quot;&gt;Timelines at scale&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=5cKTP36HVgI&quot;&gt;Big and small data at Twitter&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=z8LU0Cj6BOU&quot;&gt;Operations at Twitter: scaling beyond 100 million users&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://highscalability.com/blog/2016/4/20/how-twitter-handles-3000-images-per-second.html&quot;&gt;How Twitter Handles 3,000 Images Per Second&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Uber&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://highscalability.com/blog/2015/9/14/how-uber-scales-their-real-time-market-platform.html&quot;&gt;How Uber scales their real-time market platform&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://highscalability.com/blog/2016/10/12/lessons-learned-from-scaling-uber-to-2000-engineers-1000-ser.html&quot;&gt;Lessons Learned From Scaling Uber To 2000 Engineers, 1000 Services, And 8000 Git Repositories&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;WhatsApp&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;http://highscalability.com/blog/2014/2/26/the-whatsapp-architecture-facebook-bought-for-19-billion.html&quot;&gt;The WhatsApp architecture Facebook bought for $19 billion&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;YouTube&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=w5WVu624fY8&quot;&gt;YouTube scalability&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://highscalability.com/youtube-architecture&quot;&gt;YouTube architecture&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h3&gt;Company engineering blogs&lt;/h3&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;Architectures for companies you are interviewing with.&lt;/p&gt; 
 &lt;p&gt;Questions you encounter might be from the same domain.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://nerds.airbnb.com/&quot;&gt;Airbnb Engineering&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://developer.atlassian.com/blog/&quot;&gt;Atlassian Developers&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://aws.amazon.com/blogs/aws/&quot;&gt;AWS Blog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://word.bitly.com/&quot;&gt;Bitly Engineering Blog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://blog.box.com/blog/category/engineering&quot;&gt;Box Blogs&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://blog.cloudera.com/&quot;&gt;Cloudera Developer Blog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://tech.dropbox.com/&quot;&gt;Dropbox Tech Blog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.quora.com/q/quoraengineering&quot;&gt;Engineering at Quora&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.ebaytechblog.com/&quot;&gt;Ebay Tech Blog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://blog.evernote.com/tech/&quot;&gt;Evernote Tech Blog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://codeascraft.com/&quot;&gt;Etsy Code as Craft&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/Engineering&quot;&gt;Facebook Engineering&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://code.flickr.net/&quot;&gt;Flickr Code&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://engineering.foursquare.com/&quot;&gt;Foursquare Engineering Blog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.blog/category/engineering&quot;&gt;GitHub Engineering Blog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://googleresearch.blogspot.com/&quot;&gt;Google Research Blog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://engineering.groupon.com/&quot;&gt;Groupon Engineering Blog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://engineering.heroku.com/&quot;&gt;Heroku Engineering Blog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://product.hubspot.com/blog/topic/engineering&quot;&gt;Hubspot Engineering Blog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://highscalability.com/&quot;&gt;High Scalability&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://instagram-engineering.tumblr.com/&quot;&gt;Instagram Engineering&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://software.intel.com/en-us/blogs/&quot;&gt;Intel Software Blog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://blogs.janestreet.com/category/ocaml/&quot;&gt;Jane Street Tech Blog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://engineering.linkedin.com/blog&quot;&gt;LinkedIn Engineering&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://engineering.microsoft.com/&quot;&gt;Microsoft Engineering&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://blogs.msdn.microsoft.com/pythonengineering/&quot;&gt;Microsoft Python Engineering&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://techblog.netflix.com/&quot;&gt;Netflix Tech Blog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://developer.paypal.com/community/blog/&quot;&gt;Paypal Developer Blog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://medium.com/@Pinterest_Engineering&quot;&gt;Pinterest Engineering Blog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.redditblog.com/&quot;&gt;Reddit Blog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://developer.salesforce.com/blogs/engineering/&quot;&gt;Salesforce Engineering Blog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://slack.engineering/&quot;&gt;Slack Engineering Blog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://labs.spotify.com/&quot;&gt;Spotify Labs&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stripe.com/blog/engineering&quot;&gt;Stripe Engineering Blog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.twilio.com/engineering&quot;&gt;Twilio Engineering Blog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://blog.twitter.com/engineering/&quot;&gt;Twitter Engineering&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://eng.uber.com/&quot;&gt;Uber Engineering Blog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://yahooeng.tumblr.com/&quot;&gt;Yahoo Engineering Blog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://engineeringblog.yelp.com/&quot;&gt;Yelp Engineering Blog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.zynga.com/blogs/engineering&quot;&gt;Zynga Engineering Blog&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Source(s) and further reading&lt;/h4&gt; 
&lt;p&gt;Looking to add a blog? To avoid duplicating work, consider adding your company blog to the following repo:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/kilimchoi/engineering-blogs&quot;&gt;kilimchoi/engineering-blogs&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Under development&lt;/h2&gt; 
&lt;p&gt;Interested in adding a section or helping complete one in-progress? &lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#contributing&quot;&gt;Contribute&lt;/a&gt;!&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Distributed computing with MapReduce&lt;/li&gt; 
 &lt;li&gt;Consistent hashing&lt;/li&gt; 
 &lt;li&gt;Scatter gather&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/donnemartin/system-design-primer/master/#contributing&quot;&gt;Contribute&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Credits&lt;/h2&gt; 
&lt;p&gt;Credits and sources are provided throughout this repo.&lt;/p&gt; 
&lt;p&gt;Special thanks to:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.hiredintech.com/system-design/the-system-design-process/&quot;&gt;Hired in tech&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/dp/0984782850/&quot;&gt;Cracking the coding interview&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://highscalability.com/&quot;&gt;High scalability&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/checkcheckzz/system-design-interview&quot;&gt;checkcheckzz/system-design-interview&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/shashank88/system_design&quot;&gt;shashank88/system_design&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/mmcgrana/services-engineering&quot;&gt;mmcgrana/services-engineering&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://gist.github.com/vasanthk/485d1c25737e8e72759f&quot;&gt;System design cheat sheet&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://dancres.github.io/Pages/&quot;&gt;A distributed systems reading list&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.puncsky.com/blog/2016-02-13-crack-the-system-design-interview&quot;&gt;Cracking the system design interview&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Contact info&lt;/h2&gt; 
&lt;p&gt;Feel free to contact me to discuss any issues, questions, or comments.&lt;/p&gt; 
&lt;p&gt;My contact info can be found on my &lt;a href=&quot;https://github.com/donnemartin&quot;&gt;GitHub page&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;License&lt;/h2&gt; 
&lt;p&gt;&lt;em&gt;I am providing code and resources in this repository to you under an open source license. Because this is my personal repository, the license you receive to my code and resources is from me and not my employer (Facebook).&lt;/em&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Copyright 2017 Donne Martin

Creative Commons Attribution 4.0 International License (CC BY 4.0)

http://creativecommons.org/licenses/by/4.0/
&lt;/code&gt;&lt;/pre&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/dd6e572543da7fc6be9bc4340e5183cb70e1a8b72376349556afffb637e45266/donnemartin/system-design-primer" medium="image" />
      
    </item>
    
    <item>
      <title>Robbyant/lingbot-map</title>
      <link>https://github.com/Robbyant/lingbot-map</link>
      <description>&lt;p&gt;A feed-forward 3D foundation model for reconstructing scenes from streaming data&lt;/p&gt;&lt;hr&gt;&lt;div align=&quot;center&quot;&gt; 
 &lt;img src=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/assets/teaser.webp&quot; width=&quot;100%&quot; /&gt; 
 &lt;h1&gt;LingBot-Map: Geometric Context Transformer for Streaming 3D Reconstruction&lt;/h1&gt; 
 &lt;p&gt;Robbyant Team&lt;/p&gt; 
&lt;/div&gt; 
&lt;div align=&quot;center&quot;&gt; 
 &lt;p&gt;&lt;a href=&quot;https://arxiv.org/abs/2604.14141&quot;&gt;&lt;img src=&quot;https://img.shields.io/static/v1?label=Paper&amp;amp;message=arXiv&amp;amp;color=red&amp;amp;logo=arxiv&quot; alt=&quot;Paper&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/lingbot-map_paper.pdf&quot;&gt;&lt;img src=&quot;https://img.shields.io/static/v1?label=Paper&amp;amp;message=PDF&amp;amp;color=red&amp;amp;logo=adobeacrobatreader&quot; alt=&quot;PDF&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://technology.robbyant.com/lingbot-map&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Project-Website-blue&quot; alt=&quot;Project&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://huggingface.co/robbyant/lingbot-map&quot;&gt;&lt;img src=&quot;https://img.shields.io/static/v1?label=%F0%9F%A4%97%20Model&amp;amp;message=HuggingFace&amp;amp;color=orange&quot; alt=&quot;HuggingFace&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.modelscope.cn/models/Robbyant/lingbot-map&quot;&gt;&lt;img src=&quot;https://img.shields.io/static/v1?label=%F0%9F%A4%96%20Model&amp;amp;message=ModelScope&amp;amp;color=purple&quot; alt=&quot;ModelScope&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/LICENSE.txt&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/License-Apache--2.0-green&quot; alt=&quot;License&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/user-attachments/assets/fe39e095-af2c-4ec9-b68d-a8ba97e505ab&quot;&gt;https://github.com/user-attachments/assets/fe39e095-af2c-4ec9-b68d-a8ba97e505ab&lt;/a&gt;&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h3&gt;🗺️ Meet LingBot-Map! We&#39;ve built a feed-forward 3D foundation model for streaming 3D reconstruction! 🏗️🌍&lt;/h3&gt; 
&lt;p&gt;LingBot-Map has focused on:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Geometric Context Transformer&lt;/strong&gt;: Architecturally unifies coordinate grounding, dense geometric cues, and long-range drift correction within a single streaming framework through anchor context, pose-reference window, and trajectory memory.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;High-Efficiency Streaming Inference&lt;/strong&gt;: A feed-forward architecture with paged KV cache attention, enabling stable inference at ~20 FPS on 518×378 resolution over long sequences exceeding 10,000 frames.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;State-of-the-Art Reconstruction&lt;/strong&gt;: Superior performance on diverse benchmarks compared to both existing streaming and iterative optimization-based approaches.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;hr /&gt; 
&lt;h2&gt;📑 Table of Contents&lt;/h2&gt; 
&lt;details&gt; 
 &lt;summary&gt;Click to expand&lt;/summary&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/#-news&quot;&gt;📰 News&lt;/a&gt;&lt;/li&gt; 
  &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/#-todo&quot;&gt;📋 TODO&lt;/a&gt;&lt;/li&gt; 
  &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/#%EF%B8%8F-installation&quot;&gt;⚙️ Installation&lt;/a&gt;&lt;/li&gt; 
  &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/#-model-download&quot;&gt;📦 Model Download&lt;/a&gt;&lt;/li&gt; 
  &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/#-quick-start&quot;&gt;🚀 Quick Start&lt;/a&gt;&lt;/li&gt; 
  &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/#-interactive-demo-demopy&quot;&gt;🎬 Interactive Demo (&lt;code&gt;demo.py&lt;/code&gt;)&lt;/a&gt; 
   &lt;ul&gt; 
    &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/#try-the-example-scenes&quot;&gt;Try the Example Scenes&lt;/a&gt;&lt;/li&gt; 
    &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/#streaming-with-keyframe-interval&quot;&gt;Streaming with Keyframe Interval&lt;/a&gt;&lt;/li&gt; 
    &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/#windowed-inference-for-long-sequences-3000-frames&quot;&gt;Windowed Inference (for long sequences, &amp;gt;3000 frames)&lt;/a&gt;&lt;/li&gt; 
    &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/#sky-masking&quot;&gt;Sky Masking&lt;/a&gt;&lt;/li&gt; 
    &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/#visualization-options&quot;&gt;Visualization Options&lt;/a&gt;&lt;/li&gt; 
    &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/#performance--memory&quot;&gt;Performance &amp;amp; Memory&lt;/a&gt;&lt;/li&gt; 
   &lt;/ul&gt; &lt;/li&gt; 
  &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/#-offline-rendering-pipeline-demo_renderbatch_demopy&quot;&gt;🎥 Offline Rendering Pipeline (&lt;code&gt;demo_render/batch_demo.py&lt;/code&gt;)&lt;/a&gt;&lt;/li&gt; 
  &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/#-license&quot;&gt;📜 License&lt;/a&gt;&lt;/li&gt; 
  &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/#-citation&quot;&gt;📖 Citation&lt;/a&gt;&lt;/li&gt; 
  &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/#-acknowledgments&quot;&gt;✨ Acknowledgments&lt;/a&gt;&lt;/li&gt; 
 &lt;/ul&gt; 
&lt;/details&gt; 
&lt;hr /&gt; 
&lt;h2&gt;📰 News&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;2026-06-28&lt;/strong&gt; — Fixed an SDPA KV cache bug. &lt;strong&gt;The SDPA backend now performs better on long sequences&lt;/strong&gt;. We still recommend the FlashInfer backend for the best performance.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;2026-05-25&lt;/strong&gt; — 📊 &lt;strong&gt;Evaluation benchmark released&lt;/strong&gt;. We released the evaluation scripts for KITTI and Oxford Spires — see &lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/benchmark/&quot;&gt;benchmark/&lt;/a&gt; for the pipeline, and run &lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/preprocess/oxford.py&quot;&gt;&lt;code&gt;preprocess/oxford.py&lt;/code&gt;&lt;/a&gt; to prepare Oxford Spires data before evaluation.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;2026-04-29&lt;/strong&gt; — 📹 &lt;strong&gt;Long-video demo released&lt;/strong&gt;. We released a very-long-video example (~25 000 frames, 13-minute indoor walkthrough) rendered with the offline pipeline — see &lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/#worked-example--long-indoor-walkthrough-25-000-frames-13-minutes&quot;&gt;Worked Example&lt;/a&gt; for the command, flag rationale, and rendered output.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;2026-04-27&lt;/strong&gt; — 🚀 &lt;strong&gt;LingBot-Map accelerated&lt;/strong&gt;. Pull the latest &lt;code&gt;main&lt;/code&gt; and run &lt;code&gt;python demo.py --compile ...&lt;/code&gt; or &lt;code&gt;python gct_profile.py --backend flashinfer --dtype bf16 --compile&lt;/code&gt; to verify on your hardware.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;2026-04-24&lt;/strong&gt; — Fixed a FlashInfer KV cache bug where &lt;code&gt;--keyframe_interval &amp;gt; 1&lt;/code&gt; silently cached non-keyframes. &lt;strong&gt;You should now see better pose and reconstruction quality when running with more than 320 frames&lt;/strong&gt;.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;hr /&gt; 
&lt;h2&gt;📋 TODO&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;✅ Release evaluation benchmark 
  &lt;ul&gt; 
   &lt;li&gt;✅ Oxford Spires dataset&lt;/li&gt; 
   &lt;li&gt;✅ KITTI dataset&lt;/li&gt; 
   &lt;li&gt;✅ VBR dataset&lt;/li&gt; 
   &lt;li&gt;✅ Droid-W dataset&lt;/li&gt; 
   &lt;li&gt;✅ TUM-D dataset&lt;/li&gt; 
   &lt;li&gt;✅ 7-scenes dataset&lt;/li&gt; 
   &lt;li&gt;✅ ETH3D dataset&lt;/li&gt; 
   &lt;li&gt;✅ Tanks and Temples dataset&lt;/li&gt; 
   &lt;li&gt;✅ NRGBD dataset&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;✅ Release demo scripts 
  &lt;ul&gt; 
   &lt;li&gt;✅ Indoor long-video demo (&lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/#-featured-indoor-walkthrough-25-000-frames-13-minutes&quot;&gt;Featured indoor walkthrough&lt;/a&gt;)&lt;/li&gt; 
   &lt;li&gt;✅ Outdoor long-video demo&lt;/li&gt; 
   &lt;li&gt;✅ LingBot-World demo (&lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/#worked-example--lingbot-world-scenes&quot;&gt;Worked example&lt;/a&gt;)&lt;/li&gt; 
   &lt;li&gt;✅ Aerial long-video demo&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;hr /&gt; 
&lt;h2&gt;⚙️ Installation&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;1. Create conda environment&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;conda create -n lingbot-map python=3.10 -y
conda activate lingbot-map
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;2. Install PyTorch (CUDA 12.8)&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install torch==2.8.0 torchvision==0.23.0 --index-url https://download.pytorch.org/whl/cu128
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;PyTorch 2.8.0 is the recommended version because NVIDIA Kaolin (required by the batch rendering pipeline) has prebuilt wheels for &lt;code&gt;torch-2.8.0_cu128&lt;/code&gt;. If you only need &lt;code&gt;demo.py&lt;/code&gt; you may use a newer PyTorch, but the batch renderer then requires building Kaolin from source. For other CUDA versions, see &lt;a href=&quot;https://pytorch.org/get-started/locally/&quot;&gt;PyTorch Get Started&lt;/a&gt;.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;strong&gt;3. Install lingbot-map&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install -e .
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;4. Install FlashInfer (recommended)&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;FlashInfer provides paged KV cache attention for efficient streaming inference. It is a pure-Python package that JIT-compiles CUDA kernels on first use, so a single wheel works across CUDA/PyTorch versions:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install --index-url https://pypi.org/simple flashinfer-python
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;code&gt;--index-url https://pypi.org/simple&lt;/code&gt; is only needed if your default pip index is an internal mirror that doesn&#39;t have &lt;code&gt;flashinfer-python&lt;/code&gt;. (Optional) For faster first-use, you can additionally install a CUDA-specific JIT cache: &lt;code&gt;pip install flashinfer-jit-cache -f https://flashinfer.ai/whl/cu128/flashinfer-jit-cache/&lt;/code&gt;. See &lt;a href=&quot;https://docs.flashinfer.ai/installation.html&quot;&gt;FlashInfer installation&lt;/a&gt; for details. If FlashInfer is not installed, the model falls back to SDPA (PyTorch native attention) via &lt;code&gt;--use_sdpa&lt;/code&gt;.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;strong&gt;5. Visualization dependencies (optional)&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install -e &quot;.[vis]&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;📦 Model Download&lt;/h2&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Model Name&lt;/th&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Huggingface Repository&lt;/th&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;ModelScope Repository&lt;/th&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Description&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;lingbot-map-long&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://huggingface.co/robbyant/lingbot-map&quot;&gt;robbyant/lingbot-map&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://www.modelscope.cn/models/Robbyant/lingbot-map&quot;&gt;Robbyant/lingbot-map&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Better suited for long sequences and large scale scenes.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;lingbot-map&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://huggingface.co/robbyant/lingbot-map&quot;&gt;robbyant/lingbot-map&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://www.modelscope.cn/models/Robbyant/lingbot-map&quot;&gt;Robbyant/lingbot-map&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Balanced checkpoint (used in paper, benchmark and offline demo) — trade off all-around performance across short and long sequences.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;lingbot-map-stage1&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://huggingface.co/robbyant/lingbot-map&quot;&gt;robbyant/lingbot-map&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://www.modelscope.cn/models/Robbyant/lingbot-map&quot;&gt;Robbyant/lingbot-map&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Stage-1 training checkpoint of lingbot-map — can be loaded into the VGGT model for bidirectional inference (c2w).&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;🚧 &lt;strong&gt;Coming soon:&lt;/strong&gt; we&#39;re training an stronger model that supports longer sequences — stay tuned.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h2&gt;🚀 Quick Start&lt;/h2&gt; 
&lt;p&gt;After installation, run your first scene with one command:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;python demo.py --model_path /path/to/lingbot-map.pt \
    --image_folder example/courthouse --mask_sky
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This launches an interactive &lt;a href=&quot;https://github.com/nerfstudio-project/viser&quot;&gt;viser&lt;/a&gt; viewer at &lt;code&gt;http://localhost:8080&lt;/code&gt;. See &lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/#-interactive-demo-demopy&quot;&gt;Interactive Demo&lt;/a&gt; below for the full set of scenes and flags, or jump to &lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/#-offline-rendering-pipeline-demo_renderbatch_demopy&quot;&gt;Offline Rendering Pipeline&lt;/a&gt; for long-sequence batch rendering.&lt;/p&gt; 
&lt;h2&gt;🎬 Interactive Demo (&lt;code&gt;demo.py&lt;/code&gt;)&lt;/h2&gt; 
&lt;p&gt;Run &lt;code&gt;demo.py&lt;/code&gt; for interactive 3D visualization via a browser-based &lt;a href=&quot;https://github.com/nerfstudio-project/viser&quot;&gt;viser&lt;/a&gt; viewer (default &lt;code&gt;http://localhost:8080&lt;/code&gt;).&lt;/p&gt; 
&lt;h3&gt;Try the Example Scenes&lt;/h3&gt; 
&lt;p&gt;We provide three example scenes in &lt;code&gt;example/&lt;/code&gt; that you can run out of the box:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# courthouse scene
python demo.py --model_path /path/to/lingbot-map.pt \
    --image_folder example/courthouse --mask_sky
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/user-attachments/assets/aa10f7ab-8024-43c7-92f8-d56159ec85c8&quot;&gt;https://github.com/user-attachments/assets/aa10f7ab-8024-43c7-92f8-d56159ec85c8&lt;/a&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# University scene
python demo.py --model_path /path/to/lingbot-map.pt \
    --image_folder example/university --mask_sky
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/user-attachments/assets/212a1744-6ff5-4ccf-9bd4-728608248b57&quot;&gt;https://github.com/user-attachments/assets/212a1744-6ff5-4ccf-9bd4-728608248b57&lt;/a&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Loop scene (loop closure trajectory)
python demo.py --model_path /path/to/lingbot-map.pt \
    --image_folder example/loop
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/user-attachments/assets/5ae0a292-b081-40c6-838c-b7c1a0538d75&quot;&gt;https://github.com/user-attachments/assets/5ae0a292-b081-40c6-838c-b7c1a0538d75&lt;/a&gt;&lt;/p&gt; 
&lt;h4&gt;🎯 Featured: indoor walkthrough (~25 000 frames, 13 minutes)&lt;/h4&gt; 
&lt;p&gt;&lt;em&gt;Sequence is too long for the interactive viser viewer — this clip was rendered with the &lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/#-offline-rendering-pipeline-demo_renderbatch_demopy&quot;&gt;Offline Rendering Pipeline&lt;/a&gt;. See that section for the full command.&lt;/em&gt;&lt;/p&gt; 
&lt;p&gt;We will provide more examples in the follow-up.&lt;/p&gt; 
&lt;h3&gt;Dynamic Demo (From Droid-W)&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;Dataset:&lt;/strong&gt; Download the demo sequences from &lt;a href=&quot;https://huggingface.co/datasets/robbyant/lingbot-map-demo/tree/main&quot;&gt;robbyant/lingbot-map-demo&lt;/a&gt; on Hugging Face.&lt;/p&gt; 
&lt;p&gt;Example run on the &lt;code&gt;dynamic&lt;/code&gt; sequence from the dataset above (sky masking on, 4 camera optimization iterations, keyframe every 2 frames):&lt;/p&gt; 
&lt;p&gt;Run the &lt;code&gt;dynamic&lt;/code&gt; sequence with sky masking, 4 camera optimization iterations, and an input stride of 2:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;python demo.py \
    --image_folder /path/to/dynamic\
    --model_path ../../Lingbot-Map/lingbot-map.pt \
    --camera_num_iterations 4 \
    --mask_sky \
    --stride 2
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/user-attachments/assets/567b6e9b-1cbf-402a-96be-9bab70715ec3&quot;&gt;https://github.com/user-attachments/assets/567b6e9b-1cbf-402a-96be-9bab70715ec3&lt;/a&gt;&lt;/p&gt; 
&lt;img width=&quot;1453&quot; height=&quot;1195&quot; alt=&quot;image&quot; src=&quot;https://github.com/user-attachments/assets/27f8c6b7-339e-4e5f-9776-7cb577147401&quot; /&gt; 
&lt;h3&gt;Streaming with Keyframe Interval&lt;/h3&gt; 
&lt;p&gt;Use &lt;code&gt;--keyframe_interval&lt;/code&gt; to reduce KV cache memory by only keeping every N-th frame as a keyframe. Non-keyframe frames still produce predictions but are not stored in the cache. This is useful for long sequences which exceed 320 frames (We train with video RoPE on 320 views, so performance degrades when the KV cache stores more than 320 views. Using a keyframe strategy allows inference over longer sequences.). In &lt;a href=&quot;http://demo.py&quot;&gt;demo.py&lt;/a&gt;, the keyframe interval is calculated automatically.&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;Note on inference range.&lt;/strong&gt; Our method does not perform state resetting by default, so the maximum inference range is bounded by the longest distance seen during training on the dataset. Beyond that distance, state resetting becomes necessary. If you observe pose collapse, switch to windowed mode (&lt;code&gt;--mode windowed&lt;/code&gt;) — in most cases tuning &lt;code&gt;--keyframe_interval&lt;/code&gt; alone is enough and the rest of the windowed parameters can stay at their defaults.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h3&gt;Windowed Inference (for long sequences, &amp;gt;3000 frames)&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;python demo.py --model_path /path/to/lingbot-map.pt \
    --video_path video.mp4 --fps 10 \
    --mode windowed --window_size 128 --overlap_keyframes 16 --keyframe_interval 2 
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Sky Masking&lt;/h3&gt; 
&lt;p&gt;Sky masking uses an ONNX sky segmentation model to filter out sky points from the reconstructed point cloud, which improves visualization quality for outdoor scenes.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Setup:&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Install onnxruntime (required)
pip install onnxruntime        # CPU
# or
pip install onnxruntime-gpu    # GPU (faster for large image sets)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The sky segmentation model (&lt;code&gt;skyseg.onnx&lt;/code&gt;) will be automatically downloaded from &lt;a href=&quot;https://huggingface.co/JianyuanWang/skyseg/resolve/main/skyseg.onnx&quot;&gt;HuggingFace&lt;/a&gt; on first use. If the download fails or does not produce a regular file, sky masking stops with a &lt;code&gt;RuntimeError&lt;/code&gt; that reports the model path, download URL, cause, and manual setup guidance; it never silently continues without masking. For manual recovery, download the model as &lt;code&gt;skyseg.onnx&lt;/code&gt; in the directory from which you run the command, because root &lt;code&gt;demo.py&lt;/code&gt; resolves its default model path relative to the current working directory:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wget -O skyseg.onnx https://huggingface.co/JianyuanWang/skyseg/resolve/main/skyseg.onnx
python demo.py --model_path /path/to/checkpoint.pt \
    --image_folder /path/to/images/ --mask_sky
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;Usage:&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;python demo.py --model_path /path/to/checkpoint.pt \
    --image_folder /path/to/images/ --mask_sky
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Sky masks are cached in &lt;code&gt;&amp;lt;image_folder&amp;gt;_sky_masks/&lt;/code&gt; so subsequent runs skip regeneration. You can also specify a custom cache directory with &lt;code&gt;--sky_mask_dir&lt;/code&gt;, or save side-by-side mask visualizations with &lt;code&gt;--sky_mask_visualization_dir&lt;/code&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;python demo.py --model_path /path/to/checkpoint.pt \
    --image_folder /path/to/images/ --mask_sky \
    --sky_mask_dir /path/to/cached_masks/ \
    --sky_mask_visualization_dir /path/to/mask_viz/
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Visualization Options&lt;/h3&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Argument&lt;/th&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Default&lt;/th&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Description&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;--port&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;8080&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Viser viewer port&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;--conf_threshold&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;1.5&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Visibility threshold for filtering low-confidence points&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;--point_size&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;0.00001&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Point cloud point size&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;--downsample_factor&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;10&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Spatial downsampling for point cloud display&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h3&gt;Performance &amp;amp; Memory&lt;/h3&gt; 
&lt;h4&gt;Without FlashInfer (SDPA fallback)&lt;/h4&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;python demo.py --model_path /path/to/checkpoint.pt \
    --image_folder /path/to/images/ --use_sdpa
&lt;/code&gt;&lt;/pre&gt; 
&lt;h4&gt;Running on Limited GPU Memory&lt;/h4&gt; 
&lt;p&gt;If you run into out-of-memory issues, try one (or both) of the following:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;code&gt;--offload_to_cpu&lt;/code&gt;&lt;/strong&gt; — offload per-frame predictions to CPU during inference (on by default; use &lt;code&gt;--no-offload_to_cpu&lt;/code&gt; only if you have memory to spare).&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;code&gt;--num_scale_frames 2&lt;/code&gt;&lt;/strong&gt; — reduce the number of bidirectional scale frames from the default 8 down to 2, which shrinks the activation peak of the initial scale phase.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h4&gt;Faster Inference&lt;/h4&gt; 
&lt;p&gt;Lower the number of iterative refinement steps in the camera head to trade a small amount of pose accuracy for wall-clock speed:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;python demo.py --model_path /path/to/checkpoint.pt \
    --image_folder /path/to/images/ --camera_num_iterations 1
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;--camera_num_iterations&lt;/code&gt; defaults to &lt;code&gt;4&lt;/code&gt;; setting it to &lt;code&gt;1&lt;/code&gt; skips three refinement passes in the camera head (and shrinks its KV cache by 4×).&lt;/p&gt; 
&lt;h2&gt;🎥 Offline Rendering Pipeline (&lt;code&gt;demo_render/batch_demo.py&lt;/code&gt;)&lt;/h2&gt; 
&lt;p&gt;Use this pipeline when your sequence is too long for the interactive viser viewer — for example, the &lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/#-featured-indoor-walkthrough-25-000-frames-13-minutes&quot;&gt;indoor walkthrough featured above&lt;/a&gt;. &lt;code&gt;demo_render/batch_demo.py&lt;/code&gt; is the all-in-one offline entry point: feed it a video or a folder of images and it will run model inference and produce a headless point-cloud flythrough MP4 in a single command. It shares the same PyTorch / FlashInfer / checkpoint stack as &lt;code&gt;demo.py&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;For those constrained by limited VRAM or GPU usage, you may also refer to the implementation at: &lt;a href=&quot;https://github.com/ureeey/lingbot-map-rtx4060-8g/commit/eeee84a89cc97c1e39b736b46df4ee315275700b&quot;&gt;https://github.com/ureeey/lingbot-map-rtx4060-8g/commit/eeee84a89cc97c1e39b736b46df4ee315275700b&lt;/a&gt;&lt;/p&gt; 
&lt;h3&gt;Install (extends the main install)&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;1. Rendering Python dependencies&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install -e &quot;.[vis,render]&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;render&lt;/code&gt; pulls in &lt;code&gt;open3d&amp;gt;=0.19&lt;/code&gt; and &lt;code&gt;pyyaml&lt;/code&gt; (the core &lt;code&gt;numpy&amp;lt;2&lt;/code&gt; constraint comes from the base &lt;code&gt;lingbot-map&lt;/code&gt; install). Sky masking in this pipeline uses &lt;code&gt;onnxruntime-gpu&lt;/code&gt; for batched segmentation; install it if you don&#39;t already have the CPU &lt;code&gt;onnxruntime&lt;/code&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install onnxruntime-gpu
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The offline pipeline has the same first-use model download and fatal failure behavior described in &lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/#sky-masking&quot;&gt;Sky Masking&lt;/a&gt;. Use &lt;code&gt;--skyseg_model_path /absolute/path/to/skyseg.onnx&lt;/code&gt; with &lt;code&gt;demo_render/batch_demo.py&lt;/code&gt;; for standalone &lt;code&gt;demo_render/rgbd_scan_render.py&lt;/code&gt;, use &lt;code&gt;--sky_model /absolute/path/to/skyseg.onnx&lt;/code&gt; on the command line or set &lt;code&gt;preprocess.sky_model&lt;/code&gt; in YAML.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;2. Kaolin&lt;/strong&gt; — matches the PyTorch 2.8.0 + CUDA 12.8 recommended above:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install --index-url https://pypi.org/simple \
    kaolin -f https://nvidia-kaolin.s3.us-east-2.amazonaws.com/torch-2.8.0_cu128.html
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;code&gt;--index-url https://pypi.org/simple&lt;/code&gt; bypasses any internal mirror that might otherwise serve the PyPI placeholder wheel (which raises &lt;code&gt;ImportError&lt;/code&gt; on import). NVIDIA Kaolin does not publish prebuilt wheels for PyTorch 2.9.x — if you&#39;re on 2.9 for other reasons, build Kaolin from source (&lt;code&gt;pip install --no-build-isolation git+https://github.com/NVIDIAGameWorks/kaolin.git&lt;/code&gt;, needs local CUDA toolkit). For other torch/CUDA combinations see &lt;a href=&quot;https://kaolin.readthedocs.io/en/latest/notes/installation.html&quot;&gt;NVIDIA Kaolin installation&lt;/a&gt;.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;strong&gt;3. ffmpeg&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install ffmpeg    # or: brew install ffmpeg
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;4. CUDA extensions&lt;/strong&gt; (required before first run)&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd demo_render/render_cuda_ext &amp;amp;&amp;amp; python setup.py build_ext --inplace &amp;amp;&amp;amp; cd ../..
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This builds &lt;code&gt;voxel_morton_ext&lt;/code&gt; and &lt;code&gt;frustum_cull_ext&lt;/code&gt; in place — both are imported by &lt;code&gt;rgbd_render&lt;/code&gt; for GPU voxelization and frustum culling.&lt;/p&gt; 
&lt;h3&gt;Worked Example — long indoor walkthrough (~25 000 frames, 13 minutes)&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;Dataset:&lt;/strong&gt; Download the example video from &lt;a href=&quot;https://huggingface.co/datasets/robbyant/lingbot-map-demo/tree/main&quot;&gt;robbyant/lingbot-map-demo&lt;/a&gt; on Hugging Face.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;    python demo_render/batch_demo.py \
    --video_path /data/demo_videos/indoor_travel.MP4 \
    --output_folder /data/outputs/indoor_travel/ \
    --model_path /path/to/lingbot-map.pt \
    --config demo_render/config/indoor.yaml \
    --mode windowed --window_size 128 \
    --keyframe_interval 10 --overlap_keyframes 8 \
    --sky_mask_dir /data/outputs/sky_masks \
    --sky_mask_visualization_dir /data/outputs/sky_mask_viz \
    --camera_vis default --keyframes_only_points \
    --frame_tag --frame_tag_position top_right \
    --save_predictions
&lt;/code&gt;&lt;/pre&gt; 
&lt;img width=&quot;1920&quot; height=&quot;1080&quot; alt=&quot;image&quot; src=&quot;https://github.com/user-attachments/assets/f4f5e555-22a8-4cc9-b380-dfde5fe1c809&quot; /&gt; 
&lt;p&gt;Flag-by-flag rationale:&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Flag&lt;/th&gt; 
   &lt;th&gt;Why it&#39;s there&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;--mode windowed --window_size 128&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Sliding-window inference is required once the sequence exceeds the ~320-frame RoPE training range; each window resets the KV cache. &lt;strong&gt;&lt;code&gt;window_size&lt;/code&gt; counts KV-cache slots, not actual frames&lt;/strong&gt; — the first &lt;code&gt;num_scale_frames&lt;/code&gt; (=8) slots hold the scale frames and the remaining &lt;code&gt;128 − 8 = 120&lt;/code&gt; slots hold keyframes. With &lt;code&gt;keyframe_interval = 13&lt;/code&gt;, one window therefore covers &lt;code&gt;8 + 120 × 13 = 1568&lt;/code&gt; actual frames.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;--keyframe_interval 10&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Cache only every 10th frame as a keyframe. Non-keyframes still emit per-frame predictions but don&#39;t grow the KV cache&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;--overlap_keyframes 8&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Adjacent windows share 8 keyframes of context, resolved internally to &lt;code&gt;max(num_scale_frames, 8 × keyframe_interval) = 8 × 13 = 104&lt;/code&gt; actual frames of overlap. Recommended whenever &lt;code&gt;keyframe_interval &amp;gt; 1&lt;/code&gt;, to keep cross-window pose alignment stable.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;--config demo_render/config/indoor.yaml&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Seed render/scene/camera/overlay defaults from the indoor preset (short depth, tighter follow cam). Any CLI flag the user explicitly passes still overrides the YAML value.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;--sky_mask_dir&lt;/code&gt; / &lt;code&gt;--sky_mask_visualization_dir&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Persist sky masks and their side-by-side visualizations to disk so subsequent reruns reuse them instead of re-running ONNX segmentation. (The render pipeline only consumes them when sky masking is enabled — by the YAML preset or by &lt;code&gt;--mask_sky&lt;/code&gt;.)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;--camera_vis default&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Overlay the trajectory trail + recent-frame points on the rendered video.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;--keyframes_only_points&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Only unproject keyframe depth into the point cloud; non-keyframes still contribute their pose to the trajectory/frustum overlay. Keeps the cloud sparse for very long sequences.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;--frame_tag --frame_tag_position top_right&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Stamp a &lt;code&gt;&amp;lt;i&amp;gt; / &amp;lt;N&amp;gt; Frames&lt;/code&gt; counter in the top-right corner of the MP4.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;--save_predictions&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Persist per-frame NPZs alongside the MP4. Useful for inspection or for re-rendering with different camera/overlay settings later.&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;Replacing keyframe_interval = 10 with image_stride = 10 speeds up rendering. Then, uncomment the camera follow section in demo_render/config/indoor.yaml and set the birdeye&#39;s ranges to [2000, 2500] to reproduce the indoor fly-through effect shown in the demo:&lt;/p&gt; 
&lt;img width=&quot;3822&quot; height=&quot;1080&quot; alt=&quot;image&quot; src=&quot;https://github.com/user-attachments/assets/5581d2b2-cb86-4187-a13d-46ac9a22ce99&quot; /&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/user-attachments/assets/21b444ea-e6b6-48f0-8b34-3acad41166ac&quot;&gt;https://github.com/user-attachments/assets/21b444ea-e6b6-48f0-8b34-3acad41166ac&lt;/a&gt;&lt;/p&gt; 
&lt;h3&gt;Worked Example — outdoor drive scene&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;Dataset:&lt;/strong&gt; Download the example video from &lt;a href=&quot;https://huggingface.co/datasets/robbyant/lingbot-map-demo/tree/main&quot;&gt;robbyant/lingbot-map-demo&lt;/a&gt; on Hugging Face.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;    python demo_render/batch_demo.py \
    --video_path /data/demo_videos/drive_frames.mp4 \
    --output_folder /data/outputs/drive/ \
    --model_path /path/to/lingbot-map.pt \
    --config demo_render/config/outdoor_drive.yaml \
    --mode windowed --window_size 128 \
    --max_non_keyframe_gap 100 --overlap_keyframes 8 \
    --image_stride 1 \
    --sky_mask_dir /data/outputs/sky_masks \
    --sky_mask_visualization_dir /data/outputs/sky_mask_viz \
    --camera_vis default --keyframes_only_points \
    --frame_tag --frame_tag_position top_right \
    --save_predictions
&lt;/code&gt;&lt;/pre&gt; 
&lt;img width=&quot;3822&quot; height=&quot;1080&quot; alt=&quot;image&quot; src=&quot;https://github.com/user-attachments/assets/3c26afdb-6bb8-4d20-a7e0-f5a220382662&quot; /&gt; 
&lt;p&gt;What differs from the indoor walkthrough above:&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Flag&lt;/th&gt; 
   &lt;th&gt;Why it&#39;s there&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;--config demo_render/config/outdoor_drive.yaml&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Seed defaults from the outdoor preset: sky masking enabled, deeper render range (&lt;code&gt;max_depth: 250&lt;/code&gt;), and a follow cam tuned for vehicle trajectories with a final birdeye reveal.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;--image_stride 1&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Use every video frame. Increase it to subsample long or high-FPS drive footage.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;--max_non_keyframe_gap 100&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Upper bound on consecutive non-keyframes before a keyframe is forced. Only active with flow-based keyframe selection (&lt;code&gt;--flow_threshold &amp;gt; 0&lt;/code&gt;); in the default fixed-interval mode it has no effect.&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;The remaining flags (&lt;code&gt;--mode windowed --window_size 128&lt;/code&gt;, &lt;code&gt;--overlap_keyframes 8&lt;/code&gt;, sky-mask caching, overlays, &lt;code&gt;--save_predictions&lt;/code&gt;) carry over unchanged from the indoor example — see the flag-by-flag table above.&lt;/p&gt; 
&lt;h3&gt;Worked Example — LingBot-World scenes&lt;/h3&gt; 
&lt;p&gt;Reconstruct videos generated by LingBot-World, our world model — the same pipeline works on generated footage out of the box.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Dataset:&lt;/strong&gt; Download the example videos (&lt;code&gt;lingbo_world_frames.mp4&lt;/code&gt;, &lt;code&gt;lingbo_world2_frames.mp4&lt;/code&gt;) from &lt;a href=&quot;https://huggingface.co/datasets/robbyant/lingbot-map-demo/tree/main&quot;&gt;robbyant/lingbot-map-demo&lt;/a&gt; on Hugging Face.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;    python demo_render/batch_demo.py \
    --video_path /data/demo_videos/lingbo_world_frames.mp4 \
    --output_folder /data/outputs/lingbo_world/ \
    --model_path /path/to/lingbot-map.pt \
    --config demo_render/config/outdoor_drive.yaml \
    --mode windowed --window_size 128 \
    --max_non_keyframe_gap 100 --overlap_keyframes 8 \
    --image_stride 1 \
    --sky_mask_dir /data/outputs/sky_masks \
    --sky_mask_visualization_dir /data/outputs/sky_mask_viz \
    --camera_vis default --keyframes_only_points \
    --frame_tag --frame_tag_position top_right \
    --save_predictions
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;For the second clip, run the same command with &lt;code&gt;--video_path /data/demo_videos/lingbo_world2_frames.mp4 --output_folder /data/outputs/lingbo_world2/&lt;/code&gt; (and separate &lt;code&gt;--sky_mask_dir&lt;/code&gt; / &lt;code&gt;--sky_mask_visualization_dir&lt;/code&gt; folders if you want to keep the cached masks apart).&lt;/p&gt; 
&lt;p&gt;All flags are identical to the &lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/#worked-example--outdoor-drive-scene&quot;&gt;outdoor drive scene&lt;/a&gt; above — only the input video and output folder change. See the drive scene and indoor walkthrough tables for the flag-by-flag rationale.&lt;/p&gt; 
&lt;img width=&quot;3736&quot; height=&quot;1080&quot; alt=&quot;image&quot; src=&quot;https://github.com/user-attachments/assets/1f60d505-1407-482c-9b5d-57c7145c0b7d&quot; /&gt; 
&lt;img width=&quot;1200&quot; height=&quot;339&quot; alt=&quot;image&quot; src=&quot;https://github.com/user-attachments/assets/e62bedaa-1e61-40b3-8fea-01c8a15355f0&quot; /&gt; 
&lt;h3&gt;Camera Path (YAML)&lt;/h3&gt; 
&lt;p&gt;The virtual camera path is described by the &lt;code&gt;camera.segments&lt;/code&gt; list in the YAML preset passed via &lt;code&gt;--config&lt;/code&gt;. Edit the YAML to design your own shot — no need to touch CLI flags.&lt;/p&gt; 
&lt;p&gt;Built-in presets live in &lt;code&gt;demo_render/config/&lt;/code&gt;: &lt;code&gt;default.yaml&lt;/code&gt;, &lt;code&gt;indoor.yaml&lt;/code&gt;, &lt;code&gt;outdoor_drive.yaml&lt;/code&gt;. Copy one and edit the &lt;code&gt;camera:&lt;/code&gt; block.&lt;/p&gt; 
&lt;h4&gt;YAML structure&lt;/h4&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;camera:
  fov: 60.0          # camera field of view in degrees
  transition: 30     # frames blended between adjacent segments
  segments:
    - mode: follow            # chase cam following the input trajectory
      frames: [0, 1500]       # rendered-frame range this segment covers (-1 = end)
      back_offset: 0.3        # how far behind the input camera (fraction of scene scale)
      up_offset: 0.08         # vertical lift above the input camera
      look_offset: 0.4        # how far ahead the lookat target points
      smooth_window: 30       # trajectory smoothing window in frames
    - mode: birdeye           # rise up for a top-down reveal of the whole scene
      frames: [1500, 1800]
      reveal_height_mult: 2.5 # birdeye height = scene scale × this factor
    - mode: follow            # drop back into chase cam
      frames: [1800, -1]
      back_offset: 0.3
      up_offset: 0.08
      look_offset: 0.4
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;transition&lt;/code&gt; controls how many frames are blended between adjacent segments; &lt;code&gt;frames: [0, -1]&lt;/code&gt; means &quot;the whole sequence&quot;.&lt;/p&gt; 
&lt;h4&gt;Available modes&lt;/h4&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;&lt;code&gt;mode&lt;/code&gt;&lt;/th&gt; 
   &lt;th&gt;Behavior&lt;/th&gt; 
   &lt;th&gt;Tunable fields&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;follow&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Chase cam tracks the input trajectory with smooth offsets. The most cinematic option for walkthroughs.&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;back_offset&lt;/code&gt;, &lt;code&gt;up_offset&lt;/code&gt;, &lt;code&gt;look_offset&lt;/code&gt;, &lt;code&gt;smooth_window&lt;/code&gt;, &lt;code&gt;scale_frames&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;birdeye&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Top-down reveal of the whole scene. Useful for hero / overview shots.&lt;/td&gt; 
   &lt;td&gt;&lt;code&gt;reveal_height_mult&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;static&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Fixed eye + lookat, auto-derived from the segment&#39;s start frame.&lt;/td&gt; 
   &lt;td&gt;—&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;pivot&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Fixed eye, lookat sweeps along the trajectory.&lt;/td&gt; 
   &lt;td&gt;—&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h4&gt;Single-shot YAML examples&lt;/h4&gt; 
&lt;p&gt;&lt;strong&gt;Pure follow&lt;/strong&gt; (most common):&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;camera:
  fov: 60.0
  segments:
    - mode: follow
      frames: [0, -1]
      back_offset: 0.3
      up_offset: 0.08
      look_offset: 0.4
      smooth_window: 30
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;Full birdeye&lt;/strong&gt; (good for overview / hero shots):&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;camera:
  fov: 60.0
  segments:
    - mode: birdeye
      frames: [0, -1]
      reveal_height_mult: 2.5
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;Follow with birdeye inserts&lt;/strong&gt;: just list multiple segments in order under &lt;code&gt;segments:&lt;/code&gt; — adjacent segments are interpolated using &lt;code&gt;transition&lt;/code&gt; frames.&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;Caveat: when &lt;code&gt;--config&lt;/code&gt; loads a YAML preset, passing &lt;strong&gt;any&lt;/strong&gt; segment-shaping CLI flag (&lt;code&gt;--camera_mode&lt;/code&gt;, &lt;code&gt;--back_offset&lt;/code&gt;, &lt;code&gt;--up_offset&lt;/code&gt;, &lt;code&gt;--look_offset&lt;/code&gt;, &lt;code&gt;--smooth_window&lt;/code&gt;, &lt;code&gt;--follow_scale_frames&lt;/code&gt;, &lt;code&gt;--birdeye_start&lt;/code&gt;, &lt;code&gt;--birdeye_duration&lt;/code&gt;, &lt;code&gt;--reveal_height_mult&lt;/code&gt;) discards the YAML&#39;s &lt;code&gt;segments&lt;/code&gt; and rebuilds the camera path from those flags instead. To stay fully YAML-driven, don&#39;t pass any of them on the command line.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h3&gt;Output files&lt;/h3&gt; 
&lt;p&gt;For a given output name (e.g. &lt;code&gt;&amp;lt;scene&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;video_name&amp;gt;&lt;/code&gt;):&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;File&lt;/th&gt; 
   &lt;th&gt;Description&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;&amp;lt;name&amp;gt;_pointcloud.mp4&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Rendered point-cloud flythrough&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;&amp;lt;name&amp;gt;_pointcloud_rgb.mp4&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Original RGB frames encoded as video&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;&amp;lt;name&amp;gt;_pointcloud_config.yaml&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Full config snapshot of this run&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;batch_results.json&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Per-scene success / duration summary&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h2&gt;📜 License&lt;/h2&gt; 
&lt;p&gt;This project is released under the Apache License 2.0. See &lt;a href=&quot;https://raw.githubusercontent.com/Robbyant/lingbot-map/main/LICENSE.txt&quot;&gt;LICENSE&lt;/a&gt; file for details.&lt;/p&gt; 
&lt;h2&gt;📖 Citation&lt;/h2&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bibtex&quot;&gt;@article{chen2026geometric,
  title={Geometric Context Transformer for Streaming 3D Reconstruction},
  author={Chen, Lin-Zhuo and Gao, Jian and Chen, Yihang and Cheng, Ka Leong and Sun, Yipengjing and Hu, Liangxiao and Xue, Nan and Zhu, Xing and Shen, Yujun and Yao, Yao and Xu, Yinghao},
  journal={arXiv preprint arXiv:2604.14141},
  year={2026}
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;✨ Acknowledgments&lt;/h2&gt; 
&lt;p&gt;We thank Shangzhan Zhang, Jianyuan Wang, Yudong Jin, Christian Rupprecht, and Xun Cao for their helpful discussions and support.&lt;/p&gt; 
&lt;p&gt;This work builds upon several excellent open-source projects:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/facebookresearch/vggt&quot;&gt;VGGT&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/facebookresearch/dinov2&quot;&gt;DINOv2&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/flashinfer-ai/flashinfer&quot;&gt;Flashinfer&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;hr /&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/ac0d5a8c4e17da9b9094a17c28e77ec81cc73efce758f496bd8ffc89867cabbe/Robbyant/lingbot-map" medium="image" />
      
    </item>
    
    <item>
      <title>unclecode/crawl4ai</title>
      <link>https://github.com/unclecode/crawl4ai</link>
      <description>&lt;p&gt;🚀🤖 Crawl4AI: Open-source LLM Friendly Web Crawler &amp; Scraper. Don&#39;t be shy, join here: https://discord.gg/jP8KfhDhyN&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;🚀🤖 Crawl4AI: Open-source LLM Friendly Web Crawler &amp;amp; Scraper.&lt;/h1&gt; 
&lt;div align=&quot;center&quot;&gt; 
 &lt;p&gt;&lt;a href=&quot;https://trendshift.io/repositories/11716&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://trendshift.io/api/badge/repositories/11716&quot; alt=&quot;unclecode%2Fcrawl4ai | Trendshift&quot; style=&quot;width: 250px; height: 55px;&quot; width=&quot;250&quot; height=&quot;55&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;a href=&quot;https://github.com/unclecode/crawl4ai/stargazers&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/unclecode/crawl4ai?style=social&quot; alt=&quot;GitHub Stars&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/unclecode/crawl4ai/network/members&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/forks/unclecode/crawl4ai?style=social&quot; alt=&quot;GitHub Forks&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;a href=&quot;https://badge.fury.io/py/crawl4ai&quot;&gt;&lt;img src=&quot;https://badge.fury.io/py/crawl4ai.svg?sanitize=true&quot; alt=&quot;PyPI version&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://pypi.org/project/crawl4ai/&quot;&gt;&lt;img src=&quot;https://img.shields.io/pypi/pyversions/crawl4ai&quot; alt=&quot;Python Version&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://pepy.tech/project/crawl4ai&quot;&gt;&lt;img src=&quot;https://static.pepy.tech/badge/crawl4ai/month&quot; alt=&quot;Downloads&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/sponsors/unclecode&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/sponsors/unclecode?style=flat&amp;amp;logo=GitHub-Sponsors&amp;amp;label=Sponsors&amp;amp;color=pink&quot; alt=&quot;GitHub Sponsors&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
 &lt;hr /&gt; 
 &lt;h4&gt;🚀 Crawl4AI Cloud API — Closed Beta (Launching Soon)&lt;/h4&gt; 
 &lt;p&gt;Reliable, large-scale web extraction, now built to be &lt;em&gt;&lt;strong&gt;drastically more cost-effective&lt;/strong&gt;&lt;/em&gt; than any of the existing solutions.&lt;/p&gt; 
 &lt;p&gt;👉 &lt;strong&gt;Apply &lt;a href=&quot;https://forms.gle/E9MyPaNXACnAMaqG7&quot;&gt;here&lt;/a&gt; for early access&lt;/strong&gt;&lt;br /&gt; &lt;em&gt;We’ll be onboarding in phases and working closely with early users. Limited slots.&lt;/em&gt;&lt;/p&gt; 
 &lt;hr /&gt; 
 &lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://x.com/crawl4ai&quot;&gt; &lt;img src=&quot;https://img.shields.io/badge/Follow%20on%20X-000000?style=for-the-badge&amp;amp;logo=x&amp;amp;logoColor=white&quot; alt=&quot;Follow on X&quot; /&gt; &lt;/a&gt; &lt;a href=&quot;https://www.linkedin.com/company/crawl4ai&quot;&gt; &lt;img src=&quot;https://img.shields.io/badge/Follow%20on%20LinkedIn-0077B5?style=for-the-badge&amp;amp;logo=linkedin&amp;amp;logoColor=white&quot; alt=&quot;Follow on LinkedIn&quot; /&gt; &lt;/a&gt; &lt;a href=&quot;https://discord.gg/jP8KfhDhyN&quot;&gt; &lt;img src=&quot;https://img.shields.io/badge/Join%20our%20Discord-5865F2?style=for-the-badge&amp;amp;logo=discord&amp;amp;logoColor=white&quot; alt=&quot;Join our Discord&quot; /&gt; &lt;/a&gt; &lt;/p&gt; 
&lt;/div&gt; 
&lt;p&gt;Crawl4AI turns the web into clean, LLM ready Markdown for RAG, agents, and data pipelines. Fast, controllable, battle tested by a 50k+ star community.&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/unclecode/crawl4ai/main/#-recent-updates&quot;&gt;✨ Check out latest update v0.9.2&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;✨ &lt;strong&gt;New in v0.9.2&lt;/strong&gt;: Maintenance patch release. Fixes a &lt;code&gt;MemoryAdaptiveDispatcher&lt;/code&gt; task/page leak when a streaming crawl is closed, Docker Playground &quot;Advanced Config&quot; and Monitor WebSocket auth, Playwright headless-shell packaging, and GPU (&lt;code&gt;ENABLE_GPU=true&lt;/code&gt;) Docker builds. &lt;a href=&quot;https://github.com/unclecode/crawl4ai/raw/main/docs/blog/release-v0.9.2.md&quot;&gt;Release notes →&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;✨ Recent v0.9.0: Major secure-by-default release of the Docker API server. Auth is on by default, the server binds loopback unless given a token, and the request body is now an untrusted trust boundary. &lt;a href=&quot;https://github.com/unclecode/crawl4ai/raw/main/docs/blog/release-v0.9.0.md&quot;&gt;Release notes →&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;✨ Recent v0.8.7: Security-hardening release. Fixes critical Docker API vulnerabilities (RCE, SSRF, auth bypass, file write, XSS, hardcoded JWT secret), adds DomainMapper, and ships scraping, deep-crawl, and LLM fixes. &lt;a href=&quot;https://github.com/unclecode/crawl4ai/raw/main/docs/blog/release-v0.8.7.md&quot;&gt;Release notes →&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;✨ Previous v0.8.0: Crash Recovery &amp;amp; Prefetch Mode! Deep crawl crash recovery with &lt;code&gt;resume_state&lt;/code&gt; and &lt;code&gt;on_state_change&lt;/code&gt; callbacks for long-running crawls. New &lt;code&gt;prefetch=True&lt;/code&gt; mode for 5-10x faster URL discovery. &lt;a href=&quot;https://github.com/unclecode/crawl4ai/raw/main/docs/blog/release-v0.8.0.md&quot;&gt;Release notes →&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;✨ Previous v0.7.8: Stability &amp;amp; Bug Fix Release! 11 bug fixes addressing Docker API issues, LLM extraction improvements, URL handling fixes, and dependency updates. &lt;a href=&quot;https://github.com/unclecode/crawl4ai/raw/main/docs/blog/release-v0.7.8.md&quot;&gt;Release notes →&lt;/a&gt;&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;🤓 &lt;strong&gt;My Personal Story&lt;/strong&gt;&lt;/summary&gt; 
 &lt;p&gt;I grew up on an Amstrad, thanks to my dad, and never stopped building. In grad school I specialized in NLP and built crawlers for research. That’s where I learned how much extraction matters.&lt;/p&gt; 
 &lt;p&gt;In 2023, I needed web-to-Markdown. The “open source” option wanted an account, API token, and $16, and still under-delivered. I went turbo anger mode, built Crawl4AI in days, and it went viral. Now it’s the most-starred crawler on GitHub.&lt;/p&gt; 
 &lt;p&gt;I made it open source for &lt;strong&gt;availability&lt;/strong&gt;, anyone can use it without a gate. Now I’m building the platform for &lt;strong&gt;affordability&lt;/strong&gt;, anyone can run serious crawls without breaking the bank. If that resonates, join in, send feedback, or just crawl something amazing.&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;Why developers pick Crawl4AI&lt;/summary&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;strong&gt;LLM ready output&lt;/strong&gt;, smart Markdown with headings, tables, code, citation hints&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Fast in practice&lt;/strong&gt;, async browser pool, caching, minimal hops&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Full control&lt;/strong&gt;, sessions, proxies, cookies, user scripts, hooks&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Adaptive intelligence&lt;/strong&gt;, learns site patterns, explores only what matters&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Deploy anywhere&lt;/strong&gt;, zero keys, CLI and Docker, cloud friendly&lt;/li&gt; 
 &lt;/ul&gt; 
&lt;/details&gt; 
&lt;h2&gt;🚀 Quick Start&lt;/h2&gt; 
&lt;ol&gt; 
 &lt;li&gt;Install Crawl4AI:&lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Install the package
pip install -U crawl4ai

# For pre release versions
pip install crawl4ai --pre

# Run post-installation setup
crawl4ai-setup

# Verify your installation
crawl4ai-doctor
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;If you encounter any browser-related issues, you can install them manually:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;python -m playwright install --with-deps chromium
&lt;/code&gt;&lt;/pre&gt; 
&lt;ol start=&quot;2&quot;&gt; 
 &lt;li&gt;Run a simple web crawl with Python:&lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import asyncio
from crawl4ai import *

async def main():
    async with AsyncWebCrawler() as crawler:
        result = await crawler.arun(
            url=&quot;https://www.nbcnews.com/business&quot;,
        )
        print(result.markdown)

if __name__ == &quot;__main__&quot;:
    asyncio.run(main())
&lt;/code&gt;&lt;/pre&gt; 
&lt;ol start=&quot;3&quot;&gt; 
 &lt;li&gt;Or use the new command-line interface:&lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Basic crawl with markdown output
crwl https://www.nbcnews.com/business -o markdown

# Deep crawl with BFS strategy, max 10 pages
crwl https://docs.crawl4ai.com --deep-crawl bfs --max-pages 10

# Use LLM extraction with a specific question
crwl https://www.example.com/products -q &quot;Extract all product prices&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;💖 Support Crawl4AI&lt;/h2&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;🎉 &lt;strong&gt;Sponsorship Program Now Open!&lt;/strong&gt; After powering 51K+ developers and 1 year of growth, Crawl4AI is launching dedicated support for &lt;strong&gt;startups&lt;/strong&gt; and &lt;strong&gt;enterprises&lt;/strong&gt;. Be among the first 50 &lt;strong&gt;Founding Sponsors&lt;/strong&gt; for permanent recognition in our Hall of Fame.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;Crawl4AI is the #1 trending open-source web crawler on GitHub. Your support keeps it independent, innovative, and free for the community — while giving you direct access to premium benefits.&lt;/p&gt; 
&lt;div align=&quot;&quot;&gt; 
 &lt;p&gt;&lt;a href=&quot;https://github.com/sponsors/unclecode&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Become%20a%20Sponsor-pink?style=for-the-badge&amp;amp;logo=github-sponsors&amp;amp;logoColor=white&quot; alt=&quot;Become a Sponsor&quot; /&gt;&lt;/a&gt;&lt;br /&gt; &lt;a href=&quot;https://github.com/sponsors/unclecode&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/sponsors/unclecode?style=for-the-badge&amp;amp;logo=github&amp;amp;label=Current%20Sponsors&amp;amp;color=green&quot; alt=&quot;Current Sponsors&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;/div&gt; 
&lt;h3&gt;🤝 Sponsorship Tiers&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;🌱 Believer ($5/mo)&lt;/strong&gt; — Join the movement for data democratization&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;🚀 Builder ($50/mo)&lt;/strong&gt; — Priority support &amp;amp; early access to features&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;💼 Growing Team ($500/mo)&lt;/strong&gt; — Bi-weekly syncs &amp;amp; optimization help&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;🏢 Data Infrastructure Partner ($2000/mo)&lt;/strong&gt; — Full partnership with dedicated support&lt;br /&gt; &lt;em&gt;Custom arrangements available - see &lt;a href=&quot;https://raw.githubusercontent.com/unclecode/crawl4ai/main/SPONSORS.md&quot;&gt;SPONSORS.md&lt;/a&gt; for details &amp;amp; contact&lt;/em&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong&gt;Why sponsor?&lt;/strong&gt;&lt;br /&gt; No rate-limited APIs. No lock-in. Build and own your data pipeline with direct guidance from the creator of Crawl4AI.&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/sponsors/unclecode&quot;&gt;See All Tiers &amp;amp; Benefits →&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;✨ Features&lt;/h2&gt; 
&lt;details&gt; 
 &lt;summary&gt;📝 &lt;strong&gt;Markdown Generation&lt;/strong&gt;&lt;/summary&gt; 
 &lt;ul&gt; 
  &lt;li&gt;🧹 &lt;strong&gt;Clean Markdown&lt;/strong&gt;: Generates clean, structured Markdown with accurate formatting.&lt;/li&gt; 
  &lt;li&gt;🎯 &lt;strong&gt;Fit Markdown&lt;/strong&gt;: Heuristic-based filtering to remove noise and irrelevant parts for AI-friendly processing.&lt;/li&gt; 
  &lt;li&gt;🔗 &lt;strong&gt;Citations and References&lt;/strong&gt;: Converts page links into a numbered reference list with clean citations.&lt;/li&gt; 
  &lt;li&gt;🛠️ &lt;strong&gt;Custom Strategies&lt;/strong&gt;: Users can create their own Markdown generation strategies tailored to specific needs.&lt;/li&gt; 
  &lt;li&gt;📚 &lt;strong&gt;BM25 Algorithm&lt;/strong&gt;: Employs BM25-based filtering for extracting core information and removing irrelevant content.&lt;/li&gt; 
 &lt;/ul&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;📊 &lt;strong&gt;Structured Data Extraction&lt;/strong&gt;&lt;/summary&gt; 
 &lt;ul&gt; 
  &lt;li&gt;🤖 &lt;strong&gt;LLM-Driven Extraction&lt;/strong&gt;: Supports all LLMs (open-source and proprietary) for structured data extraction.&lt;/li&gt; 
  &lt;li&gt;🧱 &lt;strong&gt;Chunking Strategies&lt;/strong&gt;: Implements chunking (topic-based, regex, sentence-level) for targeted content processing.&lt;/li&gt; 
  &lt;li&gt;🌌 &lt;strong&gt;Cosine Similarity&lt;/strong&gt;: Find relevant content chunks based on user queries for semantic extraction.&lt;/li&gt; 
  &lt;li&gt;🔎 &lt;strong&gt;CSS-Based Extraction&lt;/strong&gt;: Fast schema-based data extraction using XPath and CSS selectors.&lt;/li&gt; 
  &lt;li&gt;🔧 &lt;strong&gt;Schema Definition&lt;/strong&gt;: Define custom schemas for extracting structured JSON from repetitive patterns.&lt;/li&gt; 
 &lt;/ul&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;🌐 &lt;strong&gt;Browser Integration&lt;/strong&gt;&lt;/summary&gt; 
 &lt;ul&gt; 
  &lt;li&gt;🖥️ &lt;strong&gt;Managed Browser&lt;/strong&gt;: Use user-owned browsers with full control, avoiding bot detection.&lt;/li&gt; 
  &lt;li&gt;🔄 &lt;strong&gt;Remote Browser Control&lt;/strong&gt;: Connect to Chrome Developer Tools Protocol for remote, large-scale data extraction.&lt;/li&gt; 
  &lt;li&gt;👤 &lt;strong&gt;Browser Profiler&lt;/strong&gt;: Create and manage persistent profiles with saved authentication states, cookies, and settings.&lt;/li&gt; 
  &lt;li&gt;🔒 &lt;strong&gt;Session Management&lt;/strong&gt;: Preserve browser states and reuse them for multi-step crawling.&lt;/li&gt; 
  &lt;li&gt;🧩 &lt;strong&gt;Proxy Support&lt;/strong&gt;: Seamlessly connect to proxies with authentication for secure access.&lt;/li&gt; 
  &lt;li&gt;⚙️ &lt;strong&gt;Full Browser Control&lt;/strong&gt;: Modify headers, cookies, user agents, and more for tailored crawling setups.&lt;/li&gt; 
  &lt;li&gt;🌍 &lt;strong&gt;Multi-Browser Support&lt;/strong&gt;: Compatible with Chromium, Firefox, and WebKit.&lt;/li&gt; 
  &lt;li&gt;📐 &lt;strong&gt;Dynamic Viewport Adjustment&lt;/strong&gt;: Automatically adjusts the browser viewport to match page content, ensuring complete rendering and capturing of all elements.&lt;/li&gt; 
 &lt;/ul&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;🔎 &lt;strong&gt;Crawling &amp;amp; Scraping&lt;/strong&gt;&lt;/summary&gt; 
 &lt;ul&gt; 
  &lt;li&gt;🖼️ &lt;strong&gt;Media Support&lt;/strong&gt;: Extract images, audio, videos, and responsive image formats like &lt;code&gt;srcset&lt;/code&gt; and &lt;code&gt;picture&lt;/code&gt;.&lt;/li&gt; 
  &lt;li&gt;🚀 &lt;strong&gt;Dynamic Crawling&lt;/strong&gt;: Execute JS and wait for async or sync for dynamic content extraction.&lt;/li&gt; 
  &lt;li&gt;📸 &lt;strong&gt;Screenshots&lt;/strong&gt;: Capture page screenshots during crawling for debugging or analysis.&lt;/li&gt; 
  &lt;li&gt;📂 &lt;strong&gt;Raw Data Crawling&lt;/strong&gt;: Directly process raw HTML (&lt;code&gt;raw:&lt;/code&gt;) or local files (&lt;code&gt;file://&lt;/code&gt;).&lt;/li&gt; 
  &lt;li&gt;🔗 &lt;strong&gt;Comprehensive Link Extraction&lt;/strong&gt;: Extracts internal, external links, and embedded iframe content.&lt;/li&gt; 
  &lt;li&gt;🛠️ &lt;strong&gt;Customizable Hooks&lt;/strong&gt;: Define hooks at every step to customize crawling behavior (supports both string and function-based APIs).&lt;/li&gt; 
  &lt;li&gt;💾 &lt;strong&gt;Caching&lt;/strong&gt;: Cache data for improved speed and to avoid redundant fetches.&lt;/li&gt; 
  &lt;li&gt;📄 &lt;strong&gt;Metadata Extraction&lt;/strong&gt;: Retrieve structured metadata from web pages.&lt;/li&gt; 
  &lt;li&gt;📡 &lt;strong&gt;IFrame Content Extraction&lt;/strong&gt;: Seamless extraction from embedded iframe content.&lt;/li&gt; 
  &lt;li&gt;🕵️ &lt;strong&gt;Lazy Load Handling&lt;/strong&gt;: Waits for images to fully load, ensuring no content is missed due to lazy loading.&lt;/li&gt; 
  &lt;li&gt;🔄 &lt;strong&gt;Full-Page Scanning&lt;/strong&gt;: Simulates scrolling to load and capture all dynamic content, perfect for infinite scroll pages.&lt;/li&gt; 
 &lt;/ul&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;🚀 &lt;strong&gt;Deployment&lt;/strong&gt;&lt;/summary&gt; 
 &lt;ul&gt; 
  &lt;li&gt;🐳 &lt;strong&gt;Dockerized Setup&lt;/strong&gt;: Optimized Docker image with FastAPI server for easy deployment.&lt;/li&gt; 
  &lt;li&gt;🔑 &lt;strong&gt;Secure Authentication&lt;/strong&gt;: Built-in JWT token authentication for API security.&lt;/li&gt; 
  &lt;li&gt;🔄 &lt;strong&gt;API Gateway&lt;/strong&gt;: One-click deployment with secure token authentication for API-based workflows.&lt;/li&gt; 
  &lt;li&gt;🌐 &lt;strong&gt;Scalable Architecture&lt;/strong&gt;: Designed for mass-scale production and optimized server performance.&lt;/li&gt; 
  &lt;li&gt;☁️ &lt;strong&gt;Cloud Deployment&lt;/strong&gt;: Ready-to-deploy configurations for major cloud platforms.&lt;/li&gt; 
 &lt;/ul&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;🎯 &lt;strong&gt;Additional Features&lt;/strong&gt;&lt;/summary&gt; 
 &lt;ul&gt; 
  &lt;li&gt;🕶️ &lt;strong&gt;Stealth Mode&lt;/strong&gt;: Avoid bot detection by mimicking real users.&lt;/li&gt; 
  &lt;li&gt;🏷️ &lt;strong&gt;Tag-Based Content Extraction&lt;/strong&gt;: Refine crawling based on custom tags, headers, or metadata.&lt;/li&gt; 
  &lt;li&gt;🔗 &lt;strong&gt;Link Analysis&lt;/strong&gt;: Extract and analyze all links for detailed data exploration.&lt;/li&gt; 
  &lt;li&gt;🛡️ &lt;strong&gt;Error Handling&lt;/strong&gt;: Robust error management for seamless execution.&lt;/li&gt; 
  &lt;li&gt;🔐 &lt;strong&gt;CORS &amp;amp; Static Serving&lt;/strong&gt;: Supports filesystem-based caching and cross-origin requests.&lt;/li&gt; 
  &lt;li&gt;📖 &lt;strong&gt;Clear Documentation&lt;/strong&gt;: Simplified and updated guides for onboarding and advanced usage.&lt;/li&gt; 
  &lt;li&gt;🙌 &lt;strong&gt;Community Recognition&lt;/strong&gt;: Acknowledges contributors and pull requests for transparency.&lt;/li&gt; 
 &lt;/ul&gt; 
&lt;/details&gt; 
&lt;h2&gt;Try it Now!&lt;/h2&gt; 
&lt;p&gt;✨ Play around with this &lt;a href=&quot;https://colab.research.google.com/drive/1SgRPrByQLzjRfwoRNq1wSGE9nYY_EE8C?usp=sharing&quot;&gt;&lt;img src=&quot;https://colab.research.google.com/assets/colab-badge.svg?sanitize=true&quot; alt=&quot;Open In Colab&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;✨ Visit our &lt;a href=&quot;https://docs.crawl4ai.com/&quot;&gt;Documentation Website&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;Installation 🛠️&lt;/h2&gt; 
&lt;p&gt;Crawl4AI offers flexible installation options to suit various use cases. You can install it as a Python package or use Docker.&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;🐍 &lt;strong&gt;Using pip&lt;/strong&gt;&lt;/summary&gt; 
 &lt;p&gt;Choose the installation option that best fits your needs:&lt;/p&gt; 
 &lt;h3&gt;Basic Installation&lt;/h3&gt; 
 &lt;p&gt;For basic web crawling and scraping tasks:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install crawl4ai
crawl4ai-setup # Setup the browser
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;By default, this will install the asynchronous version of Crawl4AI, using Playwright for web crawling.&lt;/p&gt; 
 &lt;p&gt;👉 &lt;strong&gt;Note&lt;/strong&gt;: When you install Crawl4AI, the &lt;code&gt;crawl4ai-setup&lt;/code&gt; should automatically install and set up Playwright. However, if you encounter any Playwright-related errors, you can manually install it using one of these methods:&lt;/p&gt; 
 &lt;ol&gt; 
  &lt;li&gt; &lt;p&gt;Through the command line:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;playwright install
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;If the above doesn&#39;t work, try this more specific command:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;python -m playwright install chromium
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;/ol&gt; 
 &lt;p&gt;This second method has proven to be more reliable in some cases.&lt;/p&gt; 
 &lt;hr /&gt; 
 &lt;h3&gt;Installation with Synchronous Version&lt;/h3&gt; 
 &lt;p&gt;The sync version is deprecated and will be removed in future versions. If you need the synchronous version using Selenium:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install crawl4ai[sync]
&lt;/code&gt;&lt;/pre&gt; 
 &lt;hr /&gt; 
 &lt;h3&gt;Development Installation&lt;/h3&gt; 
 &lt;p&gt;For contributors who plan to modify the source code:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/unclecode/crawl4ai.git
cd crawl4ai
pip install -e .                    # Basic installation in editable mode
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;Install optional features:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install -e &quot;.[torch]&quot;           # With PyTorch features
pip install -e &quot;.[transformer]&quot;     # With Transformer features
pip install -e &quot;.[cosine]&quot;          # With cosine similarity features
pip install -e &quot;.[sync]&quot;            # With synchronous crawling (Selenium)
pip install -e &quot;.[all]&quot;             # Install all optional features
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;🐳 &lt;strong&gt;Docker Deployment&lt;/strong&gt;&lt;/summary&gt; 
 &lt;blockquote&gt; 
  &lt;p&gt;🚀 &lt;strong&gt;Now Available!&lt;/strong&gt; Our completely redesigned Docker implementation is here! This new solution makes deployment more efficient and seamless than ever.&lt;/p&gt; 
 &lt;/blockquote&gt; 
 &lt;h3&gt;New Docker Features&lt;/h3&gt; 
 &lt;p&gt;The new Docker implementation includes:&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;strong&gt;Real-time Monitoring Dashboard&lt;/strong&gt; with live system metrics and browser pool visibility&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Browser pooling&lt;/strong&gt; with page pre-warming for faster response times&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Interactive playground&lt;/strong&gt; to test and generate request code&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;MCP integration&lt;/strong&gt; for direct connection to AI tools like Claude Code&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Comprehensive API endpoints&lt;/strong&gt; including HTML extraction, screenshots, PDF generation, and JavaScript execution&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Multi-architecture support&lt;/strong&gt; with automatic detection (AMD64/ARM64)&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Optimized resources&lt;/strong&gt; with improved memory management&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;h3&gt;Getting Started&lt;/h3&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Pull and run the latest release
docker pull unclecode/crawl4ai:latest
docker run -d -p 11235:11235 --name crawl4ai --shm-size=1g unclecode/crawl4ai:latest

# Visit the monitoring dashboard at http://localhost:11235/dashboard
# Or the playground at http://localhost:11235/playground
&lt;/code&gt;&lt;/pre&gt; 
 &lt;h3&gt;Quick Test&lt;/h3&gt; 
 &lt;p&gt;Run a quick test (works for both Docker options):&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import requests

# Submit a crawl job
response = requests.post(
    &quot;http://localhost:11235/crawl&quot;,
    json={&quot;urls&quot;: [&quot;https://example.com&quot;], &quot;priority&quot;: 10}
)
if response.status_code == 200:
    print(&quot;Crawl job submitted successfully.&quot;)
    
if &quot;results&quot; in response.json():
    results = response.json()[&quot;results&quot;]
    print(&quot;Crawl job completed. Results:&quot;)
    for result in results:
        print(result)
else:
    task_id = response.json()[&quot;task_id&quot;]
    print(f&quot;Crawl job submitted. Task ID:: {task_id}&quot;)
    result = requests.get(f&quot;http://localhost:11235/task/{task_id}&quot;)
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;For more examples, see our &lt;a href=&quot;https://github.com/unclecode/crawl4ai/raw/main/docs/examples/docker_example.py&quot;&gt;Docker Examples&lt;/a&gt;. For advanced configuration, monitoring features, and production deployment, see our &lt;a href=&quot;https://docs.crawl4ai.com/core/self-hosting/&quot;&gt;Self-Hosting Guide&lt;/a&gt;.&lt;/p&gt; 
&lt;/details&gt; 
&lt;hr /&gt; 
&lt;h2&gt;🔬 Advanced Usage Examples 🔬&lt;/h2&gt; 
&lt;p&gt;You can check the project structure in the directory &lt;a href=&quot;https://github.com/unclecode/crawl4ai/tree/main/docs/examples&quot;&gt;docs/examples&lt;/a&gt;. Over there, you can find a variety of examples; here, some popular examples are shared.&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;📝 &lt;strong&gt;Heuristic Markdown Generation with Clean and Fit Markdown&lt;/strong&gt;&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import asyncio
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode
from crawl4ai.content_filter_strategy import PruningContentFilter, BM25ContentFilter
from crawl4ai.markdown_generation_strategy import DefaultMarkdownGenerator

async def main():
    browser_config = BrowserConfig(
        headless=True,  
        verbose=True,
    )
    run_config = CrawlerRunConfig(
        cache_mode=CacheMode.ENABLED,
        markdown_generator=DefaultMarkdownGenerator(
            content_filter=PruningContentFilter(threshold=0.48, threshold_type=&quot;fixed&quot;, min_word_threshold=0)
        ),
        # markdown_generator=DefaultMarkdownGenerator(
        #     content_filter=BM25ContentFilter(user_query=&quot;WHEN_WE_FOCUS_BASED_ON_A_USER_QUERY&quot;, bm25_threshold=1.0)
        # ),
    )
    
    async with AsyncWebCrawler(config=browser_config) as crawler:
        result = await crawler.arun(
            url=&quot;https://docs.micronaut.io/4.9.9/guide/&quot;,
            config=run_config
        )
        print(len(result.markdown.raw_markdown))
        print(len(result.markdown.fit_markdown))

if __name__ == &quot;__main__&quot;:
    asyncio.run(main())
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;🖥️ &lt;strong&gt;Executing JavaScript &amp;amp; Extract Structured Data without LLMs&lt;/strong&gt;&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import asyncio
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode
from crawl4ai import JsonCssExtractionStrategy
import json

async def main():
    schema = {
    &quot;name&quot;: &quot;KidoCode Courses&quot;,
    &quot;baseSelector&quot;: &quot;section.charge-methodology .w-tab-content &amp;gt; div&quot;,
    &quot;fields&quot;: [
        {
            &quot;name&quot;: &quot;section_title&quot;,
            &quot;selector&quot;: &quot;h3.heading-50&quot;,
            &quot;type&quot;: &quot;text&quot;,
        },
        {
            &quot;name&quot;: &quot;section_description&quot;,
            &quot;selector&quot;: &quot;.charge-content&quot;,
            &quot;type&quot;: &quot;text&quot;,
        },
        {
            &quot;name&quot;: &quot;course_name&quot;,
            &quot;selector&quot;: &quot;.text-block-93&quot;,
            &quot;type&quot;: &quot;text&quot;,
        },
        {
            &quot;name&quot;: &quot;course_description&quot;,
            &quot;selector&quot;: &quot;.course-content-text&quot;,
            &quot;type&quot;: &quot;text&quot;,
        },
        {
            &quot;name&quot;: &quot;course_icon&quot;,
            &quot;selector&quot;: &quot;.image-92&quot;,
            &quot;type&quot;: &quot;attribute&quot;,
            &quot;attribute&quot;: &quot;src&quot;
        }
    ]
}

    extraction_strategy = JsonCssExtractionStrategy(schema, verbose=True)

    browser_config = BrowserConfig(
        headless=False,
        verbose=True
    )
    run_config = CrawlerRunConfig(
        extraction_strategy=extraction_strategy,
        js_code=[&quot;&quot;&quot;(async () =&amp;gt; {const tabs = document.querySelectorAll(&quot;section.charge-methodology .tabs-menu-3 &amp;gt; div&quot;);for(let tab of tabs) {tab.scrollIntoView();tab.click();await new Promise(r =&amp;gt; setTimeout(r, 500));}})();&quot;&quot;&quot;],
        cache_mode=CacheMode.BYPASS
    )
        
    async with AsyncWebCrawler(config=browser_config) as crawler:
        
        result = await crawler.arun(
            url=&quot;https://www.kidocode.com/degrees/technology&quot;,
            config=run_config
        )

        companies = json.loads(result.extracted_content)
        print(f&quot;Successfully extracted {len(companies)} companies&quot;)
        print(json.dumps(companies[0], indent=2))


if __name__ == &quot;__main__&quot;:
    asyncio.run(main())
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;📚 &lt;strong&gt;Extracting Structured Data with LLMs&lt;/strong&gt;&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import os
import asyncio
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode, LLMConfig
from crawl4ai import LLMExtractionStrategy
from pydantic import BaseModel, Field

class OpenAIModelFee(BaseModel):
    model_name: str = Field(..., description=&quot;Name of the OpenAI model.&quot;)
    input_fee: str = Field(..., description=&quot;Fee for input token for the OpenAI model.&quot;)
    output_fee: str = Field(..., description=&quot;Fee for output token for the OpenAI model.&quot;)

async def main():
    browser_config = BrowserConfig(verbose=True)
    run_config = CrawlerRunConfig(
        word_count_threshold=1,
        extraction_strategy=LLMExtractionStrategy(
            # Here you can use any provider that Litellm library supports, for instance: ollama/qwen2
            # provider=&quot;ollama/qwen2&quot;, api_token=&quot;no-token&quot;, 
            llm_config = LLMConfig(provider=&quot;openai/gpt-4o&quot;, api_token=os.getenv(&#39;OPENAI_API_KEY&#39;)), 
            schema=OpenAIModelFee.schema(),
            extraction_type=&quot;schema&quot;,
            instruction=&quot;&quot;&quot;From the crawled content, extract all mentioned model names along with their fees for input and output tokens. 
            Do not miss any models in the entire content. One extracted model JSON format should look like this: 
            {&quot;model_name&quot;: &quot;GPT-4&quot;, &quot;input_fee&quot;: &quot;US$10.00 / 1M tokens&quot;, &quot;output_fee&quot;: &quot;US$30.00 / 1M tokens&quot;}.&quot;&quot;&quot;
        ),            
        cache_mode=CacheMode.BYPASS,
    )
    
    async with AsyncWebCrawler(config=browser_config) as crawler:
        result = await crawler.arun(
            url=&#39;https://openai.com/api/pricing/&#39;,
            config=run_config
        )
        print(result.extracted_content)

if __name__ == &quot;__main__&quot;:
    asyncio.run(main())
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;🤖 &lt;strong&gt;Using Your own Browser with Custom User Profile&lt;/strong&gt;&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import os, sys
from pathlib import Path
import asyncio, time
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode

async def test_news_crawl():
    # Create a persistent user data directory
    user_data_dir = os.path.join(Path.home(), &quot;.crawl4ai&quot;, &quot;browser_profile&quot;)
    os.makedirs(user_data_dir, exist_ok=True)

    browser_config = BrowserConfig(
        verbose=True,
        headless=True,
        user_data_dir=user_data_dir,
        use_persistent_context=True,
    )
    run_config = CrawlerRunConfig(
        cache_mode=CacheMode.BYPASS
    )
    
    async with AsyncWebCrawler(config=browser_config) as crawler:
        url = &quot;ADDRESS_OF_A_CHALLENGING_WEBSITE&quot;
        
        result = await crawler.arun(
            url,
            config=run_config,
            magic=True,
        )
        
        print(f&quot;Successfully crawled {url}&quot;)
        print(f&quot;Content length: {len(result.markdown)}&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;hr /&gt; 
&lt;h2&gt;✨ Recent Updates&lt;/h2&gt; 
&lt;details open&gt; 
 &lt;summary&gt;&lt;strong&gt;Version 0.9.2 Release Highlights - Maintenance Bug Fixes&lt;/strong&gt;&lt;/summary&gt; 
 &lt;p&gt;A maintenance patch release with bug fixes across the dispatcher, Docker, and GPU builds. &lt;code&gt;MemoryAdaptiveDispatcher&lt;/code&gt; no longer leaks crawl tasks and browser pages when a streaming crawl is closed. Docker fixes cover the Playground &quot;Advanced Config&quot; 400, the Monitor WebSocket 500 under JWT auth, and Playwright headless-shell packaging. &lt;code&gt;ENABLE_GPU=true&lt;/code&gt; Docker builds no longer fail on the CUDA toolkit.&lt;/p&gt; 
 &lt;p&gt;No new features, no breaking changes.&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install -U crawl4ai
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;&lt;a href=&quot;https://github.com/unclecode/crawl4ai/raw/main/docs/blog/release-v0.9.2.md&quot;&gt;Full v0.9.2 Release Notes →&lt;/a&gt;&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;strong&gt;Version 0.9.1 Release Highlights - Bug Fixes &amp;amp; PruningContentFilter Whitelist&lt;/strong&gt;&lt;/summary&gt; 
 &lt;p&gt;A patch release with 12 bug fixes and one new feature. The new &lt;code&gt;preserve_classes&lt;/code&gt; / &lt;code&gt;preserve_tags&lt;/code&gt; parameters for &lt;code&gt;PruningContentFilter&lt;/code&gt; let you whitelist CSS classes or HTML tags that should never be pruned — useful for protecting short metadata elements like author names and timestamps.&lt;/p&gt; 
 &lt;p&gt;Bug fixes span Docker (auth gate UI, supervisord/redis dirs, FastAPI compatibility, redis auth), browser (Windows channel crash, context snapshot leak), core (HTTP timeout unit mismatch, best-first ordering), and extraction (html2text table attributes).&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install -U crawl4ai
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;&lt;a href=&quot;https://github.com/unclecode/crawl4ai/raw/main/docs/blog/release-v0.9.1.md&quot;&gt;Full v0.9.1 Release Notes →&lt;/a&gt;&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;strong&gt;Version 0.9.0 Release Highlights - Secure-by-Default Docker Server&lt;/strong&gt;&lt;/summary&gt; 
 &lt;p&gt;A major, secure-by-default release of the Docker API server. The out-of-the-box deployment is hardened with defense in depth: authentication is on by default, the server binds loopback unless you give it a token, and the network request body is treated as an untrusted trust boundary.&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install -U crawl4ai
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;&lt;a href=&quot;https://github.com/unclecode/crawl4ai/raw/main/deploy/docker/MIGRATION.md&quot;&gt;Migration Guide →&lt;/a&gt; · &lt;a href=&quot;https://github.com/unclecode/crawl4ai/raw/main/docs/blog/release-v0.9.0.md&quot;&gt;Full v0.9.0 Release Notes →&lt;/a&gt;&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;strong&gt;Version 0.8.7 Release Highlights - Security Hardening, DomainMapper &amp;amp; Community Fixes&lt;/strong&gt;&lt;/summary&gt; 
 &lt;p&gt;A security-hardening release. Fixes critical Docker API vulnerabilities (AST sandbox escape RCE, hook sandbox RCE, hardcoded JWT secret, SSRF on webhook and crawl endpoints, arbitrary file write, monitor auth bypass, stored XSS, and unauthenticated JS execution), adds the DomainMapper feature, and ships a batch of scraping, deep-crawl, and LLM fixes. If you self-host the Docker API, upgrade immediately.&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install -U crawl4ai
&lt;/code&gt;&lt;/pre&gt; 
 &lt;p&gt;&lt;a href=&quot;https://github.com/unclecode/crawl4ai/raw/main/docs/blog/release-v0.8.7.md&quot;&gt;Full v0.8.7 Release Notes →&lt;/a&gt;&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;strong&gt;Version 0.8.6 - Security Hotfix: litellm Supply Chain Fix&lt;/strong&gt;&lt;/summary&gt; 
 &lt;p&gt;Replaced &lt;code&gt;litellm&lt;/code&gt; dependency with &lt;code&gt;unclecode-litellm&lt;/code&gt; due to a PyPI supply chain compromise affecting the original package. If you&#39;re on v0.8.5 or earlier, upgrade immediately.&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install -U crawl4ai
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;strong&gt;Version 0.8.5 Release Highlights - Anti-Bot Detection, Shadow DOM &amp;amp; 60+ Bug Fixes&lt;/strong&gt;&lt;/summary&gt; 
 &lt;p&gt;Our biggest release since v0.8.0. Anti-bot detection with proxy escalation, Shadow DOM flattening, deep crawl cancellation, and over 60 bug fixes.&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🛡️ Anti-Bot Detection &amp;amp; Proxy Escalation&lt;/strong&gt;:&lt;/p&gt; 
   &lt;ul&gt; 
    &lt;li&gt;3-tier detection: known vendors, generic block indicators, structural integrity checks&lt;/li&gt; 
    &lt;li&gt;Automatic retry with proxy chain and fallback fetch function&lt;/li&gt; 
   &lt;/ul&gt; &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from crawl4ai import CrawlerRunConfig
from crawl4ai.async_configs import ProxyConfig

config = CrawlerRunConfig(
    proxy_config=[ProxyConfig.DIRECT, ProxyConfig(server=&quot;http://my-proxy:8080&quot;)],
    max_retries=2,
    fallback_fetch_function=my_web_unlocker,
)
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🌑 Shadow DOM Flattening&lt;/strong&gt;:&lt;/p&gt; 
   &lt;ul&gt; 
    &lt;li&gt;Extract content hidden inside shadow DOM components&lt;/li&gt; 
   &lt;/ul&gt; &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;config = CrawlerRunConfig(flatten_shadow_dom=True)
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🛑 Deep Crawl Cancellation&lt;/strong&gt;:&lt;/p&gt; 
   &lt;ul&gt; 
    &lt;li&gt;Stop long crawls gracefully with &lt;code&gt;cancel()&lt;/code&gt; or &lt;code&gt;should_cancel&lt;/code&gt; callback&lt;/li&gt; 
    &lt;li&gt;Works with BFS, DFS, and BestFirst strategies&lt;/li&gt; 
   &lt;/ul&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;⚙️ Config Defaults API&lt;/strong&gt;:&lt;/p&gt; 
   &lt;ul&gt; 
    &lt;li&gt;&lt;code&gt;set_defaults()&lt;/code&gt; / &lt;code&gt;get_defaults()&lt;/code&gt; / &lt;code&gt;reset_defaults()&lt;/code&gt; on BrowserConfig and CrawlerRunConfig&lt;/li&gt; 
   &lt;/ul&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🔒 Critical Security Fixes&lt;/strong&gt;:&lt;/p&gt; 
   &lt;ul&gt; 
    &lt;li&gt;RCE via deserialization in Docker &lt;code&gt;/crawl&lt;/code&gt; endpoint — removed &lt;code&gt;eval()&lt;/code&gt;, added allowlist&lt;/li&gt; 
    &lt;li&gt;Redis CVE-2025-49844 (CVSS 10.0) — upgraded to 7.2.7&lt;/li&gt; 
   &lt;/ul&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;60+ Bug Fixes&lt;/strong&gt; across browser management, proxy, deep crawling, extraction, CLI, and Docker&lt;/p&gt; &lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;&lt;a href=&quot;https://github.com/unclecode/crawl4ai/raw/main/docs/blog/release-v0.8.5.md&quot;&gt;Full v0.8.5 Release Notes →&lt;/a&gt;&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;strong&gt;Version 0.8.0 Release Highlights - Crash Recovery &amp;amp; Prefetch Mode&lt;/strong&gt;&lt;/summary&gt; 
 &lt;p&gt;This release introduces crash recovery for deep crawls, a new prefetch mode for fast URL discovery, and critical security fixes for Docker deployments.&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🔄 Deep Crawl Crash Recovery&lt;/strong&gt;:&lt;/p&gt; 
   &lt;ul&gt; 
    &lt;li&gt;&lt;code&gt;on_state_change&lt;/code&gt; callback fires after each URL for real-time state persistence&lt;/li&gt; 
    &lt;li&gt;&lt;code&gt;resume_state&lt;/code&gt; parameter to continue from a saved checkpoint&lt;/li&gt; 
    &lt;li&gt;JSON-serializable state for Redis/database storage&lt;/li&gt; 
    &lt;li&gt;Works with BFS, DFS, and Best-First strategies&lt;/li&gt; 
   &lt;/ul&gt; &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from crawl4ai.deep_crawling import BFSDeepCrawlStrategy

strategy = BFSDeepCrawlStrategy(
    max_depth=3,
    resume_state=saved_state,  # Continue from checkpoint
    on_state_change=save_to_redis,  # Called after each URL
)
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;⚡ Prefetch Mode for Fast URL Discovery&lt;/strong&gt;:&lt;/p&gt; 
   &lt;ul&gt; 
    &lt;li&gt;&lt;code&gt;prefetch=True&lt;/code&gt; skips markdown, extraction, and media processing&lt;/li&gt; 
    &lt;li&gt;5-10x faster than full processing&lt;/li&gt; 
    &lt;li&gt;Perfect for two-phase crawling: discover first, process selectively&lt;/li&gt; 
   &lt;/ul&gt; &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;config = CrawlerRunConfig(prefetch=True)
result = await crawler.arun(&quot;https://example.com&quot;, config=config)
# Returns HTML and links only - no markdown generation
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🔒 Security Fixes (Docker API)&lt;/strong&gt;:&lt;/p&gt; 
   &lt;ul&gt; 
    &lt;li&gt;Hooks disabled by default (&lt;code&gt;CRAWL4AI_HOOKS_ENABLED=false&lt;/code&gt;)&lt;/li&gt; 
    &lt;li&gt;&lt;code&gt;file://&lt;/code&gt; URLs blocked on API endpoints to prevent LFI&lt;/li&gt; 
    &lt;li&gt;&lt;code&gt;__import__&lt;/code&gt; removed from hook execution sandbox&lt;/li&gt; 
   &lt;/ul&gt; &lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;&lt;a href=&quot;https://github.com/unclecode/crawl4ai/raw/main/docs/blog/release-v0.8.0.md&quot;&gt;Full v0.8.0 Release Notes →&lt;/a&gt;&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;strong&gt;Version 0.7.8 Release Highlights - Stability &amp;amp; Bug Fix Release&lt;/strong&gt;&lt;/summary&gt; 
 &lt;p&gt;This release focuses on stability with 11 bug fixes addressing issues reported by the community. No new features, but significant improvements to reliability.&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🐳 Docker API Fixes&lt;/strong&gt;:&lt;/p&gt; 
   &lt;ul&gt; 
    &lt;li&gt;Fixed &lt;code&gt;ContentRelevanceFilter&lt;/code&gt; deserialization in deep crawl requests (#1642)&lt;/li&gt; 
    &lt;li&gt;Fixed &lt;code&gt;ProxyConfig&lt;/code&gt; JSON serialization in &lt;code&gt;BrowserConfig.to_dict()&lt;/code&gt; (#1629)&lt;/li&gt; 
    &lt;li&gt;Fixed &lt;code&gt;.cache&lt;/code&gt; folder permissions in Docker image (#1638)&lt;/li&gt; 
   &lt;/ul&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🤖 LLM Extraction Improvements&lt;/strong&gt;:&lt;/p&gt; 
   &lt;ul&gt; 
    &lt;li&gt;Configurable rate limiter backoff with new &lt;code&gt;LLMConfig&lt;/code&gt; parameters (#1269):&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from crawl4ai import LLMConfig

config = LLMConfig(
    provider=&quot;openai/gpt-4o-mini&quot;,
    backoff_base_delay=5,           # Wait 5s on first retry
    backoff_max_attempts=5,          # Try up to 5 times
    backoff_exponential_factor=3     # Multiply delay by 3 each attempt
)
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
    &lt;li&gt;HTML input format support for &lt;code&gt;LLMExtractionStrategy&lt;/code&gt; (#1178):&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from crawl4ai import LLMExtractionStrategy

strategy = LLMExtractionStrategy(
    llm_config=config,
    instruction=&quot;Extract table data&quot;,
    input_format=&quot;html&quot;  # Now supports: &quot;html&quot;, &quot;markdown&quot;, &quot;fit_markdown&quot;
)
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
    &lt;li&gt;Fixed raw HTML URL variable - extraction strategies now receive &lt;code&gt;&quot;Raw HTML&quot;&lt;/code&gt; instead of HTML blob (#1116)&lt;/li&gt; 
   &lt;/ul&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🔗 URL Handling&lt;/strong&gt;:&lt;/p&gt; 
   &lt;ul&gt; 
    &lt;li&gt;Fixed relative URL resolution after JavaScript redirects (#1268)&lt;/li&gt; 
    &lt;li&gt;Fixed import statement formatting in extracted code (#1181)&lt;/li&gt; 
   &lt;/ul&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;📦 Dependency Updates&lt;/strong&gt;:&lt;/p&gt; 
   &lt;ul&gt; 
    &lt;li&gt;Replaced deprecated PyPDF2 with pypdf (#1412)&lt;/li&gt; 
    &lt;li&gt;Pydantic v2 ConfigDict compatibility - no more deprecation warnings (#678)&lt;/li&gt; 
   &lt;/ul&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🧠 AdaptiveCrawler&lt;/strong&gt;:&lt;/p&gt; 
   &lt;ul&gt; 
    &lt;li&gt;Fixed query expansion to actually use LLM instead of hardcoded mock data (#1621)&lt;/li&gt; 
   &lt;/ul&gt; &lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;&lt;a href=&quot;https://github.com/unclecode/crawl4ai/raw/main/docs/blog/release-v0.7.8.md&quot;&gt;Full v0.7.8 Release Notes →&lt;/a&gt;&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;strong&gt;Version 0.7.7 Release Highlights - The Self-Hosting &amp;amp; Monitoring Update&lt;/strong&gt;&lt;/summary&gt; 
 &lt;ul&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;📊 Real-time Monitoring Dashboard&lt;/strong&gt;: Interactive web UI with live system metrics and browser pool visibility&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# Access the monitoring dashboard
# Visit: http://localhost:11235/dashboard

# Real-time metrics include:
# - System health (CPU, memory, network, uptime)
# - Active and completed request tracking
# - Browser pool management (permanent/hot/cold)
# - Janitor cleanup events
# - Error monitoring with full context
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🔌 Comprehensive Monitor API&lt;/strong&gt;: Complete REST API for programmatic access to all monitoring data&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import httpx

async with httpx.AsyncClient() as client:
    # System health
    health = await client.get(&quot;http://localhost:11235/monitor/health&quot;)

    # Request tracking
    requests = await client.get(&quot;http://localhost:11235/monitor/requests&quot;)

    # Browser pool status
    browsers = await client.get(&quot;http://localhost:11235/monitor/browsers&quot;)

    # Endpoint statistics
    stats = await client.get(&quot;http://localhost:11235/monitor/endpoints/stats&quot;)
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;⚡ WebSocket Streaming&lt;/strong&gt;: Real-time updates every 2 seconds for custom dashboards&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🔥 Smart Browser Pool&lt;/strong&gt;: 3-tier architecture (permanent/hot/cold) with automatic promotion and cleanup&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🧹 Janitor System&lt;/strong&gt;: Automatic resource management with event logging&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🎮 Control Actions&lt;/strong&gt;: Manual browser management (kill, restart, cleanup) via API&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;📈 Production Metrics&lt;/strong&gt;: 6 critical metrics for operational excellence with Prometheus integration&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🐛 Critical Bug Fixes&lt;/strong&gt;:&lt;/p&gt; 
   &lt;ul&gt; 
    &lt;li&gt;Fixed async LLM extraction blocking issue (#1055)&lt;/li&gt; 
    &lt;li&gt;Enhanced DFS deep crawl strategy (#1607)&lt;/li&gt; 
    &lt;li&gt;Fixed sitemap parsing in AsyncUrlSeeder (#1598)&lt;/li&gt; 
    &lt;li&gt;Resolved browser viewport configuration (#1495)&lt;/li&gt; 
    &lt;li&gt;Fixed CDP timing with exponential backoff (#1528)&lt;/li&gt; 
    &lt;li&gt;Security update for pyOpenSSL (&amp;gt;=25.3.0)&lt;/li&gt; 
   &lt;/ul&gt; &lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;&lt;a href=&quot;https://github.com/unclecode/crawl4ai/raw/main/docs/blog/release-v0.7.7.md&quot;&gt;Full v0.7.7 Release Notes →&lt;/a&gt;&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;strong&gt;Version 0.7.5 Release Highlights - The Docker Hooks &amp;amp; Security Update&lt;/strong&gt;&lt;/summary&gt; 
 &lt;ul&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🔧 Docker Hooks System&lt;/strong&gt;: Complete pipeline customization with user-provided Python functions at 8 key points&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;✨ Function-Based Hooks API (NEW)&lt;/strong&gt;: Write hooks as regular Python functions with full IDE support:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from crawl4ai import hooks_to_string
from crawl4ai.docker_client import Crawl4aiDockerClient

# Define hooks as regular Python functions
async def on_page_context_created(page, context, **kwargs):
    &quot;&quot;&quot;Block images to speed up crawling&quot;&quot;&quot;
    await context.route(&quot;**/*.{png,jpg,jpeg,gif,webp}&quot;, lambda route: route.abort())
    await page.set_viewport_size({&quot;width&quot;: 1920, &quot;height&quot;: 1080})
    return page

async def before_goto(page, context, url, **kwargs):
    &quot;&quot;&quot;Add custom headers&quot;&quot;&quot;
    await page.set_extra_http_headers({&#39;X-Crawl4AI&#39;: &#39;v0.7.5&#39;})
    return page

# Option 1: Use hooks_to_string() utility for REST API
hooks_code = hooks_to_string({
    &quot;on_page_context_created&quot;: on_page_context_created,
    &quot;before_goto&quot;: before_goto
})

# Option 2: Docker client with automatic conversion (Recommended)
client = Crawl4aiDockerClient(base_url=&quot;http://localhost:11235&quot;)
results = await client.crawl(
    urls=[&quot;https://httpbin.org/html&quot;],
    hooks={
        &quot;on_page_context_created&quot;: on_page_context_created,
        &quot;before_goto&quot;: before_goto
    }
)
# ✓ Full IDE support, type checking, and reusability!
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🤖 Enhanced LLM Integration&lt;/strong&gt;: Custom providers with temperature control and base_url configuration&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🔒 HTTPS Preservation&lt;/strong&gt;: Secure internal link handling with &lt;code&gt;preserve_https_for_internal_links=True&lt;/code&gt;&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🐍 Python 3.10+ Support&lt;/strong&gt;: Modern language features and enhanced performance&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🛠️ Bug Fixes&lt;/strong&gt;: Resolved multiple community-reported issues including URL processing, JWT authentication, and proxy configuration&lt;/p&gt; &lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;&lt;a href=&quot;https://github.com/unclecode/crawl4ai/raw/main/docs/blog/release-v0.7.5.md&quot;&gt;Full v0.7.5 Release Notes →&lt;/a&gt;&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;strong&gt;Version 0.7.4 Release Highlights - The Intelligent Table Extraction &amp;amp; Performance Update&lt;/strong&gt;&lt;/summary&gt; 
 &lt;ul&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🚀 LLMTableExtraction&lt;/strong&gt;: Revolutionary table extraction with intelligent chunking for massive tables:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from crawl4ai import LLMTableExtraction, LLMConfig

# Configure intelligent table extraction
table_strategy = LLMTableExtraction(
    llm_config=LLMConfig(provider=&quot;openai/gpt-4.1-mini&quot;),
    enable_chunking=True,           # Handle massive tables
    chunk_token_threshold=5000,     # Smart chunking threshold
    overlap_threshold=100,          # Maintain context between chunks
    extraction_type=&quot;structured&quot;    # Get structured data output
)

config = CrawlerRunConfig(table_extraction_strategy=table_strategy)
result = await crawler.arun(&quot;https://complex-tables-site.com&quot;, config=config)

# Tables are automatically chunked, processed, and merged
for table in result.tables:
    print(f&quot;Extracted table: {len(table[&#39;data&#39;])} rows&quot;)
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;⚡ Dispatcher Bug Fix&lt;/strong&gt;: Fixed sequential processing bottleneck in arun_many for fast-completing tasks&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🧹 Memory Management Refactor&lt;/strong&gt;: Consolidated memory utilities into main utils module for cleaner architecture&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🔧 Browser Manager Fixes&lt;/strong&gt;: Resolved race conditions in concurrent page creation with thread-safe locking&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🔗 Advanced URL Processing&lt;/strong&gt;: Better handling of raw:// URLs and base tag link resolution&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🛡️ Enhanced Proxy Support&lt;/strong&gt;: Flexible proxy configuration supporting both dict and string formats&lt;/p&gt; &lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;&lt;a href=&quot;https://github.com/unclecode/crawl4ai/raw/main/docs/blog/release-v0.7.4.md&quot;&gt;Full v0.7.4 Release Notes →&lt;/a&gt;&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;strong&gt;Version 0.7.3 Release Highlights - The Multi-Config Intelligence Update&lt;/strong&gt;&lt;/summary&gt; 
 &lt;ul&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🕵️ Undetected Browser Support&lt;/strong&gt;: Bypass sophisticated bot detection systems:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from crawl4ai import AsyncWebCrawler, BrowserConfig

browser_config = BrowserConfig(
    browser_type=&quot;undetected&quot;,  # Use undetected Chrome
    headless=True,              # Can run headless with stealth
    extra_args=[
        &quot;--disable-blink-features=AutomationControlled&quot;,
        &quot;--disable-web-security&quot;
    ]
)

async with AsyncWebCrawler(config=browser_config) as crawler:
    result = await crawler.arun(&quot;https://protected-site.com&quot;)
# Successfully bypass Cloudflare, Akamai, and custom bot detection
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🎨 Multi-URL Configuration&lt;/strong&gt;: Different strategies for different URL patterns in one batch:&lt;/p&gt; &lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from crawl4ai import CrawlerRunConfig, MatchMode, CacheMode
  
  configs = [
      # Documentation sites - aggressive caching
      CrawlerRunConfig(
          url_matcher=[&quot;*docs*&quot;, &quot;*documentation*&quot;],
          cache_mode=CacheMode.WRITE_ONLY,
          markdown_generator_options={&quot;include_links&quot;: True}
      ),
      
      # News/blog sites - fresh content
      CrawlerRunConfig(
          url_matcher=lambda url: &#39;blog&#39; in url or &#39;news&#39; in url,
          cache_mode=CacheMode.BYPASS
      ),
      
      # Fallback for everything else
      CrawlerRunConfig()
  ]
  
  results = await crawler.arun_many(urls, config=configs)
  # Each URL gets the perfect configuration automatically
&lt;/code&gt;&lt;/pre&gt; 
 &lt;ul&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🧠 Memory Monitoring&lt;/strong&gt;: Track and optimize memory usage during crawling:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from crawl4ai.memory_utils import MemoryMonitor

monitor = MemoryMonitor()
monitor.start_monitoring()

results = await crawler.arun_many(large_url_list)

report = monitor.get_report()
print(f&quot;Peak memory: {report[&#39;peak_mb&#39;]:.1f} MB&quot;)
print(f&quot;Efficiency: {report[&#39;efficiency&#39;]:.1f}%&quot;)
# Get optimization recommendations
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;📊 Enhanced Table Extraction&lt;/strong&gt;: Direct DataFrame conversion from web tables:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;result = await crawler.arun(&quot;https://site-with-tables.com&quot;)

# New way - direct table access
if result.tables:
    import pandas as pd
    for table in result.tables:
        df = pd.DataFrame(table[&#39;data&#39;])
        print(f&quot;Table: {df.shape[0]} rows × {df.shape[1]} columns&quot;)
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;💰 GitHub Sponsors&lt;/strong&gt;: 4-tier sponsorship system for project sustainability&lt;/p&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🐳 Docker LLM Flexibility&lt;/strong&gt;: Configure providers via environment variables&lt;/p&gt; &lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;&lt;a href=&quot;https://github.com/unclecode/crawl4ai/raw/main/docs/blog/release-v0.7.3.md&quot;&gt;Full v0.7.3 Release Notes →&lt;/a&gt;&lt;/p&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;strong&gt;Version 0.7.0 Release Highlights - The Adaptive Intelligence Update&lt;/strong&gt;&lt;/summary&gt; 
 &lt;ul&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🧠 Adaptive Crawling&lt;/strong&gt;: Your crawler now learns and adapts to website patterns automatically:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;config = AdaptiveConfig(
    confidence_threshold=0.7, # Min confidence to stop crawling
    max_depth=5, # Maximum crawl depth
    max_pages=20, # Maximum number of pages to crawl
    strategy=&quot;statistical&quot;
)

async with AsyncWebCrawler() as crawler:
    adaptive_crawler = AdaptiveCrawler(crawler, config)
    state = await adaptive_crawler.digest(
        start_url=&quot;https://news.example.com&quot;,
        query=&quot;latest news content&quot;
    )
# Crawler learns patterns and improves extraction over time
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🌊 Virtual Scroll Support&lt;/strong&gt;: Complete content extraction from infinite scroll pages:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;scroll_config = VirtualScrollConfig(
    container_selector=&quot;[data-testid=&#39;feed&#39;]&quot;,
    scroll_count=20,
    scroll_by=&quot;container_height&quot;,
    wait_after_scroll=1.0
)

result = await crawler.arun(url, config=CrawlerRunConfig(
    virtual_scroll_config=scroll_config
))
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🔗 Intelligent Link Analysis&lt;/strong&gt;: 3-layer scoring system for smart link prioritization:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;link_config = LinkPreviewConfig(
    query=&quot;machine learning tutorials&quot;,
    score_threshold=0.3,
    concurrent_requests=10
)

result = await crawler.arun(url, config=CrawlerRunConfig(
    link_preview_config=link_config,
    score_links=True
))
# Links ranked by relevance and quality
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;🎣 Async URL Seeder&lt;/strong&gt;: Discover thousands of URLs in seconds:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;seeder = AsyncUrlSeeder(SeedingConfig(
    source=&quot;sitemap+cc&quot;,
    pattern=&quot;*/blog/*&quot;,
    query=&quot;python tutorials&quot;,
    score_threshold=0.4
))

urls = await seeder.discover(&quot;https://example.com&quot;)
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;&lt;strong&gt;⚡ Performance Boost&lt;/strong&gt;: Up to 3x faster with optimized resource handling and memory efficiency&lt;/p&gt; &lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;Read the full details in our &lt;a href=&quot;https://docs.crawl4ai.com/blog/release-v0.7.0&quot;&gt;0.7.0 Release Notes&lt;/a&gt; or check the &lt;a href=&quot;https://github.com/unclecode/crawl4ai/raw/main/CHANGELOG.md&quot;&gt;CHANGELOG&lt;/a&gt;.&lt;/p&gt; 
&lt;/details&gt; 
&lt;h2&gt;Version Numbering in Crawl4AI&lt;/h2&gt; 
&lt;p&gt;Crawl4AI follows standard Python version numbering conventions (PEP 440) to help users understand the stability and features of each release.&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;📈 &lt;strong&gt;Version Numbers Explained&lt;/strong&gt;&lt;/summary&gt; 
 &lt;p&gt;Our version numbers follow this pattern: &lt;code&gt;MAJOR.MINOR.PATCH&lt;/code&gt; (e.g., 0.4.3)&lt;/p&gt; 
 &lt;h4&gt;Pre-release Versions&lt;/h4&gt; 
 &lt;p&gt;We use different suffixes to indicate development stages:&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;code&gt;dev&lt;/code&gt; (0.4.3dev1): Development versions, unstable&lt;/li&gt; 
  &lt;li&gt;&lt;code&gt;a&lt;/code&gt; (0.4.3a1): Alpha releases, experimental features&lt;/li&gt; 
  &lt;li&gt;&lt;code&gt;b&lt;/code&gt; (0.4.3b1): Beta releases, feature complete but needs testing&lt;/li&gt; 
  &lt;li&gt;&lt;code&gt;rc&lt;/code&gt; (0.4.3): Release candidates, potential final version&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;h4&gt;Installation&lt;/h4&gt; 
 &lt;ul&gt; 
  &lt;li&gt; &lt;p&gt;Regular installation (stable version):&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install -U crawl4ai
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;Install pre-release versions:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install crawl4ai --pre
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;p&gt;Install specific version:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install crawl4ai==0.4.3b1
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;h4&gt;Why Pre-releases?&lt;/h4&gt; 
 &lt;p&gt;We use pre-releases to:&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;Test new features in real-world scenarios&lt;/li&gt; 
  &lt;li&gt;Gather feedback before final releases&lt;/li&gt; 
  &lt;li&gt;Ensure stability for production users&lt;/li&gt; 
  &lt;li&gt;Allow early adopters to try new features&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;For production environments, we recommend using the stable version. For testing new features, you can opt-in to pre-releases using the &lt;code&gt;--pre&lt;/code&gt; flag.&lt;/p&gt; 
&lt;/details&gt; 
&lt;h2&gt;📖 Documentation &amp;amp; Roadmap&lt;/h2&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;🚨 &lt;strong&gt;Documentation Update Alert&lt;/strong&gt;: We&#39;re undertaking a major documentation overhaul next week to reflect recent updates and improvements. Stay tuned for a more comprehensive and up-to-date guide!&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;For current documentation, including installation instructions, advanced features, and API reference, visit our &lt;a href=&quot;https://docs.crawl4ai.com/&quot;&gt;Documentation Website&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;To check our development plans and upcoming features, visit our &lt;a href=&quot;https://github.com/unclecode/crawl4ai/raw/main/ROADMAP.md&quot;&gt;Roadmap&lt;/a&gt;.&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;📈 &lt;strong&gt;Development TODOs&lt;/strong&gt;&lt;/summary&gt; 
 &lt;ul class=&quot;task-list&quot;&gt; 
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_0&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_0&quot;&gt; 0. Graph Crawler: Smart website traversal using graph search algorithms for comprehensive nested page extraction&lt;/label&gt;&lt;/li&gt; 
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_1&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_1&quot;&gt; 1. Question-Based Crawler: Natural language driven web discovery and content extraction&lt;/label&gt;&lt;/li&gt; 
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_2&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_2&quot;&gt; 2. Knowledge-Optimal Crawler: Smart crawling that maximizes knowledge while minimizing data extraction&lt;/label&gt;&lt;/li&gt; 
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_3&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_3&quot;&gt; 3. Agentic Crawler: Autonomous system for complex multi-step crawling operations&lt;/label&gt;&lt;/li&gt; 
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_4&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_4&quot;&gt; 4. Automated Schema Generator: Convert natural language to extraction schemas&lt;/label&gt;&lt;/li&gt; 
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_5&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_5&quot;&gt; 5. Domain-Specific Scrapers: Pre-configured extractors for common platforms (academic, e-commerce)&lt;/label&gt;&lt;/li&gt; 
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_6&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_6&quot;&gt; 6. Web Embedding Index: Semantic search infrastructure for crawled content&lt;/label&gt;&lt;/li&gt; 
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_7&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_7&quot;&gt; 7. Interactive Playground: Web UI for testing, comparing strategies with AI assistance&lt;/label&gt;&lt;/li&gt; 
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_8&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_8&quot;&gt; 8. Performance Monitor: Real-time insights into crawler operations&lt;/label&gt;&lt;/li&gt; 
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_9&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_9&quot;&gt; 9. Cloud Integration: One-click deployment solutions across cloud providers&lt;/label&gt;&lt;/li&gt; 
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_10&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_10&quot;&gt; 10. Sponsorship Program: Structured support system with tiered benefits&lt;/label&gt;&lt;/li&gt; 
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_11&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_11&quot;&gt; 11. Educational Content: &quot;How to Crawl&quot; video series and interactive tutorials&lt;/label&gt;&lt;/li&gt; 
 &lt;/ul&gt; 
&lt;/details&gt; 
&lt;h2&gt;🤝 Contributing&lt;/h2&gt; 
&lt;p&gt;We welcome contributions from the open-source community. Check out our &lt;a href=&quot;https://github.com/unclecode/crawl4ai/raw/main/CONTRIBUTORS.md&quot;&gt;contribution guidelines&lt;/a&gt; for more information.&lt;/p&gt; 
&lt;p&gt;I&#39;ll help modify the license section with badges. For the halftone effect, here&#39;s a version with it:&lt;/p&gt; 
&lt;p&gt;Here&#39;s the updated license section:&lt;/p&gt; 
&lt;h2&gt;📄 License &amp;amp; Attribution&lt;/h2&gt; 
&lt;p&gt;This project is licensed under the Apache License 2.0, attribution is recommended via the badges below. See the &lt;a href=&quot;https://github.com/unclecode/crawl4ai/raw/main/LICENSE&quot;&gt;Apache 2.0 License&lt;/a&gt; file for details.&lt;/p&gt; 
&lt;h3&gt;Attribution Requirements&lt;/h3&gt; 
&lt;p&gt;When using Crawl4AI, you must include one of the following attribution methods:&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;📈 &lt;strong&gt;1. Badge Attribution (Recommended)&lt;/strong&gt;&lt;/summary&gt; Add one of these badges to your README, documentation, or website: 
 &lt;table&gt; 
  &lt;thead&gt; 
   &lt;tr&gt; 
    &lt;th&gt;Theme&lt;/th&gt; 
    &lt;th&gt;Badge&lt;/th&gt; 
   &lt;/tr&gt; 
  &lt;/thead&gt; 
  &lt;tbody&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;Disco Theme (Animated)&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/unclecode/crawl4ai&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/unclecode/crawl4ai/main/docs/assets/powered-by-disco.svg?sanitize=true&quot; alt=&quot;Powered by Crawl4AI&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;Night Theme (Dark with Neon)&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/unclecode/crawl4ai&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/unclecode/crawl4ai/main/docs/assets/powered-by-night.svg?sanitize=true&quot; alt=&quot;Powered by Crawl4AI&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;Dark Theme (Classic)&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/unclecode/crawl4ai&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/unclecode/crawl4ai/main/docs/assets/powered-by-dark.svg?sanitize=true&quot; alt=&quot;Powered by Crawl4AI&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
   &lt;tr&gt; 
    &lt;td&gt;&lt;strong&gt;Light Theme (Classic)&lt;/strong&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;a href=&quot;https://github.com/unclecode/crawl4ai&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/unclecode/crawl4ai/main/docs/assets/powered-by-light.svg?sanitize=true&quot; alt=&quot;Powered by Crawl4AI&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;/tr&gt; 
  &lt;/tbody&gt; 
 &lt;/table&gt; 
 &lt;p&gt;HTML code for adding the badges:&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!-- Disco Theme (Animated) --&amp;gt;
&amp;lt;a href=&quot;https://github.com/unclecode/crawl4ai&quot;&amp;gt;
  &amp;lt;img src=&quot;https://raw.githubusercontent.com/unclecode/crawl4ai/main/docs/assets/powered-by-disco.svg&quot; alt=&quot;Powered by Crawl4AI&quot; width=&quot;200&quot;/&amp;gt;
&amp;lt;/a&amp;gt;

&amp;lt;!-- Night Theme (Dark with Neon) --&amp;gt;
&amp;lt;a href=&quot;https://github.com/unclecode/crawl4ai&quot;&amp;gt;
  &amp;lt;img src=&quot;https://raw.githubusercontent.com/unclecode/crawl4ai/main/docs/assets/powered-by-night.svg&quot; alt=&quot;Powered by Crawl4AI&quot; width=&quot;200&quot;/&amp;gt;
&amp;lt;/a&amp;gt;

&amp;lt;!-- Dark Theme (Classic) --&amp;gt;
&amp;lt;a href=&quot;https://github.com/unclecode/crawl4ai&quot;&amp;gt;
  &amp;lt;img src=&quot;https://raw.githubusercontent.com/unclecode/crawl4ai/main/docs/assets/powered-by-dark.svg&quot; alt=&quot;Powered by Crawl4AI&quot; width=&quot;200&quot;/&amp;gt;
&amp;lt;/a&amp;gt;

&amp;lt;!-- Light Theme (Classic) --&amp;gt;
&amp;lt;a href=&quot;https://github.com/unclecode/crawl4ai&quot;&amp;gt;
  &amp;lt;img src=&quot;https://raw.githubusercontent.com/unclecode/crawl4ai/main/docs/assets/powered-by-light.svg&quot; alt=&quot;Powered by Crawl4AI&quot; width=&quot;200&quot;/&amp;gt;
&amp;lt;/a&amp;gt;

&amp;lt;!-- Simple Shield Badge --&amp;gt;
&amp;lt;a href=&quot;https://github.com/unclecode/crawl4ai&quot;&amp;gt;
  &amp;lt;img src=&quot;https://img.shields.io/badge/Powered%20by-Crawl4AI-blue?style=flat-square&quot; alt=&quot;Powered by Crawl4AI&quot;/&amp;gt;
&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;📖 &lt;strong&gt;2. Text Attribution&lt;/strong&gt;&lt;/summary&gt; Add this line to your documentation: ``` This project uses Crawl4AI (https://github.com/unclecode/crawl4ai) for web data extraction. ``` 
&lt;/details&gt; 
&lt;h2&gt;📚 Citation&lt;/h2&gt; 
&lt;p&gt;If you use Crawl4AI in your research or project, please cite:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bibtex&quot;&gt;@software{crawl4ai2024,
  author = {UncleCode},
  title = {Crawl4AI: Open-source LLM Friendly Web Crawler &amp;amp; Scraper},
  year = {2024},
  publisher = {GitHub},
  journal = {GitHub Repository},
  howpublished = {\url{https://github.com/unclecode/crawl4ai}},
  commit = {Please use the commit hash you&#39;re working with}
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Text citation format:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;UncleCode. (2024). Crawl4AI: Open-source LLM Friendly Web Crawler &amp;amp; Scraper [Computer software]. 
GitHub. https://github.com/unclecode/crawl4ai
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;📧 Contact&lt;/h2&gt; 
&lt;p&gt;For questions, suggestions, or feedback, feel free to reach out:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;GitHub: &lt;a href=&quot;https://github.com/unclecode&quot;&gt;unclecode&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;Twitter: &lt;a href=&quot;https://twitter.com/unclecode&quot;&gt;@unclecode&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;Website: &lt;a href=&quot;https://crawl4ai.com&quot;&gt;crawl4ai.com&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Happy Crawling! 🕸️🚀&lt;/p&gt; 
&lt;h2&gt;🗾 Mission&lt;/h2&gt; 
&lt;p&gt;Our mission is to unlock the value of personal and enterprise data by transforming digital footprints into structured, tradeable assets. Crawl4AI empowers individuals and organizations with open-source tools to extract and structure data, fostering a shared data economy.&lt;/p&gt; 
&lt;p&gt;We envision a future where AI is powered by real human knowledge, ensuring data creators directly benefit from their contributions. By democratizing data and enabling ethical sharing, we are laying the foundation for authentic AI advancement.&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;🔑 &lt;strong&gt;Key Opportunities&lt;/strong&gt;&lt;/summary&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;strong&gt;Data Capitalization&lt;/strong&gt;: Transform digital footprints into measurable, valuable assets.&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Authentic AI Data&lt;/strong&gt;: Provide AI systems with real human insights.&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Shared Economy&lt;/strong&gt;: Create a fair data marketplace that benefits data creators.&lt;/li&gt; 
 &lt;/ul&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary&gt;🚀 &lt;strong&gt;Development Pathway&lt;/strong&gt;&lt;/summary&gt; 
 &lt;ol&gt; 
  &lt;li&gt;&lt;strong&gt;Open-Source Tools&lt;/strong&gt;: Community-driven platforms for transparent data extraction.&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Digital Asset Structuring&lt;/strong&gt;: Tools to organize and value digital knowledge.&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;Ethical Data Marketplace&lt;/strong&gt;: A secure, fair platform for exchanging structured data.&lt;/li&gt; 
 &lt;/ol&gt; 
 &lt;p&gt;For more details, see our &lt;a href=&quot;https://raw.githubusercontent.com/unclecode/crawl4ai/main/MISSION.md&quot;&gt;full mission statement&lt;/a&gt;.&lt;/p&gt; 
&lt;/details&gt; 
&lt;h2&gt;🌟 Current Sponsors&lt;/h2&gt; 
&lt;h3&gt;🤝 Strategic Partners&lt;/h3&gt; 
&lt;p&gt;These companies provide core infrastructure and technology that power Crawl4AI’s capabilities — from web access and proxy networks to AI tooling and data pipelines.&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Company&lt;/th&gt; 
   &lt;th&gt;About&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://www.joinmassive.com/&quot; target=&quot;_blank&quot;&gt;
     &lt;picture&gt;
      &lt;source media=&quot;(prefers-color-scheme: dark)&quot; srcset=&quot;docs/assets/sponsors/massive_light.svg&quot; /&gt;
      &lt;source media=&quot;(prefers-color-scheme: light)&quot; srcset=&quot;docs/assets/sponsors/massive.svg&quot; /&gt;
      &lt;img alt=&quot;Massive&quot; src=&quot;https://raw.githubusercontent.com/unclecode/crawl4ai/main/docs/assets/sponsors/massive.svg?sanitize=true&quot; height=&quot;40&quot; /&gt;
     &lt;/picture&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Massive is a web access API backed by millions of volunteer devices in 195+ countries. AI agents, models, and data pipelines use it to reach any site on the internet, reliably, in real time, and at scale.&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h3&gt;🏢 Enterprise Sponsors&lt;/h3&gt; 
&lt;p&gt;Our enterprise sponsors support Crawl4AI and help scale it to power production-grade data pipelines.&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Company&lt;/th&gt; 
   &lt;th&gt;About&lt;/th&gt; 
   &lt;th&gt;Sponsorship Tier&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://kipo.ai&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://docs.crawl4ai.com/uploads/sponsors/20251013045751_2d54f57f117c651e.png&quot; alt=&quot;DataSync&quot; height=&quot;40&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Helps engineers and buyers find, compare, and source electronic &amp;amp; industrial parts in seconds, with specs, pricing, lead times &amp;amp; alternatives.&lt;/td&gt; 
   &lt;td&gt;🥇 Gold&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://www.kidocode.com/&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://docs.crawl4ai.com/uploads/sponsors/20251013045045_bb8dace3f0440d65.svg?sanitize=true&quot; alt=&quot;Kidocode&quot; height=&quot;40&quot; /&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Kidocode is a hybrid technology and entrepreneurship school for kids aged 5–18, offering both online and on-campus education.&lt;/td&gt; 
   &lt;td&gt;🥇 Gold&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://www.alephnull.sg/&quot; target=&quot;_blank&quot;&gt;
     &lt;picture&gt;
      &lt;source media=&quot;(prefers-color-scheme: dark)&quot; srcset=&quot;docs/assets/sponsors/aleph_null_light.svg&quot; /&gt;
      &lt;source media=&quot;(prefers-color-scheme: light)&quot; srcset=&quot;docs/assets/sponsors/aleph_null.svg&quot; /&gt;
      &lt;img alt=&quot;Aleph null&quot; src=&quot;https://raw.githubusercontent.com/unclecode/crawl4ai/main/docs/assets/sponsors/aleph_null.svg?sanitize=true&quot; height=&quot;40&quot; /&gt;
     &lt;/picture&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Singapore-based Aleph Null is Asia’s leading edtech hub, dedicated to student-centric, AI-driven education—empowering learners with the tools to thrive in a fast-changing world.&lt;/td&gt; 
   &lt;td&gt;🥇 Gold&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;hr /&gt; 
&lt;h3&gt;💼 Become a Strategic Partner or Sponsor&lt;/h3&gt; 
&lt;p&gt;Interested in partnering with Crawl4AI?&lt;/p&gt; 
&lt;p&gt;Whether you’re a proxy provider, AI infrastructure company, cloud platform, or an organization looking to support the Crawl4AI ecosystem, we’d love to hear from you.&lt;/p&gt; 
&lt;p&gt;📩 Contact: &lt;a href=&quot;mailto:hello@crawl4ai.com&quot;&gt;hello@crawl4ai.com&lt;/a&gt;&lt;/p&gt; 
&lt;h3&gt;🧑‍🤝 Individual Sponsors&lt;/h3&gt; 
&lt;p&gt;A heartfelt thanks to our individual supporters! Every contribution helps us keep our opensource mission alive and thriving!&lt;/p&gt; 
&lt;p align=&quot;left&quot;&gt; &lt;a href=&quot;https://github.com/hafezparast&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/14273305?s=60&amp;amp;v=4&quot; style=&quot;border-radius:50%;&quot; width=&quot;64px;&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/ntohidi&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/17140097?s=60&amp;amp;v=4&quot; style=&quot;border-radius:50%;&quot; width=&quot;64px;&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/Sjoeborg&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/17451310?s=60&amp;amp;v=4&quot; style=&quot;border-radius:50%;&quot; width=&quot;64px;&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/romek-rozen&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/30595969?s=60&amp;amp;v=4&quot; style=&quot;border-radius:50%;&quot; width=&quot;64px;&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/Kourosh-Kiyani&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/34105600?s=60&amp;amp;v=4&quot; style=&quot;border-radius:50%;&quot; width=&quot;64px;&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/Etherdrake&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/67021215?s=60&amp;amp;v=4&quot; style=&quot;border-radius:50%;&quot; width=&quot;64px;&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/shaman247&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/211010067?s=60&amp;amp;v=4&quot; style=&quot;border-radius:50%;&quot; width=&quot;64px;&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/work-flow-manager&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/217665461?s=60&amp;amp;v=4&quot; style=&quot;border-radius:50%;&quot; width=&quot;64px;&quot; /&gt;&lt;/a&gt; &lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;Want to join them? &lt;a href=&quot;https://github.com/sponsors/unclecode&quot;&gt;Sponsor Crawl4AI →&lt;/a&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h2&gt;Star History&lt;/h2&gt; 
&lt;a href=&quot;https://www.star-history.com/?type=date&amp;amp;repos=unclecode%2Fcrawl4ai&quot;&gt; 
 &lt;picture&gt; 
  &lt;source media=&quot;(prefers-color-scheme: dark)&quot; srcset=&quot;https://api.star-history.com/chart?repos=unclecode/crawl4ai&amp;amp;type=date&amp;amp;theme=dark&amp;amp;legend=top-left&amp;amp;sealed_token=KuajrA7ScH8VT4KagC7nm1xbazTVaNs6rdok4At2dV6tDl91YR_dxmHhmsffjhFiWdLYlzdACxZ-cWLwp8tZHCYxSDMjITf3Vnu4mPns7YdLetyQBPHMQ2f_KakXdbvbVP6PofI82GNqGCVEXtPnZWHC8WM6CzZe6s6cJb6_ga_kn-jh-BeHdyuRRdVR&quot; /&gt; 
  &lt;source media=&quot;(prefers-color-scheme: light)&quot; srcset=&quot;https://api.star-history.com/chart?repos=unclecode/crawl4ai&amp;amp;type=date&amp;amp;legend=top-left&amp;amp;sealed_token=KuajrA7ScH8VT4KagC7nm1xbazTVaNs6rdok4At2dV6tDl91YR_dxmHhmsffjhFiWdLYlzdACxZ-cWLwp8tZHCYxSDMjITf3Vnu4mPns7YdLetyQBPHMQ2f_KakXdbvbVP6PofI82GNqGCVEXtPnZWHC8WM6CzZe6s6cJb6_ga_kn-jh-BeHdyuRRdVR&quot; /&gt; 
  &lt;img alt=&quot;Star History Chart&quot; src=&quot;https://api.star-history.com/chart?repos=unclecode/crawl4ai&amp;amp;type=date&amp;amp;legend=top-left&amp;amp;sealed_token=KuajrA7ScH8VT4KagC7nm1xbazTVaNs6rdok4At2dV6tDl91YR_dxmHhmsffjhFiWdLYlzdACxZ-cWLwp8tZHCYxSDMjITf3Vnu4mPns7YdLetyQBPHMQ2f_KakXdbvbVP6PofI82GNqGCVEXtPnZWHC8WM6CzZe6s6cJb6_ga_kn-jh-BeHdyuRRdVR&quot; /&gt; 
 &lt;/picture&gt; &lt;/a&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/4ab9eab1536c21f7d9143017cdc27756c5565e9aca3e8b74e91bfe96885c0bc4/unclecode/crawl4ai" medium="image" />
      
    </item>
    
    <item>
      <title>thinking-machines-lab/tinker-cookbook</title>
      <link>https://github.com/thinking-machines-lab/tinker-cookbook</link>
      <description>&lt;p&gt;Post-training with Tinker&lt;/p&gt;&lt;hr&gt;&lt;h1 align=&quot;center&quot;&gt;Tinker Cookbook&lt;/h1&gt; 
&lt;div align=&quot;center&quot;&gt; 
 &lt;img src=&quot;https://raw.githubusercontent.com/thinking-machines-lab/tinker-cookbook/main/assets/tinker-cover.png&quot; width=&quot;60%&quot; /&gt; 
&lt;/div&gt; 
&lt;div align=&quot;center&quot;&gt; 
 &lt;p&gt;&lt;a href=&quot;https://github.com/thinking-machines-lab/tinker-cookbook/actions/workflows/pytest.yaml&quot;&gt;&lt;img src=&quot;https://github.com/thinking-machines-lab/tinker-cookbook/actions/workflows/pytest.yaml/badge.svg?sanitize=true&quot; alt=&quot;pytest&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/thinking-machines-lab/tinker-cookbook/actions/workflows/pyright.yaml&quot;&gt;&lt;img src=&quot;https://github.com/thinking-machines-lab/tinker-cookbook/actions/workflows/pyright.yaml/badge.svg?sanitize=true&quot; alt=&quot;pyright&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/thinking-machines-lab/tinker-cookbook/actions/workflows/smoke-test-recipes.yaml&quot;&gt;&lt;img src=&quot;https://github.com/thinking-machines-lab/tinker-cookbook/actions/workflows/smoke-test-recipes.yaml/badge.svg?sanitize=true&quot; alt=&quot;smoke-test-recipes&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://pypi.org/project/tinker-cookbook/&quot;&gt;&lt;img src=&quot;https://img.shields.io/pypi/v/tinker-cookbook&quot; alt=&quot;PyPI&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;/div&gt; 
&lt;p&gt;We provide two libraries for the broader community to customize their language models: &lt;code&gt;tinker&lt;/code&gt; and &lt;code&gt;tinker-cookbook&lt;/code&gt;.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;tinker&lt;/code&gt; is a training SDK for researchers and developers to fine-tune language models. You send API requests to us and we handle the complexities of distributed training.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;tinker-cookbook&lt;/code&gt; includes realistic examples of fine-tuning language models. It builds on the Tinker API and provides common abstractions to fine-tune language models.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Installation&lt;/h2&gt; 
&lt;ol&gt; 
 &lt;li&gt;Sign up for Tinker &lt;a href=&quot;https://auth.thinkingmachines.ai/sign-up&quot;&gt;here&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;Once you have access, create an API key from the &lt;a href=&quot;https://tinker-console.thinkingmachines.ai&quot;&gt;console&lt;/a&gt; and export it as environment variable &lt;code&gt;TINKER_API_KEY&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;Install &lt;code&gt;tinker-cookbook&lt;/code&gt; (includes the &lt;code&gt;tinker&lt;/code&gt; SDK as a dependency):&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Latest stable release from PyPI
uv pip install tinker-cookbook

# Or install the nightly build
uv pip install &#39;tinker-cookbook @ git+https://github.com/thinking-machines-lab/tinker-cookbook.git@nightly&#39;
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;h2&gt;Using Inkling and Inkling-Small&lt;/h2&gt; 
&lt;p&gt;Inkling is Thinking Machines Lab&#39;s model tailored for Tinker. It is a general-purpose model that can code, reason, call tools, and process image and audio inputs. Inkling-Small is a smaller, lower-cost model in the same family that shares Inkling&#39;s rendering path and reasoning-effort interface. Tinker Cookbook supports sampling and post-training both through the standalone &lt;code&gt;tml-renderers&lt;/code&gt; library, included in the default installation together with the required &lt;code&gt;torch&amp;gt;=2.10&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;Pass &lt;code&gt;model_name=&quot;thinkingmachines/Inkling&quot;&lt;/code&gt; or &lt;code&gt;model_name=&quot;thinkingmachines/Inkling-Small&quot;&lt;/code&gt; anywhere the cookbook accepts a model name. The appropriate renderer and tokenizer are selected automatically for any &lt;code&gt;thinkingmachines/Inkling*&lt;/code&gt; model, including the &lt;code&gt;:peft:&lt;/code&gt; long-context variants.&lt;/p&gt; 
&lt;p&gt;Both models support &lt;a href=&quot;https://tinker-docs.thinkingmachines.ai/cookbook/inkling/thinking-effort/&quot;&gt;controllable reasoning effort&lt;/a&gt; as well as multimodal &lt;a href=&quot;https://tinker-docs.thinkingmachines.ai/cookbook/inkling/audio/&quot;&gt;audio&lt;/a&gt; and &lt;a href=&quot;https://tinker-docs.thinkingmachines.ai/cookbook/inkling/images/&quot;&gt;image&lt;/a&gt; inputs. See the &lt;a href=&quot;https://tinker-docs.thinkingmachines.ai/cookbook/inkling/&quot;&gt;Inkling documentation&lt;/a&gt; for setup and usage details, and &lt;a href=&quot;https://tinker-docs.thinkingmachines.ai/tinker/models/&quot;&gt;Models &amp;amp; Pricing&lt;/a&gt; for per-model context lengths and pricing.&lt;/p&gt; 
&lt;h2&gt;Tinker&lt;/h2&gt; 
&lt;p&gt;Here we introduce a few Tinker primitives — the basic components to fine-tune LLMs (see the &lt;a href=&quot;https://tinker-docs.thinkingmachines.ai/tinker/quickstart/&quot;&gt;quickstart guide&lt;/a&gt; for more details):&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import tinker
service_client = tinker.ServiceClient()
training_client = service_client.create_lora_training_client(
  base_model=&quot;meta-llama/Llama-3.2-1B&quot;, rank=32,
)
training_client.forward_backward(...)
training_client.optim_step(...)
training_client.save_state(...)
training_client.load_state(...)

sampling_client = training_client.save_weights_and_get_sampling_client()
sampling_client.sample(...)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;See &lt;a href=&quot;https://raw.githubusercontent.com/thinking-machines-lab/tinker-cookbook/main/tinker_cookbook/recipes/sl_loop.py&quot;&gt;tinker_cookbook/recipes/sl_loop.py&lt;/a&gt; and &lt;a href=&quot;https://raw.githubusercontent.com/thinking-machines-lab/tinker-cookbook/main/tinker_cookbook/recipes/rl_loop.py&quot;&gt;tinker_cookbook/recipes/rl_loop.py&lt;/a&gt; for minimal examples of using these primitives to fine-tune LLMs.&lt;/p&gt; 
&lt;h3&gt;Tutorials&lt;/h3&gt; 
&lt;p&gt;New to Tinker? The &lt;a href=&quot;https://raw.githubusercontent.com/thinking-machines-lab/tinker-cookbook/main/tutorials/&quot;&gt;&lt;code&gt;tutorials/&lt;/code&gt;&lt;/a&gt; directory contains 20+ progressive &lt;a href=&quot;https://marimo.io/&quot;&gt;marimo&lt;/a&gt; notebooks that walk through core concepts — rendering, loss functions, completers, weight management — and advanced topics such as custom RL environments, DPO, RLHF, and weight export. Run any tutorial with &lt;code&gt;marimo edit tutorials/101_hello_tinker.py&lt;/code&gt;. See the &lt;a href=&quot;https://raw.githubusercontent.com/thinking-machines-lab/tinker-cookbook/main/tutorials/README.md&quot;&gt;tutorials README&lt;/a&gt; for the full list, or browse rendered versions on the &lt;a href=&quot;https://tinker-docs.thinkingmachines.ai/tutorials&quot;&gt;Tinker docs site&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;To download the weights of any model:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;rest_client = service_client.create_rest_client()
future = rest_client.get_checkpoint_archive_url_from_tinker_path(sampling_client.model_path)
with open(f&quot;model-checkpoint.tar.gz&quot;, &quot;wb&quot;) as f:
    f.write(future.result())
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Tinker Cookbook&lt;/h3&gt; 
&lt;p&gt;Besides these primitives, we also offer &lt;strong&gt;Tinker Cookbook&lt;/strong&gt; (a.k.a. this repo), a library of a wide range of abstractions to help you customize training environments. &lt;a href=&quot;https://raw.githubusercontent.com/thinking-machines-lab/tinker-cookbook/main/tinker_cookbook/recipes/sl_basic.py&quot;&gt;&lt;code&gt;tinker_cookbook/recipes/sl_basic.py&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://raw.githubusercontent.com/thinking-machines-lab/tinker-cookbook/main/tinker_cookbook/recipes/rl_basic.py&quot;&gt;&lt;code&gt;tinker_cookbook/recipes/rl_basic.py&lt;/code&gt;&lt;/a&gt; contain minimal examples to configure supervised learning and reinforcement learning.&lt;/p&gt; 
&lt;p&gt;We also include more complete examples in the &lt;a href=&quot;https://raw.githubusercontent.com/thinking-machines-lab/tinker-cookbook/main/tinker_cookbook/recipes/&quot;&gt;&lt;code&gt;tinker_cookbook/recipes/&lt;/code&gt;&lt;/a&gt; folder:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://raw.githubusercontent.com/thinking-machines-lab/tinker-cookbook/main/tinker_cookbook/recipes/chat_sl/&quot;&gt;Chat SFT&lt;/a&gt;&lt;/strong&gt;: supervised fine-tuning on conversational datasets (e.g., Tulu3).&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://raw.githubusercontent.com/thinking-machines-lab/tinker-cookbook/main/tinker_cookbook/recipes/math_rl/&quot;&gt;Math RL&lt;/a&gt;&lt;/strong&gt;: reinforcement learning for mathematical reasoning with verifiable rewards.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://raw.githubusercontent.com/thinking-machines-lab/tinker-cookbook/main/tinker_cookbook/recipes/code_rl/&quot;&gt;Code RL&lt;/a&gt;&lt;/strong&gt;: RL on competitive programming with sandboxed code execution (DeepCoder replication).&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://raw.githubusercontent.com/thinking-machines-lab/tinker-cookbook/main/tinker_cookbook/recipes/preference/&quot;&gt;Preference learning&lt;/a&gt;&lt;/strong&gt;: DPO and a three-stage RLHF pipeline (SFT, reward model, RL).&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://raw.githubusercontent.com/thinking-machines-lab/tinker-cookbook/main/tinker_cookbook/recipes/distillation/&quot;&gt;Distillation&lt;/a&gt;&lt;/strong&gt;: on-policy and off-policy knowledge distillation with single- and multi-teacher configurations.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://raw.githubusercontent.com/thinking-machines-lab/tinker-cookbook/main/tinker_cookbook/recipes/search_tool/&quot;&gt;Tool use&lt;/a&gt;&lt;/strong&gt;: RL for retrieval-augmented generation (Search-R1 replication).&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://raw.githubusercontent.com/thinking-machines-lab/tinker-cookbook/main/tinker_cookbook/recipes/multiplayer_rl/&quot;&gt;Multi-agent&lt;/a&gt;&lt;/strong&gt;: multi-agent RL with self-play and cross-play.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://raw.githubusercontent.com/thinking-machines-lab/tinker-cookbook/main/tinker_cookbook/recipes/audio/&quot;&gt;Audio&lt;/a&gt;&lt;/strong&gt;: SFT and RL for Inkling audio inputs, including speech recognition and speaking-style classification.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://raw.githubusercontent.com/thinking-machines-lab/tinker-cookbook/main/tinker_cookbook/recipes/vlm_classifier/&quot;&gt;VLM image classification&lt;/a&gt;&lt;/strong&gt;: supervised training and evaluation for vision-language models.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;The &lt;a href=&quot;https://raw.githubusercontent.com/thinking-machines-lab/tinker-cookbook/main/tinker_cookbook/recipes/README.md&quot;&gt;recipes README&lt;/a&gt; covers all available recipes, including Harbor RL, rubric-based grading, VLM classification, and SDFT. Each recipe includes a &lt;code&gt;README.md&lt;/code&gt; with implementation details, launch commands, and expected results.&lt;/p&gt; 
&lt;h3&gt;Evaluation (experimental)&lt;/h3&gt; 
&lt;p&gt;Tinker Cookbook includes a &lt;a href=&quot;https://raw.githubusercontent.com/thinking-machines-lab/tinker-cookbook/main/tinker_cookbook/eval/&quot;&gt;benchmark framework&lt;/a&gt; for evaluating trained models:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from tinker_cookbook.eval.benchmarks import run_benchmarks, BenchmarkConfig

results = await run_benchmarks(
    [&quot;gsm8k&quot;, &quot;mmlu_pro&quot;, &quot;ifeval&quot;],
    sampling_client, renderer,
    BenchmarkConfig(save_dir=&quot;evals/step500&quot;),
)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The framework currently supports 12 benchmarks (GSM8K, MATH-500, MMLU-Pro, MMLU-Redux, GPQA, IFEval, MBPP, C-Eval, SuperGPQA, IFBench, AIME 2025, AIME 2026) with verified scores against published results, plus experimental benchmarks such as LiveCodeBench, Terminal Bench, and SWE-bench. Benchmarks can also serve as inline training evaluators via &lt;code&gt;BenchmarkEvaluator&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Benchmark scores are sensitive to evaluation configuration — system prompts, &lt;code&gt;max_tokens&lt;/code&gt;, temperature, and timeout settings can shift results significantly. We document our exact settings alongside all reported scores. This framework is under active development; feedback and contributions are welcome. See the &lt;a href=&quot;https://raw.githubusercontent.com/thinking-machines-lab/tinker-cookbook/main/tinker_cookbook/eval/README.md&quot;&gt;eval README&lt;/a&gt; for verified scores, configuration details, and instructions for adding new benchmarks.&lt;/p&gt; 
&lt;h3&gt;Documentation&lt;/h3&gt; 
&lt;p&gt;For the full Tinker documentation, visit &lt;a href=&quot;https://tinker-docs.thinkingmachines.ai&quot;&gt;tinker-docs.thinkingmachines.ai&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;Utilities&lt;/h3&gt; 
&lt;p&gt;Tinker Cookbook also provides reusable building blocks:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/thinking-machines-lab/tinker-cookbook/main/tinker_cookbook/renderers/&quot;&gt;&lt;code&gt;renderers&lt;/code&gt;&lt;/a&gt; — bidirectional conversion between token sequences and structured chat messages&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/thinking-machines-lab/tinker-cookbook/main/tinker_cookbook/hyperparam_utils.py&quot;&gt;&lt;code&gt;hyperparam_utils&lt;/code&gt;&lt;/a&gt; — learning rate and hyperparameter scaling for LoRA training&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/thinking-machines-lab/tinker-cookbook/main/tinker_cookbook/eval/&quot;&gt;&lt;code&gt;eval&lt;/code&gt;&lt;/a&gt; — benchmark framework and inline training evaluators (see &lt;a href=&quot;https://raw.githubusercontent.com/thinking-machines-lab/tinker-cookbook/main/#evaluation-experimental&quot;&gt;Evaluation&lt;/a&gt; above)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Claude Code Skills&lt;/h2&gt; 
&lt;p&gt;Tinker Cookbook ships with &lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/skills&quot;&gt;Claude Code skills&lt;/a&gt; that teach Claude how to use the Tinker API. Install them so Claude can help you write training code in any project:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/plugin marketplace add thinking-machines-lab/tinker-cookbook
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Then install the &lt;strong&gt;tinker&lt;/strong&gt; plugin from the Discover tab (&lt;code&gt;/plugin&lt;/code&gt; → Discover). Once installed, three skills are available:&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Command&lt;/th&gt; 
   &lt;th&gt;What it does&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/tinker:research&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Plan and run post-training experiments — SFT, RL, DPO, distillation, evaluation, hyperparameters, model selection, and more&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/tinker:debug&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Diagnose slow training, hangs, output mismatches, renderer issues, and errors&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/tinker:inkling&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Work with Inkling and Inkling-Small — thinking effort, rendering, post-training, evaluation, and multimodal input&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;Skills also trigger automatically based on context — ask Claude to &quot;set up SFT training&quot; and it will load the right skill without a slash command. Skills update automatically when the repo is updated.&lt;/p&gt; 
&lt;h2&gt;Development Setup&lt;/h2&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;uv sync --extra dev
pre-commit install
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This installs dev dependencies and registers pre-commit hooks that run &lt;code&gt;ruff&lt;/code&gt; formatting and linting on every commit. CI enforces these checks on all pull requests.&lt;/p&gt; 
&lt;h2&gt;Contributing&lt;/h2&gt; 
&lt;p&gt;This project is built in the spirit of open science and collaborative development. We believe that the best tools emerge through community involvement and shared learning.&lt;/p&gt; 
&lt;p&gt;We welcome PR contributions after our private beta is over. If you have any feedback, please email us at &lt;a href=&quot;mailto:tinker@thinkingmachines.ai&quot;&gt;tinker@thinkingmachines.ai&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Citation&lt;/h2&gt; 
&lt;p&gt;If you use Tinker for your research, please cite it as:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Thinking Machines Lab, 2026. Tinker. https://thinkingmachines.ai/tinker/.
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Or use this BibTeX citation:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@misc{tml2026tinker,
  author = {Thinking Machines Lab},
  title = {Tinker},
  year = {2026},
  url = {https://thinkingmachines.ai/tinker/},
}
&lt;/code&gt;&lt;/pre&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/027753f489a337fa361108cbc8f7de6aad19cd180abd0ea97e3682081e3991b6/thinking-machines-lab/tinker-cookbook" medium="image" />
      
    </item>
    
    <item>
      <title>paperless-ngx/paperless-ngx</title>
      <link>https://github.com/paperless-ngx/paperless-ngx</link>
      <description>&lt;p&gt;A community-supported supercharged document management system: scan, index and archive all your documents&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/paperless-ngx/paperless-ngx/actions&quot;&gt;&lt;img src=&quot;https://github.com/paperless-ngx/paperless-ngx/workflows/ci/badge.svg?sanitize=true&quot; alt=&quot;ci&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://crowdin.com/project/paperless-ngx&quot;&gt;&lt;img src=&quot;https://badges.crowdin.net/paperless-ngx/localized.svg?sanitize=true&quot; alt=&quot;Crowdin&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://docs.paperless-ngx.com&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/deployments/paperless-ngx/paperless-ngx/github-pages?label=docs&quot; alt=&quot;Documentation Status&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://codecov.io/gh/paperless-ngx/paperless-ngx&quot;&gt;&lt;img src=&quot;https://codecov.io/gh/paperless-ngx/paperless-ngx/branch/main/graph/badge.svg?token=VK6OUPJ3TY&quot; alt=&quot;codecov&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://matrix.to/#/%23paperlessngx%3Amatrix.org&quot;&gt;&lt;img src=&quot;https://matrix.to/img/matrix-badge.svg?sanitize=true&quot; alt=&quot;Chat on Matrix&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://demo.paperless-ngx.com&quot;&gt;&lt;img src=&quot;https://cronitor.io/badges/ve7ItY/production/W5E_B9jkelG9ZbDiNHUPQEVH3MY.svg?sanitize=true&quot; alt=&quot;demo&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; 
 &lt;picture&gt; 
  &lt;source media=&quot;(prefers-color-scheme: dark)&quot; srcset=&quot;https://github.com/paperless-ngx/paperless-ngx/blob/main/docs/assets/logo_full_white.png&quot; width=&quot;50%&quot; /&gt; 
  &lt;source media=&quot;(prefers-color-scheme: light)&quot; srcset=&quot;https://github.com/paperless-ngx/paperless-ngx/blob/main/docs/assets/logo_full_black.png&quot; width=&quot;50%&quot; /&gt; 
  &lt;img src=&quot;https://github.com/paperless-ngx/paperless-ngx/raw/main/docs/assets/logo_full_black.png&quot; width=&quot;50%&quot; /&gt; 
 &lt;/picture&gt; &lt;/p&gt; 
&lt;!-- omit in toc --&gt; 
&lt;h1&gt;Paperless-ngx&lt;/h1&gt; 
&lt;p&gt;Paperless-ngx is a document management system that transforms your physical documents into a searchable online archive so you can keep, well, &lt;em&gt;less paper&lt;/em&gt;.&lt;/p&gt; 
&lt;p&gt;Paperless-ngx is the official successor to the original &lt;a href=&quot;https://github.com/the-paperless-project/paperless&quot;&gt;Paperless&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://github.com/jonaswinkler/paperless-ng&quot;&gt;Paperless-ng&lt;/a&gt; projects and is designed to distribute the responsibility of advancing and supporting the project among a team of people. &lt;a href=&quot;https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/dev/#community-support&quot;&gt;Consider joining us!&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;Thanks to the generous folks at &lt;a href=&quot;https://m.do.co/c/8d70b916d462&quot;&gt;DigitalOcean&lt;/a&gt;, a demo is available at &lt;a href=&quot;https://demo.paperless-ngx.com&quot;&gt;demo.paperless-ngx.com&lt;/a&gt; using login &lt;code&gt;demo&lt;/code&gt; / &lt;code&gt;demo&lt;/code&gt;. &lt;em&gt;Note: demo content is reset frequently and confidential information should not be uploaded.&lt;/em&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/dev/#features&quot;&gt;Features&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/dev/#getting-started&quot;&gt;Getting started&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/dev/#contributing&quot;&gt;Contributing&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/dev/#community-support&quot;&gt;Community Support&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/dev/#translation&quot;&gt;Translation&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/dev/#feature-requests&quot;&gt;Feature Requests&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/dev/#bugs&quot;&gt;Bugs&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/dev/#related-projects&quot;&gt;Related Projects&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/dev/#important-note&quot;&gt;Important Note&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p align=&quot;right&quot;&gt;This project is supported by:&lt;br /&gt; &lt;a href=&quot;https://m.do.co/c/8d70b916d462&quot; style=&quot;padding-top: 4px; display: block;&quot;&gt; 
  &lt;picture&gt; 
   &lt;source media=&quot;(prefers-color-scheme: dark)&quot; srcset=&quot;https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/assets/SVG/DO_Logo_horizontal_white.svg&quot; width=&quot;140px&quot; /&gt; 
   &lt;source media=&quot;(prefers-color-scheme: light)&quot; srcset=&quot;https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/assets/SVG/DO_Logo_horizontal_blue.svg&quot; width=&quot;140px&quot; /&gt; 
   &lt;img src=&quot;https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/assets/SVG/DO_Logo_horizontal_black_.svg?sanitize=true&quot; width=&quot;140px&quot; /&gt; 
  &lt;/picture&gt; &lt;/a&gt; &lt;/p&gt; 
&lt;h1&gt;Features&lt;/h1&gt; 
&lt;picture&gt; 
 &lt;source media=&quot;(prefers-color-scheme: dark)&quot; srcset=&quot;https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/docs/assets/screenshots/documents-smallcards-dark.png&quot; /&gt; 
 &lt;source media=&quot;(prefers-color-scheme: light)&quot; srcset=&quot;https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/docs/assets/screenshots/documents-smallcards.png&quot; /&gt; 
 &lt;img src=&quot;https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/docs/assets/screenshots/documents-smallcards.png&quot; /&gt; 
&lt;/picture&gt; 
&lt;p&gt;A full list of &lt;a href=&quot;https://docs.paperless-ngx.com/#features&quot;&gt;features&lt;/a&gt; and &lt;a href=&quot;https://docs.paperless-ngx.com/#screenshots&quot;&gt;screenshots&lt;/a&gt; are available in the &lt;a href=&quot;https://docs.paperless-ngx.com/&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt; 
&lt;h1&gt;Getting started&lt;/h1&gt; 
&lt;p&gt;The easiest way to deploy paperless is &lt;code&gt;docker compose&lt;/code&gt;. The files in the &lt;a href=&quot;https://github.com/paperless-ngx/paperless-ngx/tree/main/docker/compose&quot;&gt;&lt;code&gt;/docker/compose&lt;/code&gt; directory&lt;/a&gt; are configured to pull the image from the GitHub container registry.&lt;/p&gt; 
&lt;p&gt;If you&#39;d like to jump right in, you can configure a &lt;code&gt;docker compose&lt;/code&gt; environment with our install script:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;bash -c &quot;$(curl -L https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/install-paperless-ngx.sh)&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;More details and step-by-step guides for alternative installation methods can be found in &lt;a href=&quot;https://docs.paperless-ngx.com/setup/#installation&quot;&gt;the documentation&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;Migrating from Paperless-ng is easy, just drop in the new docker image! See the &lt;a href=&quot;https://docs.paperless-ngx.com/setup/#migrating-to-paperless-ngx&quot;&gt;documentation on migrating&lt;/a&gt; for more details.&lt;/p&gt; 
&lt;!-- omit in toc --&gt; 
&lt;h3&gt;Documentation&lt;/h3&gt; 
&lt;p&gt;The documentation for Paperless-ngx is available at &lt;a href=&quot;https://docs.paperless-ngx.com/&quot;&gt;https://docs.paperless-ngx.com&lt;/a&gt;.&lt;/p&gt; 
&lt;h1&gt;Contributing&lt;/h1&gt; 
&lt;p&gt;If you feel like contributing to the project, please do! Bug fixes, enhancements, visual fixes etc. are always welcome. If you want to implement something big: Please start a discussion about that! The &lt;a href=&quot;https://docs.paperless-ngx.com/development/&quot;&gt;documentation&lt;/a&gt; has some basic information on how to get started.&lt;/p&gt; 
&lt;h2&gt;Community Support&lt;/h2&gt; 
&lt;p&gt;People interested in continuing the work on paperless-ngx are encouraged to reach out here on github and in the &lt;a href=&quot;https://matrix.to/#/%23paperless:matrix.org&quot;&gt;Matrix Room&lt;/a&gt;. If you would like to contribute to the project on an ongoing basis there are multiple &lt;a href=&quot;https://github.com/orgs/paperless-ngx/people&quot;&gt;teams&lt;/a&gt; (frontend, ci/cd, etc) that could use your help so please reach out!&lt;/p&gt; 
&lt;h2&gt;Translation&lt;/h2&gt; 
&lt;p&gt;Paperless-ngx is available in many languages that are coordinated on Crowdin. If you want to help out by translating paperless-ngx into your language, please head over to &lt;a href=&quot;https://crowdin.com/project/paperless-ngx&quot;&gt;https://crowdin.com/project/paperless-ngx&lt;/a&gt;, and thank you! More details can be found in &lt;a href=&quot;https://github.com/paperless-ngx/paperless-ngx/raw/main/CONTRIBUTING.md#translating-paperless-ngx&quot;&gt;CONTRIBUTING.md&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Feature Requests&lt;/h2&gt; 
&lt;p&gt;Feature requests can be submitted via &lt;a href=&quot;https://github.com/paperless-ngx/paperless-ngx/discussions/categories/feature-requests&quot;&gt;GitHub Discussions&lt;/a&gt;, you can search for existing ideas, add your own and vote for the ones you care about.&lt;/p&gt; 
&lt;h2&gt;Bugs&lt;/h2&gt; 
&lt;p&gt;For bugs please &lt;a href=&quot;https://github.com/paperless-ngx/paperless-ngx/issues&quot;&gt;open an issue&lt;/a&gt; or &lt;a href=&quot;https://github.com/paperless-ngx/paperless-ngx/discussions&quot;&gt;start a discussion&lt;/a&gt; if you have questions.&lt;/p&gt; 
&lt;h1&gt;Related Projects&lt;/h1&gt; 
&lt;p&gt;Please see &lt;a href=&quot;https://github.com/paperless-ngx/paperless-ngx/wiki/Related-Projects&quot;&gt;the wiki&lt;/a&gt; for a user-maintained list of related projects and software that is compatible with Paperless-ngx.&lt;/p&gt; 
&lt;h1&gt;Important Note&lt;/h1&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;Document scanners are typically used to scan sensitive documents like your social insurance number, tax records, invoices, etc. &lt;strong&gt;Paperless-ngx should never be run on an untrusted host&lt;/strong&gt; because information is stored in clear text without encryption. No guarantees are made regarding security (but we do try!) and you use the app at your own risk. &lt;strong&gt;The safest way to run Paperless-ngx is on a local server in your own home with backups in place&lt;/strong&gt;.&lt;/p&gt; 
&lt;/blockquote&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/7854edff4c25fcf3672f882b8f1b02146f91b03d85b1120749a3bed87b4f6e88/paperless-ngx/paperless-ngx" medium="image" />
      
    </item>
    
    <item>
      <title>harbor-framework/harbor</title>
      <link>https://github.com/harbor-framework/harbor</link>
      <description>&lt;p&gt;Framework for evaluating and improving agents&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;Harbor&lt;/h1&gt; 
&lt;p&gt;&lt;a href=&quot;https://discord.gg/6xWPKhGDbA&quot;&gt;&lt;img src=&quot;https://dcbadge.limes.pink/api/server/https://discord.gg/6xWPKhGDbA&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://harborframework.com/docs&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Docs-000000?style=for-the-badge&amp;amp;logo=mdbook&amp;amp;color=105864&quot; alt=&quot;Docs&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/harbor-framework/harbor-cookbook&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Cookbook-000000?style=for-the-badge&amp;amp;logo=mdbook&amp;amp;color=105864&quot; alt=&quot;Cookbook&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://doi.org/10.5281/zenodo.20953922&quot;&gt;&lt;img src=&quot;https://zenodo.org/badge/1032170083.svg?sanitize=true&quot; alt=&quot;DOI&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;Harbor is a framework from the creators of &lt;a href=&quot;https://www.tbench.ai&quot;&gt;Terminal-Bench&lt;/a&gt; for evaluating and optimizing agents and language models. You can use Harbor to:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Evaluate arbitrary agents like Claude Code, OpenHands, Codex CLI, and more.&lt;/li&gt; 
 &lt;li&gt;Build and share your own benchmarks and environments.&lt;/li&gt; 
 &lt;li&gt;Conduct experiments in thousands of environments in parallel through providers like Daytona, Modal, LangSmith, Blaxel, and Novita Sandbox.&lt;/li&gt; 
 &lt;li&gt;Generate rollouts for RL optimization.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Check out the &lt;a href=&quot;https://github.com/harbor-framework/harbor-cookbook&quot;&gt;Harbor Cookbook&lt;/a&gt; for end-to-end examples and guides.&lt;/p&gt; 
&lt;h2&gt;Installation&lt;/h2&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;uv tool install harbor
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;or&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install harbor
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Example: Running Terminal-Bench-2.0&lt;/h2&gt; 
&lt;p&gt;Harbor is the official harness for &lt;a href=&quot;https://github.com/laude-institute/terminal-bench-2&quot;&gt;Terminal-Bench-2.0&lt;/a&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;export ANTHROPIC_API_KEY=&amp;lt;YOUR-KEY&amp;gt; 
harbor run --dataset terminal-bench@2.0 \
   --agent claude-code \
   --model anthropic/claude-opus-4-1 \
   --n-concurrent 4 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This will launch the benchmark locally using Docker. To run it on a cloud provider (like Daytona) pass the &lt;code&gt;--env&lt;/code&gt; flag as below:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;export ANTHROPIC_API_KEY=&amp;lt;YOUR-KEY&amp;gt; 
export DAYTONA_API_KEY=&amp;lt;YOUR-KEY&amp;gt;
harbor run --dataset terminal-bench@2.0 \
   --agent claude-code \
   --model anthropic/claude-opus-4-1 \
   --n-concurrent 100 \
   --env daytona
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To see all supported agents, and other options run:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;harbor run --help
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To explore all supported third party benchmarks (like SWE-Bench and Aider Polyglot) run:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;harbor datasets list
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To evaluate an agent and model one of these datasets, you can use the following command:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;harbor run -d &quot;&amp;lt;dataset@version&amp;gt;&quot; -m &quot;&amp;lt;model&amp;gt;&quot; -a &quot;&amp;lt;agent&amp;gt;&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Citation&lt;/h2&gt; 
&lt;p&gt;If you use &lt;strong&gt;Harbor&lt;/strong&gt; in academic work, please cite it using the “Cite this repository” button on GitHub or the following BibTeX entry:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bibtex&quot;&gt;@software{Harbor_Framework,
author = {{Harbor Framework Team}},
title = {{Harbor: A framework for evaluating and optimizing agents and models in container environments}},
year = {2026},
version = {v0.16.1},
doi = {10.5281/zenodo.20953922},
url = {https://doi.org/10.5281/zenodo.20953922}
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The DOI above is the &lt;strong&gt;concept DOI&lt;/strong&gt;, which always resolves to the latest release and aggregates citations across all versions. To cite a specific version instead, use that version&#39;s DOI from the &lt;a href=&quot;https://doi.org/10.5281/zenodo.20953922&quot;&gt;Zenodo record&lt;/a&gt;.&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/27000af3d483e59656f38786312872b20953df4f548a02356e16bc6ad6346d3e/harbor-framework/harbor" medium="image" />
      
    </item>
    
    <item>
      <title>dottxt-ai/outlines</title>
      <link>https://github.com/dottxt-ai/outlines</link>
      <description>&lt;p&gt;Structured Outputs&lt;/p&gt;&lt;hr&gt;&lt;div align=&quot;center&quot; style=&quot;margin-bottom: 1em;&quot;&gt; 
 &lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/dottxt-ai/outlines/main/docs/assets/images/logo-light-mode.svg#gh-light-mode-only&quot; alt=&quot;Outlines Logo&quot; width=&quot;300&quot; /&gt; &lt;img src=&quot;https://raw.githubusercontent.com/dottxt-ai/outlines/main/docs/assets/images/logo-dark-mode.svg#gh-dark-mode-only&quot; alt=&quot;Outlines Logo&quot; width=&quot;300&quot; /&gt;&lt;/p&gt; 
 &lt;p&gt;🗒️ &lt;em&gt;Structured outputs for LLMs&lt;/em&gt; 🗒️&lt;/p&gt; 
 &lt;p&gt;Made with ❤👷️ by the team at &lt;a href=&quot;https://dottxt.co&quot;&gt;.txt&lt;/a&gt; &lt;br /&gt;Trusted by NVIDIA, Cohere, HuggingFace, vLLM, etc.&lt;/p&gt; 
 &lt;!-- Project Badges --&gt; 
 &lt;p&gt;&lt;a href=&quot;https://pypi.org/project/outlines/&quot;&gt;&lt;img src=&quot;https://img.shields.io/pypi/v/outlines?style=flat-square&amp;amp;logoColor=white&amp;amp;color=ddb8ca&quot; alt=&quot;PyPI Version&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://pypistats.org/packages/outlines&quot;&gt;&lt;img src=&quot;https://img.shields.io/pypi/dm/outlines?color=A6B4A3&amp;amp;logo=python&amp;amp;logoColor=white&amp;amp;style=flat-square&quot; alt=&quot;Downloads&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/dottxt-ai/outlines/stargazers&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/dottxt-ai/outlines?style=flat-square&amp;amp;logo=github&amp;amp;color=BD932F&amp;amp;logoColor=white&quot; alt=&quot;Stars&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
 &lt;!-- Community Badges --&gt; 
 &lt;p&gt;&lt;a href=&quot;https://discord.gg/R9DSu34mGd&quot;&gt;&lt;img src=&quot;https://img.shields.io/discord/1182316225284554793?color=ddb8ca&amp;amp;logo=discord&amp;amp;logoColor=white&amp;amp;style=flat-square&quot; alt=&quot;Discord&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://blog.dottxt.co/&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/dottxt%20blog-a6b4a3&quot; alt=&quot;Blog&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://x.com/dottxtai&quot;&gt;&lt;img src=&quot;https://img.shields.io/twitter/follow/dottxtai?style=flat-square&amp;amp;logo=x&amp;amp;logoColor=white&amp;amp;color=bd932f&quot; alt=&quot;Twitter&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;br /&gt;The .txt API is currently in early access. &lt;strong&gt;&lt;a href=&quot;https://h1xbpbfsf0w.typeform.com/to/fwQNWmS8?utm_source=github&amp;amp;utm_medium=organic&amp;amp;utm_campaign=outlines&quot;&gt;Request access here →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;/div&gt; 
&lt;h2&gt;🚀 Building the future of structured generation&lt;/h2&gt; 
&lt;p&gt;We&#39;re working with select partners to develop new interfaces to structured generation.&lt;/p&gt; 
&lt;p&gt;Need XML, FHIR, custom schemas or grammars? Let&#39;s talk.&lt;/p&gt; 
&lt;p&gt;Audit your schema: share one schema, we show you what breaks under generation, the constraints that fix it, and compliance rates before and after. Sign up &lt;a href=&quot;https://h1xbpbfsf0w.typeform.com/to/rtFUraA2?typeform&quot;&gt;here&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Table of Contents&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/dottxt-ai/outlines/main/#why-outlines&quot;&gt;Why Outlines?&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/dottxt-ai/outlines/main/#quickstart&quot;&gt;Quickstart&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/dottxt-ai/outlines/main/#real-world-examples&quot;&gt;Real-World Examples&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/dottxt-ai/outlines/main/#customer-support-triage&quot;&gt;🙋‍♂️ Customer Support Triage&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/dottxt-ai/outlines/main/#e-commerce-product-categorization&quot;&gt;📦 E-commerce Product Categorization&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/dottxt-ai/outlines/main/#parse-event-details-with-incomplete-data&quot;&gt;📊 Parse Event Details with Incomplete Data&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/dottxt-ai/outlines/main/#categorize-documents-into-predefined-types&quot;&gt;🗂️ Categorize Documents into Predefined Types&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/dottxt-ai/outlines/main/#schedule-a-meeting-with-function-calling&quot;&gt;📅 Schedule a Meeting with Function Calling&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/dottxt-ai/outlines/main/#dynamically-generate-prompts-with-re-usable-templates&quot;&gt;📝 Dynamically Generate Prompts with Re-usable Templates&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/dottxt-ai/outlines/main/#they-use-outlines&quot;&gt;They Use Outlines&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/dottxt-ai/outlines/main/#model-integrations&quot;&gt;Model Integrations&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/dottxt-ai/outlines/main/#core-features&quot;&gt;Core Features&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/dottxt-ai/outlines/main/#other-features&quot;&gt;Other Features&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/dottxt-ai/outlines/main/#about-txt&quot;&gt;About .txt&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/dottxt-ai/outlines/main/#community&quot;&gt;Community&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;div align=&quot;center&quot;&gt;
 &lt;img src=&quot;https://raw.githubusercontent.com/dottxt-ai/outlines/main/docs/assets/images/install.png&quot; width=&quot;300&quot; /&gt;
&lt;/div&gt; 
&lt;h2&gt;Why Outlines?&lt;/h2&gt; 
&lt;p&gt;LLMs are powerful but their outputs are unpredictable. Most solutions attempt to fix bad outputs after generation using parsing, regex, or fragile code that breaks easily.&lt;/p&gt; 
&lt;p&gt;Outlines guarantees structured outputs during generation — directly from any LLM.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Works with any model&lt;/strong&gt; - Same code runs across OpenAI, Ollama, vLLM, and more&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Simple integration&lt;/strong&gt; - Just pass your desired output type: &lt;code&gt;model(prompt, output_type)&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Guaranteed valid structure&lt;/strong&gt; - No more parsing headaches or broken JSON&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Provider independence&lt;/strong&gt; - Switch models without changing code&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;The Outlines Philosophy&lt;/h3&gt; 
&lt;div align=&quot;center&quot;&gt;
 &lt;img src=&quot;https://raw.githubusercontent.com/dottxt-ai/outlines/main/docs/assets/images/use_philosophy.png&quot; width=&quot;300&quot; /&gt;
&lt;/div&gt; 
&lt;p&gt;Outlines follows a simple pattern that mirrors Python&#39;s own type system. Simply specify the desired output type, and Outlines will ensure your data matches that structure exactly:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;For a yes/no response, use &lt;code&gt;Literal[&quot;Yes&quot;, &quot;No&quot;]&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;For numerical values, use &lt;code&gt;int&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;For complex objects, define a structure with a &lt;a href=&quot;https://docs.pydantic.dev/latest/&quot;&gt;Pydantic model&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Quickstart&lt;/h2&gt; 
&lt;p&gt;Getting started with outlines is simple:&lt;/p&gt; 
&lt;h3&gt;1. Install outlines&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;pip install outlines
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;2. Connect to your preferred model&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import outlines
from transformers import AutoTokenizer, AutoModelForCausalLM


MODEL_NAME = &quot;microsoft/Phi-3-mini-4k-instruct&quot;
model = outlines.from_transformers(
    AutoModelForCausalLM.from_pretrained(MODEL_NAME, device_map=&quot;auto&quot;),
    AutoTokenizer.from_pretrained(MODEL_NAME)
)
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;3. Start with simple structured outputs&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from typing import Literal
from pydantic import BaseModel


# Simple classification
sentiment = model(
    &quot;Analyze: &#39;This product completely changed my life!&#39;&quot;,
    Literal[&quot;Positive&quot;, &quot;Negative&quot;, &quot;Neutral&quot;]
)
print(sentiment)  # &quot;Positive&quot;

# Extract specific types
temperature = model(&quot;What&#39;s the boiling point of water in Celsius?&quot;, int)
print(temperature)  # 100
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;4. Create complex structures&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from pydantic import BaseModel
from enum import Enum

class Rating(Enum):
    poor = 1
    fair = 2
    good = 3
    excellent = 4

class ProductReview(BaseModel):
    rating: Rating
    pros: list[str]
    cons: list[str]
    summary: str

review = model(
    &quot;Review: The XPS 13 has great battery life and a stunning display, but it runs hot and the webcam is poor quality.&quot;,
    ProductReview,
    max_new_tokens=200,
)

review = ProductReview.model_validate_json(review)
print(f&quot;Rating: {review.rating.name}&quot;)  # &quot;Rating: good&quot;
print(f&quot;Pros: {review.pros}&quot;)           # &quot;Pros: [&#39;great battery life&#39;, &#39;stunning display&#39;]&quot;
print(f&quot;Summary: {review.summary}&quot;)     # &quot;Summary: Good laptop with great display but thermal issues&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Real-world examples&lt;/h2&gt; 
&lt;p&gt;Here are production-ready examples showing how Outlines solves common problems:&lt;/p&gt; 
&lt;details id=&quot;customer-support-triage&quot;&gt;
 &lt;summary&gt;&lt;b&gt;🙋‍♂️ Customer Support Triage&lt;/b&gt; &lt;br /&gt;This example shows how to convert a free-form customer email into a structured service ticket. By parsing attributes like priority, category, and escalation flags, the code enables automated routing and handling of support issues. &lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import outlines
from enum import Enum
from pydantic import BaseModel
from transformers import AutoTokenizer, AutoModelForCausalLM
from typing import List


MODEL_NAME = &quot;microsoft/Phi-3-mini-4k-instruct&quot;
model = outlines.from_transformers(
    AutoModelForCausalLM.from_pretrained(MODEL_NAME, device_map=&quot;auto&quot;),
    AutoTokenizer.from_pretrained(MODEL_NAME)
)


def alert_manager(ticket):
    print(&quot;Alert!&quot;, ticket)


class TicketPriority(str, Enum):
    low = &quot;low&quot;
    medium = &quot;medium&quot;
    high = &quot;high&quot;
    urgent = &quot;urgent&quot;

class ServiceTicket(BaseModel):
    priority: TicketPriority
    category: str
    requires_manager: bool
    summary: str
    action_items: List[str]


customer_email = &quot;&quot;&quot;
Subject: URGENT - Cannot access my account after payment

I paid for the premium plan 3 hours ago and still can&#39;t access any features.
I&#39;ve tried logging out and back in multiple times. This is unacceptable as I
have a client presentation in an hour and need the analytics dashboard.
Please fix this immediately or refund my payment.
&quot;&quot;&quot;

prompt = f&quot;&quot;&quot;
&amp;lt;|im_start|&amp;gt;user
Analyze this customer email:

{customer_email}
&amp;lt;|im_end|&amp;gt;
&amp;lt;|im_start|&amp;gt;assistant
&quot;&quot;&quot;

ticket = model(
    prompt,
    ServiceTicket,
    max_new_tokens=500
)

# Use structured data to route the ticket
ticket = ServiceTicket.model_validate_json(ticket)
if ticket.priority == &quot;urgent&quot; or ticket.requires_manager:
    alert_manager(ticket)
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;details id=&quot;e-commerce-product-categorization&quot;&gt;
 &lt;summary&gt;&lt;b&gt;📦 E-commerce product categorization&lt;/b&gt; &lt;br /&gt;This use case demonstrates how outlines can transform product descriptions into structured categorization data (e.g., main category, sub-category, and attributes) to streamline tasks such as inventory management. Each product description is processed automatically, reducing manual categorization overhead. &lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import outlines
from pydantic import BaseModel
from transformers import AutoTokenizer, AutoModelForCausalLM
from typing import List, Optional


MODEL_NAME = &quot;microsoft/Phi-3-mini-4k-instruct&quot;
model = outlines.from_transformers(
    AutoModelForCausalLM.from_pretrained(MODEL_NAME, device_map=&quot;auto&quot;),
    AutoTokenizer.from_pretrained(MODEL_NAME)
)


def update_inventory(product, category, sub_category):
    print(f&quot;Updated {product.split(&#39;,&#39;)[0]} in category {category}/{sub_category}&quot;)


class ProductCategory(BaseModel):
    main_category: str
    sub_category: str
    attributes: List[str]
    brand_match: Optional[str]

# Process product descriptions in batches
product_descriptions = [
    &quot;Apple iPhone 15 Pro Max 256GB Titanium, 6.7-inch Super Retina XDR display with ProMotion&quot;,
    &quot;Organic Cotton T-Shirt, Men&#39;s Medium, Navy Blue, 100% Sustainable Materials&quot;,
    &quot;KitchenAid Stand Mixer, 5 Quart, Red, 10-Speed Settings with Dough Hook Attachment&quot;
]

template = outlines.Template.from_string(&quot;&quot;&quot;
&amp;lt;|im_start|&amp;gt;user
Categorize this product:

{{ description }}
&amp;lt;|im_end|&amp;gt;
&amp;lt;|im_start|&amp;gt;assistant
&quot;&quot;&quot;)

# Get structured categorization for all products
categories = model(
    [template(description=desc) for desc in product_descriptions],
    ProductCategory,
    max_new_tokens=200
)

# Use categorization for inventory management
categories = [
    ProductCategory.model_validate_json(category) for category in categories
]
for product, category in zip(product_descriptions, categories):
    update_inventory(product, category.main_category, category.sub_category)
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;details id=&quot;parse-event-details-with-incomplete-data&quot;&gt;
 &lt;summary&gt;&lt;b&gt;📊 Parse event details with incomplete data&lt;/b&gt; &lt;br /&gt;This example uses outlines to parse event descriptions into structured information (like event name, date, location, type, and topics), even handling cases where the data is incomplete. It leverages union types to return either structured event data or a fallback “I don’t know” answer, ensuring robust extraction in varying scenarios. &lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import outlines
from typing import Union, List, Literal
from pydantic import BaseModel
from enum import Enum
from transformers import AutoTokenizer, AutoModelForCausalLM


MODEL_NAME = &quot;microsoft/Phi-3-mini-4k-instruct&quot;
model = outlines.from_transformers(
    AutoModelForCausalLM.from_pretrained(MODEL_NAME, device_map=&quot;auto&quot;),
    AutoTokenizer.from_pretrained(MODEL_NAME)
)

class EventType(str, Enum):
    conference = &quot;conference&quot;
    webinar = &quot;webinar&quot;
    workshop = &quot;workshop&quot;
    meetup = &quot;meetup&quot;
    other = &quot;other&quot;


class EventInfo(BaseModel):
    &quot;&quot;&quot;Structured information about a tech event&quot;&quot;&quot;
    name: str
    date: str
    location: str
    event_type: EventType
    topics: List[str]
    registration_required: bool

# Create a union type that can either be a structured EventInfo or &quot;I don&#39;t know&quot;
EventResponse = Union[EventInfo, Literal[&quot;I don&#39;t know&quot;]]

# Sample event descriptions
event_descriptions = [
    # Complete information
    &quot;&quot;&quot;
    Join us for DevCon 2023, the premier developer conference happening on November 15-17, 2023
    at the San Francisco Convention Center. Topics include AI/ML, cloud infrastructure, and web3.
    Registration is required.
    &quot;&quot;&quot;,

    # Insufficient information
    &quot;&quot;&quot;
    Tech event next week. More details coming soon!
    &quot;&quot;&quot;
]

# Process events
results = []
for description in event_descriptions:
    prompt = f&quot;&quot;&quot;
&amp;lt;|im_start&amp;gt;system
You are a helpful assistant
&amp;lt;|im_end|&amp;gt;
&amp;lt;|im_start&amp;gt;user
Extract structured information about this tech event:

{description}

If there is enough information, return a JSON object with the following fields:

- name: The name of the event
- date: The date where the event is taking place
- location: Where the event is taking place
- event_type: either &#39;conference&#39;, &#39;webinar&#39;, &#39;workshop&#39;, &#39;meetup&#39; or &#39;other&#39;
- topics: a list of topics of the conference
- registration_required: a boolean that indicates whether registration is required

If the information available does not allow you to fill this JSON, and only then, answer &#39;I don&#39;t know&#39;.
&amp;lt;|im_end|&amp;gt;
&amp;lt;|im_start|&amp;gt;assistant
&quot;&quot;&quot;
    # Union type allows the model to return structured data or &quot;I don&#39;t know&quot;
    result = model(prompt, EventResponse, max_new_tokens=200)
    results.append(result)

# Display results
for i, result in enumerate(results):
    print(f&quot;Event {i+1}:&quot;)
    if isinstance(result, str):
        print(f&quot;  {result}&quot;)
    else:
        # It&#39;s an EventInfo object
        print(f&quot;  Name: {result.name}&quot;)
        print(f&quot;  Type: {result.event_type}&quot;)
        print(f&quot;  Date: {result.date}&quot;)
        print(f&quot;  Topics: {&#39;, &#39;.join(result.topics)}&quot;)
    print()

# Use structured data in downstream processing
structured_count = sum(1 for r in results if isinstance(r, EventInfo))
print(f&quot;Successfully extracted data for {structured_count} of {len(results)} events&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;details id=&quot;categorize-documents-into-predefined-types&quot;&gt;
 &lt;summary&gt;&lt;b&gt;🗂️ Categorize documents into predefined types&lt;/b&gt; &lt;br /&gt;In this case, outlines classifies documents into predefined categories (e.g., “Financial Report,” “Legal Contract”) using a literal type specification. The resulting classifications are displayed in both a table format and through a category distribution summary, illustrating how structured outputs can simplify content management. &lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import outlines
from typing import Literal, List
import pandas as pd
from transformers import AutoTokenizer, AutoModelForCausalLM


MODEL_NAME = &quot;microsoft/Phi-3-mini-4k-instruct&quot;
model = outlines.from_transformers(
    AutoModelForCausalLM.from_pretrained(MODEL_NAME, device_map=&quot;auto&quot;),
    AutoTokenizer.from_pretrained(MODEL_NAME)
)


# Define classification categories using Literal
DocumentCategory = Literal[
    &quot;Financial Report&quot;,
    &quot;Legal Contract&quot;,
    &quot;Technical Documentation&quot;,
    &quot;Marketing Material&quot;,
    &quot;Personal Correspondence&quot;
]

# Sample documents to classify
documents = [
    &quot;Q3 Financial Summary: Revenue increased by 15% year-over-year to $12.4M. EBITDA margin improved to 23% compared to 19% in Q3 last year. Operating expenses...&quot;,

    &quot;This agreement is made between Party A and Party B, hereinafter referred to as &#39;the Parties&#39;, on this day of...&quot;,

    &quot;The API accepts POST requests with JSON payloads. Required parameters include &#39;user_id&#39; and &#39;transaction_type&#39;. The endpoint returns a 200 status code on success.&quot;
]

template = outlines.Template.from_string(&quot;&quot;&quot;
&amp;lt;|im_start|&amp;gt;user
Classify the following document into exactly one category among the following categories:
- Financial Report
- Legal Contract
- Technical Documentation
- Marketing Material
- Personal Correspondence

Document:
{{ document }}
&amp;lt;|im_end|&amp;gt;
&amp;lt;|im_start|&amp;gt;assistant
&quot;&quot;&quot;)

# Classify documents
def classify_documents(texts: List[str]) -&amp;gt; List[DocumentCategory]:
    results = []

    for text in texts:
        prompt = template(document=text)
        # The model must return one of the predefined categories
        category = model(prompt, DocumentCategory, max_new_tokens=200)
        results.append(category)

    return results

# Perform classification
classifications = classify_documents(documents)

# Create a simple results table
results_df = pd.DataFrame({
    &quot;Document&quot;: [doc[:50] + &quot;...&quot; for doc in documents],
    &quot;Classification&quot;: classifications
})

print(results_df)

# Count documents by category
category_counts = pd.Series(classifications).value_counts()
print(&quot;\nCategory Distribution:&quot;)
print(category_counts)
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary id=&quot;schedule-a-meeting-with-function-calling&quot;&gt;&lt;b&gt;📅 Schedule a meeting from requests with Function Calling&lt;/b&gt; &lt;br /&gt;This example demonstrates how outlines can interpret a natural language meeting request and translate it into a structured format matching a predefined function’s parameters. Once the meeting details are extracted (e.g., title, date, duration, attendees), they are used to automatically schedule the meeting. &lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import outlines
import json
from typing import List, Optional
from datetime import date
from transformers import AutoTokenizer, AutoModelForCausalLM


MODEL_NAME = &quot;microsoft/phi-4&quot;
model = outlines.from_transformers(
    AutoModelForCausalLM.from_pretrained(MODEL_NAME, device_map=&quot;auto&quot;),
    AutoTokenizer.from_pretrained(MODEL_NAME)
)


# Define a function with typed parameters
def schedule_meeting(
    title: str,
    date: date,
    duration_minutes: int,
    attendees: List[str],
    location: Optional[str] = None,
    agenda_items: Optional[List[str]] = None
):
    &quot;&quot;&quot;Schedule a meeting with the specified details&quot;&quot;&quot;
    # In a real app, this would create the meeting
    meeting = {
        &quot;title&quot;: title,
        &quot;date&quot;: date,
        &quot;duration_minutes&quot;: duration_minutes,
        &quot;attendees&quot;: attendees,
        &quot;location&quot;: location,
        &quot;agenda_items&quot;: agenda_items
    }
    return f&quot;Meeting &#39;{title}&#39; scheduled for {date} with {len(attendees)} attendees&quot;

# Natural language request
user_request = &quot;&quot;&quot;
I need to set up a product roadmap review with the engineering team for next
Tuesday at 2pm. It should last 90 minutes. Please invite john@example.com,
sarah@example.com, and the product team at product@example.com.
&quot;&quot;&quot;

# Outlines automatically infers the required structure from the function signature
prompt = f&quot;&quot;&quot;
&amp;lt;|im_start|&amp;gt;user
Extract the meeting details from this request:

{user_request}
&amp;lt;|im_end|&amp;gt;
&amp;lt;|im_start|&amp;gt;assistant
&quot;&quot;&quot;
meeting_params = model(prompt, schedule_meeting, max_new_tokens=200)

# The result is a dictionary matching the function parameters
meeting_params = json.loads(meeting_params)
print(meeting_params)

# Call the function with the extracted parameters
result = schedule_meeting(**meeting_params)
print(result)
# &quot;Meeting &#39;Product Roadmap Review&#39; scheduled for 2023-10-17 with 3 attendees&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;details&gt; 
 &lt;summary id=&quot;dynamically-generate-prompts-with-re-usable-templates&quot;&gt;&lt;b&gt;📝 Dynamically generate prompts with re-usable templates&lt;/b&gt; &lt;br /&gt;Using Jinja-based templates, this example shows how to generate dynamic prompts for tasks like sentiment analysis. It illustrates how to easily re-use and customize prompts—including few-shot learning strategies—for different content types while ensuring the outputs remain structured. &lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import outlines
from typing import List, Literal
from transformers import AutoTokenizer, AutoModelForCausalLM


MODEL_NAME = &quot;microsoft/phi-4&quot;
model = outlines.from_transformers(
    AutoModelForCausalLM.from_pretrained(MODEL_NAME, device_map=&quot;auto&quot;),
    AutoTokenizer.from_pretrained(MODEL_NAME)
)


# 1. Create a reusable template with Jinja syntax
sentiment_template = outlines.Template.from_string(&quot;&quot;&quot;
&amp;lt;|im_start&amp;gt;user
Analyze the sentiment of the following {{ content_type }}:

{{ text }}

Provide your analysis as either &quot;Positive&quot;, &quot;Negative&quot;, or &quot;Neutral&quot;.
&amp;lt;|im_end&amp;gt;
&amp;lt;|im_start&amp;gt;assistant
&quot;&quot;&quot;)

# 2. Generate prompts with different parameters
review = &quot;This restaurant exceeded all my expectations. Fantastic service!&quot;
prompt = sentiment_template(content_type=&quot;review&quot;, text=review)

# 3. Use the templated prompt with structured generation
result = model(prompt, Literal[&quot;Positive&quot;, &quot;Negative&quot;, &quot;Neutral&quot;])
print(result)  # &quot;Positive&quot;

# Templates can also be loaded from files
example_template = outlines.Template.from_file(&quot;templates/few_shot.txt&quot;)

# Use with examples for few-shot learning
examples = [
    (&quot;The food was cold&quot;, &quot;Negative&quot;),
    (&quot;The staff was friendly&quot;, &quot;Positive&quot;)
]
few_shot_prompt = example_template(examples=examples, query=&quot;Service was slow&quot;)
print(few_shot_prompt)
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;h2&gt;They use outlines&lt;/h2&gt; 
&lt;div align=&quot;center&quot;&gt; 
 &lt;img src=&quot;https://raw.githubusercontent.com/dottxt-ai/outlines/main/docs/assets/images/readme-light.png#gh-light-mode-only&quot; alt=&quot;Users Logo&quot; /&gt; 
 &lt;img src=&quot;https://raw.githubusercontent.com/dottxt-ai/outlines/main/docs/assets/images/readme-dark.png#gh-dark-mode-only&quot; alt=&quot;Users Logo&quot; /&gt; 
&lt;/div&gt; 
&lt;h2&gt;Model Integrations&lt;/h2&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Model type&lt;/th&gt; 
   &lt;th&gt;Description&lt;/th&gt; 
   &lt;th style=&quot;text-align:center&quot;&gt;Documentation&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Server Support&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;vLLM and Ollama&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://dottxt-ai.github.io/outlines/latest/features/models/&quot;&gt;Server Integrations →&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Local Model Support&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;transformers and llama.cpp&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://dottxt-ai.github.io/outlines/latest/features/models/&quot;&gt;Model Integrations →&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;API Support&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;OpenAI, Gemini, and &lt;a href=&quot;https://h1xbpbfsf0w.typeform.com/to/fwQNWmS8?utm_source=github&amp;amp;utm_medium=organic&amp;amp;utm_campaign=outlines&quot;&gt;Dottxt&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://dottxt-ai.github.io/outlines/latest/features/models/&quot;&gt;API Integrations →&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h2&gt;Core Features&lt;/h2&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Feature&lt;/th&gt; 
   &lt;th&gt;Description&lt;/th&gt; 
   &lt;th style=&quot;text-align:center&quot;&gt;Documentation&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Multiple Choices&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Constrain outputs to predefined options&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://dottxt-ai.github.io/outlines/latest/features/core/output_types/#multiple-choices&quot;&gt;Multiple Choices Guide →&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Function Calls&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Infer structure from function signatures&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://dottxt-ai.github.io/outlines/latest/features/core/output_types/#json-schemas&quot;&gt;Function Guide →&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;JSON/Pydantic&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Generate outputs matching JSON schemas&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://dottxt-ai.github.io/outlines/latest/features/core/output_types/#json-schemas&quot;&gt;JSON Guide →&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Regular Expressions&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Generate text following a regex pattern&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://dottxt-ai.github.io/outlines/latest/features/core/output_types/#regex-patterns&quot;&gt;Regex Guide →&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Grammars&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Enforce complex output structures&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://dottxt-ai.github.io/outlines/latest/features/core/output_types/#context-free-grammars&quot;&gt;Grammar Guide →&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h2&gt;Other Features&lt;/h2&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Feature&lt;/th&gt; 
   &lt;th&gt;Description&lt;/th&gt; 
   &lt;th style=&quot;text-align:center&quot;&gt;Documentation&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Prompt templates&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Separate complex prompts from code&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://dottxt-ai.github.io/outlines/latest/features/utility/template/&quot;&gt;Template Guide →&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Custome types&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Intuitive interface to build complex types&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://dottxt-ai.github.io/outlines/latest/features/core/output_types/#basic-python-types&quot;&gt;Python Types Guide →&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Applications&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Encapsulate templates and types into functions&lt;/td&gt; 
   &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;https://dottxt-ai.github.io/outlines/latest/features/utility/application/&quot;&gt;Application Guide →&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h2&gt;About .txt&lt;/h2&gt; 
&lt;div align=&quot;center&quot;&gt; 
 &lt;img src=&quot;https://raw.githubusercontent.com/dottxt-ai/outlines/main/docs/assets/images/dottxt-light.svg#gh-light-mode-only&quot; alt=&quot;dottxt logo&quot; width=&quot;100&quot; /&gt; 
 &lt;img src=&quot;https://raw.githubusercontent.com/dottxt-ai/outlines/main/docs/assets/images/dottxt-dark.svg#gh-dark-mode-only&quot; alt=&quot;dottxt logo&quot; width=&quot;100&quot; /&gt; 
&lt;/div&gt; 
&lt;p&gt;Outlines is developed and maintained by &lt;a href=&quot;https://dottxt.co&quot;&gt;.txt&lt;/a&gt;, a company dedicated to making LLMs more reliable for production applications.&lt;/p&gt; 
&lt;p&gt;Our focus is on advancing structured generation technology through:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;🧪 &lt;strong&gt;Cutting-edge Research&lt;/strong&gt;: We publish our findings on &lt;a href=&quot;http://blog.dottxt.co/performance-gsm8k.html&quot;&gt;structured generation&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;🚀 &lt;strong&gt;Enterprise-grade solutions&lt;/strong&gt;: You can license &lt;a href=&quot;https://docs.dottxt.co&quot;&gt;our enterprise-grade libraries&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;🧩 &lt;strong&gt;Open Source Collaboration&lt;/strong&gt;: We believe in building in public and contributing to the community&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Follow us on &lt;a href=&quot;https://twitter.com/dottxtai&quot;&gt;Twitter&lt;/a&gt; or check out our &lt;a href=&quot;https://blog.dottxt.co/&quot;&gt;blog&lt;/a&gt; to stay updated on our latest work in making LLMs more reliable.&lt;/p&gt; 
&lt;h2&gt;Community&lt;/h2&gt; 
&lt;div align=&quot;center&quot; style=&quot;margin-bottom: 1em;&quot;&gt; 
 &lt;p&gt;&lt;a href=&quot;https://github.com/dottxt-ai/outlines/graphs/contributors&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/contributors/dottxt-ai/outlines?style=flat-square&amp;amp;logo=github&amp;amp;logoColor=white&amp;amp;color=ECEFF4&quot; alt=&quot;Contributors&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/dottxt-ai/outlines/stargazers&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/dottxt-ai/outlines?style=flat-square&amp;amp;logo=github&amp;amp;color=BD932F&amp;amp;logoColor=white&quot; alt=&quot;Stars&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://pypistats.org/packages/outlines&quot;&gt;&lt;img src=&quot;https://img.shields.io/pypi/dm/outlines?color=A6B4A3&amp;amp;logo=python&amp;amp;logoColor=white&amp;amp;style=flat-square&quot; alt=&quot;Downloads&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://discord.gg/R9DSu34mGd&quot;&gt;&lt;img src=&quot;https://img.shields.io/discord/1182316225284554793?color=ddb8ca&amp;amp;logo=discord&amp;amp;logoColor=white&amp;amp;style=flat-square&quot; alt=&quot;Discord badge&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;/div&gt; 
&lt;ul&gt; 
 &lt;li&gt;💡 &lt;strong&gt;Have an idea?&lt;/strong&gt; Come chat with us on &lt;a href=&quot;https://discord.gg/R9DSu34mGd&quot;&gt;Discord&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;🐞 &lt;strong&gt;Found a bug?&lt;/strong&gt; Open an &lt;a href=&quot;https://github.com/dottxt-ai/outlines/issues&quot;&gt;issue&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;🧩 &lt;strong&gt;Want to contribute?&lt;/strong&gt; Consult our &lt;a href=&quot;https://dottxt-ai.github.io/outlines/latest/community/contribute/&quot;&gt;contribution guide&lt;/a&gt;.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Cite Outlines&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;@article{willard2023efficient,
  title={Efficient Guided Generation for Large Language Models},
  author={Willard, Brandon T and Louf, R{\&#39;e}mi},
  journal={arXiv preprint arXiv:2307.09702},
  year={2023}
}
&lt;/code&gt;&lt;/pre&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/e9286a633e40c3032d11167142392b12d4d8f69752de7730dc3cc1a562838c63/dottxt-ai/outlines" medium="image" />
      
    </item>
    
    <item>
      <title>livekit/agents</title>
      <link>https://github.com/livekit/agents</link>
      <description>&lt;p&gt;A framework for building realtime voice AI agents 🤖🎙️📹&lt;/p&gt;&lt;hr&gt;&lt;picture&gt; 
 &lt;source media=&quot;(prefers-color-scheme: dark)&quot; srcset=&quot;/.github/banner_dark.png&quot; /&gt; 
 &lt;source media=&quot;(prefers-color-scheme: light)&quot; srcset=&quot;/.github/banner_light.png&quot; /&gt; 
 &lt;img style=&quot;width:100%;&quot; alt=&quot;The LiveKit icon, the name of the repository and some sample code in the background.&quot; src=&quot;https://raw.githubusercontent.com/livekit/agents/main/.github/banner_light.png&quot; /&gt; 
&lt;/picture&gt; 
&lt;!--END_BANNER_IMAGE--&gt; 
&lt;br /&gt; 
&lt;p&gt;&lt;img src=&quot;https://img.shields.io/pypi/v/livekit-agents&quot; alt=&quot;PyPI - Version&quot; /&gt; &lt;a href=&quot;https://pepy.tech/projects/livekit-agents&quot;&gt;&lt;img src=&quot;https://static.pepy.tech/badge/livekit-agents/month&quot; alt=&quot;PyPI Downloads&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://livekit.io/join-slack&quot;&gt;&lt;img src=&quot;https://img.shields.io/endpoint?url=https%3A%2F%2Flivekit.io%2Fbadges%2Fslack&quot; alt=&quot;Slack community&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://twitter.com/livekit&quot;&gt;&lt;img src=&quot;https://img.shields.io/twitter/follow/livekit&quot; alt=&quot;Twitter Follow&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://deepwiki.com/livekit/agents&quot;&gt;&lt;img src=&quot;https://deepwiki.com/badge.svg?sanitize=true&quot; alt=&quot;Ask DeepWiki for understanding the codebase&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/livekit/livekit/raw/master/LICENSE&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/license/livekit/livekit&quot; alt=&quot;License&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;br /&gt; 
&lt;p&gt;Looking for the JS/TS library? Check out &lt;a href=&quot;https://github.com/livekit/agents-js&quot;&gt;AgentsJS&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;What is Agents?&lt;/h2&gt; 
&lt;!--BEGIN_DESCRIPTION--&gt; 
&lt;p&gt;The Agent Framework is designed for building realtime, programmable participants that run on servers. Use it to create conversational, multi-modal voice agents that can see, hear, and understand.&lt;/p&gt; 
&lt;!--END_DESCRIPTION--&gt; 
&lt;h2&gt;Features&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Flexible integrations&lt;/strong&gt;: A comprehensive ecosystem to mix and match the right STT, LLM, TTS, and Realtime API to suit your use case.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Integrated job scheduling&lt;/strong&gt;: Built-in task scheduling and distribution with &lt;a href=&quot;https://docs.livekit.io/agents/build/dispatch/&quot;&gt;dispatch APIs&lt;/a&gt; to connect end users to agents.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Extensive WebRTC clients&lt;/strong&gt;: Build client applications using LiveKit&#39;s open-source SDK ecosystem, supporting all major platforms.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Telephony integration&lt;/strong&gt;: Works seamlessly with LiveKit&#39;s &lt;a href=&quot;https://docs.livekit.io/sip/&quot;&gt;telephony stack&lt;/a&gt;, allowing your agent to make calls to or receive calls from phones.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Exchange data with clients&lt;/strong&gt;: Use &lt;a href=&quot;https://docs.livekit.io/home/client/data/rpc/&quot;&gt;RPCs&lt;/a&gt; and other &lt;a href=&quot;https://docs.livekit.io/home/client/data/&quot;&gt;Data APIs&lt;/a&gt; to seamlessly exchange data with clients.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Semantic turn detection&lt;/strong&gt;: Uses a transformer model to detect when a user is done with their turn, helps to reduce interruptions.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;MCP support&lt;/strong&gt;: Native support for MCP. Integrate tools provided by MCP servers with one line of code.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Builtin test framework&lt;/strong&gt;: Write tests and use judges to ensure your agent is performing as expected.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Open-source&lt;/strong&gt;: Fully open-source, allowing you to run the entire stack on your own servers, including &lt;a href=&quot;https://github.com/livekit/livekit&quot;&gt;LiveKit server&lt;/a&gt;, one of the most widely used WebRTC media servers.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Installation&lt;/h2&gt; 
&lt;p&gt;To install the core Agents library, along with plugins for popular model providers:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install &quot;livekit-agents[openai,deepgram,cartesia]&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Docs and guides&lt;/h2&gt; 
&lt;p&gt;Documentation on the framework and how to use it can be found &lt;a href=&quot;https://docs.livekit.io/agents/&quot;&gt;here&lt;/a&gt;&lt;/p&gt; 
&lt;h3&gt;Building with AI coding agents&lt;/h3&gt; 
&lt;p&gt;If you&#39;re using an AI coding assistant to build with LiveKit Agents, we recommend the following setup for the best results:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;&lt;strong&gt;Install the &lt;a href=&quot;https://docs.livekit.io/mcp&quot;&gt;LiveKit Docs MCP server&lt;/a&gt;&lt;/strong&gt; — Gives your coding agent access to up-to-date LiveKit documentation, code search across LiveKit repositories, and working examples.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;strong&gt;Install the &lt;a href=&quot;https://github.com/livekit/agent-skills&quot;&gt;LiveKit Agent Skill&lt;/a&gt;&lt;/strong&gt; — Provides your coding agent with architectural guidance and best practices for building voice AI applications, including workflow design, handoffs, tasks, and testing patterns.&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;npx skills add livekit/agent-skills --skill livekit-agents
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;The Agent Skill works best alongside the MCP server: the skill teaches your agent &lt;em&gt;how to approach&lt;/em&gt; building with LiveKit, while the MCP server provides the &lt;em&gt;current API details&lt;/em&gt; to implement it correctly.&lt;/p&gt; 
&lt;h2&gt;Core concepts&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;Agent: An LLM-based application with defined instructions.&lt;/li&gt; 
 &lt;li&gt;AgentSession: A container for agents that manages interactions with end users.&lt;/li&gt; 
 &lt;li&gt;entrypoint: The starting point for an interactive session, similar to a request handler in a web server.&lt;/li&gt; 
 &lt;li&gt;AgentServer: The main process that coordinates job scheduling and launches agents for user sessions.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Usage&lt;/h2&gt; 
&lt;h3&gt;Simple voice agent&lt;/h3&gt; 
&lt;hr /&gt; 
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from livekit.agents import (
    Agent,
    AgentServer,
    AgentSession,
    JobContext,
    RunContext,
    cli,
    function_tool,
    inference,
)


@function_tool
async def lookup_weather(
    context: RunContext,
    location: str,
):
    &quot;&quot;&quot;Used to look up weather information.&quot;&quot;&quot;

    return {&quot;weather&quot;: &quot;sunny&quot;, &quot;temperature&quot;: 70}


server = AgentServer()


@server.rtc_session()
async def entrypoint(ctx: JobContext):
    session = AgentSession(
        vad=inference.VAD(),
        # any combination of STT, LLM, TTS, or realtime API can be used
        # this example shows LiveKit Inference, a unified API to access different models via LiveKit Cloud
        # to use model provider keys directly, replace with the following:
        # from livekit.plugins import deepgram, openai, cartesia
        # stt=deepgram.STT(model=&quot;nova-3&quot;),
        # llm=openai.LLM(model=&quot;gpt-4.1-mini&quot;),
        # tts=cartesia.TTS(model=&quot;sonic-3&quot;, voice=&quot;9626c31c-bec5-4cca-baa8-f8ba9e84c8bc&quot;),
        stt=inference.STT(&quot;deepgram/nova-3&quot;, language=&quot;multi&quot;),
        llm=inference.LLM(&quot;google/gemma-4-31b-it&quot;),  # low-latency gemma, hosted on LiveKit
        tts=inference.TTS(&quot;cartesia/sonic-3&quot;, voice=&quot;9626c31c-bec5-4cca-baa8-f8ba9e84c8bc&quot;),
    )

    agent = Agent(
        instructions=&quot;You are a friendly voice assistant built by LiveKit.&quot;,
        tools=[lookup_weather],
    )

    await session.start(agent=agent, room=ctx.room)
    await session.generate_reply(instructions=&quot;greet the user and ask about their day&quot;)


if __name__ == &quot;__main__&quot;:
    cli.run_app(server)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;You&#39;ll need the following environment variables for this example:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;LIVEKIT_URL&lt;/li&gt; 
 &lt;li&gt;LIVEKIT_API_KEY&lt;/li&gt; 
 &lt;li&gt;LIVEKIT_API_SECRET&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Multi-agent handoff&lt;/h3&gt; 
&lt;hr /&gt; 
&lt;p&gt;This code snippet is abbreviated. For the full example, see &lt;a href=&quot;https://raw.githubusercontent.com/livekit/agents/main/examples/voice_agents/multi_agent.py&quot;&gt;multi_agent.py&lt;/a&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;...
class IntroAgent(Agent):
    def __init__(self) -&amp;gt; None:
        super().__init__(
            instructions=f&quot;You are a story teller. Your goal is to gather a few pieces of information from the user to make the story personalized and engaging.&quot;
            &quot;Ask the user for their name and where they are from&quot;
        )

    async def on_enter(self):
        self.session.generate_reply(instructions=&quot;greet the user and gather information&quot;)

    @function_tool
    async def information_gathered(
        self,
        context: RunContext,
        name: str,
        location: str,
    ):
        &quot;&quot;&quot;Called when the user has provided the information needed to make the story personalized and engaging.

        Args:
            name: The name of the user
            location: The location of the user
        &quot;&quot;&quot;

        context.userdata.name = name
        context.userdata.location = location

        story_agent = StoryAgent(name, location)
        return story_agent, &quot;Let&#39;s start the story!&quot;


class StoryAgent(Agent):
    def __init__(self, name: str, location: str) -&amp;gt; None:
        super().__init__(
            instructions=f&quot;You are a storyteller. Use the user&#39;s information in order to make the story personalized.&quot;
            f&quot;The user&#39;s name is {name}, from {location}&quot;,
            # override the default model, switching to Realtime API from standard LLMs
            llm=openai.realtime.RealtimeModel(voice=&quot;echo&quot;),
            chat_ctx=chat_ctx,
        )

    async def on_enter(self):
        self.session.generate_reply()


@server.rtc_session()
async def entrypoint(ctx: JobContext):
    userdata = StoryData()
    session = AgentSession[StoryData](
        vad=inference.VAD(),
        stt=&quot;deepgram/nova-3&quot;,
        llm=&quot;google/gemma-4-31b-it&quot;,  # low-latency gemma, hosted on LiveKit
        tts=&quot;cartesia/sonic-3:9626c31c-bec5-4cca-baa8-f8ba9e84c8bc&quot;,
        userdata=userdata,
    )

    await session.start(
        agent=IntroAgent(),
        room=ctx.room,
    )
...
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Testing&lt;/h3&gt; 
&lt;p&gt;Automated tests are essential for building reliable agents, especially with the non-deterministic behavior of LLMs. LiveKit Agents include native test integration to help you create dependable agents.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;@pytest.mark.asyncio
async def test_no_availability() -&amp;gt; None:
    llm = google.LLM()
    async with AgentSession(llm=llm) as sess:
        await sess.start(MyAgent())
        result = await sess.run(
            user_input=&quot;Hello, I need to place an order.&quot;
        )
        result.expect.skip_next_event_if(type=&quot;message&quot;, role=&quot;assistant&quot;)
        result.expect.next_event().is_function_call(name=&quot;start_order&quot;)
        result.expect.next_event().is_function_call_output()
        await (
            result.expect.next_event()
            .is_message(role=&quot;assistant&quot;)
            .judge(llm, intent=&quot;assistant should be asking the user what they would like&quot;)
        )

&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Examples&lt;/h2&gt; 
&lt;p&gt;For more examples and detailed setup instructions, see the &lt;a href=&quot;https://raw.githubusercontent.com/livekit/agents/main/examples/&quot;&gt;examples directory&lt;/a&gt;. For even more examples, see the &lt;a href=&quot;https://github.com/livekit-examples/python-agents-examples&quot;&gt;python-agents-examples&lt;/a&gt; repository.&lt;/p&gt; 
&lt;table&gt; 
 &lt;tbody&gt;
  &lt;tr&gt; 
   &lt;td width=&quot;50%&quot;&gt; &lt;h3&gt;🎙️ Starter Agent&lt;/h3&gt; &lt;p&gt;A starter agent optimized for voice conversations.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;https://raw.githubusercontent.com/livekit/agents/main/examples/voice_agents/basic_agent.py&quot;&gt;Code&lt;/a&gt; &lt;/p&gt; &lt;/td&gt; 
   &lt;td width=&quot;50%&quot;&gt; &lt;h3&gt;🔄 Multi-user push to talk&lt;/h3&gt; &lt;p&gt;Responds to multiple users in the room via push-to-talk.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;https://raw.githubusercontent.com/livekit/agents/main/examples/voice_agents/push_to_talk.py&quot;&gt;Code&lt;/a&gt; &lt;/p&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td width=&quot;50%&quot;&gt; &lt;h3&gt;🎵 Background audio&lt;/h3&gt; &lt;p&gt;Background ambient and thinking audio to improve realism.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;https://raw.githubusercontent.com/livekit/agents/main/examples/voice_agents/background_audio.py&quot;&gt;Code&lt;/a&gt; &lt;/p&gt; &lt;/td&gt; 
   &lt;td width=&quot;50%&quot;&gt; &lt;h3&gt;🛠️ Dynamic tool creation&lt;/h3&gt; &lt;p&gt;Creating function tools dynamically.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;https://raw.githubusercontent.com/livekit/agents/main/examples/voice_agents/dynamic_tool_creation.py&quot;&gt;Code&lt;/a&gt; &lt;/p&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td width=&quot;50%&quot;&gt; &lt;h3&gt;☎️ Outbound caller&lt;/h3&gt; &lt;p&gt;Agent that makes outbound phone calls&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;https://github.com/livekit-examples/outbound-caller-python&quot;&gt;Code&lt;/a&gt; &lt;/p&gt; &lt;/td&gt; 
   &lt;td width=&quot;50%&quot;&gt; &lt;h3&gt;📋 Structured output&lt;/h3&gt; &lt;p&gt;Using structured output from LLM to guide TTS tone.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;https://raw.githubusercontent.com/livekit/agents/main/examples/voice_agents/structured_output.py&quot;&gt;Code&lt;/a&gt; &lt;/p&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td width=&quot;50%&quot;&gt; &lt;h3&gt;🔌 MCP support&lt;/h3&gt; &lt;p&gt;Use tools from MCP servers&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;https://raw.githubusercontent.com/livekit/agents/main/examples/voice_agents/mcp&quot;&gt;Code&lt;/a&gt; &lt;/p&gt; &lt;/td&gt; 
   &lt;td width=&quot;50%&quot;&gt; &lt;h3&gt;💬 Text-only agent&lt;/h3&gt; &lt;p&gt;Skip voice altogether and use the same code for text-only integrations&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;https://raw.githubusercontent.com/livekit/agents/main/examples/other/text_only.py&quot;&gt;Code&lt;/a&gt; &lt;/p&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td width=&quot;50%&quot;&gt; &lt;h3&gt;📝 Multi-user transcriber&lt;/h3&gt; &lt;p&gt;Produce transcriptions from all users in the room&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;https://raw.githubusercontent.com/livekit/agents/main/examples/other/transcription/multi-user-transcriber.py&quot;&gt;Code&lt;/a&gt; &lt;/p&gt; &lt;/td&gt; 
   &lt;td width=&quot;50%&quot;&gt; &lt;h3&gt;🎥 Video avatars&lt;/h3&gt; &lt;p&gt;Add an AI avatar with Tavus, Bithuman, LemonSlice, and more&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;https://raw.githubusercontent.com/livekit/agents/main/examples/avatar_agents/&quot;&gt;Code&lt;/a&gt; &lt;/p&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td width=&quot;50%&quot;&gt; &lt;h3&gt;🍽️ Restaurant ordering and reservations&lt;/h3&gt; &lt;p&gt;Full example of an agent that handles calls for a restaurant.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;https://raw.githubusercontent.com/livekit/agents/main/examples/voice_agents/restaurant_agent.py&quot;&gt;Code&lt;/a&gt; &lt;/p&gt; &lt;/td&gt; 
   &lt;td width=&quot;50%&quot;&gt; &lt;h3&gt;👁️ Gemini Live vision&lt;/h3&gt; &lt;p&gt;Full example (including iOS app) of Gemini Live agent that can see.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;https://github.com/livekit-examples/vision-demo&quot;&gt;Code&lt;/a&gt; &lt;/p&gt; &lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt;
&lt;/table&gt; 
&lt;h2&gt;Running your agent&lt;/h2&gt; 
&lt;h3&gt;Testing in terminal&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;python myagent.py console
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Runs your agent in terminal mode, enabling local audio input and output for testing. This mode doesn&#39;t require external servers or dependencies and is useful for quickly validating behavior.&lt;/p&gt; 
&lt;h3&gt;Developing with LiveKit clients&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;python myagent.py dev
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Starts the agent server and enables hot reloading when files change. This mode allows each process to host multiple concurrent agents efficiently.&lt;/p&gt; 
&lt;p&gt;The agent connects to LiveKit Cloud or your self-hosted server. Set the following environment variables:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;LIVEKIT_URL&lt;/li&gt; 
 &lt;li&gt;LIVEKIT_API_KEY&lt;/li&gt; 
 &lt;li&gt;LIVEKIT_API_SECRET&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;You can connect using any LiveKit client SDK or telephony integration. To get started quickly, try the &lt;a href=&quot;https://agents-playground.livekit.io/&quot;&gt;Agents Playground&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;Running for production&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;python myagent.py start
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Runs the agent with production-ready optimizations.&lt;/p&gt; 
&lt;h2&gt;License&lt;/h2&gt; 
&lt;p&gt;The Agents framework is licensed under &lt;a href=&quot;https://raw.githubusercontent.com/livekit/agents/main/LICENSE&quot;&gt;Apache-2.0&lt;/a&gt;. The LiveKit turn detection models are licensed under the &lt;a href=&quot;https://raw.githubusercontent.com/livekit/agents/main/MODEL_LICENSE&quot;&gt;LiveKit Model License&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Contributing&lt;/h2&gt; 
&lt;p&gt;The Agents framework is under active development in a rapidly evolving field. We welcome and appreciate contributions of any kind, be it feedback, bugfixes, features, new plugins and tools, or better documentation. You can file issues under this repo, open a PR, or chat with us in the &lt;a href=&quot;https://docs.livekit.io/intro/community/&quot;&gt;LiveKit community&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;Development setup&lt;/h3&gt; 
&lt;p&gt;This project uses &lt;a href=&quot;https://docs.astral.sh/uv/&quot;&gt;uv&lt;/a&gt; for package management. To install dependencies for development:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;uv sync --all-extras --dev
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Examples&lt;/h3&gt; 
&lt;p&gt;This project includes many examples in the &lt;a href=&quot;https://raw.githubusercontent.com/livekit/agents/main/examples/&quot;&gt;&lt;code&gt;examples&lt;/code&gt;&lt;/a&gt; directory. To run them, create the file &lt;code&gt;examples/.env&lt;/code&gt; with credentials for LiveKit Server and any necessary model providers (see &lt;code&gt;examples/.env.example&lt;/code&gt;), then run:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;uv run examples/voice_agents/basic_agent.py dev
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;For more information, see the &lt;a href=&quot;https://raw.githubusercontent.com/livekit/agents/main/examples/README.md&quot;&gt;examples README&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;Tests&lt;/h3&gt; 
&lt;p&gt;Unit tests are in the &lt;code&gt;tests&lt;/code&gt; directory and can be run with:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;uv run pytest --unit
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Integration tests for each plugin require various API credentials and run automatically in GitHub CI for PRs submitted by project maintainers. See the &lt;a href=&quot;https://raw.githubusercontent.com/livekit/agents/main/.github/workflows/tests.yml&quot;&gt;tests workflow&lt;/a&gt; for details.&lt;/p&gt; 
&lt;h3&gt;Formatting&lt;/h3&gt; 
&lt;p&gt;This project uses &lt;a href=&quot;https://github.com/astral-sh/ruff&quot;&gt;ruff&lt;/a&gt; for formatting and linting:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;uv run ruff format
uv run ruff check --fix
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Documentation&lt;/h3&gt; 
&lt;p&gt;To generate docs locally with &lt;a href=&quot;https://github.com/pdoc3/pdoc&quot;&gt;pdoc&lt;/a&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;uv sync --all-extras --group docs
uv run --active pdoc --skip-errors --html --output-dir=docs livekit
&lt;/code&gt;&lt;/pre&gt; 
&lt;!--BEGIN_REPO_NAV--&gt; 
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;table&gt; 
 &lt;thead&gt;
  &lt;tr&gt;
   &lt;th colspan=&quot;2&quot;&gt;LiveKit Ecosystem&lt;/th&gt;
  &lt;/tr&gt;
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt;
   &lt;td&gt;Agents SDKs&lt;/td&gt;
   &lt;td&gt;&lt;b&gt;Python&lt;/b&gt; · &lt;a href=&quot;https://github.com/livekit/agents-js&quot;&gt;Node.js&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;&lt;/tr&gt; 
  &lt;tr&gt;
   &lt;td&gt;LiveKit SDKs&lt;/td&gt;
   &lt;td&gt;&lt;a href=&quot;https://github.com/livekit/client-sdk-js&quot;&gt;Browser&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit/client-sdk-swift&quot;&gt;Swift&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit/client-sdk-android&quot;&gt;Android&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit/client-sdk-flutter&quot;&gt;Flutter&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit/client-sdk-react-native&quot;&gt;React Native&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit/rust-sdks&quot;&gt;Rust&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit/node-sdks&quot;&gt;Node.js&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit/python-sdks&quot;&gt;Python&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit/client-sdk-unity&quot;&gt;Unity&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit/client-sdk-unity-web&quot;&gt;Unity (WebGL)&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit/client-sdk-esp32&quot;&gt;ESP32&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit/client-sdk-cpp&quot;&gt;C++&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;&lt;/tr&gt; 
  &lt;tr&gt;
   &lt;td&gt;Starter Apps&lt;/td&gt;
   &lt;td&gt;&lt;a href=&quot;https://github.com/livekit-examples/agent-starter-python&quot;&gt;Python Agent&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit-examples/agent-starter-node&quot;&gt;TypeScript Agent&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit-examples/agent-starter-react&quot;&gt;React App&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit-examples/agent-starter-swift&quot;&gt;SwiftUI App&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit-examples/agent-starter-android&quot;&gt;Android App&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit-examples/agent-starter-flutter&quot;&gt;Flutter App&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit-examples/agent-starter-react-native&quot;&gt;React Native App&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit-examples/agent-starter-embed&quot;&gt;Web Embed&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;&lt;/tr&gt; 
  &lt;tr&gt;
   &lt;td&gt;UI Components&lt;/td&gt;
   &lt;td&gt;&lt;a href=&quot;https://github.com/livekit/components-js&quot;&gt;React&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit/components-android&quot;&gt;Android Compose&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit/components-swift&quot;&gt;SwiftUI&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit/components-flutter&quot;&gt;Flutter&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;&lt;/tr&gt; 
  &lt;tr&gt;
   &lt;td&gt;Server APIs&lt;/td&gt;
   &lt;td&gt;&lt;a href=&quot;https://github.com/livekit/node-sdks&quot;&gt;Node.js&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit/server-sdk-go&quot;&gt;Golang&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit/server-sdk-ruby&quot;&gt;Ruby&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit/server-sdk-kotlin&quot;&gt;Java/Kotlin&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit/python-sdks&quot;&gt;Python&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit/rust-sdks&quot;&gt;Rust&lt;/a&gt; · &lt;a href=&quot;https://github.com/agence104/livekit-server-sdk-php&quot;&gt;PHP (community)&lt;/a&gt; · &lt;a href=&quot;https://github.com/pabloFuente/livekit-server-sdk-dotnet&quot;&gt;.NET (community)&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;&lt;/tr&gt; 
  &lt;tr&gt;
   &lt;td&gt;Resources&lt;/td&gt;
   &lt;td&gt;&lt;a href=&quot;https://docs.livekit.io&quot;&gt;Docs&lt;/a&gt; · &lt;a href=&quot;https://docs.livekit.io/mcp&quot;&gt;Docs MCP Server&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit/livekit-cli&quot;&gt;CLI&lt;/a&gt; · &lt;a href=&quot;https://cloud.livekit.io&quot;&gt;LiveKit Cloud&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;&lt;/tr&gt; 
  &lt;tr&gt;
   &lt;td&gt;LiveKit Server OSS&lt;/td&gt;
   &lt;td&gt;&lt;a href=&quot;https://github.com/livekit/livekit&quot;&gt;LiveKit server&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit/egress&quot;&gt;Egress&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit/ingress&quot;&gt;Ingress&lt;/a&gt; · &lt;a href=&quot;https://github.com/livekit/sip&quot;&gt;SIP&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;&lt;/tr&gt; 
  &lt;tr&gt;
   &lt;td&gt;Community&lt;/td&gt;
   &lt;td&gt;&lt;a href=&quot;https://community.livekit.io&quot;&gt;Developer Community&lt;/a&gt; · &lt;a href=&quot;https://livekit.io/join-slack&quot;&gt;Slack&lt;/a&gt; · &lt;a href=&quot;https://x.com/livekit&quot;&gt;X&lt;/a&gt; · &lt;a href=&quot;https://www.youtube.com/@livekit_io&quot;&gt;YouTube&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;!--END_REPO_NAV--&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/eb5e7cf814d937692e12dbd3116f1441a7047d6e8d2088361f5ef8fef2e61c05/livekit/agents" medium="image" />
      
    </item>
    
    <item>
      <title>PostHog/posthog</title>
      <link>https://github.com/PostHog/posthog</link>
      <description>&lt;p&gt;🦔 PostHog is the leading platform for building self-driving products. Our developer tools – AI observability, analytics, session replay, flags, experiments, error tracking, logs, and more – capture all the context agents need to diagnose problems, uncover opportunities, and ship fixes. Steer it all from Slack, web, desktop, or the MCP.&lt;/p&gt;&lt;hr&gt;&lt;p align=&quot;center&quot;&gt; &lt;img alt=&quot;posthoglogo&quot; src=&quot;https://user-images.githubusercontent.com/65415371/205059737-c8a4f836-4889-4654-902e-f302b187b6a0.png&quot; /&gt; &lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://posthog.com/contributors&quot;&gt;&lt;img alt=&quot;GitHub contributors&quot; src=&quot;https://img.shields.io/github/contributors/posthog/posthog&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://makeapullrequest.com&quot;&gt;&lt;img alt=&quot;PRs Welcome&quot; src=&quot;https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=shields&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;Docker Pulls&quot; src=&quot;https://img.shields.io/docker/pulls/posthog/posthog&quot; /&gt; &lt;a href=&quot;https://github.com/PostHog/posthog/commits/master&quot;&gt;&lt;img alt=&quot;GitHub commit activity&quot; src=&quot;https://img.shields.io/github/commit-activity/m/posthog/posthog&quot; /&gt; &lt;/a&gt; &lt;a href=&quot;https://github.com/PostHog/posthog/issues?q=is%3Aissue%20state%3Aclosed&quot;&gt;&lt;img alt=&quot;GitHub closed issues&quot; src=&quot;https://img.shields.io/github/issues-closed/posthog/posthog&quot; /&gt; &lt;/a&gt; &lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://posthog.com/docs&quot;&gt;Docs&lt;/a&gt; - &lt;a href=&quot;https://posthog.com/community&quot;&gt;Community&lt;/a&gt; - &lt;a href=&quot;https://posthog.com/roadmap&quot;&gt;Roadmap&lt;/a&gt; - &lt;a href=&quot;https://posthog.com/why&quot;&gt;Why PostHog?&lt;/a&gt; - &lt;a href=&quot;https://posthog.com/changelog&quot;&gt;Changelog&lt;/a&gt; - &lt;a href=&quot;https://github.com/PostHog/posthog/issues/new?assignees=&amp;amp;labels=bug&amp;amp;template=bug_report.yml&quot;&gt;Bug reports&lt;/a&gt; &lt;/p&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://www.youtube.com/watch?v=1FZji2L-LmM&quot;&gt; &lt;img src=&quot;https://res.cloudinary.com/dmukukwp6/image/upload/demo_thumb_68d0d8d56d&quot; alt=&quot;PostHog Demonstration&quot; /&gt; &lt;/a&gt; &lt;/p&gt; 
&lt;h2&gt;PostHog is the open source platform for building self-driving products&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://posthog.com/&quot;&gt;PostHog&lt;/a&gt; provides every tool you need to build a successful product, and captures all the context agents need to proactively diagnose problems, uncover opportunities, and ship fixes:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://posthog.com/docs/self-driving&quot;&gt;Self-driving mode&lt;/a&gt;: Turn signals in your product data (errors, rage clicks, failed queries, and more) into researched reports and pull requests you review and merge.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://posthog.com/product-analytics&quot;&gt;Product analytics&lt;/a&gt;: Autocapture or manually instrument event-based analytics to understand user behavior and analyze data with visualization or SQL.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://posthog.com/web-analytics&quot;&gt;Web analytics&lt;/a&gt;: Monitor web traffic and user sessions with a GA-like dashboard. Easily monitor conversion, web vitals, and revenue.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://posthog.com/session-replay&quot;&gt;Session replays&lt;/a&gt;: Watch real user sessions of interactions with your website or mobile app to diagnose issues and understand user behavior.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://posthog.com/feature-flags&quot;&gt;Feature flags&lt;/a&gt;: Safely roll out features to select users or cohorts with feature flags.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://posthog.com/experiments&quot;&gt;Experiments&lt;/a&gt;: Test changes and measure their statistical impact on goal metrics. Set up experiments with no-code too.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://posthog.com/error-tracking&quot;&gt;Error tracking&lt;/a&gt;: Track errors, get alerts, and resolve issues to improve your product.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://posthog.com/logs&quot;&gt;Logs&lt;/a&gt;: Ingest, search, and analyze log data alongside the rest of your product data.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://posthog.com/surveys&quot;&gt;Surveys&lt;/a&gt;: Ask anything with our collection of no-code survey templates, or build custom surveys with our survey builder.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://posthog.com/data-warehouse&quot;&gt;Data warehouse&lt;/a&gt;: Sync data from external tools like Stripe, Hubspot, your data warehouse, and more. Query it alongside your product data.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://posthog.com/cdp&quot;&gt;Data pipelines&lt;/a&gt;: Run custom filters and transformations on your incoming data. Send it to 25+ tools or any webhook in real time or batch export large amounts to your warehouse.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://posthog.com/docs/ai-observability&quot;&gt;AI observability&lt;/a&gt;: Capture traces, generations, latency, and cost for your LLM-powered app.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://posthog.com/docs/workflows&quot;&gt;Workflows&lt;/a&gt;: Create workflows that automate actions or send messages to your users.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;You can steer it all from &lt;a href=&quot;https://posthog.com/slack&quot;&gt;Slack&lt;/a&gt;, &lt;a href=&quot;https://posthog.com/ai&quot;&gt;web&lt;/a&gt;, desktop (&lt;a href=&quot;https://posthog.com/code&quot;&gt;PostHog Desktop&lt;/a&gt;), or your own editor via &lt;a href=&quot;https://posthog.com/mcp&quot;&gt;the MCP&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;Best of all, all of this is free to use with a &lt;a href=&quot;https://posthog.com/pricing&quot;&gt;generous monthly free tier&lt;/a&gt; for each tool. Get started by signing up for &lt;a href=&quot;https://us.posthog.com/signup&quot;&gt;PostHog Cloud US&lt;/a&gt; or &lt;a href=&quot;https://eu.posthog.com/signup&quot;&gt;PostHog Cloud EU&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Table of Contents&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/PostHog/posthog/master/#posthog-is-the-open-source-platform-for-building-self-driving-products&quot;&gt;PostHog is the open source platform for building self-driving products&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/PostHog/posthog/master/#table-of-contents&quot;&gt;Table of Contents&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/PostHog/posthog/master/#getting-started-with-posthog&quot;&gt;Getting started with PostHog&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/PostHog/posthog/master/#posthog-cloud-recommended&quot;&gt;PostHog Cloud (Recommended)&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/PostHog/posthog/master/#self-hosting-the-open-source-hobby-deploy-advanced&quot;&gt;Self-hosting the open-source hobby deploy (Advanced)&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/PostHog/posthog/master/#setting-up-posthog&quot;&gt;Setting up PostHog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/PostHog/posthog/master/#learning-more-about-posthog&quot;&gt;Learning more about PostHog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/PostHog/posthog/master/#contributing&quot;&gt;Contributing&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/PostHog/posthog/master/#open-source-vs-paid&quot;&gt;Open-source vs. paid&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/PostHog/posthog/master/#were-hiring&quot;&gt;We’re hiring!&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Getting started with PostHog&lt;/h2&gt; 
&lt;h3&gt;PostHog Cloud (Recommended)&lt;/h3&gt; 
&lt;p&gt;The fastest and most reliable way to get started with PostHog is signing up for free to&amp;nbsp;&lt;a href=&quot;https://us.posthog.com/signup&quot;&gt;PostHog Cloud&lt;/a&gt; or &lt;a href=&quot;https://eu.posthog.com/signup&quot;&gt;PostHog Cloud EU&lt;/a&gt;. Your first 1 million events, 5k recordings, 1M flag requests, 100k exceptions, and 1500 survey responses are free every month, after which you pay based on usage.&lt;/p&gt; 
&lt;h3&gt;Self-hosting the open-source hobby deploy (Advanced)&lt;/h3&gt; 
&lt;p&gt;If you want to self-host PostHog, you can deploy a hobby instance in one line on Linux with Docker (recommended 4GB memory):&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;/bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/posthog/posthog/HEAD/bin/deploy-hobby)&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Open source deployments should scale to approximately 100k events per month, after which we recommend &lt;a href=&quot;https://posthog.com/docs/migrate/migrate-to-cloud&quot;&gt;migrating to a PostHog Cloud&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;We &lt;em&gt;do not&lt;/em&gt; provide customer support or offer guarantees for open source deployments. See our &lt;a href=&quot;https://posthog.com/docs/self-host&quot;&gt;self-hosting docs&lt;/a&gt;, &lt;a href=&quot;https://posthog.com/docs/self-host/deploy/troubleshooting&quot;&gt;troubleshooting guide&lt;/a&gt;, and &lt;a href=&quot;https://posthog.com/docs/self-host/open-source/disclaimer&quot;&gt;disclaimer&lt;/a&gt; for more info.&lt;/p&gt; 
&lt;h2&gt;Setting up PostHog&lt;/h2&gt; 
&lt;p&gt;Once you&#39;ve got a PostHog instance, you can set it up by installing our &lt;a href=&quot;https://posthog.com/docs/getting-started/install?tab=snippet&quot;&gt;JavaScript web snippet&lt;/a&gt;, one of &lt;a href=&quot;https://posthog.com/docs/getting-started/install?tab=sdks&quot;&gt;our SDKs&lt;/a&gt;, or by &lt;a href=&quot;https://posthog.com/docs/getting-started/install?tab=api&quot;&gt;using our API&lt;/a&gt;. You can also connect &lt;a href=&quot;https://posthog.com/mcp&quot;&gt;the MCP&lt;/a&gt; to bring PostHog into Claude Code, Cursor, or any MCP-compatible agent.&lt;/p&gt; 
&lt;p&gt;We have SDKs and libraries for popular languages and frameworks like:&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Frontend&lt;/th&gt; 
   &lt;th&gt;Mobile&lt;/th&gt; 
   &lt;th&gt;Backend&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://posthog.com/docs/libraries/js&quot;&gt;JavaScript&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://posthog.com/docs/libraries/react-native&quot;&gt;React Native&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://posthog.com/docs/libraries/python&quot;&gt;Python&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://posthog.com/docs/libraries/next-js&quot;&gt;Next.js&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://posthog.com/docs/libraries/android&quot;&gt;Android&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://posthog.com/docs/libraries/node&quot;&gt;Node&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://posthog.com/docs/libraries/react&quot;&gt;React&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://posthog.com/docs/libraries/ios&quot;&gt;iOS&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://posthog.com/docs/libraries/php&quot;&gt;PHP&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://posthog.com/docs/libraries/vue-js&quot;&gt;Vue&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://posthog.com/docs/libraries/flutter&quot;&gt;Flutter&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href=&quot;https://posthog.com/docs/libraries/ruby&quot;&gt;Ruby&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;Beyond this, we have docs and guides for &lt;a href=&quot;https://posthog.com/docs/libraries/go&quot;&gt;Go&lt;/a&gt;, &lt;a href=&quot;https://posthog.com/docs/libraries/dotnet&quot;&gt;.NET/C#&lt;/a&gt;, &lt;a href=&quot;https://posthog.com/docs/libraries/django&quot;&gt;Django&lt;/a&gt;, &lt;a href=&quot;https://posthog.com/docs/libraries/angular&quot;&gt;Angular&lt;/a&gt;, &lt;a href=&quot;https://posthog.com/docs/libraries/wordpress&quot;&gt;WordPress&lt;/a&gt;, &lt;a href=&quot;https://posthog.com/docs/libraries/webflow&quot;&gt;Webflow&lt;/a&gt;, and more.&lt;/p&gt; 
&lt;p&gt;Once you&#39;ve installed PostHog, see our &lt;a href=&quot;https://posthog.com/docs/product-os&quot;&gt;product docs&lt;/a&gt; for more information on how to set up &lt;a href=&quot;https://posthog.com/docs/product-analytics/capture-events&quot;&gt;product analytics&lt;/a&gt;, &lt;a href=&quot;https://posthog.com/docs/web-analytics/getting-started&quot;&gt;web analytics&lt;/a&gt;, &lt;a href=&quot;https://posthog.com/docs/session-replay/how-to-watch-recordings&quot;&gt;session replays&lt;/a&gt;, &lt;a href=&quot;https://posthog.com/docs/feature-flags/creating-feature-flags&quot;&gt;feature flags&lt;/a&gt;, &lt;a href=&quot;https://posthog.com/docs/experiments/creating-an-experiment&quot;&gt;experiments&lt;/a&gt;, &lt;a href=&quot;https://posthog.com/docs/error-tracking/installation#setting-up-exception-autocapture&quot;&gt;error tracking&lt;/a&gt;, &lt;a href=&quot;https://posthog.com/docs/surveys/installation&quot;&gt;surveys&lt;/a&gt;, &lt;a href=&quot;https://posthog.com/docs/cdp/sources&quot;&gt;data warehouse&lt;/a&gt;, and more.&lt;/p&gt; 
&lt;h2&gt;Learning more about PostHog&lt;/h2&gt; 
&lt;p&gt;Our code isn&#39;t the only thing that&#39;s open source 😳. We also open source our &lt;a href=&quot;https://posthog.com/handbook&quot;&gt;company handbook&lt;/a&gt; which details our &lt;a href=&quot;https://posthog.com/handbook/why-does-posthog-exist&quot;&gt;strategy&lt;/a&gt;, &lt;a href=&quot;https://posthog.com/handbook/company/culture&quot;&gt;ways of working&lt;/a&gt;, and &lt;a href=&quot;https://posthog.com/handbook/team-structure&quot;&gt;processes&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;Curious about how to make the most of PostHog? We wrote a guide to &lt;a href=&quot;https://posthog.com/docs/new-to-posthog/getting-hogpilled&quot;&gt;winning with PostHog&lt;/a&gt; which walks you through the basics of &lt;a href=&quot;https://posthog.com/docs/new-to-posthog/activation&quot;&gt;measuring activation&lt;/a&gt;, &lt;a href=&quot;https://posthog.com/docs/new-to-posthog/retention&quot;&gt;tracking retention&lt;/a&gt;, and &lt;a href=&quot;https://posthog.com/docs/new-to-posthog/revenue&quot;&gt;capturing revenue&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Contributing&lt;/h2&gt; 
&lt;p&gt;We ❤️ contributions big and small:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Vote on features or get early access to beta functionality in our &lt;a href=&quot;https://posthog.com/roadmap&quot;&gt;roadmap&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;Open a PR (see our instructions on &lt;a href=&quot;https://posthog.com/handbook/engineering/developing-locally&quot;&gt;developing PostHog locally&lt;/a&gt;)&lt;/li&gt; 
 &lt;li&gt;Submit a &lt;a href=&quot;https://github.com/PostHog/posthog/issues/new?assignees=&amp;amp;labels=enhancement%2C+feature&amp;amp;template=feature_request.yml&quot;&gt;feature request&lt;/a&gt; or &lt;a href=&quot;https://github.com/PostHog/posthog/issues/new?assignees=&amp;amp;labels=bug&amp;amp;template=bug_report.yml&quot;&gt;bug report&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;For an overview of the codebase structure, see &lt;a href=&quot;https://raw.githubusercontent.com/PostHog/posthog/master/docs/internal/monorepo-layout.md&quot;&gt;monorepo layout&lt;/a&gt; and &lt;a href=&quot;https://raw.githubusercontent.com/PostHog/posthog/master/products/README.md&quot;&gt;products&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Open-source vs. paid&lt;/h2&gt; 
&lt;p&gt;This repo is available under the &lt;a href=&quot;https://github.com/PostHog/posthog/raw/master/LICENSE&quot;&gt;MIT expat license&lt;/a&gt;, except for the &lt;code&gt;ee&lt;/code&gt; directory (which has its &lt;a href=&quot;https://github.com/PostHog/posthog/raw/master/ee/LICENSE&quot;&gt;license here&lt;/a&gt;) if applicable.&lt;/p&gt; 
&lt;p&gt;Need &lt;em&gt;absolutely 💯% FOSS&lt;/em&gt;? Check out our &lt;a href=&quot;https://github.com/PostHog/posthog-foss&quot;&gt;posthog-foss&lt;/a&gt; repository, which is purged of all proprietary code and features.&lt;/p&gt; 
&lt;p&gt;The pricing for our paid plan is completely transparent and available on &lt;a href=&quot;https://posthog.com/pricing&quot;&gt;our pricing page&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;We&#39;re hiring!&lt;/h2&gt; 
&lt;img src=&quot;https://res.cloudinary.com/dmukukwp6/image/upload/v1/posthog.com/src/components/Home/images/mission-control-hog&quot; alt=&quot;Hedgehog working on a Mission Control Center&quot; width=&quot;350px&quot; /&gt; 
&lt;p&gt;Hey! If you&#39;re reading this, you&#39;ve proven yourself as a dedicated README reader.&lt;/p&gt; 
&lt;p&gt;You might also make a great addition to our team. We&#39;re growing fast &lt;a href=&quot;https://posthog.com/careers&quot;&gt;and would love for you to join us&lt;/a&gt;.&lt;/p&gt;</description>
      
      <media:content url="https://repository-images.githubusercontent.com/235901813/1e37b11e-1d35-44f5-a821-557f32278c26" medium="image" />
      
    </item>
    
    <item>
      <title>AgriciDaniel/claude-seo</title>
      <link>https://github.com/AgriciDaniel/claude-seo</link>
      <description>&lt;p&gt;Universal SEO skill for Claude Code. 25 sub-skills + 18 sub-agents covering technical SEO, E-E-A-T, schema, GEO/AEO, backlinks, local SEO, maps intelligence, semantic clustering, e-commerce SEO, international SEO, Google APIs, and PDF/Excel reporting. Optional DataForSEO, Firecrawl, and Banana extensions.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/cover.svg?sanitize=true&quot; alt=&quot;Claude SEO cover: a Claude Code command palette with /seo audit, schema, geo, content, and backlinks commands over a dark CRT panel&quot; /&gt;&lt;/p&gt; 
&lt;h1&gt;Claude SEO: SEO Skill for Claude Code&lt;/h1&gt; 
&lt;p&gt;&lt;strong&gt;Claude SEO is an open-source SEO analysis plugin for &lt;a href=&quot;https://claude.ai/claude-code&quot;&gt;Claude Code&lt;/a&gt;.&lt;/strong&gt; It runs 25 sub-skills and 18 specialist agents in parallel across technical SEO, content quality (E-E-A-T), &lt;a href=&quot;http://Schema.org&quot;&gt;Schema.org&lt;/a&gt; markup, AI search optimization (GEO), local SEO, e-commerce, and international SEO. Every audit produces a prioritized action plan with testable recommendations grounded in primary-source guidance from Google.&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/AgriciDaniel/claude-seo/actions/workflows/ci.yml&quot;&gt;&lt;img src=&quot;https://github.com/AgriciDaniel/claude-seo/actions/workflows/ci.yml/badge.svg?sanitize=true&quot; alt=&quot;CI&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://claude.ai/claude-code&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Claude%20Code-Skill-blue&quot; alt=&quot;Claude Code Skill&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/LICENSE&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/License-MIT-yellow.svg?sanitize=true&quot; alt=&quot;License: MIT&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/AgriciDaniel/claude-seo/releases&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/v/release/AgriciDaniel/claude-seo&quot; alt=&quot;Version&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/tests/&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/tests-410%20passing-brightgreen&quot; alt=&quot;Tests&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.skool.com/ai-marketing-hub-pro&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/AI%20Marketing%20Hub-Pro%20community-purple&quot; alt=&quot;Community&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;Two versions of this skill.&lt;/strong&gt;&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;🌐 &lt;strong&gt;Public open-source&lt;/strong&gt; → &lt;a href=&quot;https://github.com/AgriciDaniel/claude-seo&quot;&gt;&lt;code&gt;AgriciDaniel/claude-seo&lt;/code&gt;&lt;/a&gt;: MIT, public releases, no membership. Use this if you want stable + downloadable.&lt;/li&gt; 
  &lt;li&gt;🔒 &lt;strong&gt;Community private mirror&lt;/strong&gt; → &lt;a href=&quot;https://github.com/AI-Marketing-Hub/claude-seo&quot;&gt;&lt;code&gt;AI-Marketing-Hub/claude-seo&lt;/code&gt;&lt;/a&gt;: early access to upcoming features and direct collaboration with the &lt;a href=&quot;https://www.skool.com/ai-marketing-hub-pro&quot;&gt;AI Marketing Hub Pro&lt;/a&gt; community. Requires membership.&lt;/li&gt; 
 &lt;/ul&gt; 
&lt;/blockquote&gt; 
&lt;h3&gt;Why Claude SEO&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;AI-search first.&lt;/strong&gt; Aligned with &lt;a href=&quot;https://developers.google.com/search/docs/fundamentals/ai-optimization-guide&quot;&gt;Google&#39;s AI Optimization Guide&lt;/a&gt;. Question-based citability scoring, primary-source evidence on llms.txt, IPTC &lt;code&gt;TrainedAlgorithmicMedia&lt;/code&gt; for AI-generated product images, agent-friendly page checks per &lt;a href=&quot;https://web.dev/&quot;&gt;web.dev&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Parallel execution.&lt;/strong&gt; Full site audits spawn up to 15 specialist agents simultaneously. Site-level audits complete in minutes rather than hours.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Falsifiable, not promotional.&lt;/strong&gt; Every recommendation carries the first-principle observation it rests on, its dependency relationships, an explicit &quot;how would we know this failed?&quot; check, and a leading indicator. See &lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#methodology&quot;&gt;Methodology&lt;/a&gt;.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Real results&lt;/h3&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/growth-3-months.png&quot; alt=&quot;Google Search Console clicks and impressions for a three-month-old site climbing from launch to steady organic growth between 23 March and 12 June 2026&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;Google Search Console for a site started 23 March 2026 and run on this workflow: total clicks and impressions across its first three months, through 12 June 2026.&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;Using Codex instead of Claude Code? Use &lt;a href=&quot;https://github.com/AgriciDaniel/codex-seo&quot;&gt;Codex SEO&lt;/a&gt;, the Codex-first port with TOML agents, plugin packaging, deterministic runners, and the same SEO workflow surface.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h2&gt;Who this is for&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;SEO agencies running 5+ client sites.&lt;/strong&gt; Replace quarterly deep audits with weekly automated runs. Same team capacity, 4× audit cadence, every recommendation comes with a falsifiability check the client can verify.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;In-house SEO leads at SaaS / publisher / e-commerce companies.&lt;/strong&gt; Second-pair-of-eyes before executive reviews. Catches what GSC and Lighthouse hide: schema deprecation, AI-citability gaps, expired-domain heritage risk, parasite-SEO exposure, machine-translation drift.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Freelance SEO consultants.&lt;/strong&gt; Anchor day-one client scope with a 15-minute audit and a real 0-100 score. Win the engagement with concrete proof of value before you spend an hour writing the proposal.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/screenshots/seo-command-demo.gif&quot; alt=&quot;Claude SEO /seo command demo in Claude Code terminal&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;Run a full audit and watch parallel agents fan out across the site:&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/screenshots/seo-audit-demo.gif&quot; alt=&quot;Claude SEO /seo audit demo: parallel subagents producing a prioritized action plan&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=COMnNlUakQk&quot;&gt;Watch the full demo on YouTube&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;Table of Contents&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#who-this-is-for&quot;&gt;Who this is for&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#installation&quot;&gt;Installation&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#quick-start&quot;&gt;Quick Start&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#commands&quot;&gt;Commands&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#features&quot;&gt;Features&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#compared-to-manual--agency--commercial-tools&quot;&gt;Compared to manual / agency / commercial tools&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#use-cases&quot;&gt;Use cases&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#sample-output&quot;&gt;Sample Output&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#architecture&quot;&gt;Architecture&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#methodology&quot;&gt;Methodology&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#whats-new-in-v2&quot;&gt;What&#39;s New in v2&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#limitations&quot;&gt;Limitations&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#requirements&quot;&gt;Requirements&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#uninstall&quot;&gt;Uninstall&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#extensions&quot;&gt;Extensions&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#ecosystem&quot;&gt;Ecosystem&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#documentation&quot;&gt;Documentation&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#faq&quot;&gt;FAQ&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#community-contributors&quot;&gt;Community Contributors&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#license&quot;&gt;License&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#contributing&quot;&gt;Contributing&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#author&quot;&gt;Author&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Installation&lt;/h2&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;ℹ️ &lt;strong&gt;Which version are you installing?&lt;/strong&gt;&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;strong&gt;Public open-source (default).&lt;/strong&gt; The commands below install from &lt;a href=&quot;https://github.com/AgriciDaniel/claude-seo&quot;&gt;&lt;code&gt;AgriciDaniel/claude-seo&lt;/code&gt;&lt;/a&gt; — MIT, public releases, no membership required.&lt;/li&gt; 
  &lt;li&gt;&lt;strong&gt;AI Marketing Hub Pro member?&lt;/strong&gt; Install the community version with early access instead: swap &lt;code&gt;AgriciDaniel/claude-seo&lt;/code&gt; for &lt;code&gt;AI-Marketing-Hub/claude-seo&lt;/code&gt; and the plugin slug &lt;code&gt;claude-seo@agricidaniel-claude-seo&lt;/code&gt; for &lt;code&gt;claude-seo@ai-marketing-hub-claude-seo&lt;/code&gt;. Requires &lt;code&gt;gh auth login&lt;/code&gt; (or PAT) with access to the &lt;code&gt;AI-Marketing-Hub&lt;/code&gt; org. If &lt;code&gt;/plugin marketplace add&lt;/code&gt; 404s, DM in the &lt;a href=&quot;https://www.skool.com/ai-marketing-hub-pro&quot;&gt;Skool community&lt;/a&gt; to get added.&lt;/li&gt; 
 &lt;/ul&gt; 
&lt;/blockquote&gt; 
&lt;h3&gt;Plugin Install (Claude Code 1.0.33+)&lt;/h3&gt; 
&lt;p&gt;The fastest path. One-time marketplace add, then plugin install:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;/plugin marketplace add AgriciDaniel/claude-seo
/plugin install claude-seo@agricidaniel-claude-seo
/seo setup
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The explicit setup step creates an isolated Python environment in Claude&#39;s persistent plugin data and installs Playwright Chromium. Check it at any time with &lt;code&gt;/seo doctor&lt;/code&gt;. No global Python packages or PATH shims are created.&lt;/p&gt; 
&lt;h3&gt;Manual Install (Unix / macOS / Linux)&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone --depth 1 https://github.com/AgriciDaniel/claude-seo.git
bash claude-seo/install.sh
&lt;/code&gt;&lt;/pre&gt; 
&lt;details&gt; 
 &lt;summary&gt;One-liner (curl, review then run)&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;curl -fsSL https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/install.sh &amp;gt; install.sh
cat install.sh        # review before running
bash install.sh
rm install.sh
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;h3&gt;Windows (PowerShell)&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;git clone --depth 1 https://github.com/AgriciDaniel/claude-seo.git
powershell -ExecutionPolicy Bypass -File claude-seo\install.ps1
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;Why &lt;code&gt;git clone&lt;/code&gt; instead of &lt;code&gt;irm | iex&lt;/code&gt;?&lt;/strong&gt; Claude Code&#39;s own security guardrails flag &lt;code&gt;irm ... | iex&lt;/code&gt; as a supply chain risk: downloading and executing remote code without verification. The &lt;code&gt;git clone&lt;/code&gt; approach lets you inspect &lt;code&gt;claude-seo\install.ps1&lt;/code&gt; before running it.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h2&gt;Quick Start&lt;/h2&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Start Claude Code
claude

# Full site audit: parallel sub-agents produce a prioritized action plan
/seo audit https://example.com

# Deep single-page analysis: on-page elements, content quality, schema
/seo page https://example.com/about

# Schema markup audit: detect, validate, generate
/seo schema https://example.com

# AI search optimization: passage citability + primary-source-aligned recommendations
/seo geo https://example.com

# Generate a sitemap with industry templates
/seo sitemap generate
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Commands&lt;/h2&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/sub-skills.svg?sanitize=true&quot; alt=&quot;Claude SEO sub-skill ecosystem: 25 modules grouped into 8 categories (audit, content, schema, technical, AI search, local + maps, commerce + intl, extensions) around the central orchestrator&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;32 user-invocable &lt;code&gt;/seo&lt;/code&gt; commands across the orchestrator, its sub-skills, and 8 MCP extensions. Full reference in &lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/docs/COMMANDS.md&quot;&gt;docs/COMMANDS.md&lt;/a&gt;.&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Command&lt;/th&gt; 
   &lt;th&gt;Description&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo setup&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Create or refresh the isolated Python runtime and Chromium&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo doctor&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Check runtime readiness without changing the system&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo audit &amp;lt;url&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Full website audit with parallel sub-agent delegation&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo page &amp;lt;url&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Deep single-page analysis&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo technical &amp;lt;url&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Technical SEO audit across 9 categories&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo content &amp;lt;url&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;E-E-A-T and content quality analysis&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo content-brief &amp;lt;topic&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Detailed content brief: target keywords, outline, internal links&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo schema &amp;lt;url&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Detect, validate, and generate &lt;a href=&quot;http://Schema.org&quot;&gt;Schema.org&lt;/a&gt; markup&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo geo &amp;lt;url&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;AI Overviews / Generative Engine Optimization&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo sitemap &amp;lt;url | generate&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Analyze or generate XML sitemaps&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo images &amp;lt;url&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Image optimization analysis&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo plan &amp;lt;type&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Strategic SEO planning (saas, local, ecommerce, publisher, agency)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo programmatic &amp;lt;url&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Programmatic SEO analysis and planning&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo competitor-pages &amp;lt;url&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Competitor comparison page generation&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo local &amp;lt;url&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Local SEO analysis (GBP, citations, reviews, map pack)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo maps [command]&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Maps intelligence (geo-grid, GBP audit, reviews, competitors)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo hreflang &amp;lt;url&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Hreflang / i18n SEO audit and generation&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo google [command]&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Google SEO APIs (GSC, PageSpeed, CrUX, Indexing, GA4, PDF reports)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo backlinks &amp;lt;url&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Backlink profile analysis (Moz, Bing, Common Crawl)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo cluster &amp;lt;keyword&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;SERP-based semantic clustering&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo sxo &amp;lt;url&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Search Experience Optimization (page-type, user stories, personas)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo drift baseline | compare | history &amp;lt;url&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;SEO drift monitoring with SQLite snapshots&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo ecommerce &amp;lt;url&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;E-commerce SEO and marketplace intelligence&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo flow [stage]&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;FLOW framework prompts (CC BY 4.0, evidence-led)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo firecrawl [command] &amp;lt;url&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Full-site crawling (extension)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo dataforseo [command]&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Live SEO data (extension)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo image-gen [use-case]&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;AI image generation for SEO assets (extension)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo ahrefs [command] &amp;lt;url&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Backlinks, organic keywords, and content data via the official Ahrefs MCP (extension)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo seranking [command]&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;AI Share-of-Voice across ChatGPT, Gemini, Perplexity, AI Overviews, AI Mode (extension)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo profound [command]&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;LLM citation tracking with time-series data (extension)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo bing [command] &amp;lt;url&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Bing Webmaster Tools + IndexNow URL submission (extension)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;code&gt;/seo unlighthouse &amp;lt;url&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td&gt;Multi-page Lighthouse runner, runs locally (extension)&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h2&gt;Features&lt;/h2&gt; 
&lt;h3&gt;What Core Web Vitals does Claude SEO check?&lt;/h3&gt; 
&lt;p&gt;Claude SEO measures the current three Core Web Vitals: &lt;strong&gt;LCP&lt;/strong&gt; (Largest Contentful Paint, target under 2.5s), &lt;strong&gt;INP&lt;/strong&gt; (Interaction to Next Paint, target under 200ms), and &lt;strong&gt;CLS&lt;/strong&gt; (Cumulative Layout Shift, target under 0.1). &lt;a href=&quot;https://web.dev/articles/inp&quot;&gt;INP replaced FID&lt;/a&gt; on March 12, 2024; FID was removed from Chrome&#39;s field-data tools (CrUX API, PageSpeed Insights) on September 9, 2024 (Lighthouse is a lab tool and never reported FID), and Claude SEO never references FID. Field data comes from the Chrome User Experience Report (CrUX) when available; lab data falls back to Lighthouse via PageSpeed Insights. LCP can be decomposed into subparts (TTFB, load delay, load duration, render delay) via the &lt;code&gt;/seo google&lt;/code&gt; CrUX integration to localize bottlenecks. Mobile and desktop are measured separately. CrUX History (25-week trend) is included in the Tier 0 free credential set.&lt;/p&gt; 
&lt;h3&gt;How does Claude SEO assess E-E-A-T?&lt;/h3&gt; 
&lt;p&gt;E-E-A-T (Experience, Expertise, Authoritativeness, Trustworthiness) is evaluated against the Search Quality Rater Guidelines, last updated September 2025 with YMYL expanded to include political and social topics. Experience signals: original research, case studies, first-hand photos. Expertise: author credentials and topical depth. Authoritativeness: external citations and brand mentions. Trustworthiness, the most heavily weighted of the four: contact info, secure HTTPS, transparent corrections, date stamps. Before scoring sub-factors, Claude SEO applies Google&#39;s own Who / How / Why heuristic from the &lt;a href=&quot;https://developers.google.com/search/docs/fundamentals/creating-helpful-content&quot;&gt;helpful-content guide&lt;/a&gt;. Generative AI content is fine if it meets Search Essentials; it crosses into spam when used to scale low-value pages, which &lt;code&gt;seo-content humanize&lt;/code&gt; and &lt;code&gt;seo-content verify&lt;/code&gt; are designed to detect.&lt;/p&gt; 
&lt;h3&gt;What &lt;a href=&quot;http://Schema.org&quot;&gt;Schema.org&lt;/a&gt; types does Claude SEO support?&lt;/h3&gt; 
&lt;p&gt;JSON-LD is the preferred format (Google&#39;s stated preference). Claude SEO detects, validates, and generates the active &lt;a href=&quot;http://Schema.org&quot;&gt;Schema.org&lt;/a&gt; types documented in &lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/skills/seo/references/schema-types.md&quot;&gt;skills/seo/references/schema-types.md&lt;/a&gt;, including organization, article, product, local, event, job, course, software/application, service, Q&amp;amp;A, and video patterns. FAQPage: Google stopped showing FAQ rich results for all sites on May 7, 2026; it has no Google rich-result benefit. Keep it only for non-Google or internal semantics if needed. Deprecated and never recommended: HowTo (rich results removed September 2023), SpecialAnnouncement (July 2025), ClaimReview, VehicleListing, EstimatedSalary, LearningVideo, CourseInfo carousel (all retired June 2025). Replacement guidance: &lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/skills/seo-schema/references/deprecated-types-2024-2026.md&quot;&gt;skills/seo-schema/references/deprecated-types-2024-2026.md&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;How does Claude SEO optimize for AI search?&lt;/h3&gt; 
&lt;p&gt;Aligned with &lt;a href=&quot;https://developers.google.com/search/docs/fundamentals/ai-optimization-guide&quot;&gt;Google&#39;s AI Optimization Guide&lt;/a&gt;, which states that &quot;AEO&quot; and &quot;GEO&quot; are rebranded labels for SEO. AI Overviews and AI Mode are grounded in the same ranking systems as classic Search; pages must be indexed and eligible for snippet display to appear in any AI feature. Claude SEO scores passage citability (optimal 134-167 word self-contained answer blocks), question-based heading hierarchy, attribution density, structured data coverage, and entity presence across Wikipedia, Reddit, YouTube, and LinkedIn. The &lt;code&gt;seo-geo&lt;/code&gt; skill includes evidence-based reframes of three popular myths: llms.txt is not currently a citation lever (&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/skills/seo-geo/references/llmstxt-evidence.md&quot;&gt;primary-source evidence&lt;/a&gt;), content chunking is not required, and AI-specific keyword rewriting is unnecessary because synonym understanding is sufficient.&lt;/p&gt; 
&lt;h3&gt;Which Google SEO APIs does Claude SEO integrate with?&lt;/h3&gt; 
&lt;p&gt;A 4-tier credential system lets you start with zero keys and add data as needed. Every tier delivers real value at its level:&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Tier&lt;/th&gt; 
   &lt;th&gt;Credentials&lt;/th&gt; 
   &lt;th&gt;APIs Unlocked&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;0&lt;/td&gt; 
   &lt;td&gt;API key&lt;/td&gt; 
   &lt;td&gt;PageSpeed Insights, CrUX, CrUX History (25-week trends)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;1&lt;/td&gt; 
   &lt;td&gt;+ OAuth or Service Account&lt;/td&gt; 
   &lt;td&gt;+ Search Console (queries, URL Inspection, sitemap status), Indexing API&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;2&lt;/td&gt; 
   &lt;td&gt;+ GA4 property config&lt;/td&gt; 
   &lt;td&gt;+ GA4 organic traffic, top landing pages, device / country breakdown&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;3&lt;/td&gt; 
   &lt;td&gt;+ Ads developer token&lt;/td&gt; 
   &lt;td&gt;+ Keyword Planner search volume and competition data&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;PDF reports are generated via &lt;a href=&quot;https://weasyprint.org/&quot;&gt;WeasyPrint&lt;/a&gt; (A4 layout) with matplotlib charts at 200 DPI. Run &lt;code&gt;/seo google setup&lt;/code&gt; for the credential wizard. All credentials live under &lt;code&gt;~/.config/claude-seo/&lt;/code&gt; with &lt;code&gt;0o600&lt;/code&gt; permissions; nothing is checked into the repo.&lt;/p&gt; 
&lt;h3&gt;How does Claude SEO handle local SEO?&lt;/h3&gt; 
&lt;p&gt;Three layers. &lt;strong&gt;Google Business Profile signals&lt;/strong&gt;: categories, hours, photos, posts, products, attributes. &lt;strong&gt;NAP consistency&lt;/strong&gt; across citations: name, address, phone matched against major directories with deviation flagging. &lt;strong&gt;Review intelligence&lt;/strong&gt;: rating trends, sentiment, response coverage. For multi-location businesses, Claude SEO enforces a 30-page warning threshold and a 50-page hard stop to prevent doorway-page violations (configurable). The &lt;code&gt;/seo maps&lt;/code&gt; workflow adds geo-grid rank tracking, GBP profile auditing, and competitor radius mapping. Local schema generation covers &lt;code&gt;LocalBusiness&lt;/code&gt; with all required and recommended properties (geo coordinates, opening hours, areaServed). Phase F (v2) added a GBP deprecation linter that detects retired chat-field references and &lt;code&gt;.business.site&lt;/code&gt; URLs.&lt;/p&gt; 
&lt;h2&gt;Compared to manual / agency / commercial tools&lt;/h2&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;&lt;/th&gt; 
   &lt;th&gt;Manual audit&lt;/th&gt; 
   &lt;th&gt;Agency engagement&lt;/th&gt; 
   &lt;th&gt;Commercial SEO audit tool&lt;/th&gt; 
   &lt;th&gt;&lt;strong&gt;Claude SEO&lt;/strong&gt;&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Time per audit&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;4-8 hrs senior SEO time&lt;/td&gt; 
   &lt;td&gt;1-3 weeks turnaround&lt;/td&gt; 
   &lt;td&gt;10-45 min crawl + report&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;10-15 min&lt;/strong&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;High (billable hours)&lt;/td&gt; 
   &lt;td&gt;$2k-$15k+ project&lt;/td&gt; 
   &lt;td&gt;$99-$999/mo subscription&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Free skill + Claude Code subscription&lt;/strong&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Repeatable&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Inconsistent across analysts&lt;/td&gt; 
   &lt;td&gt;Inconsistent across engagements&lt;/td&gt; 
   &lt;td&gt;Yes&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Yes, deterministic + scriptable&lt;/strong&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Output format&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Wall-of-findings PDF&lt;/td&gt; 
   &lt;td&gt;Branded slide deck&lt;/td&gt; 
   &lt;td&gt;Web dashboard, CSV exports&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Markdown + PDF + JSON, local files&lt;/strong&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Custom benchmarks&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Manual per analyst&lt;/td&gt; 
   &lt;td&gt;Agency-specific frameworks&lt;/td&gt; 
   &lt;td&gt;Vendor-fixed&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Edit local &lt;a href=&quot;http://SKILL.md&quot;&gt;SKILL.md&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Data leaves machine?&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;No (your spreadsheet)&lt;/td&gt; 
   &lt;td&gt;Yes (sent to agency)&lt;/td&gt; 
   &lt;td&gt;Yes (uploaded to vendor)&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;No, fully local by default&lt;/strong&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Lock-in&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;None&lt;/td&gt; 
   &lt;td&gt;High&lt;/td&gt; 
   &lt;td&gt;High (data-exit friction)&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;None. MIT, your files.&lt;/strong&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;AI search awareness&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Depends on analyst&lt;/td&gt; 
   &lt;td&gt;Depends on agency seniority&lt;/td&gt; 
   &lt;td&gt;Lagging (typically 6-12 mo behind)&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Google AI Optimization Guide (May 2026), Sept 2025 QRG, INP-not-FID, GEO/AEO=SEO reframe, llms.txt evidence-based posture&lt;/strong&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Falsifiability per finding&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;No&lt;/td&gt; 
   &lt;td&gt;No&lt;/td&gt; 
   &lt;td&gt;No&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Yes. Every recommendation carries a &quot;how would we know this failed?&quot; check + leading indicator&lt;/strong&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;Cost benchmarks: manual audit assumes a senior SEO consultant at typical agency billable rates; agency engagement based on common discovery/audit deliverable scopes; commercial-tool subscriptions reflect published mid-tier pricing across the SEO audit category (Ahrefs, Semrush, Sitebulb, Screaming Frog). Your numbers may differ.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h2&gt;Use cases&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;SEO agency lead running 10 client sites.&lt;/strong&gt; Replaces the quarterly &quot;deep audit&quot; ritual with a weekly Monday-morning &lt;code&gt;/seo audit&lt;/code&gt; run per site. Time to deliver a client health-score email drops from 4 hours to 12 minutes; coverage goes from quarterly to weekly without billing more hours. The drift baseline catches regressions between audits so the client conversation moves from &quot;look at this snapshot&quot; to &quot;here is what changed this week.&quot;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;In-house SEO lead at a 50-person SaaS company.&lt;/strong&gt; Runs &lt;code&gt;/seo audit&lt;/code&gt; 24 hours before each quarterly business review. Catches the items the platform UI buries (broken canonical chains on programmatic pages, schema deprecation after Google&#39;s June 2025 retirement wave, AI-citability gaps that erode SERP-to-AI-Overview pickup, expired-domain heritage on acquired blog assets) before the CMO asks why organic traffic is down in front of the board.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Freelance SEO consultant onboarding a new client.&lt;/strong&gt; Runs &lt;code&gt;/seo audit&lt;/code&gt; on the discovery call. Anchors the engagement scope with a real 0-100 score, 3 prioritized critical findings, and a falsifiability check on each recommendation, instead of a vague &quot;I&#39;ll take a look and get back to you.&quot; Closes more retainers because the proof of value happens during the call, not after the proposal.&lt;/p&gt; 
&lt;h2&gt;Sample Output&lt;/h2&gt; 
&lt;p&gt;Claude SEO writes real markdown reports as its primary deliverable. Below is the first ~50 lines of a &lt;code&gt;/seo schema https://rankenstein.pro/about&lt;/code&gt; audit verbatim. The actual structure, headers, and grading format the plugin produces follows.&lt;/p&gt; 
&lt;details&gt; 
 &lt;summary&gt;&lt;code&gt;SCHEMA-REPORT.md&lt;/code&gt;: first 50 lines of a real audit&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;# Schema Markup Report: rankenstein.pro/about

**URL:** https://rankenstein.pro/about
**Date:** 2026-02-09
**Format Detected:** JSON-LD (3 blocks) | No Microdata | No RDFa

---

## Summary

| Metric | Value |
|--------|-------|
| **JSON-LD Blocks** | 3 |
| **Schema Types** | Organization, WebSite, SoftwareApplication |
| **Critical Issues** | 2 |
| **Warnings** | 5 |
| **Passed Checks** | 18 |
| **Overall Grade** | B+ (solid foundation, actionable gaps) |

---

## Existing Schema Validation

### 1. Organization (`@id: #organization`)

| Property | Value | Status | Notes |
|----------|-------|--------|-------|
| `@context` | https://schema.org | Valid | |
| `@type` | Organization | Valid | Active type |
| `@id` | https://rankenstein.pro#organization | Good | Enables cross-referencing |
| `name` | Rankenstein | Valid | |
| `description` | Present, 200+ chars | Good | Descriptive and keyword-rich |
| `url` | https://rankenstein.pro | Valid | Absolute URL |
| `logo` | ImageObject with @id, url, width, height, caption | Excellent | Well-structured |
| `foundingDate` | &quot;2024&quot; | Imprecise | Year-only accepted but ISO 8601 preferred |
| `areaServed` | &quot;Worldwide&quot; | Text | Works but `GeoShape` is more semantic |
| `contactPoint` | email + contactType | Valid | Consider adding `telephone` |
| `founder` | 1 Person (Daniel Agrici) | Incomplete | Page describes two co-founders; second missing |
| `sameAs` | 5 social profiles | Good | GitHub, X, LinkedIn, YouTube, Reddit |
| `knowsAbout` | 6 topics | Good | Relevant topical signals |

**Critical Issue:** The `founder` property only includes Daniel Agrici. Benjamin Samar (Co-Founder &amp;amp; Technical Director) is displayed on the page but absent from the schema. This creates a content-schema mismatch that can confuse search engines.
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;p&gt;Other audit outputs follow the same shape: &lt;code&gt;FULL-AUDIT-REPORT.md&lt;/code&gt; (umbrella audit), &lt;code&gt;GEO-ANALYSIS.md&lt;/code&gt; (AI-search readiness), &lt;code&gt;LOCAL-SEO-ANALYSIS.md&lt;/code&gt; (GBP and citations), and a production PDF via WeasyPrint + matplotlib (cover, TOC, executive summary, data sections, recommendations, methodology, roughly 32 A4 pages for a full site audit).&lt;/p&gt; 
&lt;h2&gt;Architecture&lt;/h2&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/signal-flow.svg?sanitize=true&quot; alt=&quot;Claude SEO audit signal flow: /seo audit enters the orchestrator, fans out to 25 sub-skills and up to 15 parallel audit agents, and converges through the scoring engine into a prioritized report&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;The plugin follows the &lt;a href=&quot;https://docs.claude.com/en/docs/claude-code/skills&quot;&gt;Agent Skills standard&lt;/a&gt; with a 3-layer architecture (directive, orchestration, execution). Skills and agents are auto-discovered from &lt;code&gt;skills/seo-*/&lt;/code&gt; and &lt;code&gt;agents/seo-*.md&lt;/code&gt;. The orchestrator (&lt;code&gt;skills/seo/SKILL.md&lt;/code&gt;) handles industry detection (SaaS, local, ecommerce, publisher, agency), parallel sub-agent dispatch up to 15 simultaneously, and synthesis through the &lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#methodology&quot;&gt;10-principle framework&lt;/a&gt; before emitting the action plan. Full architecture: &lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/docs/ARCHITECTURE.md&quot;&gt;docs/ARCHITECTURE.md&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Methodology&lt;/h2&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/framework.svg?sanitize=true&quot; alt=&quot;Claude SEO 10-principle methodology: PERCEIVE, ANALYZE, VALIDATE, and ACT phases with 10 principles arranged by quadrant&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;Every audit walks 10 principles grouped into four phases. Each emitted recommendation carries four fields: the first-principle observation it rests on, its dependency relationship to other recommendations, a &quot;how would we know this failed?&quot; check, and a leading indicator to monitor.&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Phase&lt;/th&gt; 
   &lt;th&gt;Principles&lt;/th&gt; 
   &lt;th&gt;What it does&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;PERCEIVE&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;OBSERVE (external) · OBSERVE (internal) · LISTEN&lt;/td&gt; 
   &lt;td&gt;Collect raw signals; audit your own assumptions; read what the SERP, the brand voice, and the community actually say&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;ANALYZE&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;THINK · CONNECT (lateral) · CONNECT (system)&lt;/td&gt; 
   &lt;td&gt;Reduce to first principles; find non-obvious cross-skill links; sequence into a dependency graph&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;VALIDATE&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;FEEL · ACCEPT&lt;/td&gt; 
   &lt;td&gt;Pressure-test against UX, brand voice, operator capacity; surface falsifiability&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;ACT&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;CREATE · GROW&lt;/td&gt; 
   &lt;td&gt;Ship the artifact; set the feedback loop for the next audit&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;Full methodology: &lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/skills/seo/references/thinking-framework.md&quot;&gt;skills/seo/references/thinking-framework.md&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;What&#39;s New in v2&lt;/h2&gt; 
&lt;p&gt;v2.0.0 is the largest release in the plugin&#39;s history. Six build phases, all shipped:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Phase A: Headless rendering everywhere.&lt;/strong&gt; Shared &lt;code&gt;scripts/render_page.py&lt;/code&gt; with Playwright Chromium plus &lt;a href=&quot;https://github.com/adbar/trafilatura&quot;&gt;trafilatura&lt;/a&gt; and &lt;a href=&quot;https://github.com/adbar/htmldate&quot;&gt;htmldate&lt;/a&gt;. Every audit subagent gets SPA-aware fetching via &lt;code&gt;--render auto&lt;/code&gt; (auto-detected on Next.js, React, Vue, Nuxt, Astro islands). Closes the SPA limitation that capped v1.x.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Phase B: QRG-aligned content quality gates.&lt;/strong&gt; Filler detector and AI-pattern humanizer keyed to QRG §4.6.5 and §4.6.6, claim-verification scanner, expired-domain heritage check via WHOIS, primary-source Google updates changelog.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Phase C: Technical and CWV depth.&lt;/strong&gt; LCP subparts via CrUX (TTFB, load delay, load duration, render delay), Speculation Rules and bfcache detection, IndexNow submitter for Bing / Yandex / Seznam / Naver, Unlighthouse multi-page Lighthouse wrapper.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Phase D: Schema completeness.&lt;/strong&gt; Four explicit generators (Reservation, OrderAction, DiscussionForumPosting, ProfilePage), e-commerce schema validator (&lt;code&gt;hasMerchantReturnPolicy&lt;/code&gt;, &lt;code&gt;shippingDetails&lt;/code&gt;, &lt;code&gt;MemberProgram&lt;/code&gt;, EU &lt;code&gt;energyEfficiencyClass&lt;/code&gt;, ProductGroup variants), dual validator (Rich Results Test plus Schema Markup Validator).&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Phase E: AI search reframing and 5 new MCP extensions.&lt;/strong&gt; Ahrefs, SE Ranking (AI Share-of-Voice), Profound (LLM citation tracker), Bing Webmaster plus IndexNow, Unlighthouse. Plus the parasite-SEO risk scanner per Google&#39;s November 2024 &lt;a href=&quot;https://developers.google.com/search/blog/2024/11/site-reputation-abuse-update&quot;&gt;site reputation abuse policy&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Phase F: Local, international, and privacy polish.&lt;/strong&gt; Google Business Profile deprecation linter (chat field and &lt;code&gt;.business.site&lt;/code&gt; URLs, with Q&amp;amp;A treated as category/region-limited), DMA consent-mode-v2 click-through diagnostic, machine-translation QA flag per January 2025 QRG.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Test coverage grew from 39 (v1.9.9) to 410 across the v2 line; the url_safety suite alone runs 91 SSRF and DNS-rebinding bypass cases, closing the obfuscated-IPv4, FQDN-trailing-dot, and redirect-rebinding bypass classes. Full migration notes and breaking changes: &lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/docs/MIGRATION-v1-to-v2.md&quot;&gt;docs/MIGRATION-v1-to-v2.md&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;Since v2.0.0&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;v2.1.0 (May 2026): currency refresh.&lt;/strong&gt; May 2026 core update, Google I/O 2026 (custom version of Gemini 2.5 powers AI Mode), FAQ rich results retired 2026-05-07 (QAPage remains the type for genuine Q&amp;amp;A pages, FAQ markup itself just no longer yields rich results).&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;v2.2.0 (June 2026): security + portability.&lt;/strong&gt; Installer credential-injection fix, SSRF authority-confusion bypass closed, Google API keys moved to the &lt;code&gt;X-Goog-Api-Key&lt;/code&gt; header, secret-scan CI gate, Windows/macOS fixes; suite at 326.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;v2.2.1 (June 2026): Google-currency reconfirmation + full command audit.&lt;/strong&gt; Lighthouse 13.4.0 with the new Agentic Browsing category, Google Search ignores llms.txt, an internally-reweighted E-E-A-T scorecard (Trust highest, per Google&#39;s &#39;trust is most important&#39;); every &lt;code&gt;/seo&lt;/code&gt; command and subcommand audited and &lt;a href=&quot;http://COMMANDS.md&quot;&gt;COMMANDS.md&lt;/a&gt; brought to 100% coverage.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;v2.2.2 (July 2026): full-review maintenance.&lt;/strong&gt; Corrected GBP Q&amp;amp;A handling, AI Mode model naming, image-model IDs, hook input behavior, and added a strict reference-graph consistency gate.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;v2.2.3 (July 2026): prompt-hygiene alignment.&lt;/strong&gt; Normalized emphasis and punctuation across the prompt surface without changing behavior, routing, or output contracts.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;v2.2.4 (July 2026): community maintenance.&lt;/strong&gt; Added the managed cross-platform runtime and safe sitemap discovery, repaired GSC pagination and totals, replaced removed Bing endpoints, fixed extension and Windows portability gaps, and reconciled every open issue and pull request.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Limitations&lt;/h2&gt; 
&lt;p&gt;Two real boundaries worth being upfront about.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Heavy client-side hydration timing.&lt;/strong&gt; Phase A&#39;s headless renderer handles most SPAs out of the box (&lt;code&gt;--render auto&lt;/code&gt; detects empty &lt;code&gt;&amp;lt;div id=&quot;root&quot;&amp;gt;&lt;/code&gt; shells and switches to Playwright). Edge cases that still produce noisy findings: pages with hydration tied to scroll position past the fold, pages that fetch critical content after user interaction (modal opens, tab clicks), pages with race-condition-prone third-party widget mounts. For these, manually triggering the &lt;code&gt;seo-visual&lt;/code&gt; subagent and comparing its Playwright snapshot to the raw-HTML subagents&#39; findings is the recommended workflow.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Local-only without enrichment.&lt;/strong&gt; The free tier makes no third-party API calls by default (audits still fetch the target URLs you point them at). Adding Google API credentials (Tier 0 through 3) unlocks real field data and live indexation status; without them, Core Web Vitals are lab estimates only and indexation is inferred from page-level signals. Adding MCP extensions (Ahrefs, DataForSEO, SE Ranking, Profound) similarly unlocks competitive and AI-citation data but requires their respective accounts.&lt;/p&gt; 
&lt;h2&gt;Requirements&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;Python 3.10+&lt;/li&gt; 
 &lt;li&gt;Claude Code CLI&lt;/li&gt; 
 &lt;li&gt;Optional: Playwright Chromium — &lt;a href=&quot;http://install.sh&quot;&gt;install.sh&lt;/a&gt; offers to install it (you can skip the prompt); needed only for SPA rendering and screenshots&lt;/li&gt; 
 &lt;li&gt;Optional: Google API credentials for enriched CWV / GSC / GA4 data (see &lt;code&gt;/seo google setup&lt;/code&gt;)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Uninstall&lt;/h2&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone --depth 1 https://github.com/AgriciDaniel/claude-seo.git
bash claude-seo/uninstall.sh
&lt;/code&gt;&lt;/pre&gt; 
&lt;details&gt; 
 &lt;summary&gt;One-liner (curl)&lt;/summary&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;curl -fsSL https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/uninstall.sh | bash
&lt;/code&gt;&lt;/pre&gt; 
&lt;/details&gt; 
&lt;h2&gt;Extensions&lt;/h2&gt; 
&lt;p&gt;Optional MCP servers add live data to the audit pipeline. Claude SEO ships extensions for 8 servers; the plugin core works without any of them.&lt;/p&gt; 
&lt;h3&gt;DataForSEO&lt;/h3&gt; 
&lt;p&gt;Live SERP data, keyword research, backlinks, on-page analysis, content analysis, business listings, AI visibility checks, and LLM mention tracking. 23 data commands across 9 API modules.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;./extensions/dataforseo/install.sh   # requires DataForSEO account
/seo dataforseo serp best coffee shops
/seo dataforseo ai-mentions your brand
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Full DataForSEO docs: &lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/extensions/dataforseo/README.md&quot;&gt;extensions/dataforseo/README.md&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;Firecrawl&lt;/h3&gt; 
&lt;p&gt;Full-site crawling and URL discovery via the &lt;a href=&quot;https://www.firecrawl.dev/&quot;&gt;Firecrawl&lt;/a&gt; MCP server.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;./extensions/firecrawl/install.sh
/seo firecrawl crawl https://example.com
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Full Firecrawl docs: &lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/extensions/firecrawl/README.md&quot;&gt;extensions/firecrawl/README.md&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;Banana: AI image generation&lt;/h3&gt; 
&lt;p&gt;SEO image generation (OG previews, blog heroes, product photos, infographics) via the &lt;a href=&quot;https://github.com/AgriciDaniel/banana-claude&quot;&gt;Claude Banana&lt;/a&gt; Creative Director pipeline.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;./extensions/banana/install.sh
/seo image-gen og &quot;Professional SaaS dashboard&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Full Banana docs: &lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/extensions/banana/README.md&quot;&gt;extensions/banana/README.md&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;Ahrefs, SE Ranking, Profound, Bing Webmaster, Unlighthouse (new in v2)&lt;/h3&gt; 
&lt;p&gt;Five extensions added in Phase E:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Ahrefs:&lt;/strong&gt; official &lt;code&gt;@ahrefs/mcp&lt;/code&gt; server with backlink and organic data&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;SE Ranking:&lt;/strong&gt; AI Share-of-Voice across ChatGPT, Gemini, Perplexity, AI Overviews, AI Mode&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Profound:&lt;/strong&gt; LLM citation tracker with time-series data&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Bing Webmaster:&lt;/strong&gt; Bing Webmaster Tools plus IndexNow unified&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Unlighthouse:&lt;/strong&gt; MIT-licensed multi-page Lighthouse runner&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Setup walkthroughs live under &lt;code&gt;extensions/&amp;lt;name&amp;gt;/docs/&lt;/code&gt;; integration notes: &lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/docs/MCP-INTEGRATION.md&quot;&gt;docs/MCP-INTEGRATION.md&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Ecosystem&lt;/h2&gt; 
&lt;p&gt;Claude SEO is part of a family of Claude Code skills that interoperate cleanly:&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Skill&lt;/th&gt; 
   &lt;th&gt;What it does&lt;/th&gt; 
   &lt;th&gt;How it connects&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/AgriciDaniel/claude-seo&quot;&gt;Claude SEO&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;SEO analysis, audits, schema, GEO&lt;/td&gt; 
   &lt;td&gt;Core. Analyzes sites and generates action plans.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/AgriciDaniel/claude-blog&quot;&gt;Claude Blog&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Blog writing, optimization, scoring&lt;/td&gt; 
   &lt;td&gt;Companion. Writes content optimized by SEO findings.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/AgriciDaniel/banana-claude&quot;&gt;Claude Banana&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;AI image generation via Gemini&lt;/td&gt; 
   &lt;td&gt;Shared. Generates images for SEO assets and blog posts.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/AgriciDaniel/codex-seo&quot;&gt;Codex SEO&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Codex-first SEO skill suite&lt;/td&gt; 
   &lt;td&gt;Port. Same SEO system adapted for Codex skills, TOML agents, deterministic runners.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/zubair-trabzada/ai-marketing-claude&quot;&gt;AI Marketing Claude&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Copywriting, emails, social, ads, funnels, CRO&lt;/td&gt; 
   &lt;td&gt;Community. Post-audit marketing action from SEO findings.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/AgriciDaniel/flow&quot;&gt;FLOW&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Evidence-led SEO framework (41 AI prompts, CC BY 4.0)&lt;/td&gt; 
   &lt;td&gt;Knowledge base. Powers &lt;code&gt;seo-flow&lt;/code&gt; prompts.&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;&lt;strong&gt;Workflow example:&lt;/strong&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;code&gt;/seo audit https://example.com&lt;/code&gt;: identify content gaps and technical issues&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;/seo backlinks https://example.com&lt;/code&gt;: analyze link profile and competitor gaps&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;/seo geo https://example.com/blog/post&lt;/code&gt;: score AI-citation readiness&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;/blog write &quot;target keyword&quot;&lt;/code&gt;: create SEO-optimized blog post (Claude Blog)&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;/seo image-gen hero &quot;blog topic&quot;&lt;/code&gt;: generate hero image (Banana extension)&lt;/li&gt; 
&lt;/ol&gt; 
&lt;h2&gt;Documentation&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/docs/INSTALLATION.md&quot;&gt;Installation Guide&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/docs/COMMANDS.md&quot;&gt;Commands Reference&lt;/a&gt;: every &lt;code&gt;/seo&lt;/code&gt; command in depth&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/docs/ARCHITECTURE.md&quot;&gt;Architecture&lt;/a&gt;: 3-layer design, auto-discovery, parallel dispatch&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/docs/MIGRATION-v1-to-v2.md&quot;&gt;Migration v1 → v2&lt;/a&gt;: breaking changes, six phases of work&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/docs/MCP-INTEGRATION.md&quot;&gt;MCP Integration&lt;/a&gt;: integration notes; extension setup lives under &lt;code&gt;extensions/&amp;lt;name&amp;gt;/docs/&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/docs/TROUBLESHOOTING.md&quot;&gt;Troubleshooting&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/CONTRIBUTORS.md&quot;&gt;Contributors&lt;/a&gt;: community credits&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;FAQ&lt;/h2&gt; 
&lt;h3&gt;What is Claude SEO?&lt;/h3&gt; 
&lt;p&gt;Claude SEO is an open-source SEO analysis plugin for Claude Code. It runs 25 sub-skills and 18 specialist agents in parallel across technical SEO, content quality, &lt;a href=&quot;http://Schema.org&quot;&gt;Schema.org&lt;/a&gt; markup, AI search optimization, local SEO, e-commerce, and international SEO. Audits produce a prioritized action plan where each recommendation carries the first-principle observation it rests on, its dependency relationship to other recommendations, a &quot;how would we know this failed?&quot; check, and a leading indicator. The plugin is MIT-licensed, ships zero proprietary tracking, and works without third-party API enrichment; audits still contact the target URLs you analyze. Aligned with &lt;a href=&quot;https://developers.google.com/search/docs/fundamentals/ai-optimization-guide&quot;&gt;Google&#39;s AI Optimization Guide&lt;/a&gt; and the September 2025 Quality Rater Guidelines.&lt;/p&gt; 
&lt;h3&gt;How is Claude SEO different from Screaming Frog or Ahrefs Site Audit?&lt;/h3&gt; 
&lt;p&gt;Different surface area, different tradeoffs. &lt;strong&gt;Screaming Frog&lt;/strong&gt; crawls deeper and faster at the link-graph level; it is purpose-built as a crawler and Claude SEO does not attempt to replace it. &lt;strong&gt;Ahrefs Site Audit&lt;/strong&gt; brings a proprietary backlink index and link intelligence; Claude SEO integrates with Ahrefs via its MCP extension rather than competing. Where Claude SEO leads: conversational LLM-native workflow, recommendation falsifiability (every finding carries an explicit failure-mode check), open-source MIT licensing with zero per-domain pricing, AI search optimization aligned with Google&#39;s primary-source guidance, and primary-source schema-deprecation tracking. Use Screaming Frog or Ahrefs for what they are best at; use Claude SEO when you want LLM-driven synthesis, conversational iteration, and AI-search-first audits in the same environment as your other Claude Code workflows.&lt;/p&gt; 
&lt;h3&gt;Does Claude SEO work on single-page applications (Next.js, React, Vue)?&lt;/h3&gt; 
&lt;p&gt;Yes. Phase A of v2 shipped a shared headless renderer (&lt;code&gt;scripts/render_page.py&lt;/code&gt;) backed by Playwright Chromium. Audit subagents call &lt;code&gt;render_page.py --mode auto&lt;/code&gt;, which auto-detects SPA hallmarks (empty &lt;code&gt;&amp;lt;div id=&quot;root&quot;&amp;gt;&lt;/code&gt; shells, single bundle script, hydration markers) and switches to a rendered fetch. The lower-level &lt;code&gt;scripts/fetch_page.py&lt;/code&gt; wrapper supports &lt;code&gt;--render auto&lt;/code&gt; as an opt-in wrapper mode; its default is &lt;code&gt;--render never&lt;/code&gt; for raw HTTP. Use &lt;code&gt;render_page.py --mode always&lt;/code&gt; or &lt;code&gt;fetch_page.py --render always&lt;/code&gt; to force rendering. Content extraction uses &lt;a href=&quot;https://github.com/adbar/trafilatura&quot;&gt;trafilatura&lt;/a&gt; for boilerplate removal. Publication dates come from &lt;a href=&quot;https://github.com/adbar/htmldate&quot;&gt;htmldate&lt;/a&gt;. Known nuance: pages with scroll-bound hydration or post-interaction content fetches still produce noisy findings; see the &lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#limitations&quot;&gt;Limitations&lt;/a&gt; section for the recommended &lt;code&gt;seo-visual&lt;/code&gt; cross-check workflow on those edge cases.&lt;/p&gt; 
&lt;h3&gt;What Google APIs does Claude SEO use, and are they required?&lt;/h3&gt; 
&lt;p&gt;None are required. Claude SEO is fully functional with zero API keys. A 4-tier credential system lets you upgrade gradually: Tier 0 (API key only) unlocks PageSpeed Insights, CrUX, and CrUX History (25-week trend data). Tier 1 (+ OAuth or service account) adds Search Console with queries, URL Inspection, sitemap status, and the Indexing API for eligible JobPosting pages or BroadcastEvent in VideoObject pages; the API does not guarantee indexing. Tier 2 (+ GA4 property config) adds organic traffic, top landing pages, and device / country breakdowns. Tier 3 (+ Ads developer token) adds Keyword Planner search volume and competition data. The credential setup wizard runs via &lt;code&gt;/seo google setup&lt;/code&gt;. All credentials live under &lt;code&gt;~/.config/claude-seo/&lt;/code&gt; with &lt;code&gt;0o600&lt;/code&gt; file permissions; nothing is checked into the repo and nothing is transmitted beyond Google&#39;s own endpoints.&lt;/p&gt; 
&lt;h3&gt;Is Claude SEO free?&lt;/h3&gt; 
&lt;p&gt;Yes. MIT licensed, fully open source, no per-domain pricing, no telemetry, no API quotas imposed by the plugin itself. The core plugin and all 25 sub-skills work without any paid service. Some optional MCP extensions wrap paid services (DataForSEO, Ahrefs, Profound, SE Ranking) where you bring your own account credentials; their use is opt-in and the plugin works fully without them. Google APIs (PageSpeed Insights, Search Console, Indexing, GA4) are free from Google with normal account quota limits and require your own credentials. If you want commercial support or enterprise features beyond the open-source plugin, that is not part of this project.&lt;/p&gt; 
&lt;h3&gt;How is Claude SEO different from regular SEO tools when it comes to AI search?&lt;/h3&gt; 
&lt;p&gt;Most SEO tools treat AI search as a separate optimization discipline. Claude SEO follows &lt;a href=&quot;https://developers.google.com/search/docs/fundamentals/ai-optimization-guide&quot;&gt;Google&#39;s own position&lt;/a&gt; that AEO and GEO are rebranded labels for SEO. AI Overviews and AI Mode are grounded in the same ranking systems as classic Search; the eligibility floor is normal indexation. Claude SEO scores passage citability (134-167 word self-contained answer blocks), question-based heading hierarchy, attribution density, and entity presence across Wikipedia, Reddit, YouTube, and LinkedIn. It explicitly rejects three influencer myths: llms.txt as a citation lever, content chunking for AI, and AI-specific keyword rewriting. For commerce sites, Claude SEO audits the IPTC &lt;code&gt;TrainedAlgorithmicMedia&lt;/code&gt; requirement on AI-generated product images per Google Merchant Center policy.&lt;/p&gt; 
&lt;h2&gt;Community Contributors&lt;/h2&gt; 
&lt;p&gt;v1.9.0 includes contributions from the &lt;a href=&quot;https://www.skool.com/ai-marketing-hub&quot;&gt;AI Marketing Hub&lt;/a&gt; Pro Hub Challenge:&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Contributor&lt;/th&gt; 
   &lt;th&gt;Contribution&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Lutfiya Miller&lt;/strong&gt; (Winner)&lt;/td&gt; 
   &lt;td&gt;Semantic Cluster Engine → &lt;code&gt;seo-cluster&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Florian Schmitz&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;SXO Skill → &lt;code&gt;seo-sxo&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Dan Colta&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;SEO Drift Monitor → &lt;code&gt;seo-drift&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Chris Muller&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;Multi-lingual SEO → &lt;code&gt;seo-hreflang&lt;/code&gt; enhancements&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;Matej Marjanovic&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;E-commerce + DataForSEO Cost Config → &lt;code&gt;seo-ecommerce&lt;/code&gt; + cost guardrails&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;See &lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/CONTRIBUTORS.md&quot;&gt;CONTRIBUTORS.md&lt;/a&gt; for full details and original repo links.&lt;/p&gt; 
&lt;h2&gt;License&lt;/h2&gt; 
&lt;p&gt;MIT License. See &lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/LICENSE&quot;&gt;LICENSE&lt;/a&gt; for details.&lt;/p&gt; 
&lt;h2&gt;Contributing&lt;/h2&gt; 
&lt;p&gt;Contributions welcome. Please read &lt;a href=&quot;https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/CONTRIBUTING.md&quot;&gt;CONTRIBUTING.md&lt;/a&gt; before submitting PRs and include the tests or checks you ran in the PR description.&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Author&lt;/h2&gt; 
&lt;p&gt;Built by &lt;strong&gt;&lt;a href=&quot;https://agricidaniel.com/about&quot;&gt;Agrici Daniel&lt;/a&gt;&lt;/strong&gt;, AI Workflow Architect. Single maintainer, open to community contributions via the &lt;a href=&quot;https://www.skool.com/ai-marketing-hub-pro&quot;&gt;Pro Skool community&lt;/a&gt;. Background in marketing automation, AI-assisted content workflows, and open-source tooling for Claude Code.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://agricidaniel.com/blog&quot;&gt;Blog&lt;/a&gt;: deep dives on AI marketing automation&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.skool.com/ai-marketing-hub&quot;&gt;AI Marketing Hub (free)&lt;/a&gt;: open community&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.skool.com/ai-marketing-hub-pro&quot;&gt;AI Marketing Hub Pro&lt;/a&gt;: Pro community, early access to this skill&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/@AgriciDaniel&quot;&gt;YouTube&lt;/a&gt;: tutorials and demos&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/AgriciDaniel&quot;&gt;GitHub&lt;/a&gt;: all open-source tools&lt;/li&gt; 
&lt;/ul&gt;</description>
      
      <media:content url="https://repository-images.githubusercontent.com/1152014594/0e048e51-24ae-435b-9b32-cc6b3def5356" medium="image" />
      
    </item>
    
    <item>
      <title>arc53/DocsGPT</title>
      <link>https://github.com/arc53/DocsGPT</link>
      <description>&lt;p&gt;Private AI platform for agents, assistants and enterprise search. Built-in Agent Builder, Deep research, Document analysis, Multi-model support, and API connectivity for agents.&lt;/p&gt;&lt;hr&gt;&lt;h1 align=&quot;center&quot;&gt; DocsGPT 🦖 &lt;/h1&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;strong&gt;Private AI for agents, assistants and enterprise search&lt;/strong&gt; &lt;/p&gt; 
&lt;p align=&quot;left&quot;&gt; &lt;strong&gt;&lt;a href=&quot;https://www.docsgpt.cloud/&quot;&gt;DocsGPT&lt;/a&gt;&lt;/strong&gt; is an open-source AI platform for building intelligent agents and assistants. Features Agent Builder, deep research tools, document analysis (PDF, Office, web content, and audio), Multi-model support (choose your provider or run locally), and rich API connectivity for agents with actionable tools and integrations. Deploy anywhere with complete privacy control. &lt;/p&gt; 
&lt;div align=&quot;center&quot;&gt; 
 &lt;p&gt;&lt;a href=&quot;https://github.com/arc53/DocsGPT&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/arc53/docsgpt?style=social&quot; alt=&quot;link to main GitHub showing Stars number&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/arc53/DocsGPT&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/forks/arc53/docsgpt?style=social&quot; alt=&quot;link to main GitHub showing Forks number&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/arc53/DocsGPT/raw/main/LICENSE&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/license/arc53/docsgpt&quot; alt=&quot;link to license file&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.bestpractices.dev/projects/9907&quot;&gt;&lt;img src=&quot;https://www.bestpractices.dev/projects/9907/badge&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://discord.gg/vN7YFfdMpj&quot;&gt;&lt;img src=&quot;https://img.shields.io/discord/1070046503302877216&quot; alt=&quot;link to discord&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://x.com/docsgptai&quot;&gt;&lt;img src=&quot;https://img.shields.io/twitter/follow/docsgptai&quot; alt=&quot;X (formerly Twitter) URL&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;a href=&quot;https://docs.docsgpt.cloud/quickstart&quot;&gt;⚡️ Quickstart&lt;/a&gt; • &lt;a href=&quot;https://app.docsgpt.cloud/&quot;&gt;☁️ Cloud Version&lt;/a&gt; • &lt;a href=&quot;https://discord.gg/vN7YFfdMpj&quot;&gt;💬 Discord&lt;/a&gt; &lt;br /&gt; &lt;a href=&quot;https://docs.docsgpt.cloud/&quot;&gt;📖 Documentation&lt;/a&gt; • &lt;a href=&quot;https://github.com/arc53/DocsGPT/raw/main/CONTRIBUTING.md&quot;&gt;👫 Contribute&lt;/a&gt; • &lt;a href=&quot;https://blog.docsgpt.cloud/&quot;&gt;🗞 Blog&lt;/a&gt; &lt;br /&gt;&lt;/p&gt; 
&lt;/div&gt; 
&lt;div align=&quot;center&quot;&gt; 
 &lt;br /&gt; 
 &lt;img src=&quot;https://d3dg1063dc54p9.cloudfront.net/videos/demo-26.gif&quot; alt=&quot;video-example-of-docs-gpt&quot; width=&quot;800&quot; height=&quot;480&quot; /&gt; 
&lt;/div&gt; 
&lt;h3 align=&quot;left&quot;&gt; &lt;strong&gt;Key Features:&lt;/strong&gt; &lt;/h3&gt; 
&lt;ul align=&quot;left&quot;&gt; 
 &lt;li&gt;&lt;strong&gt;🗂️ Wide Format Support:&lt;/strong&gt; Reads PDF, DOCX, CSV, XLSX, EPUB, MD, RST, HTML, MDX, JSON, PPTX, images, and audio files such as MP3, WAV, M4A, OGG, and WebM.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;🎙️ Speech Workflows:&lt;/strong&gt; Record voice input into chat, transcribe audio on the backend, and ingest meeting recordings or voice notes as searchable knowledge.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;🌐 Web &amp;amp; Data Integration:&lt;/strong&gt; Ingests from URLs, sitemaps, Reddit, GitHub and web crawlers.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;✅ Reliable Answers:&lt;/strong&gt; Get accurate, hallucination-free responses with source citations viewable in a clean UI.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;🔑 Streamlined API Keys:&lt;/strong&gt; Generate keys linked to your settings, documents, and models, simplifying chatbot and integration setup.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;🔗 Actionable Tooling:&lt;/strong&gt; Connect to APIs, tools, and other services to enable LLM actions.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;🧩 Pre-built Integrations:&lt;/strong&gt; Use readily available HTML/React chat widgets, search tools, Discord/Telegram bots, and more.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;🔌 Flexible Deployment:&lt;/strong&gt; Works with major LLMs (OpenAI, Google, Anthropic) and local models (Ollama, llama_cpp).&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;🏢 Secure &amp;amp; Scalable:&lt;/strong&gt; Run privately and securely with Kubernetes support, designed for enterprise-grade reliability.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Roadmap&lt;/h2&gt; 
&lt;ul class=&quot;task-list&quot;&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_0&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_0&quot;&gt; Agent Workflow Builder with conditional nodes ( February 2026 )&lt;/label&gt;&lt;/li&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_1&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_1&quot;&gt; Research mode ( March 2026 )&lt;/label&gt;&lt;/li&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_2&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_2&quot;&gt; SharePoint &amp;amp; Confluence connectors ( March – April 2026 )&lt;/label&gt;&lt;/li&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_3&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_3&quot;&gt; Postgres migration for user data ( April 2026 )&lt;/label&gt;&lt;/li&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_4&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_4&quot;&gt; OpenTelemetry observability ( April 2026 )&lt;/label&gt;&lt;/li&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_5&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_5&quot;&gt; Bring Your Own Model (BYOM) ( April 2026 )&lt;/label&gt;&lt;/li&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_6&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_6&quot;&gt; Agent scheduling (RedBeat-backed) ( April 2026 )&lt;/label&gt;&lt;/li&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_7&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_7&quot;&gt; Notifications &amp;amp; conversation search ( May 2026 )&lt;/label&gt;&lt;/li&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_8&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_8&quot;&gt; Analytics &amp;amp; logs revamp with per-agent attribution ( June 2026 )&lt;/label&gt;&lt;/li&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_9&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_9&quot;&gt; OIDC / SSO login with SCIM provisioning &amp;amp; groups ( June 2026 )&lt;/label&gt;&lt;/li&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_10&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_10&quot;&gt; Admin dashboard &amp;amp; role-based access control (RBAC) ( June 2026 )&lt;/label&gt;&lt;/li&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_11&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_11&quot;&gt; Agent import / export ( June 2026 )&lt;/label&gt;&lt;/li&gt; 
 &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;cbx_12&quot; checked=&quot;true&quot; disabled=&quot;true&quot; /&gt;&lt;label for=&quot;cbx_12&quot;&gt; Teams with team-scoped sharing &amp;amp; roles ( June 2026 )&lt;/label&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;You can find our full roadmap &lt;a href=&quot;https://github.com/orgs/arc53/projects/2&quot;&gt;here&lt;/a&gt;. Please don&#39;t hesitate to contribute or create issues, it helps us improve DocsGPT!&lt;/p&gt; 
&lt;h3&gt;Production Support / Help for Companies:&lt;/h3&gt; 
&lt;p&gt;We&#39;re eager to provide personalized assistance when deploying your DocsGPT to a live environment.&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.docsgpt.cloud/contact&quot;&gt;Get a Demo 👋&lt;/a&gt;⁠&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;mailto:support@docsgpt.cloud?subject=DocsGPT%20support%2Fsolutions&quot;&gt;Send Email 📧&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;Join the Lighthouse Program 🌟&lt;/h2&gt; 
&lt;p&gt;Calling all developers and GenAI innovators! The &lt;strong&gt;DocsGPT Lighthouse Program&lt;/strong&gt; connects technical leaders actively deploying or extending DocsGPT in real-world scenarios. Collaborate directly with our team to shape the roadmap, access priority support, and build enterprise-ready solutions with exclusive community insights.&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/forms/d/1KAADiJinUJ8EMQyfTXUIGyFbqINNClNR3jBNWq7DgTE&quot;&gt;Learn More &amp;amp; Apply →&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;QuickStart&lt;/h2&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-note&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-info mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Note&lt;/p&gt;
 &lt;p&gt;Make sure you have &lt;a href=&quot;https://docs.docker.com/engine/install/&quot;&gt;Docker&lt;/a&gt; installed&lt;/p&gt; 
&lt;/div&gt; 
&lt;p&gt;A more detailed &lt;a href=&quot;https://docs.docsgpt.cloud/quickstart&quot;&gt;Quickstart&lt;/a&gt; is available in our documentation&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;&lt;strong&gt;Clone the repository:&lt;/strong&gt;&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/arc53/DocsGPT.git
cd DocsGPT
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;strong&gt;For macOS and Linux:&lt;/strong&gt;&lt;/p&gt; 
&lt;ol start=&quot;2&quot;&gt; 
 &lt;li&gt; &lt;p&gt;&lt;strong&gt;Run the setup script:&lt;/strong&gt;&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;./setup.sh
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;strong&gt;For Windows:&lt;/strong&gt;&lt;/p&gt; 
&lt;ol start=&quot;2&quot;&gt; 
 &lt;li&gt; &lt;p&gt;&lt;strong&gt;Run the PowerShell setup script:&lt;/strong&gt;&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;PowerShell -ExecutionPolicy Bypass -File .\setup.ps1
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;Either script will guide you through setting up DocsGPT. Five options are available: using the public API, running locally, connecting to a local inference engine, using a cloud API provider, or building the docker image locally. The scripts will automatically configure your &lt;code&gt;.env&lt;/code&gt; file and handle necessary downloads and installations based on your chosen option.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Navigate to &lt;a href=&quot;http://localhost:5173/&quot;&gt;http://localhost:5173/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;To stop DocsGPT, open a terminal in the &lt;code&gt;DocsGPT&lt;/code&gt; directory and run:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f deployment/docker-compose.yaml down
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;(or use the specific &lt;code&gt;docker compose down&lt;/code&gt; command shown after running the setup script).&lt;/p&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-note&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-info mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Note&lt;/p&gt;
 &lt;p&gt;For development environment setup instructions, please refer to the &lt;a href=&quot;https://docs.docsgpt.cloud/Deploying/Development-Environment&quot;&gt;Development Environment Guide&lt;/a&gt;.&lt;/p&gt; 
&lt;/div&gt; 
&lt;h2&gt;Contributing&lt;/h2&gt; 
&lt;p&gt;Please refer to the &lt;a href=&quot;https://raw.githubusercontent.com/arc53/DocsGPT/main/CONTRIBUTING.md&quot;&gt;CONTRIBUTING.md&lt;/a&gt; file for information about how to get involved. We welcome issues, questions, and pull requests.&lt;/p&gt; 
&lt;h2&gt;Architecture&lt;/h2&gt; 
&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/fc6a7841-ddfc-45e6-b5a0-d05fe648cbe2&quot; alt=&quot;Architecture chart&quot; /&gt;&lt;/p&gt; 
&lt;h2&gt;Project Structure&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt; &lt;p&gt;&lt;strong&gt;Application&lt;/strong&gt; - Backend Flask application.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;strong&gt;Extensions&lt;/strong&gt; - Integrations and widgets (e.g., Chatwoot, React widget).&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;strong&gt;Frontend&lt;/strong&gt; - Web UI built with &lt;a href=&quot;https://vitejs.dev/&quot;&gt;Vite&lt;/a&gt; and &lt;a href=&quot;https://react.dev/&quot;&gt;React&lt;/a&gt;.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;strong&gt;Scripts&lt;/strong&gt; - Miscellaneous utility scripts.&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Code Of Conduct&lt;/h2&gt; 
&lt;p&gt;We as members, contributors, and leaders, pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. Please refer to the &lt;a href=&quot;https://raw.githubusercontent.com/arc53/DocsGPT/main/CODE_OF_CONDUCT.md&quot;&gt;CODE_OF_CONDUCT.md&lt;/a&gt; file for more information about contributing.&lt;/p&gt; 
&lt;h2&gt;Many Thanks To Our Contributors⚡&lt;/h2&gt; 
&lt;a href=&quot;https://github.com/arc53/DocsGPT/graphs/contributors&quot; alt=&quot;View Contributors&quot;&gt; &lt;img src=&quot;https://contrib.rocks/image?repo=arc53/DocsGPT&quot; alt=&quot;Contributors&quot; /&gt; &lt;/a&gt; 
&lt;h2&gt;License&lt;/h2&gt; 
&lt;p&gt;The source code license is &lt;a href=&quot;https://opensource.org/license/mit/&quot;&gt;MIT&lt;/a&gt;, as described in the &lt;a href=&quot;https://raw.githubusercontent.com/arc53/DocsGPT/main/LICENSE&quot;&gt;LICENSE&lt;/a&gt; file.&lt;/p&gt; 
&lt;h2&gt;This project is supported by:&lt;/h2&gt; 
&lt;p&gt; &lt;a href=&quot;https://www.digitalocean.com/?utm_medium=opensource&amp;amp;utm_source=DocsGPT&quot;&gt; &lt;img src=&quot;https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/assets/SVG/DO_Logo_horizontal_blue.svg?sanitize=true&quot; width=&quot;201px&quot; /&gt; &lt;/a&gt; &lt;/p&gt; 
&lt;p&gt; &lt;a href=&quot;https://get.neon.com/docsgpt&quot;&gt; &lt;img width=&quot;201&quot; alt=&quot;color&quot; src=&quot;https://github.com/user-attachments/assets/7d9813b7-0e6d-403f-b5af-68af066b326f&quot; /&gt; &lt;/a&gt; &lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/38cacd90ea738f2c17a7e38a2231e406c6e8fc60a2930a4698665b48b7c60ca6/arc53/DocsGPT" medium="image" />
      
    </item>
    
  </channel>
</rss>
