<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dharani</title>
    <description>The latest articles on DEV Community by Dharani (@dharanidh75).</description>
    <link>https://dev.to/dharanidh75</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3959556%2F61998cf4-d2a0-4dfd-8d93-1597d247f195.jpeg</url>
      <title>DEV Community: Dharani</title>
      <link>https://dev.to/dharanidh75</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dharanidh75"/>
    <language>en</language>
    <item>
      <title>The .txt File as the Soul of a Personal AI — FileRAG Memory Architecture</title>
      <dc:creator>Dharani</dc:creator>
      <pubDate>Sat, 30 May 2026 06:45:32 +0000</pubDate>
      <link>https://dev.to/dharanidh75/the-txt-file-as-the-soul-of-a-personal-ai-filerag-memory-architecture-k71</link>
      <guid>https://dev.to/dharanidh75/the-txt-file-as-the-soul-of-a-personal-ai-filerag-memory-architecture-k71</guid>
      <description>&lt;h1&gt;
  
  
  The .txt File as the Soul of a Personal AI — FileRAG Memory Architecture
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;By Dharanidharan J (JD)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Full Stack &amp;amp; AI Engineer | Building Jarvix&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  The Problem Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;Every chatbot tutorial teaches you the same thing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;history&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="n"&gt;history&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that works — until it doesn't.&lt;/p&gt;

&lt;p&gt;After 500 turns, your dict has forgotten who the user is. After 1000 turns, you're hitting token limits. After a restart, everything is gone. Redis helps with persistence but still buries early facts under noise. Vector DBs help with retrieval but bloat storage and need infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if the memory itself was just a file?&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Idea
&lt;/h2&gt;

&lt;p&gt;Every conversation a user has gets distilled into a plain &lt;code&gt;.txt&lt;/code&gt; file. That file is the brain. On every new query, a hybrid BM25 + semantic RAG retrieves the most relevant chunks from it and injects them as context.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;users/
└── jd.txt        ← the soul file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The soul file looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Turns 1-5]
- User's name is JD, software engineer
- Building FileRAG, a novel memory architecture
- Uses Pop!_OS with Fish shell and NVIDIA GPU

[Turns 6-10]
- Has a cat named Pixel who distracts during coding
- Paused TaskNest due to burnout
- Now focused on AgenticMesh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Human readable. Editable. Yours.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Is Different
&lt;/h2&gt;

&lt;p&gt;Most memory systems store &lt;strong&gt;messages&lt;/strong&gt;. FileRAG stores a &lt;strong&gt;relationship&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;System&lt;/th&gt;
&lt;th&gt;What it stores&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Dict / Redis&lt;/td&gt;
&lt;td&gt;Raw message objects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vector DB&lt;/td&gt;
&lt;td&gt;Embeddings of messages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FileRAG&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Distilled understanding of the user&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The longer you use it, the more the AI understands you — not because it has more messages, but because it has a better summary of who you are.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User message
     ↓
Topic drift check (cosine similarity)
     ├── Drift detected → distill current buffer immediately
     └── No drift → continue
     ↓
Hybrid retrieval (BM25 + ChromaDB) from soul file
     ↓
Inject context → LLM responds
     ↓
Append to turn buffer
     ↓
Every 5 turns → distill → append to soul file → update ChromaDB
     ↓
Emergency distillation on exit (SIGINT/SIGTERM)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key innovations:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Topic-Drift Distillation&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Instead of waiting every N turns blindly, the system measures semantic similarity between the current buffer and the new message. If similarity drops below 0.25, it immediately distills and starts a fresh block. This keeps topic chunks clean and isolated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Deduplication&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Before writing any new chunk, cosine similarity is checked against all existing chunks. If &amp;gt;92% similar, the chunk is skipped. This prevents filler conversations from polluting the soul file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Emergency Exit Handler&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;SIGINT&lt;/code&gt; and &lt;code&gt;SIGTERM&lt;/code&gt; are intercepted. On Ctrl+C, the current buffer is immediately distilled before the process exits. Nothing is lost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Hybrid Retrieval&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
BM25 catches exact keywords (project names, usernames). Semantic search catches meaning (preferences, personality). Together they outperform either alone.&lt;/p&gt;


