<?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: Aaditya Raaj Pandit</title>
    <description>The latest articles on DEV Community by Aaditya Raaj Pandit (@aaditya_raajpandit_d56f3).</description>
    <link>https://dev.to/aaditya_raajpandit_d56f3</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%2F3838116%2F1708367c-fd3c-40c2-bf12-734dc3d857be.jpg</url>
      <title>DEV Community: Aaditya Raaj Pandit</title>
      <link>https://dev.to/aaditya_raajpandit_d56f3</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aaditya_raajpandit_d56f3"/>
    <language>en</language>
    <item>
      <title>How I built Multi-User Memory Isolation with Hindsight Banks</title>
      <dc:creator>Aaditya Raaj Pandit</dc:creator>
      <pubDate>Mon, 23 Mar 2026 06:14:55 +0000</pubDate>
      <link>https://dev.to/aaditya_raajpandit_d56f3/how-i-built-multi-user-memory-isolation-with-hindsight-banks-4nk1</link>
      <guid>https://dev.to/aaditya_raajpandit_d56f3/how-i-built-multi-user-memory-isolation-with-hindsight-banks-4nk1</guid>
      <description>&lt;p&gt;Last week I realized our AI was sharing one user's excuses with a completely different person — fixing it with Hindsight banks took exactly three lines of code.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Built
&lt;/h2&gt;

&lt;p&gt;AXIOM is a discipline accountability agent for engineering students. It tracks goals, scores discipline out of 1000, builds personalized daily plans, and remembers everything you tell it across sessions using &lt;a href="https://github.com/vectorize-io/hindsight" rel="noopener noreferrer"&gt;Hindsight&lt;/a&gt; persistent memory.&lt;/p&gt;

&lt;p&gt;My specific contribution was solving the multi-user problem — making sure each user's memory is completely private and isolated from everyone else's.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: One Brain, Many Users
&lt;/h2&gt;

&lt;p&gt;Our initial implementation used a single Hindsight memory bank for everyone:&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;BANK_ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;discipline-bot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This meant every user's memories went into the same pool. When User A logged in, &lt;code&gt;recall()&lt;/code&gt; might return memories from User B's sessions. The agent was accidentally sharing one person's goals, failures, and excuses with a completely different person.&lt;/p&gt;

&lt;p&gt;For a discipline agent where the whole point is personal accountability — this was a fatal flaw.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fix: Per-User Banks
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://vectorize.io/features/agent-memory" rel="noopener noreferrer"&gt;Hindsight's memory architecture&lt;/a&gt; uses memory banks — completely isolated containers where memories in one bank are never visible to another. The fix was simple:&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;BANK_ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;axiom-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When Samith logs in, his bank is &lt;code&gt;axiom-samith&lt;/code&gt;. When John logs in, his bank is &lt;code&gt;axiom-john&lt;/code&gt;. These banks are 100% isolated — no cross-contamination possible.&lt;/p&gt;

&lt;p&gt;The best part: you don't need to pre-create these banks. Hindsight automatically creates a new bank the first time you call &lt;code&gt;retain()&lt;/code&gt; on it. Zero configuration for new users:&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="c1"&gt;# Login screen
&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Enter your name to begin:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Start Session&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &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;-&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_set&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
        &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rerun&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Bank ID is automatically unique per user
&lt;/span&gt;&lt;span class="n"&gt;BANK_ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;axiom-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No bank setup. No initialization. The first message a new user sends creates their entire private memory environment automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demonstrating Isolation to Judges
&lt;/h2&gt;

&lt;p&gt;This became one of the most powerful parts of our demo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open app → type "Samith" → have a full conversation, log some failures&lt;/li&gt;
&lt;li&gt;Click "Switch User" in sidebar → type "John"&lt;/li&gt;
&lt;li&gt;Completely blank memory — AXIOM has no idea who Samith is&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Judges can see exactly how per-user memory isolation works in real time. It's live and demonstrable in 60 seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before vs After
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt; Single shared bank. User B could see User A's excuses. Privacy completely broken.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt; Every user has a private bank. &lt;code&gt;axiom-samith&lt;/code&gt; and &lt;code&gt;axiom-john&lt;/code&gt; are completely separate. The agent's responses are always grounded in that specific user's history only.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Hardcoded bank IDs are a bug waiting to happen. Always use namespaced user-specific bank IDs from day one.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hindsight.vectorize.io/" rel="noopener noreferrer"&gt;Hindsight documentation&lt;/a&gt; confirms bank isolation is complete — memories in one bank are never visible to another.&lt;/li&gt;
&lt;li&gt;Hindsight bank auto-creation eliminates all onboarding friction — no initialization code needed.&lt;/li&gt;
&lt;li&gt;Memory isolation is a feature, not just a technical detail. Users need to trust their data is private.&lt;/li&gt;
&lt;li&gt;The Switch User demo is the single most convincing way to show judges how per-user persistent memory actually works.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full code: &lt;a href="https://github.com/itzsam10/axiom-discipline-ai" rel="noopener noreferrer"&gt;https://github.com/itzsam10/axiom-discipline-ai&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Live demo: &lt;a href="https://axiom-discipline-ai-wstowhyf2yr6ehevrcb9nw.streamlit.app/" rel="noopener noreferrer"&gt;https://axiom-discipline-ai-wstowhyf2yr6ehevrcb9nw.streamlit.app/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>hindsight</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
