<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged backend developments</title>
<link>https://coderlegion.com/tag/backend+developments</link>
<description>Powered by Question2Answer</description>
<item>
<title>How Backboard.io Transformed My Multi-Agent AI System</title>
<link>https://coderlegion.com/14786/how-backboard-io-transformed-my-multi-agent-ai-system</link>
<description>&lt;p&gt;I built &lt;strong&gt;Londoolink AI&lt;/strong&gt; to help users stay on top of their day by generating personalized briefings from emails, calendar events, Notion pages, and social media.&lt;/p&gt;
&lt;p&gt;It worked well and pulled together useful insights, but it had one major flaw.&lt;/p&gt;
&lt;p&gt;It forgot everything.&lt;/p&gt;
&lt;p&gt;Every time a user came back, it was like starting over. Preferences were lost, conversations had no context, and the experience felt repetitive. The system was smart, but it didn’t feel intelligent.&lt;/p&gt;
&lt;p&gt;That changed when I integrated &lt;strong&gt;Backboard.io&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;You can view the project here: &lt;a rel=&quot;nofollow&quot; href=&quot;https://londoolink-ai.vercel.app/&quot;&gt;https://londoolink-ai.vercel.app/&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;1-the-problem-no-memory&quot;&gt;1. The Problem: No Memory&lt;/h3&gt;
&lt;p&gt;Before the integration, users had to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Repeat their preferences every day&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Re-explain what mattered to them&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ask the same follow-up questions again&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Even though the system could analyze data well, it didn’t learn from users over time.&lt;/p&gt;
&lt;h3 id=&quot;2-the-shift-to-a-stateful-system&quot;&gt;2. The Shift to a Stateful System&lt;/h3&gt;
&lt;p&gt;I first came across &lt;a rel=&quot;nofollow&quot; href=&quot;http://Backboard.io&quot;&gt;&lt;strong&gt;Backboard.io&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;through an email&lt;/strong&gt; after submitting my project to an &lt;strong&gt;Auth0 Hackathon on Devpost&lt;/strong&gt;. The team had reached out, sharing more about the platform and how it enables AI systems to become stateful through persistent memory, threads, and tool-calling.&lt;/p&gt;
&lt;p&gt;That sparked my curiosity, so I explored it further during &lt;strong&gt;MLH Global Hack Week: API&lt;/strong&gt;, where I got to understand more about how it actually works in practice.&lt;/p&gt;
&lt;p&gt;What stood out was simple but powerful:&lt;/p&gt;
&lt;p&gt;Instead of building memory from scratch, Backboard provides it out of the box.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;3-what-changed&quot;&gt;3. What Changed&lt;/h3&gt;
&lt;h4 id=&quot;persistent-memory&quot;&gt;&lt;em&gt;Persistent Memory&lt;/em&gt;&lt;/h4&gt;
&lt;p&gt;Now, users can store preferences like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Preferring meetings in the morning&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prioritizing certain emails&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And the system remembers them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here’s a simplified version of how I store preferences:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This function saves a new piece of memory (like a user preference) for a specific assistant using Backboard’s API.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;class BackboardService:
    def add_memory(self, assistant_id, content):
        response = requests.post(
            f&quot;{self.base_url}/assistants/{assistant_id}/memories&quot;,
            headers=self.headers,
            json={&quot;content&quot;: content}
        )
        return response.json()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Retrieving preferences:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This function searches stored memories and returns anything related to user preferences so the assistant can personalize responses.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def get_preferences(self, assistant_id):
    response = requests.post(
        f&quot;{self.base_url}/assistants/{assistant_id}/memories/search&quot;,
        headers=self.headers,
        json={&quot;query&quot;: &quot;user preferences&quot;}
    )
    return response.json().get(&quot;memories&quot;, [])
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;better-document-retrieval&quot;&gt;&lt;em&gt;Better Document Retrieval&lt;/em&gt;&lt;/h4&gt;
&lt;p&gt;I moved from a local setup to a cloud-based system.&lt;/p&gt;
&lt;p&gt;This function uploads documents (like notes or data sources) to the cloud so they can be retrieved and used by the AI system later.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def add_document(self, content, metadata):
    return requests.post(
        f&quot;{self.base_url}/documents&quot;,
        headers=self.headers,
        json={
            &quot;content&quot;: content,
            &quot;metadata&quot;: metadata
        }
    )
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This improved both scalability and search quality.&lt;/p&gt;
&lt;h4 id=&quot;threaded-conversations&quot;&gt;&lt;em&gt;Threaded Conversations&lt;/em&gt;&lt;/h4&gt;
&lt;p&gt;Now users can ask follow-up questions with full context.&lt;/p&gt;
&lt;p&gt;This function creates a conversation thread tied to a specific user so all messages stay connected.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def create_thread(self, user_id):
    response = requests.post(
        f&quot;{self.base_url}/threads&quot;,
        headers=self.headers,
        json={&quot;metadata&quot;: {&quot;user_id&quot;: user_id}}
    )
    return response.json()[&quot;thread_id&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Adding messages to a thread:&lt;/p&gt;
&lt;p&gt;This appends a new message (from a user or an assistant) to an existing conversation thread to maintain context.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def add_message(self, thread_id, role, content):
    requests.post(
        f&quot;{self.base_url}/threads/{thread_id}/messages&quot;,
        headers=self.headers,
        json={&quot;role&quot;: role, &quot;content&quot;: content}
    )
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;4-how-it-all-comes-together&quot;&gt;4. How It All Comes Together&lt;/h3&gt;
&lt;p&gt;In my main agent:&lt;/p&gt;
&lt;p&gt;This is the full flow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Get or create an assistant&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fetch stored user preferences&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Generate a personalized briefing&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a conversation thread for follow-ups&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def create_briefing(self, user_id):
    assistant_id = self.get_or_create_assistant(user_id)

    preferences = self.get_preferences(assistant_id)

    briefing = self.generate_briefing(
        data_sources,
        user_preferences=preferences
    )

    thread_id = self.create_thread(user_id)

    return {
        &quot;briefing&quot;: briefing,
        &quot;thread_id&quot;: thread_id
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;5-challenges-along-the-way&quot;&gt;5. Challenges Along the Way&lt;/h3&gt;
&lt;p&gt;One issue I ran into was handling API responses.&lt;/p&gt;
&lt;p&gt;The API sometimes returned &lt;strong&gt;201 instead of 200&lt;/strong&gt;, so I updated my handler:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;if response.status_code in (200, 201):
    return response.json()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I also had to handle endpoint inconsistencies like &lt;code&gt;/memory&lt;/code&gt; vs &lt;code&gt;/memories&lt;/code&gt;, and made response parsing more flexible.&lt;/p&gt;
&lt;h3 id=&quot;6-the-impact&quot;&gt;6. The Impact&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Before Backboard &lt;/th&gt;&lt;th&gt;After Backboard&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;No memory &lt;/td&gt;&lt;td&gt;Remembers user preferences&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Generic outputs &lt;/td&gt;&lt;td&gt;Personalized results&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;No conversation continuity &lt;/td&gt;&lt;td&gt;Context-aware conversations&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;7-key-takeaways&quot;&gt;7. Key Takeaways&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Memory makes AI feel like an assistant, not just a tool&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A simple service layer keeps integrations clean&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Small API details matter more than you think&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;8-shoutout&quot;&gt;8. Shoutout&lt;/h3&gt;
&lt;p&gt;I learned more about &lt;strong&gt;Backboard.io&lt;/strong&gt; during the ongoing &lt;strong&gt;MLH Global Hack Week: API Week 2026&lt;/strong&gt;, a week-long online hackathon by &lt;strong&gt;Major League Hacking (MLH)&lt;/strong&gt; focused on APIs, building, and learning through live sessions and community challenges.&lt;/p&gt;
&lt;p&gt;Big shoutout to the MLH community and organizers for creating an environment where developers can explore tools like this while building real-world projects and learning by doing.&lt;/p&gt;
&lt;h3 id=&quot;9-final-thoughts&quot;&gt;9. Final Thoughts&lt;/h3&gt;
&lt;p&gt;This integration changed my system from something that generates results into something that understands users over time.&lt;/p&gt;
&lt;p&gt;If you’re building AI applications, adding memory is one of the most impactful upgrades you can make.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/14786/how-backboard-io-transformed-my-multi-agent-ai-system</guid>
<pubDate>Tue, 14 Apr 2026 12:56:36 +0000</pubDate>
</item>
</channel>
</rss>