AI makes you productive where you already understand. It confuses you where you don't.
I've been reading non-fiction with AI assistants for a while, and I kept hitting the same wall: 30 messages into a conversation about a dense book chapter, the AI starts losing the thread. I'd branch into a tangent β "how does this connect to what Kahneman said about System 1?" β and suddenly the entire chat context is polluted. No way to get back to where I was.
So I built pi-tree β a self-hosted AI reading companion where the conversation is the reading experience. The key insight: conversations should be trees, not threads.
Why Trees?
When you think through complex material, your mind doesn't work linearly. You branch β "wait, how does this relate to X?" β explore for a bit, then come back. But every AI chat tool forces you into a flat thread where everything piles up.
Tree-structured conversations fix this at the architecture level:
- Focused context β Each branch carries only its path from root to current node. Less noise β more accurate responses.
- Token savings β A 50-message linear chat sends all 50 every turn. A tree with 5 branches of 10 sends only ~10. Lower cost, faster responses.
- Less hallucination β Context pollution is a primary cause of hallucination in long conversations. Isolated branches keep the model grounded.
Here's what a reading session looks like:
π Reading: Thinking, Fast and Slow (Kahneman)
Root
βββ What is System 1 vs System 2?
β βββ How does this relate to cognitive biases?
β β βββ Anchoring bias deep-dive
β βββ Real-world examples in decision making
βββ Chapter 3: The Lazy Controller
β βββ Why do we avoid effortful thinking?
βββ Comparison with Nassim Taleb's ideas
βββ Black Swan connection
βββ Antifragility and heuristics
And here's the actual UI β tree sidebar on the left, conversation in the center, table of contents on the right:
Agentic, Not RAG
Most "chat with your documents" tools use RAG β chunk your content into embeddings, then retrieve what seems relevant. The problem: retrieval is approximate. The AI gets semantically similar chunks, not necessarily the right context.
Pi-tree takes an agentic approach: the AI has tools that give it precise, on-demand access to your content β more like grep than vector search. It can look up a specific chapter, fetch a paper's methodology section, or scan today's RSS feeds. The context is exact, structural, and requested when needed β not pre-computed and hoped for.
Each source type gets purpose-built tools:
-
Books β
process_bookparses EPUB/MOBI/PDF, extracts chapter structure, builds a navigable outline -
News feeds β
get_latest_rss,search_rsscrawl your feeds, find trends across sources -
Papers β
search_papers,get_paper_infoquery arXiv, fetch and contextualize research -
YouTube β
get_youtube_transcriptextracts transcripts for segment-level discussion
The AI's behavior is then shaped by skills β markdown instruction files that define how to read, not just what to retrieve.
Here's a news session β the AI scanned RSS feeds and produced a digest with trends:
The Plugin System
Everything is customizable at three levels:
1. Skills (Markdown files) β Change how the AI reads by editing a .md file. No code.
2. Session Profiles (YAML) β Map source types to different skills, extensions, and models:
name: book.reading
skills:
- interactive-reading
extensions:
- book
exclude_tools:
- bash
- edit
3. Full Plugins (TypeScript) β Build new source types with the plugin SDK:
import { definePiTreeExtension } from "@pi-tree/plugin-sdk";
export default definePiTreeExtension((pi, services) => {
pi.registerTool({
name: "my_custom_tool",
description: "Does something useful",
execute: async (args) => {
const source = await services.sources.get(args.sourceId);
// your logic here
}
});
});
There's also an MCP bridge β connect external MCP servers (web search, academic databases, translation APIs) by dropping a JSON config file. Same format as Claude Desktop.
Quick Start (Docker)
cp .env.example .env # add your API key
docker run -d --name pi-tree \
--env-file .env \
-p 3847:3847 \
-v ~/.local/share/pi-tree:/data \
ghcr.io/shuowu/pi-tree:latest
Open http://localhost:3847. That's it.
Works with any OpenAI-compatible API β cloud providers (DeepSeek, Gemini, Claude, OpenAI) or fully offline with Ollama / LM Studio. Reading doesn't need frontier models β a 12B parameter model works well.
How It Compares
| Pi-tree | ChatGPT / Claude | NotebookLM | Obsidian + AI | |
|---|---|---|---|---|
| Focus | Comprehension & exploration | General-purpose Q&A | Document Q&A | Note-taking |
| Conversations | π³ Tree β branch, explore, return | Linear chat | Linear chat | Linear chat |
| AI approach | Agentic β tools & skills over local data | Prompt + context window | RAG over uploads | Plugins over local vault |
| Sources | Books, papers, news feeds, YouTube | File uploads, web | Multi-doc notebooks | Markdown vault |
| Extensibility | Skills, plugins, MCP bridge | GPTs (cloud-hosted) | None | Community plugins |
| Model choice | BYOK β any provider or local | Vendor-locked | Google only | Plugin-dependent |
| Data | Local-first, self-hosted | Cloud | Cloud | Local |
Who Is This For?
- Nonfiction readers β you're reading a dense chapter and AI summaries skip the part you actually don't understand. Pi-tree stays in that gap with you until you do.
- Researchers & students β you're outside your subfield and every paper assumes background you lack. Branch into what you don't know, then return to the argument.
- News followers β you read the headline but can't evaluate the claim. Turn feeds into conversations where you build context over time.
- Developers β you're in an unfamiliar domain. Build custom plugins to explore anything conversationally.
Links
- π³ GitHub: github.com/shuowu/pi-tree
- π Docs: shuowu.github.io/pi-tree
- π§© Plugin guide: Building extensions
- πΈ Feature tour: Screenshots & demo
License: AGPL-3.0 β fully open source.
I'd love feedback on:
- Does the tree-structured approach resonate with how you read/research?
- What source types would you want beyond books, news, papers, and YouTube?
- If you self-host LLMs, what models are working well for reading tasks?
Built on the Pi SDK for tree-structured agent sessions.















