<?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: Brinn</title>
    <description>The latest articles on DEV Community by Brinn (@brinn_app).</description>
    <link>https://dev.to/brinn_app</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%2F4175031%2F0dfb3d3a-9de3-4870-b1be-db79c732e0a9.jpg</url>
      <title>DEV Community: Brinn</title>
      <link>https://dev.to/brinn_app</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/brinn_app"/>
    <language>en</language>
    <item>
      <title>The Mistakes We Made While Designing Long-Term AI Memory</title>
      <dc:creator>Brinn</dc:creator>
      <pubDate>Sat, 10 Oct 2026 10:43:48 +0000</pubDate>
      <link>https://dev.to/brinn_app/the-mistakes-we-made-while-designing-long-term-ai-memory-4l7</link>
      <guid>https://dev.to/brinn_app/the-mistakes-we-made-while-designing-long-term-ai-memory-4l7</guid>
      <description>&lt;p&gt;We started building what is now Brinn in August 2025, under the earlier name Memolink. The first version was a fairly conventional app: entries, people and categories, with a web client and an API. Since then the product has been renamed, restructured and extended across several surfaces.&lt;/p&gt;

&lt;p&gt;Looking back at that arc, a few of our early assumptions about long-term memory didn't hold up. This post is an honest list of the lessons, not a postmortem of any single failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. We framed memory as a journal
&lt;/h2&gt;

&lt;p&gt;For a while, the place where captured information lived was called a "Journal". It sounded natural, but it quietly told users what the product was for: writing diary-like entries on purpose.&lt;/p&gt;

&lt;p&gt;That's not how people use memory. They fire off a voice note while walking, forward an email, jot a half-sentence. In 2026 we renamed Journal to &lt;strong&gt;Memories&lt;/strong&gt; across the product, and the framing change mattered more than we expected. Names set expectations about effort.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; the vocabulary of your product decides how much work users think they're signing up for.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. We thought of "the app" as the product
&lt;/h2&gt;

&lt;p&gt;The earliest versions were centred on a web client. But the moments when people need to remember something rarely happen inside a web app. They happen in a chat thread, an inbox, a browser tab.&lt;/p&gt;

&lt;p&gt;That pushed us toward being present where people already are: messaging, email, web, desktop and a browser extension, all backed by the same memory. We wrote about the practical side in &lt;a href="https://www.brinn.app/blogs/whatsapp-web-desktop-which-brinn-surface-for-which-job" rel="noopener noreferrer"&gt;which Brinn surface suits which job&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; memory should follow the person, not the interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. We treated storage as the hard part
&lt;/h2&gt;

&lt;p&gt;It's easy to assume the difficulty in AI memory is capacity. It isn't. The hard parts turned out to be capture with no friction, understanding dates and entities, retrieving the &lt;em&gt;right&lt;/em&gt; thing, and following through with reminders. See &lt;a href="https://www.brinn.app/blogs/why-ai-reminders-misread-relative-dates" rel="noopener noreferrer"&gt;why AI reminders misread relative dates&lt;/a&gt; for one example of how small errors undermine trust.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; a memory system is judged by what it surfaces at the right moment, not by what it holds.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. We underestimated how much "forgetting" matters
&lt;/h2&gt;

&lt;p&gt;More stored data isn't better data. Stale facts, duplicates and noise degrade retrieval. Good memory needs ways for newer information to supersede older, and for users to see and delete what's stored. We cover the user-side controls in &lt;a href="https://www.brinn.app/blogs/how-to-delete-your-data-from-ai-services" rel="noopener noreferrer"&gt;how to delete your data from AI services&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; design the forgetting at the same time as the remembering.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. We kept renaming things
&lt;/h2&gt;

&lt;p&gt;Memolink became Brinn. Journal became Memories. Pieces of the stack were reorganised into a monorepo with shared API contracts. Each change was reasonable on its own, but the cumulative churn has a cost for users, docs and ourselves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; get naming and structure as right as you can early, and treat renames as expensive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this leaves us
&lt;/h2&gt;

&lt;p&gt;None of these were catastrophic, and we're still learning. But if you're building a personal AI, we'd suggest asking early: what does our wording imply, where do users actually need us, and what does the system do when information changes?&lt;/p&gt;

&lt;p&gt;We're applying these lessons in &lt;a href="https://www.brinn.app" rel="noopener noreferrer"&gt;Brinn&lt;/a&gt;, a personal AI for reminders, lists and memory across WhatsApp, email, web and desktop. What would you add to the list?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>startup</category>
      <category>productivity</category>
      <category>architecture</category>
    </item>
    <item>
      <title>The Hardest Problem in Personal AI Isn't the LLM</title>
      <dc:creator>Brinn</dc:creator>
      <pubDate>Sat, 10 Oct 2026 10:38:01 +0000</pubDate>
      <link>https://dev.to/brinn_app/the-hardest-problem-in-personal-ai-isnt-the-llm-d42</link>
      <guid>https://dev.to/brinn_app/the-hardest-problem-in-personal-ai-isnt-the-llm-d42</guid>
      <description>&lt;p&gt;When people picture the hard part of building a personal AI assistant, they usually picture the model: which LLM, which prompt, which fine-tune. In our experience, the model is the part that's easiest to swap and the part users notice least. The hard problems are everywhere around it.&lt;/p&gt;