&lt;h2&gt;
  
  
  Benchmark Results
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Tested on Pop!_OS, NVIDIA GPU, sentence-transformers all-MiniLM-L6-v2 embeddings&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Small (20 turns)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Dict&lt;/th&gt;
&lt;th&gt;Redis&lt;/th&gt;
&lt;th&gt;Vector DB&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;FileRAG&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Write Speed (ms)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.0004&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.30&lt;/td&gt;
&lt;td&gt;33.38&lt;/td&gt;
&lt;td&gt;20.33&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read Speed (ms)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.002&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.26&lt;/td&gt;
&lt;td&gt;6.64&lt;/td&gt;
&lt;td&gt;9.26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage (KB)&lt;/td&gt;
&lt;td&gt;1.42&lt;/td&gt;
&lt;td&gt;1.38&lt;/td&gt;
&lt;td&gt;396.16&lt;/td&gt;
&lt;td&gt;356.66&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accuracy&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;67%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Persistent&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✅&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At small scale, Dict and Redis win on speed. FileRAG matches on accuracy. Fair.&lt;/p&gt;
&lt;h3&gt;
  
  
  Medium (500 turns)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Dict&lt;/th&gt;
&lt;th&gt;Redis&lt;/th&gt;
&lt;th&gt;Vector DB&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;FileRAG&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Write Speed (ms)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.0002&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.08&lt;/td&gt;
&lt;td&gt;22.23&lt;/td&gt;
&lt;td&gt;18.93&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read Speed (ms)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.002&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.24&lt;/td&gt;
&lt;td&gt;8.51&lt;/td&gt;
&lt;td&gt;7.64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage (KB)&lt;/td&gt;
&lt;td&gt;34.75&lt;/td&gt;
&lt;td&gt;33.77&lt;/td&gt;
&lt;td&gt;1604.16&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;653.47&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accuracy&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0%&lt;/strong&gt; ❌&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0%&lt;/strong&gt; ❌&lt;/td&gt;
&lt;td&gt;67%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is where it gets interesting. Dict and Redis completely fail — core facts buried under 490 turns of noise. FileRAG still retrieves perfectly.&lt;/p&gt;
&lt;h3&gt;
  
  
  Large (1000 turns)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Dict&lt;/th&gt;
&lt;th&gt;Redis&lt;/th&gt;
&lt;th&gt;Vector DB&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;FileRAG&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Storage (KB)&lt;/td&gt;
&lt;td&gt;69.47&lt;/td&gt;
&lt;td&gt;67.51&lt;/td&gt;
&lt;td&gt;4338.36&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;938.74&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Soul file only (KB)&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;18.58&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accuracy&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0%&lt;/strong&gt; ❌&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0%&lt;/strong&gt; ❌&lt;/td&gt;
&lt;td&gt;67%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;FileRAG's total storage includes ChromaDB index overhead. The soul file itself — the actual human-readable memory — is just &lt;strong&gt;18 KB&lt;/strong&gt; for 1000 turns.&lt;/p&gt;

&lt;p&gt;---|---|---|---|---|&lt;br&gt;
| Storage (KB) | 3,478 | 3,381 | 76,159 | &lt;strong&gt;29,812&lt;/strong&gt; |&lt;br&gt;
| Soul file (KB) | — | — | — | &lt;strong&gt;~1,865&lt;/strong&gt; |&lt;br&gt;
| Accuracy | 0% | 0% | ~67% | &lt;strong&gt;~100%&lt;/strong&gt; |&lt;/p&gt;

