The Private Personal Assistant
Build a local RAG pipeline that searches through your personal notes, journals, PDFs, and research — using plain English questions. Think "personal Google" for everything you've ever written or saved.
Build a local RAG pipeline that searches through your personal notes, journals, PDFs, and research — using plain English questions. Think "personal Google" for everything you've ever written or saved.
What We're Building
A local search engine for your personal documents. You'll index your notes, journals, PDFs, and text files into a vector database, then query them with natural language: "What did I write about productivity systems last spring?" or "Find the journal entry where I talked about that conversation with Dad." Everything runs on your Pi. Nothing leaves your network.
I have ten years of markdown notes, journal entries, project logs, and saved articles scattered across my filesystem. Some in ~/Documents, some in ~/notes, some buried in old backup drives. Traditional search — grep, filename matching, folder browsing — works fine when I know exactly what I'm looking for. It fails when I don't.
Semantic search is different. Instead of matching keywords, it matches meaning. A query like "ideas I had about garden automation" finds paragraphs about irrigation timers, soil moisture sensors, and Arduino-controlled watering — even if none of those exact words appear in the query. This is what RAG makes possible.
Search "garden automation" → only finds files containing those exact words. Misses notes about "watering system with moisture sensors" and "Arduino greenhouse controller."
Search "garden automation" → finds everything conceptually related to automated gardening, regardless of the specific words used. Surfaces connections you forgot existed.
If you've already built the Offline-First AI Stack, you have all the components. We're going to customize them for personal document search:
Before you index anything, take inventory of what you actually have. Most people underestimate their personal document corpus. Common sources:
Don't Overthink This
You don't need to organize your files before indexing them. That's the whole point of semantic search — the system finds things regardless of where they're stored. Dump everything into a single directory if you want. The embeddings don't care about your folder structure.
Assuming you have the base stack (Ollama + ChromaDB) from the Offline-First guide, we need to add document loading capabilities for additional file types:
We need a loader that handles whatever you throw at it. Create universal_loader.py:
About the Chunk Overlap
The overlap=50 parameter means each chunk shares 50 words with the previous chunk. This prevents important ideas from being split across chunk boundaries. If a key sentence is the last 10 words of chunk 3 and the first 10 words of chunk 4, it'll be findable in both. You can adjust this — more overlap = better recall but more storage.
Now the satisfying part — feeding your documents into the pipeline. Using the RAGEngine class from the Offline-First guide:
Indexing Takes Time — Plan Accordingly
Each document needs to be loaded, chunked, embedded (via Ollama), and stored in ChromaDB. On a Pi 5 without an NPU, expect roughly 1-3 seconds per chunk. A medium-sized personal archive (500-1000 chunks) might take 10-30 minutes. Run it in the background and let it work.
With your documents indexed, here's what daily use looks like:
"What was I thinking about last January?" → Finds journal entries from January 2025, even if they weren't about anything specific — the embedding captures the general tone, concerns, and themes of that period. This is eerily effective for self-reflection.
"What was the original plan for the garden automation system?" → Surfaces notes from three years ago that you'd forgotten you wrote, including the sketch of the sensor layout and the rationale for choosing I²C over UART.
"Have I ever connected ideas about game design to my work on nonprofit donor engagement?" → Finds a paragraph in a 2022 journal entry where you drew parallels between RPG quest structures and donor journey mapping. A connection you'd never have found with keyword search.
"What do my saved articles say about forest garden design in temperate climates?" → Searches across 50+ saved PDFs and articles, pulls out relevant passages about species selection, guild planting, and microclimate management, and synthesizes them into a coherent summary.
This is where the personal RAG pipeline becomes genuinely transformative. Instead of starting every AI conversation from scratch, you can feed the model context from your own life before asking questions.
Example: You're trying to decide whether to accept a job offer. You've been journaling about career satisfaction for years. Before asking the AI "Should I take this job?", you retrieve the 10 most relevant passages from your journal about career values, work-life balance preferences, and professional goals — then include those as context in your prompt.
The AI's response is now grounded in your actual thinking, not generic career advice. This is the difference between asking a stranger for advice and asking someone who has read your diary.
Ethical Note
The purpose of this tool is to help you see patterns in your own thinking — not to replace your judgment. The AI surfaces what you've already written; you decide what to do with it. I've found it most useful as a mirror: here's what you've been saying about this topic over time. What do you notice?
An index is only useful if it stays current. I use a simple cron job to re-index new and modified files nightly:
A Note on ChromaDB and Duplicates
ChromaDB doesn't automatically deduplicate by content. If you re-index the same file, you'll get duplicate entries. The simple approach above re-indexes everything nightly — for a small personal archive, this is fine (duplicates just mean stronger signal for those documents). For larger collections, add a last-modified check to the re-index script.
For personal document search, smaller models work surprisingly well because you're not asking them to generate world knowledge — just to find and synthesize what you've already written:
| TASK | RECOMMENDED MODEL | WHY |
|---|---|---|
| Embeddings | nomic-embed-text | Fast, lightweight, excellent semantic quality. The only choice for embedding. |
| Simple Q&A | llama3.2:3b | Fast enough for interactive use. Good at extracting facts from context. |
| Synthesis & themes | qwen2.5:7b | Better at identifying patterns across multiple documents. Slower but more insightful. |
| Code + notes | qwen2.5-coder:3b | If your notes contain code snippets, this model understands both natural language and code. |
I want to be direct about why this matters. Your notes contain things you wouldn't post publicly: half-formed ideas, personal struggles, honest assessments of people and situations, creative work in progress. These are not things you should upload to a cloud AI service.
When you use ChatGPT or Claude with personal content, you're trusting a corporation with your inner life. Most people don't read the terms of service carefully enough to know what rights they're granting. Even if the company has good intentions today, data retention policies change, breaches happen, and training data is valuable.
A local RAG pipeline eliminates this trade-off entirely. You get the cognitive augmentation — the ability to search, synthesize, and explore your own thinking — without the privacy cost. Your journals stay on your hardware. Your ideas remain yours.
This isn't paranoia. It's architecture. The right tool for private data is a private tool.