&lt;p&gt;This is a practical list of where the real work tends to hide. It's opinion drawn from building in this space, not a benchmark.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Getting information in with no friction
&lt;/h2&gt;

&lt;p&gt;An assistant is only as good as what it has captured. And people capture things in the middle of other things: while walking, in a chat thread, forwarding an email. If saving something takes more effort than remembering it, it won't happen.&lt;/p&gt;

&lt;p&gt;That means supporting messy, multimodal input (text, voice notes, forwarded messages, web pages) and turning it into something usable without asking the user to fill in forms. We covered the user side of this in &lt;a href="https://www.brinn.app/blogs/capture-inbox-method-with-ai" rel="noopener noreferrer"&gt;the capture inbox method&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Understanding time
&lt;/h2&gt;

&lt;p&gt;"Next Friday", "in two weeks", "the day after the meeting". Relative dates are ambiguous, depend on the user's time zone, and depend on &lt;em&gt;when the message was sent&lt;/em&gt;. Misparse one and you get a reminder at the wrong time, which destroys trust quickly. We wrote about the failure modes in &lt;a href="https://www.brinn.app/blogs/why-ai-reminders-misread-relative-dates" rel="noopener noreferrer"&gt;why AI reminders misread relative dates&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Identity and entities
&lt;/h2&gt;

&lt;p&gt;Is "Sam" the same Sam as last month? Is "the dentist" a person, a place, or a calendar entry? Resolving references across notes is a data-modelling problem that no prompt solves on its own. See &lt;a href="https://www.brinn.app/blogs/how-ai-extracts-people-places-dates-from-notes" rel="noopener noreferrer"&gt;how AI extracts people, places and dates from notes&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Retrieval that knows what "relevant" means
&lt;/h2&gt;

&lt;p&gt;Semantic similarity is necessary but not sufficient: you also need recency, supersession and exact lookups. We discussed this in &lt;a href="https://www.brinn.app/blogs/retrieval-augmented-generation-personal-notes-explained" rel="noopener noreferrer"&gt;retrieval-augmented generation for personal notes&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Being present on many surfaces
&lt;/h2&gt;

&lt;p&gt;Users live in chat apps, email, browsers and calendars. Supporting several surfaces means consistent behaviour, shared state and different constraints on each. A feature that works in a web UI may be impossible in a messaging thread.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Scheduling and follow-through
&lt;/h2&gt;

&lt;p&gt;An assistant that only reacts is a chatbot. Following through means background jobs, retries, notification delivery and respecting quiet hours, all of which are classic distributed-systems problems wearing a friendly interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Trust, privacy and control
&lt;/h2&gt;

&lt;p&gt;Personal data is sensitive. Export, deletion and clear permissions are product features, not legal footnotes. See &lt;a href="https://www.brinn.app/blogs/review-connected-apps-and-ai-permissions" rel="noopener noreferrer"&gt;reviewing connected apps and AI permissions&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means for builders
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Treat the LLM as a replaceable component behind clean interfaces.&lt;/li&gt;
&lt;li&gt;Invest early in capture, time parsing and entity resolution.&lt;/li&gt;
&lt;li&gt;Design retrieval as a pipeline, not a single vector query.&lt;/li&gt;
&lt;li&gt;Build for multiple surfaces from day one.&lt;/li&gt;
&lt;li&gt;Make scheduling reliable before making it clever.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is glamorous, and none of it moves on a leaderboard. But it's where the difference between a demo and a daily-use product tends to come from.&lt;/p&gt;

&lt;p&gt;This is the work we're doing at &lt;a href="https://www.brinn.app" rel="noopener noreferrer"&gt;Brinn&lt;/a&gt;, a personal AI for reminders, lists and memory across WhatsApp, email, web and desktop. If you're building something similar, what did you find was the unexpectedly hard part?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>architecture</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Building AI That Knows What to Remember and What to Forget</title>
      <dc:creator>Brinn</dc:creator>
      <pubDate>Sat, 10 Oct 2026 10:37:18 +0000</pubDate>
      <link>https://dev.to/brinn_app/building-ai-that-knows-what-to-remember-and-what-to-forget-40nh</link>
      <guid>https://dev.to/brinn_app/building-ai-that-knows-what-to-remember-and-what-to-forget-40nh</guid>
      <description>&lt;p&gt;Most discussions about AI memory are about how to &lt;em&gt;store&lt;/em&gt; more: longer context windows, bigger vector stores, more history. For a personal assistant, the harder and more interesting question is the opposite one: what should it &lt;em&gt;not&lt;/em&gt; keep, and what should it let fade?&lt;/p&gt;

