<?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: OKAFOR KOSISOCHUKWU</title>
    <description>The latest articles on DEV Community by OKAFOR KOSISOCHUKWU (@okafor_kosisochukwu_f3e57).</description>
    <link>https://dev.to/okafor_kosisochukwu_f3e57</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2928518%2Fb63b4d18-88ed-4268-b942-0c2fc7a80a83.jpg</url>
      <title>DEV Community: OKAFOR KOSISOCHUKWU</title>
      <link>https://dev.to/okafor_kosisochukwu_f3e57</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/okafor_kosisochukwu_f3e57"/>
    <language>en</language>
    <item>
      <title>I gave my assistant a memory that survives the server it runs on</title>
      <dc:creator>OKAFOR KOSISOCHUKWU</dc:creator>
      <pubDate>Mon, 05 Oct 2026 20:03:39 +0000</pubDate>
      <link>https://dev.to/okafor_kosisochukwu_f3e57/i-gave-my-assistant-a-memory-that-survives-the-server-it-runs-on-3aea</link>
      <guid>https://dev.to/okafor_kosisochukwu_f3e57/i-gave-my-assistant-a-memory-that-survives-the-server-it-runs-on-3aea</guid>
      <description>&lt;p&gt;I built an assistant that remembers durable facts about the person using it, and&lt;br&gt;
the interesting part turned out not to be the storing.&lt;/p&gt;

&lt;p&gt;A quick summary of what it is. Cheta is a personal assistant you can reach from&lt;br&gt;
Telegram, a web page, a command line client, or a browser extension, and all four&lt;br&gt;
share one memory space per person. It picks between thirteen tools on its own,&lt;br&gt;
transcribes voice notes, reads PDF, Word, PowerPoint with the speaker notes,&lt;br&gt;
Excel and any plain text or source file, and can crawl a site you point it at.&lt;br&gt;
The browser extension reads the page you are currently on and can act on it.&lt;/p&gt;

&lt;p&gt;Now the failure that taught me the most.&lt;/p&gt;

&lt;p&gt;My first version kept its index in a SQLite file on the server. Every redeploy&lt;br&gt;
erased it, so the assistant told a user with twenty stored facts that it had&lt;br&gt;
nothing about them. The facts were safe the whole time. They live on Walrus&lt;br&gt;
Memory, which stores data as blobs on the Walrus network and is reached through&lt;br&gt;
an HTTP relayer, and the local index was only a cache. I had forgotten that, and&lt;br&gt;
the result was an assistant confidently denying it knew someone it had been&lt;br&gt;
talking to for weeks.&lt;/p&gt;

&lt;p&gt;It now rebuilds its index from a snapshot held in Walrus itself, so a fresh&lt;br&gt;
server recovers what it lost.&lt;/p&gt;

&lt;p&gt;The second lesson was about deciding what to keep. My first consolidation pass&lt;br&gt;
compared raw text, so two notes saying the same thing in different words never&lt;br&gt;
matched and an exact duplicate could be stored twice. Comparing a normalised form&lt;br&gt;
fixed that. A changed preference now retires the older note rather than sitting&lt;br&gt;
beside it, and two facts that conflict get flagged so the assistant can say so&lt;br&gt;
instead of contradicting itself later.&lt;/p&gt;

&lt;p&gt;The third lesson was about latency, and the cause surprised me. Turns were taking&lt;br&gt;
up to forty seconds. It was not the model. The provider was rate limiting, and&lt;br&gt;
the client library's automatic retry was sleeping for up to fifty seconds before&lt;br&gt;
trying again, against a timeout of thirty. Every one of those retries was wasted&lt;br&gt;
work. Turning the SDK retry off and rotating across several API keys took a rate&lt;br&gt;
limited turn from about four seconds of dead waiting to effectively nothing.&lt;/p&gt;

&lt;p&gt;The thing I would tell anyone adding memory to a bot: do not trust your own&lt;br&gt;
summary of whether it works. I compared two answers to the same question, one&lt;br&gt;
with memory switched on and one with it switched off, same model and same minute,&lt;br&gt;
and put them side by side. That comparison caught more problems than any test I&lt;br&gt;
wrote.&lt;/p&gt;

&lt;p&gt;Code and setup instructions are here, and it runs without any paid service:&lt;br&gt;
&lt;a href="https://github.com/Ksschkw/" rel="noopener noreferrer"&gt;https://github.com/Ksschkw/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn0088k0clviuorr2t8uu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn0088k0clviuorr2t8uu.png" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Longer write-up of the build:&lt;br&gt;
&lt;a href="https://medium.com/@kookafor893/i-gave-my-chatbot-a-memory-that-outlived-its-own-database-449ed737d0ec" rel="noopener noreferrer"&gt;https://medium.com/@kookafor893/i-gave-my-chatbot-a-memory-that-outlived-its-own-database-449ed737d0ec&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>blockchain</category>
    </item>
  </channel>
</rss>