&lt;p&gt;At 100k turns, Vector DB would consume ~74 MB just for index storage. FileRAG's soul file stays under 2 MB — human-readable, portable, private.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Verdict
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Dict&lt;/th&gt;
&lt;th&gt;Redis&lt;/th&gt;
&lt;th&gt;Vector DB&lt;/th&gt;
&lt;th&gt;FileRAG&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fastest write&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best accuracy at scale&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Smallest storage at scale&lt;/td&gt;
&lt;td&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;Persistent&lt;/td&gt;
&lt;td&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;No infrastructure&lt;/td&gt;
&lt;td&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;Local / offline&lt;/td&gt;
&lt;td&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;Privacy (on device)&lt;/td&gt;
&lt;td&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;Grows naturally with user&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;FileRAG is not the fastest. It is not the simplest. But it is the &lt;strong&gt;only architecture that gets more accurate as the conversation grows&lt;/strong&gt;, without growing infrastructure requirements.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Human Analogy
&lt;/h2&gt;

&lt;p&gt;Your brain doesn't record every conversation verbatim. It compresses experiences into memory — feelings, facts, patterns. The hippocampus distills, the cortex stores.&lt;/p&gt;

&lt;p&gt;FileRAG does the same thing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Conversation → Distillation → Soul file → Retrieval → Natural response
Experience  → Hippocampus  → Cortex    → Recall    → Natural behaviour
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The soul file is not a database. It is a diary the AI reads before speaking to you.&lt;/p&gt;




&lt;h2&gt;
  
  
  Limitations (Honest)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Write speed&lt;/strong&gt; is slower than Dict/Redis — embedding costs time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not suited for 10k+ concurrent users&lt;/strong&gt; — file I/O doesn't scale horizontally&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Distillation quality&lt;/strong&gt; depends on the LLM used — a weak summariser produces weak memories&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;10k+ turns&lt;/strong&gt; require deduplication to prevent soul file pollution (implemented, but adds complexity)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Stack
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;LLM          → Groq (llama3-70b-8192)&lt;/span&gt;
&lt;span class="s"&gt;Distillation → Groq (llama3-70b-8192) every 5 turns or on topic drift&lt;/span&gt;
&lt;span class="s"&gt;Embeddings   → sentence-transformers/all-MiniLM-L6-v2&lt;/span&gt;
&lt;span class="s"&gt;Vector store → ChromaDB (persistent)&lt;/span&gt;
&lt;span class="s"&gt;Retrieval    → Hybrid BM25 + Cosine Semantic&lt;/span&gt;
&lt;span class="s"&gt;Memory       → {user_id}.txt — the soul file&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Get the Code
&lt;/h2&gt;

&lt;p&gt;The full implementation — &lt;code&gt;main.py&lt;/code&gt;, &lt;code&gt;benchmark.py&lt;/code&gt;, and the architecture — is available on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;→ &lt;a href="https://github.com/dharanidh75/filerag-memory.git" rel="noopener noreferrer"&gt;github.com/dharanidh75/filerag-memory&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is also the memory layer being built into &lt;strong&gt;Jarvix&lt;/strong&gt; — a local-first voice AI assistant for Pop!_OS.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;v2: Structured memory schema (facts, preferences, timeline)&lt;/li&gt;
&lt;li&gt;v3: Multi-user support with isolated soul files per session&lt;/li&gt;
&lt;li&gt;v4: Fine-tuned distillation model for higher extraction quality&lt;/li&gt;
&lt;li&gt;v5: Production-ready API layer&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;If you're building a local AI, a personal assistant, or just tired of your chatbot forgetting who you are after every restart — give FileRAG a try.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The soul file is 18 KB. Your AI deserves better than a dict.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Dharanidharan J (JD)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/dharanidharan-j-7757a9321/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; · &lt;a href="https://www.github.com/dharanidh75" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; &lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>llm</category>
      <category>rag</category>
    </item>
  </channel>
</rss>