&lt;p&gt;This is a design note about the trade-offs. We're not presenting benchmarks, just the reasoning we find useful when thinking about personal memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "remember everything" is a trap
&lt;/h2&gt;

&lt;p&gt;Retaining every message forever sounds safe. In practice it creates problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Noise grows with volume.&lt;/strong&gt; The more you store at equal weight, the more irrelevant material competes with what matters at retrieval time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stale facts linger.&lt;/strong&gt; Old addresses, cancelled plans and superseded preferences keep matching queries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sensitive data accumulates.&lt;/strong&gt; Everything retained is something that has to be protected, exported and deletable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A simple taxonomy of what to keep
&lt;/h2&gt;

&lt;p&gt;It helps to sort incoming information by &lt;em&gt;how it will be used later&lt;/em&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;Handling&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Commitments&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"Remind me to send the invoice Friday"&lt;/td&gt;
&lt;td&gt;Keep until done, then archive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Durable facts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Someone's birthday, a preference&lt;/td&gt;
&lt;td&gt;Keep, but allow updates to supersede&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reference material&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A saved article, a receipt&lt;/td&gt;
&lt;td&gt;Keep retrievable, low priority in recall&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ephemeral chatter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"ok thanks", small talk&lt;/td&gt;
&lt;td&gt;Don't store as memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Context for now&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What we were just discussing&lt;/td&gt;
&lt;td&gt;Short-term only, expire quickly&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The short-term vs long-term split is the most important line. We cover it in more detail in &lt;a href="https://www.brinn.app/blogs/how-ai-assistants-remember-short-term-long-term-memory" rel="noopener noreferrer"&gt;how AI assistants remember across short-term and long-term memory&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supersession beats deletion
&lt;/h2&gt;

&lt;p&gt;Facts change. Rather than only appending, a memory system should be able to say "this replaces that". If the user says their dentist appointment moved, the old time shouldn't just sit alongside the new one. A pragmatic approach is to keep the old record but mark it superseded, so it stops competing in retrieval while remaining auditable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let importance be earned
&lt;/h2&gt;

&lt;p&gt;Instead of guessing importance at write time, signals can accumulate:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Was it mentioned again?&lt;/li&gt;
&lt;li&gt;Was it retrieved and used?&lt;/li&gt;
&lt;li&gt;Did the user correct or confirm it?&lt;/li&gt;
&lt;li&gt;Is it attached to a date or a person that recurs?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Things that never get touched can decay in priority. Things that keep coming up can be promoted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Forgetting must be user-controlled
&lt;/h2&gt;

&lt;p&gt;For personal data, "the system decided to forget" is not enough. Users should be able to see what is stored, edit it, and delete it for real. Two practical guides on the user side: &lt;a href="https://www.brinn.app/blogs/how-to-delete-your-data-from-ai-services" rel="noopener noreferrer"&gt;how to delete your data from AI services&lt;/a&gt; and &lt;a href="https://www.brinn.app/blogs/ai-data-portability-export-checklist" rel="noopener noreferrer"&gt;an AI data portability checklist&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entity extraction as a filter
&lt;/h2&gt;

&lt;p&gt;Structured extraction (people, places, dates) doubles as a relevance filter: a message with a date and a person is probably worth keeping; a greeting isn't. We described that side in &lt;a href="https://www.brinn.app/blogs/how-ai-extracts-people-places-dates-from-notes" rel="noopener noreferrer"&gt;how AI extracts people, places and dates from notes&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaway
&lt;/h2&gt;

&lt;p&gt;Good personal memory is curated, not hoarded: keep commitments and durable facts, expire context quickly, let updates supersede old values, and always leave the user in control. If you're building in this space, design the forgetting alongside the remembering.&lt;/p&gt;

&lt;p&gt;We're applying these ideas in &lt;a href="https://www.brinn.app" rel="noopener noreferrer"&gt;Brinn&lt;/a&gt;, a personal AI for reminders, lists and memory across WhatsApp, email, web and desktop. How do you handle forgetting in your own systems? We'd love to hear in the comments.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>productivity</category>
      <category>privacy</category>
    </item>
    <item>
      <title>Why Vector Databases Alone Cannot Solve AI Memory</title>
      <dc:creator>Brinn</dc:creator>
      <pubDate>Sat, 10 Oct 2026 10:18:12 +0000</pubDate>
      <link>https://dev.to/brinn_app/why-vector-databases-alone-cannot-solve-ai-memory-4g6p</link>
      <guid>https://dev.to/brinn_app/why-vector-databases-alone-cannot-solve-ai-memory-4g6p</guid>
      <description>&lt;p&gt;Every "AI with memory" demo starts the same way: embed the user's notes, store the vectors, retrieve the top-k nearest chunks, paste them into the prompt. It works well enough in a demo. Then real use arrives and the cracks show.&lt;/p&gt;

