Retrieve The Forgotten Memory
About
The open retrieval layer for AI coding agents. Indexes code, docs, legal, research, data — 15 parsers, FTS5 + semantic search, knowledge graph. Serves surgical context via MCP. Open source, local, free.
Explore
11 tasks, 3 repos of varying size, 4 conditions (A = standard prompt with file paths; B = discovery, no paths; C = RTFM FTS; D = RTFM hybrid), 3 runs each.
On a single smaller-scope run (test_stub_generatoron metaflow), RTFM cut agent time by−37 %vs the no-paths baseline. On the larger repos, the tasks themselves were too hard for Sonnet 4 to resolve inside a 20-minute timeout regardless of retrieval.
- Single model (Sonnet 4), single agent (Claude Code). Not statistically bullet-proof.
- On small repos (< 1k files),grepis enough and RTFM adds overhead.
- FeatureBench measurescode modification, notinformation retrieval. It's the wrong benchmark for a retrieval tool — I'm running against it because it's what exists. Better-suited benchmarks (RepoQA, SWE-QA, LocAgent) are on the roadmap.
RTFM measurably wins when the bottleneck is"find the right paragraph in a 2,000-file corpus". It doesn't magically make unsolvable tasks solvable. The model still has to do the work — RTFM just makes sure it has the right context to do it with.
RTFM works anywhere your project isn't just code:
- LegalTech— Code + tax law + regulatory specs. Ships with Legifrance XML and BOFiP parsers.
- Research— Code + LaTeX papers + datasets. Ships with LaTeX and PDF parsers.
- FinTech— Code + financial regulations + XBRL reports. Write an XBRL parser in 50 lines.
- HealthTech— Code + medical records (HL7/FHIR) + clinical guidelines.
- Solo devs with big projects— Stop watching your agent grep the same 8,000 files every session.
- Obsidian / PKM users— Make your vault actually searchable by your AI.
- Any regulated industry— If your project mixes code with domain documents, RTFM is for you.
- FTS5 full-text search— instant, zero-config, works out of the box
- Semantic search— optional embeddings (FastEmbed/ONNX, no GPU needed)
- Hybrid mode— combine both, rank by relevance score
- Metadata-first— results return file paths + scores (~300 tokens), not content dumps
- Progressive disclosure— agent expands only the chunks it actually needs
- Knowledge graph— wikilinks + Python imports resolved as graph edges, hub detection, centrality ranking
- 22 parsers built-in— Markdown, Python (AST), LaTeX, YAML, JSON, TOML, Shell, PDF, XML, HTML, SQLite, Jupyter, CSV/TSV, XLSX, EPUB, MOBI/AZW, FB2, DJVU, DOCX, ODT, RTF, plain text
- Extensible— add any format in ~50 lines of Python
- Auto-sync hooks— index stays fresh every prompt, zero manual work
- Incremental— only re-indexes what changed
- Native Claude Code plugin—/plugin install rtfm@roomi-fields/rtfm, auto-init per project
- Pure-Python MCP server— 0 external deps, nomcpSDK /pydantic/ native binaries
- Cross-platform— Linux, macOS, Windows, WSL (only requires Python ≥ 3.10 on PATH)
- 13 MCP tools— search, context, expand, graph, history, sync, tags, ...
- Manual install fallback—pip install rtfm-aifor Cursor, Codex, Claude Desktop chat, any other MCP client
- CLI + Python API— scriptable for pipelines
- Non-invasive— doesn't touch your code, doesn't replace your editor
Need to index a format nobody supports? Write a parser in ~50 lines.
from rtfm.parsers.base import BaseParser, ParserRegistry from rtfm.core.models import Chunk import json from uuid import uuid4 @ParserRegistry.register class FHIRParser(BaseParser): """Parse HL7 FHIR medical records.""" extensions = ](https://huggingface.co/datasets/LiberCoders/FeatureBench)['.fhir.json'] name = "fhir" def parse(self, path, metadata=None): data = json.loads(path.read_text()) for entry in data.get('entry', []): resource = entry.get('resource', {}) yield Chunk( id=resource.get('id', str(uuid4())), content=json.dumps(resource, indent=2), book_title=f"FHIR {resource.get('resourceType', 'Unknown')}", book_slug=resource.get('id', 'unknown'), page_start=1, page_end=1, )
Drop it in your project, restart Claude Code, your medical AI agent now understands FHIR records.
For JSON-based formats specifically, RTFM offers a second extensibility path that doesn't need any Python:
SeeJSON schema mappingsfor the full reference, andRTFM × NotebookLMfor a concrete recipe.
# Search rtfm search "authentication flow" rtfm search "article 39" --corpus cgi --limit 5 # Sync rtfm sync # All registered sources rtfm sync /path/to/docs --corpus docs # Specific directory rtfm sync . --force # Force re-index # Source management rtfm add /path/to/docs --corpus docs --extensions md,pdf rtfm sources # Obsidian vault rtfm vault # Initialize for cwd vault rtfm vault /path/to/vault # Specific vault rtfm vault --regenerate # Regenerate _rtfm/ files # Cross-project Claude memory rtfm memory # Manual snapshot rtfm memory --install-hook # Auto-snapshot on SessionEnd # Status & info rtfm status rtfm books rtfm tags rtfm history path/to/file.md # Memory version history # Semantic search rtfm embed # Generate embeddings (one-time) rtfm semantic-search "tax deductions" --hybrid # MCP server rtfm serve
from rtfm import Library lib = Library("my_library.db") # Index stats = lib.ingest("documents/article.md", corpus="docs") result = lib.sync(".", corpus="my-project") # SyncResult(+3 ~1 -0 =42) # Search results = lib.search("depreciation", limit=10, corpus="cgi") results = lib.hybrid_search("amortissement fiscal", limit=10) # Export for LLM prompt_context = results.to_prompt(max_chars=8000) lib.close()
RTFM isn't a task manager. It's not an agent framework. It's the knowledge layer your agent needs underneath whatever you're already using.
┌─────────────────────────────────┐ │ GSD / Taskmaster / Claude Flow │ ← Orchestration ├─────────────────────────────────┤ │ RTFM │ ← Knowledge (you are here) ├─────────────────────────────────┤ │ Claude Code │ ← Execution └─────────────────────────────────┘
Without RTFM, your orchestrator drives an agent that hallucinates. With RTFM, the agent knows what it's building on.
Adding a parser is the easiest way to contribute — and the most impactful. SeeCONTRIBUTING.md.
Found a bug? Have an idea?Open an issue.
MIT — use it, fork it, extend it, ship it.
Code indexers see your code. RTFM sees everything.
⭐ Star on GitHubif RTFM saves your agent from hallucinating.
Curious how it works under the hood? See theArchitecture— SQLite + FTS5, the parser registry, and the priority-queue worker (ingest → embed → OCR).
This is a web browser that enables your coding agent, such as Claude Code, to visit websites on your behalf and assist you in identifying bugs or creating UI test cases.
A Retrieval-Augmented Generation (RAG) server for document processing, vector storage, and intelligent Q&A, powered by the Model Context Protocol.
Local code analysis MCP server with 25+ tools: semantic search, call graph tracing, dependency analysis, and symbol navigation. Built with Tree-sitter and CozoDB. Supports Go, Python, JS, TS.
A local-first code indexer that enhances LLMs with deep code understanding. It integrates with AI assistants via the Model Context Protocol (MCP) and supports AI-powered semantic search.
A knowledge management tool for code repositories using vector embeddings, powered by a local Ollama service.
A server for managing structured project context using SQLite, with support for vector embeddings for semantic search and Retrieval Augmented Generation (RAG).
A RAG-based Q&A server using a vector store built from Gemini CLI documentation.
Setting up with Highlight
This MCP is not yet compatible with Highlight’s one-click setup. However, you can still use it with Highlight by following these steps:
- Download and install Highlight from highlightai.com/download
- Navigate to the plugins tab and select "Add Custom Plugin"
-
Configure the plugin with the settings below
Plugin Name
Retrieve The Forgotten MemoryCommand (node, npx, python, etc.)Please refer to the README for specific instructions on how to obtain API keys or other required environment variables.
- Enable "Start Automatically" if you want the plugin to start when Highlight launches
From the repository
For clients without Claude Code's plugin system :
pip install rtfm-ai cd /path/to/your-project rtfm init
Then point your MCP client atrtfm-serve(the entry exposed by the pip package). Optional extras viapip install rtfm-ai](https://github.com/roomi-fields/notebooklm-mcp)[embeddings,pdf].
RTFM is the only open-source option that indexes multi-domain content with structural parsing, a code-level knowledge graph, and unlimited per-file history.That's the niche.
Different from MemPalace specifically: MemPalace is an entity-level memory for conversations (who/project/decision triples in SQLite, plus verbatim chunks in ChromaDB). RTFM is a retrieval layer forartefacts— parsed by format, linked at the file level, versioned over time. The two are stackable, not competing.
For a deeper breakdown of the design choices behind any RAG (chunking, retrieval, augmentation, integration, freshness, storage), seeRAG Fundamentals — the 6 axes →
Between sessions, most agents forget. RTFM indexes Claude Code's own memory files across every project on your machine, with full version history.
rtfm memory # Manual snapshot rtfm memory --install-hook # Auto-snapshot on every SessionEnd
- Cross-project index— one DB at~/.rtfm/memory.dbsees every~/.claude/projects//memory/directory on your machine. Askrtfm_search("OAuth auth decisions")and get hits from all 18 of your projects.
- Unlimited version history— every change to a memory file is snapshotted (no prune).rtfm_history <slug>returns the full evolution.
- Auto-snapshot onSessionEnd— one command installs a global Claude Code hook. Every session you close captures a new snapshot.
- Curated, not verbatim— RTFM indexes the notes the agent already curated itself during the session (small, structured, signal-dense). Different philosophy from MemPalace, which indexes the full conversation transcripts in ChromaDB (large, noisy, needs aggressive semantic filtering).
RTFM is the retrieval layer for theKarpathy LLM Wikipattern. Karpathy himself wrote:"at small scale the index file is enough, but as the wiki grows you want proper search."This is proper search.
cd /path/to/your-obsidian-vault rtfm vault
- Detects.obsidian/, proposes a folder → corpus mapping
- Resolves[[wikilinks]]following Obsidian rules → stored as graph edges
- Generates_rtfm/with Obsidian-native navigation (index, graph with Mermaid, hubs, orphans, Dataview frontmatter)
- Tested on a 1,700-note research vault
_rtfm/ ├── index.md # Hub: corpus list, top connected documents ├── graph.md # Hub documents, orphans, broken links, Mermaid ├── recent.md # Recently modified files └── corpus/ # Per-corpus indexes
The LLM still writes your wiki. RTFM handles the retrieval thatindex.mdcan't scale to.
RTFM pairs naturally withnotebooklm-mcp. NotebookLM caps you at 50 queries/day per notebook; RTFM removes that ceiling by indexing answers locally — ask once, retrieve forever, offline, in milliseconds.
notebooklm-mcp's/batch-to-vaultendpoint writes citation-backed Q&A as{slug}.md(markdown with frontmatter) plus{slug}.json(structurednblm-answer-v1sidecar). Both are guaranteed to coexist. Two integration paths, both ship today:
- Path A — Markdown (zero config): drop the vault into RTFM andrtfm sync. The default markdown parser slices each answer into question / answer / per-citation chunks automatically. No mapping, no schema, no code.
- Path B — JSON sidecar (typed metadata): drop a[nblm-answer.yamlmappinginto.rtfm/mappings/. Each.jsonanswer file produces typed chunks withnotebook_id,source_name,citation_markerqueryable via SQL, pluscitesedge candidates between answers and sources.
Use Path A unless you specifically need to filter or graph by structured citation fields.
I ran two kinds of benchmarks. The honest picture is nuanced — retrieval helps most on tasks that are actually solvable and where the agent is spending timelooking for things*.
Claude Desktop / Cursor
Paste into your MCP client config file to install this server.
{
"mcpServers": {
"retrieve the forgotten memory": {
"rtfm": {
"command": "rtfm-serve",
"args": [],
"env": {
"RTFM_DB": ".rtfm/library.db"
}
}
}
}
}
McpServers
{
"rtfm": {
"command": "rtfm-serve",
"args": [],
"env": {
"RTFM_DB": ".rtfm/library.db"
}
}
}
Code task:](https://github.com/roomi-fields/rtfm/blob/HEAD/docs/notebooklm-integration.md#path-b--json-sidecar-typed-metadata--edges)FeatureBench(LiberCoders dataset)
11 tasks, 3 repos of varying size, 4 conditions (A = standard prompt with file paths; B = discovery, no paths; C = RTFM FTS; D = RTFM hybrid), 3 runs each.
On a single smaller-scope run (test_stub_generatoron metaflow), RTFM cut agent time by−37 %vs the no-paths baseline. On the larger repos, the tasks themselves were too hard for Sonnet 4 to resolve inside a 20-minute timeout regardless of retrieval.
- Single model (Sonnet 4), single agent (Claude Code). Not statistically bullet-proof.
- On small repos (< 1k files),grepis enough and RTFM adds overhead.
- FeatureBench measurescode modification, notinformation retrieval. It's the wrong benchmark for a retrieval tool — I'm running against it because it's what exists. Better-suited benchmarks (RepoQA, SWE-QA, LocAgent) are on the roadmap.
RTFM measurably wins when the bottleneck is"find the right paragraph in a 2,000-file corpus". It doesn't magically make unsolvable tasks solvable. The model still has to do the work — RTFM just makes sure it has the right context to do it with.
RTFM works anywhere your project isn't just code:
- LegalTech— Code + tax law + regulatory specs. Ships with Legifrance XML and BOFiP parsers.
- Research— Code + LaTeX papers + datasets. Ships with LaTeX and PDF parsers.
- FinTech— Code + financial regulations + XBRL reports. Write an XBRL parser in 50 lines.
- HealthTech— Code + medical records (HL7/FHIR) + clinical guidelines.
- Solo devs with big projects— Stop watching your agent grep the same 8,000 files every session.
- Obsidian / PKM users— Make your vault actually searchable by your AI.
- Any regulated industry— If your project mixes code with domain documents, RTFM is for you.
- FTS5 full-text search— instant, zero-config, works out of the box
- Semantic search— optional embeddings (FastEmbed/ONNX, no GPU needed)
- Hybrid mode— combine both, rank by relevance score
- Metadata-first— results return file paths + scores (~300 tokens), not content dumps
- Progressive disclosure— agent expands only the chunks it actually needs
- Knowledge graph— wikilinks + Python imports resolved as graph edges, hub detection, centrality ranking
- 22 parsers built-in— Markdown, Python (AST), LaTeX, YAML, JSON, TOML, Shell, PDF, XML, HTML, SQLite, Jupyter, CSV/TSV, XLSX, EPUB, MOBI/AZW, FB2, DJVU, DOCX, ODT, RTF, plain text
- Extensible— add any format in ~50 lines of Python
- Auto-sync hooks— index stays fresh every prompt, zero manual work
- Incremental— only re-indexes what changed
- Native Claude Code plugin—/plugin install rtfm@roomi-fields/rtfm, auto-init per project
- Pure-Python MCP server— 0 external deps, nomcpSDK /pydantic/ native binaries
- Cross-platform— Linux, macOS, Windows, WSL (only requires Python ≥ 3.10 on PATH)
- 13 MCP tools— search, context, expand, graph, history, sync, tags, ...
- Manual install fallback—pip install rtfm-aifor Cursor, Codex, Claude Desktop chat, any other MCP client
- CLI + Python API— scriptable for pipelines
- Non-invasive— doesn't touch your code, doesn't replace your editor
Need to index a format nobody supports? Write a parser in ~50 lines.
from rtfm.parsers.base import BaseParser, ParserRegistry from rtfm.core.models import Chunk import json from uuid import uuid4 @ParserRegistry.register class FHIRParser(BaseParser): """Parse HL7 FHIR medical records.""" extensions = ['.fhir.json'] name = "fhir" def parse(self, path, metadata=None): data = json.loads(path.read_text()) for entry in data.get('entry', []): resource = entry.get('resource', {}) yield Chunk( id=resource.get('id', str(uuid4())), content=json.dumps(resource, indent=2), book_title=f"FHIR {resource.get('resourceType', 'Unknown')}", book_slug=resource.get('id', 'unknown'), page_start=1, page_end=1, )
Drop it in your project, restart Claude Code, your medical AI agent now understands FHIR records.
For JSON-based formats specifically, RTFM offers a second extensibility path that doesn't need any Python:
SeeJSON schema mappingsfor the full reference, andRTFM × NotebookLMfor a concrete recipe.
# Search rtfm search "authentication flow" rtfm search "article 39" --corpus cgi --limit 5 # Sync rtfm sync # All registered sources rtfm sync /path/to/docs --corpus docs # Specific directory rtfm sync . --force # Force re-index # Source management rtfm add /path/to/docs --corpus docs --extensions md,pdf rtfm sources # Obsidian vault rtfm vault # Initialize for cwd vault rtfm vault /path/to/vault # Specific vault rtfm vault --regenerate # Regenerate _rtfm/ files # Cross-project Claude memory rtfm memory # Manual snapshot rtfm memory --install-hook # Auto-snapshot on SessionEnd # Status & info rtfm status rtfm books rtfm tags rtfm history path/to/file.md # Memory version history # Semantic search rtfm embed # Generate embeddings (one-time) rtfm semantic-search "tax deductions" --hybrid # MCP server rtfm serve
from rtfm import Library lib = Library("my_library.db") # Index stats = lib.ingest("documents/article.md", corpus="docs") result = lib.sync(".", corpus="my-project") # SyncResult(+3 ~1 -0 =42) # Search results = lib.search("depreciation", limit=10, corpus="cgi") results = lib.hybrid_search("amortissement fiscal", limit=10) # Export for LLM prompt_context = results.to_prompt(max_chars=8000) lib.close()
RTFM isn't a task manager. It's not an agent framework. It's the knowledge layer your agent needs underneath whatever you're already using.
┌─────────────────────────────────┐ │ GSD / Taskmaster / Claude Flow │ ← Orchestration ├─────────────────────────────────┤ │ RTFM │ ← Knowledge (you are here) ├─────────────────────────────────┤ │ Claude Code │ ← Execution └─────────────────────────────────┘
Without RTFM, your orchestrator drives an agent that hallucinates. With RTFM, the agent knows what it's building on.
Adding a parser is the easiest way to contribute — and the most impactful. SeeCONTRIBUTING.md.
Found a bug? Have an idea?Open an issue.
MIT — use it, fork it, extend it, ship it.
Code indexers see your code. RTFM sees everything.
⭐ Star on GitHubif RTFM saves your agent from hallucinating.
Curious how it works under the hood? See theArchitecture— SQLite + FTS5, the parser registry, and the priority-queue worker (ingest → embed → OCR).
This is a web browser that enables your coding agent, such as Claude Code, to visit websites on your behalf and assist you in identifying bugs or creating UI test cases.
A Retrieval-Augmented Generation (RAG) server for document processing, vector storage, and intelligent Q&A, powered by the Model Context Protocol.
Local code analysis MCP server with 25+ tools: semantic search, call graph tracing, dependency analysis, and symbol navigation. Built with Tree-sitter and CozoDB. Supports Go, Python, JS, TS.
A local-first code indexer that enhances LLMs with deep code understanding. It integrates with AI assistants via the Model Context Protocol (MCP) and supports AI-powered semantic search.
A knowledge management tool for code repositories using vector embeddings, powered by a local Ollama service.
A server for managing structured project context using SQLite, with support for vector embeddings for semantic search and Retrieval Augmented Generation (RAG).
A RAG-based Q&A server using a vector store built from Gemini CLI documentation.
Sign in to leave a review
Use Google, GitHub, or an email account so ratings stay tied to real people.
No reviews posted yet.