&lt;p&gt;This post is about where vector search stops being enough for &lt;em&gt;personal&lt;/em&gt; memory, and what has to sit next to it. It's a design note, not a benchmark: we're not claiming numbers, just describing failure modes that show up when the thing you're remembering is a person's life.&lt;/p&gt;

&lt;h2&gt;
  
  
  What vectors are good at
&lt;/h2&gt;

&lt;p&gt;Embeddings capture semantic similarity. If someone saved "dentist said to book a cleaning in March" and later asks "what did I need to do about my teeth?", nearest-neighbour search finds it without any shared keywords. That's genuinely useful, and for fuzzy recall it's hard to beat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it breaks for personal memory
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Similarity is not relevance.&lt;/strong&gt; "What's Sara's number?" and a note that says "Sara's birthday dinner went great" are semantically close. The one you need is a structured fact (a phone number), not the nearest paragraph.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Time doesn't exist in embedding space.&lt;/strong&gt; "I moved to a new flat" saved in January and "I'm moving next month" saved in September both match a query about where you live. Which one is current? Vectors can't tell you; you need timestamps, supersession rules, or both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Facts get updated, not just added.&lt;/strong&gt; A dentist appointment moves from Tuesday to Thursday. A vector store happily returns both. Personal memory needs the concept of "this replaces that".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Entities are not chunks.&lt;/strong&gt; People, places and dates recur across many notes. If "Sara" is only ever a token inside chunks, you can't ask "everything connected to Sara" without hoping the retriever gets lucky. Extracting entities into their own records makes that a lookup, not a gamble. (We wrote about the extraction side here: &lt;a href="https://www.brinn.app/blogs/how-ai-extracts-people-places-dates-from-notes" rel="noopener noreferrer"&gt;how AI extracts people, places and dates from notes&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Forgetting is a feature.&lt;/strong&gt; If everything is retained forever with equal weight, retrieval gets noisier as the store grows. Deciding what to keep, summarise or let go is a design problem, not a storage problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to put beside the vector index
&lt;/h2&gt;

&lt;p&gt;A pragmatic stack for personal memory tends to look like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Raw capture&lt;/strong&gt; — keep the original note, message or voice transcript as the source of truth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured layer&lt;/strong&gt; — extracted entities, dates and relationships stored as real fields, so exact questions get exact answers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vector index&lt;/strong&gt; — for fuzzy, "what was that thing about..." recall.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recency and supersession logic&lt;/strong&gt; — so updated facts beat stale ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A retrieval step that routes&lt;/strong&gt; — exact lookup first when the question is exact, semantic search when it's vague, and a combination when it's both.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether the structured layer is a plain relational table or a graph is a separate decision, and the answer depends on how connected your data actually is. We compare the two in &lt;a href="https://www.brinn.app/blogs/knowledge-graph-vs-plain-notes-when-structure-helps" rel="noopener noreferrer"&gt;knowledge graph vs plain notes: when structure helps&lt;/a&gt;, and the retrieval basics in &lt;a href="https://www.brinn.app/blogs/retrieval-augmented-generation-personal-notes-explained" rel="noopener noreferrer"&gt;retrieval-augmented generation for personal notes, explained&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Short-term vs long-term memory
&lt;/h2&gt;

&lt;p&gt;One more distinction that gets lost: what the assistant needs &lt;em&gt;right now&lt;/em&gt; in a conversation (short-term) is different from what it should durably know about you (long-term). Treating both as "stuff in a vector DB" hides that. See &lt;a href="https://www.brinn.app/blogs/how-ai-assistants-remember-short-term-long-term-memory" rel="noopener noreferrer"&gt;how AI assistants remember across short-term and long-term memory&lt;/a&gt; for the longer version.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaway
&lt;/h2&gt;

&lt;p&gt;Vector search is a retrieval &lt;em&gt;tool&lt;/em&gt;, not a memory &lt;em&gt;system&lt;/em&gt;. For personal AI, the hard parts are knowing what's current, what's connected, and what to drop. If you're building in this space, start with the structure and add embeddings where fuzziness actually helps.&lt;/p&gt;

&lt;p&gt;We're working on exactly this problem at &lt;a href="https://www.brinn.app" rel="noopener noreferrer"&gt;Brinn&lt;/a&gt;, a personal AI that handles reminders, lists and memory across WhatsApp, email, web and desktop. If you're building something similar, we'd like to hear what's worked for you in the comments.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>database</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
