<?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: Richard Harvey</title>
    <description>The latest articles on DEV Community by Richard Harvey (@omnimem).</description>
    <link>https://dev.to/omnimem</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%2F1124112%2F0db7de03-81ba-47c2-a342-875c0049113d.png</url>
      <title>DEV Community: Richard Harvey</title>
      <link>https://dev.to/omnimem</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/omnimem"/>
    <language>en</language>
    <item>
      <title>Memory isn't enough. AI needs experience.</title>
      <dc:creator>Richard Harvey</dc:creator>
      <pubDate>Mon, 26 Oct 2026 16:19:07 +0000</pubDate>
      <link>https://dev.to/omnimem/memory-isnt-enough-ai-needs-experience-22b1</link>
      <guid>https://dev.to/omnimem/memory-isnt-enough-ai-needs-experience-22b1</guid>
      <description>&lt;p&gt;Twenty runs. The answer to the task was already sitting in &amp;lt;omnimem&amp;gt;. Across all twenty, the agent made zero memory calls of its own.&lt;/p&gt;

&lt;p&gt;That result changed how I think about AI memory. Storage was never the hard part. An agent with perfect recall will still walk back into last week's dead end if nothing tells it the dead end matters, and nothing makes it look, and this isn’t how we (humans) use or think about memory. So my approach was to start modelling our behaviours into the recall, and there is much more to come in the future.&lt;/p&gt;

&lt;p&gt;Every memory system can remember. &amp;lt;omnimem&amp;gt; is built to gain experience: to know what worked, what failed and what it cost, and to act on that before your agent repeats itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  A filing cabinet doesn't get better at its job
&lt;/h2&gt;

&lt;p&gt;Most AI memory is a filing cabinet. You put things in, you search, you get things out. Add more and it gets bigger and noisier: old decisions sit beside new ones with equal weight, and a workaround from six months ago ranks as high as the fix that replaced it.&lt;/p&gt;

&lt;p&gt;An apprentice works differently. They remember what happened, and they remember how it went. The approach that took four attempts and a weird workaround sticks. The one that wasted a day becomes a note to self: don't do that again. After enough jobs, the lessons stop being memories and become habits.&lt;/p&gt;

&lt;p&gt;That's the line between memory and experience.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Memory&lt;/th&gt;
&lt;th&gt;Experience&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;What it keeps&lt;/td&gt;
&lt;td&gt;What happened&lt;/td&gt;
&lt;td&gt;What happened, how it went, what it cost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failures&lt;/td&gt;
&lt;td&gt;Stored like anything else, or lost&lt;/td&gt;
&lt;td&gt;Kept in a graveyard and used as warnings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Over time&lt;/td&gt;
&lt;td&gt;Grows and gets noisier&lt;/td&gt;
&lt;td&gt;Fades the stale, strengthens the hard-won&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conflicts&lt;/td&gt;
&lt;td&gt;Both versions kept silently&lt;/td&gt;
&lt;td&gt;Flagged the moment they're written&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;End state&lt;/td&gt;
&lt;td&gt;A bigger pile&lt;/td&gt;
&lt;td&gt;Rules your agent follows&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How &amp;lt;omnimem&amp;gt; turns memory into experience
&lt;/h2&gt;

&lt;p&gt;Six mechanisms, all in the same binary, all running on your machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[Diagram goes here: the experience loop, 5 stages. It lives in the online doc, so export it from there.]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Put together, it's a loop: what happens in one session shapes how the next one starts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Experience scoring.&lt;/strong&gt; Every memory carries an outcome and an effort rating from 1 to 5. Effort raises its weight at recall from 1.0× up to 1.8×, so the lesson that cost you a day outranks the one that cost you a minute. Recall ranks on &lt;code&gt;similarity × surface × recency × experience × date&lt;/code&gt;, not similarity alone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The graveyard.&lt;/strong&gt; Abandoned approaches aren't thrown away. They're recorded with what was tried, why it failed and how much effort went in. When your agent heads down a path that's already in the graveyard, it gets a warning and the alternatives that worked instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A memory lifecycle.&lt;/strong&gt; Memory isn't binary. Entries move from active (1.0×) to deprioritised (0.2×) to archived (0.0×) to deleted, and a deprioritised memory can come back when a query proves it's relevant again. Recency fades gently: 0.9 at 90 days, then 5% every 30 days, never below 0.3.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contradiction detection and deduplication.&lt;/strong&gt; Every write is checked. A near-duplicate returns the existing memory instead of storing a copy. A likely contradiction is stored with a warning, so you resolve it now rather than discovering it mid-task.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compiled skills.&lt;/strong&gt; This is where memory becomes habit. &lt;code&gt;compile_skill(domain)&lt;/code&gt; reads the reinforced lessons, recurring gotchas and graveyard for a domain and writes a SKILL.md: rules your agent follows, each citing the memories it came from, plus a never-again list from the graveyard. A lesson only becomes a rule once it recurs (twice by default), every change arrives as a diff for you to accept, and the same sources always compile to the same file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hooks.&lt;/strong&gt; The fix for those twenty runs. &lt;code&gt;omnimem hook&lt;/code&gt; injects a project briefing when a Claude Code session starts, blocks tool calls that repeat an abandoned approach, and records how the session ended. A briefing takes about 6 ms. Your agent no longer has to remember to remember.&lt;/p&gt;

&lt;h2&gt;
  
  
  The evidence, and what it doesn't prove yet
&lt;/h2&gt;

&lt;p&gt;I tested the hooks on one task: ten pairs of runs, with and without them.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;With hooks, every attempt at the abandoned approach was stopped before it ran, and no run reached a failing test suite.&lt;/li&gt;
&lt;li&gt;Without hooks, 8 of 10 runs did.&lt;/li&gt;
&lt;li&gt;Runs with hooks cost 27% less.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's a small test, run by me, on my own data, and I'd rather say so up front. It's exactly the kind of result I want other people to try to break.&lt;/p&gt;

&lt;p&gt;On recall, I ran &amp;lt;omnimem&amp;gt; against &lt;a href="https://github.com/xiaowu0162/LongMemEval" rel="noopener noreferrer"&gt;LongMemEval&lt;/a&gt; earlier this year: 5.x scored 65.6% across 500 questions with a GPT-4o judge. The runs also exposed real bugs, including fact extraction replacing verbatim content instead of adding to it, and those got fixed. Those numbers are from 5.x. I haven't re-run it on 7 yet.&lt;/p&gt;

&lt;p&gt;It's worth being clear about what LongMemEval measures: whether a system can find facts in long chat histories. It doesn't measure whether an agent learns from outcomes, avoids dead ends or gets cheaper over time. That's the part I care about, and I haven't found a public benchmark for it yet. Maybe we should create one!&lt;/p&gt;

&lt;h2&gt;
  
  
  7.0: one binary, nothing else to install
&lt;/h2&gt;

&lt;p&gt;6.x was four containers: Valkey, a Python MCP server, a web UI and an RSS worker. 7.0 is one Rust binary.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One file of state.&lt;/strong&gt; Memories live in SQLite. Vectors are searched exactly, filters are plain SQL, and there's no separate index to drift. A real store of 3,500 memories is a 12.8 MB database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local embeddings.&lt;/strong&gt; all-MiniLM-L6-v2 runs on ONNX Runtime with no GPU. The model downloads once, about 90 MB. Nothing leaves your machine unless you opt in to Claude Haiku for fact extraction, query expansion and summaries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Same tools.&lt;/strong&gt; All 48 MCP tools keep their names, parameters and defaults from 6.x.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desktop or server.&lt;/strong&gt; A tray app on macOS (Apple silicon), Windows and Linux (Flatpak), or &lt;code&gt;.deb&lt;/code&gt;, &lt;code&gt;.rpm&lt;/code&gt; and Docker on a server, serving MCP on port 8765 with token or OAuth 2.1 auth.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It works with any MCP client, including Claude Code, Claude Desktop, claude.ai, Codex, Cursor, OpenCode, GitHub Copilot, GitLab Duo and Kiro.&lt;/p&gt;

&lt;p&gt;The rough edges, honestly: there's no Intel Mac build yet, and the Windows installer isn't code-signed, so SmartScreen will grumble.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open source, not open core
&lt;/h2&gt;

&lt;p&gt;&amp;lt;omnimem&amp;gt; is MIT licensed and free forever. Every feature in this post is in the open source core, and it stays there.&lt;/p&gt;

&lt;p&gt;I'm planning optional paid services for people who'd rather not run things themselves: hosting, secure tunnels and encrypted backups. They're convenience, not features. Anything they do, you can do yourself with the open source binary, and paying for one funds the project rather than unlocking it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started
&lt;/h2&gt;

&lt;p&gt;Grab the installer for your platform from &lt;a href="https://omnimem.org" rel="noopener noreferrer"&gt;omnimem.org&lt;/a&gt;, or on a Debian or Ubuntu server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; ./omnimem_&amp;lt;version&amp;gt;_amd64.deb
curl http://127.0.0.1:8765/healthz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then point Claude Code at it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http &lt;span class="nt"&gt;--scope&lt;/span&gt; user omnimem http://127.0.0.1:8765/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the desktop, the tray menu does that step for you.&lt;/p&gt;

&lt;p&gt;The source lives on &lt;a href="https://code.squarecows.com/ric/omnimem" rel="noopener noreferrer"&gt;Forgejo&lt;/a&gt;, with a &lt;a href="https://github.com/richarvey/OmniMem" rel="noopener noreferrer"&gt;GitHub mirror&lt;/a&gt;. If &amp;lt;omnimem&amp;gt; saves your agent from one dead end, a star helps other people find it. If it doesn't, open an issue and tell me why.&lt;/p&gt;

&lt;p&gt;Stop living the same session twice.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>memory</category>
      <category>claude</category>
    </item>
    <item>
      <title>OmniMem 7: one app, no Docker</title>
      <dc:creator>Richard Harvey</dc:creator>
      <pubDate>Wed, 21 Oct 2026 16:47:47 +0000</pubDate>
      <link>https://dev.to/omnimem/omnimem-7-one-app-no-docker-55h1</link>
      <guid>https://dev.to/omnimem/omnimem-7-one-app-no-docker-55h1</guid>
      <description>&lt;p&gt;OmniMem 7 is out, and it's a different kind of program. 6.x was four containers: Valkey with its search module, the Python MCP server, the web UI and the RSS worker, held together by a Docker Compose file. 7.0 is one Rust binary. It holds its own store, serves MCP, runs the RSS scheduler and the enrichment worker, and on a desktop it sits in your tray or menu bar with a settings window behind it.&lt;/p&gt;

&lt;p&gt;Nothing else to install. No Docker, no database server, no Python. Download it, open it, and the embedding model fetches itself on the first start (about 90 MB, once).&lt;/p&gt;

&lt;p&gt;Your memories come with you via a simple backup and import process, and they behave the way they did before. The 48 MCP tools have the same names, parameters and defaults, so an agent that knew OmniMem 6 knows OmniMem 7.&lt;/p&gt;

&lt;p&gt;The first release is 7.0.3, on the &lt;a href="https://code.squarecows.com/ric/omnimem/releases/latest" rel="noopener noreferrer"&gt;releases page&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why rewrite it
&lt;/h2&gt;

&lt;p&gt;OmniMem's job is small: embed one memory, embed one query, search, rank. 6.x did that job well, but the machinery around it kept growing. Four images to pull and keep in step. A search index that lived beside the data and could drift from it, with phantom entries, silent index migration failures and tag-query quirks to work around. Each Python service loaded its own copy of the embedding model. And the only way to see your memories was a web UI on a port, which is one more thing listening on your machine. That setup was great for developing and testing the theories behind how memory and experience should live and work together, but I wanted to make this more accessible for everyone.&lt;/p&gt;

&lt;h2&gt;
  
  
  What 7 is
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;One process.&lt;/strong&gt; The MCP server, the memory engine, the embedding model, RSS ingestion and the database all live in one binary. One embedder serves every caller. It's written in Rust, so it's memory safe and fast: a session's briefing arrives in about 6 ms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One file.&lt;/strong&gt; Memories live in SQLite. On start, every vector is loaded into one matrix per namespace and searched exactly, not approximately. At OmniMem's scale (tens of thousands of memories) a full scan takes a few milliseconds and gives the same answer every time. Filters are plain SQL, so there's no separate index left to drift from the data. A real 3,500-memory store comes to a 12.8 MB database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nothing leaves your machine.&lt;/strong&gt; The embedding model (all-MiniLM-L6-v2 on ONNX Runtime) runs locally. The Anthropic API is only called if you give OmniMem a key for the optional Claude Haiku features: fact extraction, query expansion, deeper contradiction checks and RSS summaries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Less on the network.&lt;/strong&gt; Over HTTP, 7.0 serves &lt;code&gt;/mcp&lt;/code&gt;, the OAuth 2.1 routes that protect it and &lt;code&gt;/healthz&lt;/code&gt;. That's all. There is no web UI on a port and no &lt;code&gt;/metrics&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  On your desktop
&lt;/h2&gt;

&lt;p&gt;There's an installer for each platform: a DMG for macOS (Apple silicon, 13.4 or later), an MSI for Windows 10 and 11, and a Flatpak for Linux desktops on amd64 and arm64.&lt;/p&gt;

&lt;p&gt;OmniMem lives in the tray, or the menu bar on a Mac. The menu shows whether it's running and how many memories it holds, and it does the setup for you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Add to Claude Code&lt;/strong&gt; and &lt;strong&gt;Add to Claude Desktop&lt;/strong&gt; check the client's settings first and never add OmniMem twice. An old &lt;code&gt;omnimem&lt;/code&gt; entry pointing at a 6.x install is offered as &lt;strong&gt;Switch Claude Desktop here&lt;/strong&gt;, which repoints it rather than adding a second.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy MCP URL&lt;/strong&gt; covers every other agent with a bit of manual work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Settings…&lt;/strong&gt; opens a window with every page the 6.x web UI had (the dashboard, memories, search, projects, experience and the graveyard, skills with export and import, duplicates, contradictions, telemetry, token overhead, feeds and backups) plus a configuration page for everything a headless install sets in its environment (such as the OAuth settings or the Anthropic API key). The window's pages come from the app itself over a custom URL scheme. Nothing about them is reachable over a network, from your machine or anyone else's.&lt;/p&gt;

&lt;p&gt;Secrets (your Anthropic key, the MCP access token, a Hugging Face token) go to the OS keychain: Keychain on macOS, Credential Manager on Windows, the Secret Service on Linux. Once saved they're never shown again.&lt;/p&gt;

&lt;h2&gt;
  
  
  On a server
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;omnimem serve&lt;/code&gt; is the same binary without the desktop parts, configured with the same environment variables as before.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;.deb&lt;/code&gt; and &lt;code&gt;.rpm&lt;/code&gt;&lt;/strong&gt; for amd64 and arm64 install it as the &lt;code&gt;omnimem&lt;/code&gt; systemd service, running as its own user, with one settings file (&lt;code&gt;/etc/omnimem/omnimem.env&lt;/code&gt;) and its data in &lt;code&gt;/var/lib/omnimem&lt;/code&gt;. There's a tarball with an &lt;code&gt;install.sh&lt;/code&gt; for other distributions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker&lt;/strong&gt;: &lt;code&gt;richarvey/omnimem:7.0.3&lt;/code&gt;, amd64 and arm64, with everything in one &lt;code&gt;/data&lt;/code&gt; volume. A token is all it needs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OAuth 2.1&lt;/strong&gt; is rebuilt by hand on axum, and every route, discovery document, challenge and error was checked against a capture of the 6.x server, so claude.ai and other OAuth clients connect as before. Tokens are stored only as SHA-256 hashes and survive restarts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Linux builds need glibc 2.38 or newer (Debian 13, Ubuntu 24.04, Fedora 39 and later), a floor set by ONNX Runtime's library.&lt;/p&gt;

&lt;h2&gt;
  
  
  The same memory
&lt;/h2&gt;

&lt;p&gt;This is the part that matters most. A rewrite that ranks your memories differently is a migration dressed up as an upgrade, so 7.0 was checked against 6.x at every step:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The vectors are the 6.7 vectors.&lt;/strong&gt; The Rust engine was checked against full reference vectors the Python engine wrote, covering accents, CJK, emoji, empty text, truncation past 256 tokens and mixed-length batches. Deduplication, contradiction and skill clustering thresholds don't move.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recall returns the same results.&lt;/strong&gt; A real production backup of 3,500 memories was imported, and all 32 query and namespace searches tested returned an identical ordered top 10 to the Python engine's search over the same data. Every field survives an export.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills compile the same.&lt;/strong&gt; Skill rendering matches the Python compiler byte for byte.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RSS reads the same articles.&lt;/strong&gt; On the project's own reading list, the Rust parser picks out exactly the 59 articles 6.x's feedparser does, with the same keys, titles, dates and text.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recall scoring has three deliberate changes, all in the &lt;a href="https://code.squarecows.com/ric/omnimem/src/branch/main/CHANGELOG.md" rel="noopener noreferrer"&gt;changelog&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Recency declines from the day a memory is written&lt;/strong&gt;, reaching 0.9 at 90 days and then falling 5% every 30 days to a 0.3 floor. 6.x held it flat at 1.0 for 90 days, so yesterday's memory and one from three months ago scored alike. The relevance floor reads raw similarity, so nothing extra is dropped.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An abandoned outcome scores 1.0, not 0.1.&lt;/strong&gt; The old weight buried the write-up of a failure along with the approach, so the one memory explaining why something didn't work ranked below almost everything else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recording an abandonment no longer suppresses anything.&lt;/strong&gt; Suppression hid the memory that explained the failure, and it was store-wide, so a dead end on one project silenced unrelated memories on another.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Memory your agent doesn't have to ask for
&lt;/h2&gt;

&lt;p&gt;One finding shaped this release more than any other. Across twenty runs with OmniMem attached and the answer already in the store, the agent made zero memory calls of its own. The memory was there. Nothing asked it.&lt;/p&gt;

&lt;p&gt;So 7.0 ships &lt;a href="https://code.squarecows.com/ric/omnimem/src/branch/main/docs/claude-code-hook.md" rel="noopener noreferrer"&gt;Claude Code hooks&lt;/a&gt;. &lt;code&gt;omnimem hook&lt;/code&gt; puts the project's briefing into every session's opening context, read-only, in about 6 ms. Before a tool call that changes something, it checks the graveyard, and if the call proposes an approach this project already abandoned, it stops it and hands back what was abandoned, why, and what worked instead. It never guards a read, and it fails open on any error. At the end of a session it records what the session did, skips sessions that changed nothing and redacts credentials before writing.&lt;/p&gt;

&lt;p&gt;Measured over ten pairs of runs on one task: every attempt at the abandoned approach was stopped before it ran, no run with the hooks reached a failing test suite (against 8 of 10 without them), and the runs cost 27% less.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hardened before release
&lt;/h2&gt;

&lt;p&gt;The whole Rust workspace was security reviewed before 7.0.0, with fixes in every crate. The headlines: the OAuth routes are size-capped, rate limited and strict about PKCE and redirect URIs; the settings panel carries no inline JavaScript and sends a Content Security Policy; skill bundles are read against their declared sizes, so a zip bomb is refused rather than inflated; RSS fetches refuse private and loopback addresses and re-check every redirect; and the model download verifies a sha256 from the hub. CI now runs &lt;code&gt;cargo audit&lt;/code&gt; and gitleaks on every push. The full list is in the &lt;a href="https://code.squarecows.com/ric/omnimem/src/branch/main/CHANGELOG.md" rel="noopener noreferrer"&gt;changelog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Coming from 6.x
&lt;/h2&gt;

&lt;p&gt;Your 6.x install keeps working, and nothing upgrades itself. When you're ready:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;On 6.x, take a backup: ask your agent to call &lt;code&gt;dump_to_file()&lt;/code&gt;, or use the old web UI's Backups page.&lt;/li&gt;
&lt;li&gt;Stop 6.x, or at least make sure it isn't on port 8765.&lt;/li&gt;
&lt;li&gt;Install 7, then restore the backup on the settings window's &lt;strong&gt;Backups&lt;/strong&gt; page, or run &lt;code&gt;omnimem import omnimem_backup.json&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Backups don't carry vectors, so every memory is embedded again from its text. That's about 8 ms a memory, so a few thousand take well under a minute and 25,000 take roughly three and a half minutes. It also has a side benefit: any memory 6.x had stopped finding, because its stored vector had gone missing or stale, is found again.&lt;/p&gt;

&lt;p&gt;If you aren't ready, the 6.x Docker stack carries on from the &lt;code&gt;v6.7.x&lt;/code&gt; branch, and the old one-line installer still sets up 6.7.&lt;/p&gt;

&lt;p&gt;A few things are gone on purpose: Valkey and every &lt;code&gt;VALKEY_*&lt;/code&gt; setting, the Compose stack, the web UI on port 8080, &lt;code&gt;/metrics&lt;/code&gt; and the SSE transport. If an agent's config still says &lt;code&gt;"type": "sse"&lt;/code&gt; or ends in &lt;code&gt;/sse&lt;/code&gt;, point it at &lt;code&gt;http://127.0.0.1:8765/mcp&lt;/code&gt; instead. The &lt;a href="https://code.squarecows.com/ric/omnimem/src/branch/main/docs/configuration.md#gone-since-6x" rel="noopener noreferrer"&gt;configuration reference&lt;/a&gt; lists every setting that went.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rough edges
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No Intel Mac build.&lt;/strong&gt; ONNX Runtime ships no prebuilt library for Intel macOS, so the DMG is Apple silicon only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Windows installer isn't signed yet&lt;/strong&gt;, so SmartScreen asks first: &lt;strong&gt;More info&lt;/strong&gt;, then &lt;strong&gt;Run anyway&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In the Flatpak, Add to Claude Code can't work&lt;/strong&gt;, because the sandbox can't see a &lt;code&gt;claude&lt;/code&gt; installed outside it. The menu says so, and &lt;code&gt;claude mcp add&lt;/code&gt; does the job.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stock GNOME doesn't show tray icons&lt;/strong&gt; without the AppIndicator extension. Where there's no tray, OmniMem opens its settings window instead and says which extension to install.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get it now
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://code.squarecows.com/ric/omnimem/releases/latest" rel="noopener noreferrer"&gt;OmniMem 7.0.3 on the releases page&lt;/a&gt;, with a &lt;code&gt;.sha256&lt;/code&gt; beside every file&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.squarecows.com/ric/omnimem/src/branch/main/docs/quick-start.md" rel="noopener noreferrer"&gt;Quick start&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://omnimem.org" rel="noopener noreferrer"&gt;omnimem.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;OmniMem is open source, MIT licensed, and free. Issues and ideas are welcome on &lt;a href="https://github.com/richarvey/OmniMem/issues" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>backend</category>
      <category>mcp</category>
      <category>rust</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>What if the answer to data centre sprawl is small, modular… and underground?</title>
      <dc:creator>Richard Harvey</dc:creator>
      <pubDate>Mon, 05 Oct 2026 09:10:05 +0000</pubDate>
      <link>https://dev.to/omnimem/what-if-the-answer-to-data-centre-sprawl-is-small-modular-and-underground-2976</link>
      <guid>https://dev.to/omnimem/what-if-the-answer-to-data-centre-sprawl-is-small-modular-and-underground-2976</guid>
      <description>&lt;p&gt;Every few months, the same story pops up in the news: a planning row over a data centre. A giant grey box the size of several football pitches, a new substation, an argument about water, and the promise of a few dozen jobs. And every time, nobody seems to ask the obvious question: &lt;em&gt;why does our computing have to arrive in enormous lumps?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We never really had that conversation. So let's have it now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Small, buried, and close to home
&lt;/h2&gt;

&lt;p&gt;Here's the idea. Picture a precast culvert section, the sort of concrete tube we already bury under roads by the thousand. Now imagine each one holds a couple of server racks. Join a few together, add an access shaft, and bury the lot under a car park, a field, or the corner of a business park.&lt;/p&gt;

&lt;p&gt;For want of a better name, let's call this thing a &lt;strong&gt;small modular data centre&lt;/strong&gt;. SMDC, if you like. The energy industry already made "small modular reactor" a household phrase; maybe compute is next.&lt;/p&gt;

&lt;p&gt;Why bother? A few metres down, UK ground sits at a steady 10–12°C all year round. That's free, gloriously boring, utterly reliable cooling. There's nothing to look at, not much to object to, and the land above just carries on doing its job: parking cars, growing grass, whatever it was doing before.&lt;/p&gt;

&lt;p&gt;And because the units are small, they can go where the &lt;em&gt;users&lt;/em&gt; are: a town, a hospital campus, a housing estate. Compute at the edge, owned by the people it actually serves, instead of rented from somebody else's "region" on a map far away.&lt;/p&gt;

&lt;h2&gt;
  
  
  Heat is a product, not a problem
&lt;/h2&gt;

&lt;p&gt;Big data centres spend serious money throwing heat away. A small one sitting next to buildings can &lt;em&gt;hand it over&lt;/em&gt; instead.&lt;/p&gt;

&lt;p&gt;A pair of typical racks draws somewhere around 5 to 8 kW each, and essentially every watt of that comes back out as heat (ASHRAE treats the conversion as 100%). So call it 12 to 16 kW of steady warmth, about what a couple of homes need on a cold day. Pipe it into the office above, or the houses along the road, through a low-temperature heat network, and the same electricity gets used twice: once to do the sums, once to keep someone warm. There's something quite pleasing about that.&lt;/p&gt;

&lt;p&gt;AI raises the stakes, in a good way. GPU racks run far hotter than ordinary servers and need liquid cooling, which sounds like a headache until you realise that liquid carries heat away at a much more &lt;em&gt;useful&lt;/em&gt; temperature. Those workloads might be happiest under a block of flats or an office building, with plenty of people right above them who'd love the warmth.&lt;/p&gt;

&lt;p&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%2Fuh4j9s8d0f0bubrn4kit.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%2Fuh4j9s8d0f0bubrn4kit.png" alt="Server racks in a concrete culvert recycling waste heat to the builds above" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The awkward bits (let's be honest)
&lt;/h2&gt;

&lt;p&gt;I'm not going to pretend this is solved. A few things genuinely need answering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Big is cheap.&lt;/strong&gt; Hyperscale exists for a reason: cost per rack falls as you grow. Small has to earn its keep through heat sales, cheaper land, and quicker planning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Soil fills up.&lt;/strong&gt; The ground is not a bottomless heat sink. Push heat into it for years and it warms up, so this needs proper modelling, not optimism.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Summer.&lt;/strong&gt; Nobody wants heating in July. Without a year-round use for the heat, you still need another way to get rid of it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lots of small sites.&lt;/strong&gt; Hundreds of buried rooms are harder to maintain and secure than one big shed. Flooding, access, and fire safety underground all need real answers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It won't do everything.&lt;/strong&gt; Nobody is training a frontier AI model in a culvert. &lt;em&gt;Running&lt;/em&gt; one is a different matter: inference, like most of the workloads we actually use day to day, belongs close to the people asking the questions. (Though dense GPU racks will want liquid cooling, mind, not just cool soil alone won't cut it.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Bigger than the building
&lt;/h2&gt;

&lt;p&gt;One buried room changes nothing. A few thousand small modular data centres, joined up? That might.&lt;/p&gt;

&lt;p&gt;If every site speaks the same open standards, they stop being isolated server rooms and start behaving like a cloud. A council, a co-op, or a small business could run its own node, lend out spare capacity, and borrow someone else's when it runs short. No single owner, no proprietary lock-in, and no rent flowing to a handful of companies on another continent.&lt;/p&gt;

&lt;p&gt;There's money in it too. A landlord, a homeowner, a group of tenants, a business with a spare patch of ground, any of them could host a unit and earn from it: rent, a share of the hosting income, or simply cheaper heat. Dead space under a car park becomes a revenue stream.&lt;/p&gt;

&lt;p&gt;That's the part that interests me most. The culvert is only the catalyst.&lt;/p&gt;

&lt;h2&gt;
  
  
  So… what if?
&lt;/h2&gt;

&lt;p&gt;I think data centre sprawl is a design choice we've mistaken for a law of physics. I might be wrong, and I'd much rather find that out in public.&lt;/p&gt;

&lt;p&gt;So I'd genuinely love to hear from you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔧 &lt;strong&gt;Work in district heating, civil engineering, or planning?&lt;/strong&gt; Tell me where this falls over. You won't hurt my feelings.&lt;/li&gt;
&lt;li&gt;🌡️ &lt;strong&gt;What would you do with a steady supply of low-grade heat in August?&lt;/strong&gt; (Seriously, someone must have a good answer.)&lt;/li&gt;
&lt;li&gt;📍 &lt;strong&gt;Where would you bury the first one?&lt;/strong&gt; Under your supermarket? Your school? Your street?&lt;/li&gt;
&lt;li&gt;🗳️ &lt;strong&gt;And who should own it?&lt;/strong&gt; The council? A co-op? You?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The comments are open. Bring a better idea. I'll be in there.&lt;/p&gt;

</description>
      <category>sustainability</category>
      <category>datacentres</category>
      <category>greenit</category>
      <category>whatif</category>
    </item>
    <item>
      <title>Opus 5.5 Is Brilliant. It Still Forgets You.</title>
      <dc:creator>Richard Harvey</dc:creator>
      <pubDate>Tue, 29 Sep 2026 07:30:05 +0000</pubDate>
      <link>https://dev.to/omnimem/opus-55-is-brilliant-it-still-forgets-you-2ddm</link>
      <guid>https://dev.to/omnimem/opus-55-is-brilliant-it-still-forgets-you-2ddm</guid>
      <description>&lt;p&gt;Anthropic shipped Claude Opus 5.5 on 22 September, and I've spent most of the week since with it open in one terminal or another. It's the first Opus in a while that I've just stopped thinking about. It does the work, it tells me what it did in plain English, and it doesn't burn through my allowance doing it.&lt;/p&gt;

&lt;p&gt;I'm clearly not the only one. But alongside the praise there's a quieter thread of people saying the same thing I've been saying about every model for two years: it's brilliant, and it still doesn't remember anything. So let's look at both, and then at what I've been doing about the second one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What people are saying
&lt;/h2&gt;

&lt;p&gt;The headline numbers are good. Opus 5.5 is priced at $4 in and $20 out per million tokens, 20% cheaper than Opus 5, and it sits at the top of the Artificial Analysis Intelligence Index with a score of 58. &lt;a href="https://www.eesel.ai/blog/claude-opus-5-5-review" rel="noopener noreferrer"&gt;eesel's review&lt;/a&gt; called it, at medium effort, "the best tool I've used" for genuinely hard, long, agentic work. Subscribers get a slice of the saving too: &lt;a href="https://memeburn.com/anthropic-says-opus-5-5-costs-40-less-to-run-claude-subscribers-get-about-25-more-room" rel="noopener noreferrer"&gt;Memeburn worked out&lt;/a&gt; that Pro, Max and Team allowances stretch roughly 25% further than they did on Opus 5.&lt;/p&gt;

&lt;p&gt;But the thing people keep coming back to isn't a benchmark. It's how it feels to work with. Opus 5 was verbose to the point of being tiring, and 5.5 has fixed most of that. The team at Every ran a week-long &lt;a href="https://every.to/vibe-check/vibe-check-opus-5-5-is-pulling-our-codex-converts-back-to-claude" rel="noopener noreferrer"&gt;vibe check&lt;/a&gt; and it pulled their writers back from Codex; their shortest summary was "Anthropic fixed Opus's personality." Over on &lt;a href="https://news.ycombinator.com/item?id=49804316" rel="noopener noreferrer"&gt;Hacker News&lt;/a&gt;, one commenter called the change in output style "a very big improvement over Opus 5", and in the main &lt;a href="https://news.ycombinator.com/item?id=49803892" rel="noopener noreferrer"&gt;launch thread&lt;/a&gt; another simply said "Opus 5.5 is a game changer for me."&lt;/p&gt;

&lt;p&gt;The code quality data backs up the vibe. SonarSource ran it through their &lt;a href="https://www.sonarsource.com/blog/claude-opus-5-5-an-evaluation/" rel="noopener noreferrer"&gt;Java benchmark&lt;/a&gt; and found it wrote 27.5% less code and used 40% fewer output tokens than Opus 5, with a pass rate within a point and total findings down 42%. Less code to review is the most underrated feature a coding model can have.&lt;/p&gt;

&lt;p&gt;A couple of practical patterns are also emerging:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Medium effort is the sweet spot.&lt;/strong&gt; &lt;a href="https://moelueker.com/blog/claude-opus-5-5-review" rel="noopener noreferrer"&gt;Moe Lueker's testing&lt;/a&gt; on FrontierCode had medium scoring 54.6% at about $0.80 a task, while max scored slightly lower at nearly eight times the cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan with one, build with the other.&lt;/strong&gt; Plenty of Claude Code users are pairing Fable 5.1 for planning and orchestration with Opus 5.5 for execution. One HN commenter, quoted by &lt;a href="https://explainx.ai/blog/fable-5-1-vs-opus-5-5-comparison-2026" rel="noopener noreferrer"&gt;explainx&lt;/a&gt;, boiled it down to "plan with fable, implement with opus."That matches my own week. Opus 5.5 on medium is now my default for anything that isn't trivial.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  It's not all roses
&lt;/h2&gt;

&lt;p&gt;In fairness, the reception isn't unanimous. Some HN users found it just as wordy as Opus 5 on day one, and others weren't impressed until they bumped the effort up. &lt;a href="https://www.coderabbit.ai/blog/opus-5-5-model-review" rel="noopener noreferrer"&gt;CodeRabbit&lt;/a&gt; liked its capability but flagged that its code reviews used more tokens and left more comments, so the cheaper sticker price doesn't automatically mean a cheaper bill. Sonar's numbers also showed injection-style findings going up, which is a good reminder that less code isn't the same as safer code. And if you work in bioinformatics or security research, the new &lt;a href="https://roo.beehiiv.com/p/claude-opus-5-5-review" rel="noopener noreferrer"&gt;safeguards&lt;/a&gt; mean many of those requests get routed to an older model instead.&lt;/p&gt;

&lt;p&gt;None of that changes my overall view, but you should go in with your eyes open.&lt;/p&gt;

&lt;h2&gt;
  
  
  The memory complaints
&lt;/h2&gt;

&lt;p&gt;This is the bit that caught my attention, because it's the problem I've been working on.&lt;br&gt;
A GitHub issue on the &lt;a href="https://github.com/anthropics/claude-code/issues/96527" rel="noopener noreferrer"&gt;Claude Code repo&lt;/a&gt;, originally about Opus 4.6, lists Opus 5.5 among the affected models and describes the model losing track of repository context within a single conversation. The reporter sums up the symptom as the "model loses track of established facts within a session", with real consequences like files being committed to the wrong repository. &lt;/p&gt;

&lt;p&gt;Another &lt;a href="https://github.com/anthropics/claude-code/issues/97387" rel="noopener noreferrer"&gt;issue&lt;/a&gt; reports a Max plan user seeing Opus 5.5's context window capped at 150k tokens in Claude Code. And in the HN launch thread, one frustrated developer asked whether 5.5 still skips over CLAUDE.md and reads a couple of lines of a file when asked to read the whole thing.&lt;/p&gt;

&lt;p&gt;It's worth pulling these apart, because they're really two different problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In-session problems&lt;/strong&gt; (context caps, compaction losing detail, a model not reading the file you told it to) are Anthropic's to fix, and some of these look like bugs or config issues rather than the model itself. Nothing I'm about to describe will lift a 150k cap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-session problems&lt;/strong&gt; are different, and they're not a bug at all. They're simply how these models work. Every new session starts from zero. Your agent doesn't know your stack, doesn't know you tried that library last Tuesday and it segfaulted on Alpine, and doesn't know you prefer Forgejo over GitHub. A 1M-token context window doesn't change that. &lt;a href="https://buda.im/blog/claude-opus-5-5-context-window-agent-memory" rel="noopener noreferrer"&gt;Buda put it better than I could&lt;/a&gt;: "A large window delays forgetting; it does not solve persistence."&lt;/p&gt;

&lt;p&gt;The first problem makes the second one worse. If you're relying on a giant CLAUDE.md or on stuffing everything into the context window so the model might remember it, any hiccup in how that context is read or compacted hits you hard.&lt;/p&gt;
&lt;h2&gt;
  
  
  Where OmniMem fits
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://omnimem.org" rel="noopener noreferrer"&gt;OmniMem&lt;/a&gt; is the self-hosted memory server I built because I got fed up re-explaining myself every morning. It's an MCP server, so it works with anything that speaks MCP: Claude Code, Claude on the desktop and web, Codex, Cursor, OpenCode, Copilot, Kiro and others. It runs on your own hardware, uses local ONNX embeddings with Valkey vector search, and it's MIT licensed and free.&lt;/p&gt;

&lt;p&gt;Rather than a flat file the model may or may not read, OmniMem gives your agent a proper memory it can query:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A one-call briefing.&lt;/strong&gt; At the start of a session, briefing() hands the agent your project context, recent experience, stale memories, new articles and any contradictions. No warm-up, no hoping a file gets read.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recall across four namespaces.&lt;/strong&gt; Episodic memories (decisions, bugs, what you tried), project context, a knowledge base fed from RSS, and your preferences, all searched together and ranked by similarity, recency, lifecycle state and how hard the lesson was to learn.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The graveyard.&lt;/strong&gt; Every abandoned approach is kept on purpose, along with why it failed and how much effort it burned. Before the agent reaches for that library again, it gets a warning and the thing that worked instead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contradiction detection and semantic dedup,&lt;/strong&gt; so your memory doesn't quietly fill up with conflicting or duplicate facts.- &lt;strong&gt;A real lifecycle.&lt;/strong&gt; "Forget about X" usually means "stop bringing it up", so memories can be deprioritised or archived rather than just deleted, and reinstated if they become relevant again.- &lt;strong&gt;Compiled skills.&lt;/strong&gt; compile_skill() turns accumulated experience into a SKILL.md for a domain, proposed as a diff you review before anything is written.So how does that map to the complaints?&lt;/li&gt;
&lt;li&gt;"It forgets established facts": those facts live in OmniMem and come back via briefing and recall, rather than depending on surviving compaction.- "It ignores CLAUDE.md": OmniMem's instructions are injected when the MCP server connects, and memory is pulled in by query when it's relevant.- "Context gets capped": retrieving only what's relevant keeps the context lean, which matters more when the window is smaller than you expected.- "It made the same mistake again": that's exactly what the graveyard is for.To be clear about the limits: OmniMem doesn't change how Opus 5.5 reasons within a session, and it won't fix a platform bug. What it does is make sure the things that matter survive between sessions, between projects and between machines. Pair it with Opus 5.5's much better instruction following and the combination is genuinely lovely to work with. It's how I've been running all week.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Use it today: OmniMem v6
&lt;/h2&gt;

&lt;p&gt;OmniMem v6 is available now (the latest release is 6.7.1). You'll need Docker and Docker Compose, and that's about it. The quickest route is the installer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://code.squarecows.com/ric/omnimem/raw/branch/main/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or, if you'd rather see what you're running first (and you should, it's a curl-to-bash), do it by hand:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://code.squarecows.com/ric/omnimem.git- &lt;span class="nb"&gt;cd &lt;/span&gt;omnimem and &lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Edit .env to set VALKEY_PASSWORD, and optionally ANTHROPIC_API_KEY- docker compose up -d (the web UI is then at &lt;a href="http://localhost:8080" rel="noopener noreferrer"&gt;http://localhost:8080&lt;/a&gt;)Then point your agent at the MCP endpoint, &lt;a href="http://localhost:8765/sse" rel="noopener noreferrer"&gt;http://localhost:8765/sse &lt;/a&gt;. There's a setup guide for each supported client, including the exact Claude Code config, at &lt;a href="https://code.squarecows.com/ric/omnimem/src/branch/main/guides" rel="noopener noreferrer"&gt;https://code.squarecows.com/ric/omnimem/src/branch/main/guides&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That gives you four containers (Valkey with vector search, the MCP server, the RSS worker and the web dashboard), and nothing leaves your machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Coming soon: OmniMem v7
&lt;/h2&gt;

&lt;p&gt;Docker Compose is great if you live on a Linux server like I do, but it's a barrier for a lot of people. v7 is a rebuild as a single Rust binary, and it comes with proper desktop installers: an MSI for Windows, a DMG for macOS and a Flatpak for Linux. Once it's running you'll get a system tray icon that takes you straight to the settings, with no YAML or .env editing required. The Docker image isn't going anywhere, so if you're running headless on a server nothing changes for you.&lt;br&gt;
In short, if v6 is "clone, configure, compose", v7 is "download, double-click, done".&lt;/p&gt;

&lt;h2&gt;
  
  
  Give your agent a memory
&lt;/h2&gt;

&lt;p&gt;Opus 5.5 is the best model Anthropic has shipped for day-to-day work, and I'd switch to it today. Just don't expect a bigger context window to do the job of memory. Give it somewhere to keep what it learns.&lt;br&gt;
Head over to &lt;strong&gt;&lt;a href="https://omnimem.org" rel="noopener noreferrer"&gt;https://omnimem.org&lt;/a&gt;&lt;/strong&gt; to get started, and if you hit a snag or have an idea, the issue tracker is open at &lt;a href="https://code.squarecows.com/ric/omnimem/issues" rel="noopener noreferrer"&gt;https://code.squarecows.com/ric/omnimem/issues&lt;/a&gt;&lt;br&gt;
This article was researched and drafted with help from Claude Opus 5.5, which felt fitting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Anthropic, Introducing Claude Opus 5.5: &lt;a href="https://www.anthropic.com/claude-opus-5-5" rel="noopener noreferrer"&gt;https://www.anthropic.com/claude-opus-5-5&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;eesel, Claude Opus 5.5 review: &lt;a href="https://www.eesel.ai/blog/claude-opus-5-5-review" rel="noopener noreferrer"&gt;https://www.eesel.ai/blog/claude-opus-5-5-review&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Every, Vibe Check: &lt;a href="https://every.to/vibe-check/vibe-check-opus-5-5-is-pulling-our-codex-converts-back-to-claude" rel="noopener noreferrer"&gt;https://every.to/vibe-check/vibe-check-opus-5-5-is-pulling-our-codex-converts-back-to-claude&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;SonarSource evaluation: &lt;a href="https://www.sonarsource.com/blog/claude-opus-5-5-an-evaluation/" rel="noopener noreferrer"&gt;https://www.sonarsource.com/blog/claude-opus-5-5-an-evaluation/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CodeRabbit, Opus 5.5 for code review: &lt;a href="https://www.coderabbit.ai/blog/opus-5-5-model-review" rel="noopener noreferrer"&gt;https://www.coderabbit.ai/blog/opus-5-5-model-review&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Moe Lueker, Claude Opus 5.5 review: &lt;a href="https://moelueker.com/blog/claude-opus-5-5-review" rel="noopener noreferrer"&gt;https://moelueker.com/blog/claude-opus-5-5-review&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Memeburn, subscriber limits: &lt;a href="https://memeburn.com/anthropic-says-opus-5-5-costs-40-less-to-run-claude-subscribers-get-about-25-more-room" rel="noopener noreferrer"&gt;https://memeburn.com/anthropic-says-opus-5-5-costs-40-less-to-run-claude-subscribers-get-about-25-more-room&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;explainx, Fable 5.1 vs Opus 5.5: &lt;a href="https://explainx.ai/blog/fable-5-1-vs-opus-5-5-comparison" rel="noopener noreferrer"&gt;https://explainx.ai/blog/fable-5-1-vs-opus-5-5-comparison&lt;/a&gt;
-2026- Roo, what breaks when you switch: &lt;a href="https://roo.beehiiv.com/p/claude-opus-5-5-review" rel="noopener noreferrer"&gt;https://roo.beehiiv.com/p/claude-opus-5-5-review&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Hacker News launch thread: &lt;a href="https://news.ycombinator.com/item?id=49803892" rel="noopener noreferrer"&gt;https://news.ycombinator.com/item?id=49803892&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Hacker News, Artificial Analysis thread: &lt;a href="https://news.ycombinator.com/item?id=49804316" rel="noopener noreferrer"&gt;https://news.ycombinator.com/item?id=49804316&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub anthropics/claude-code #96527: &lt;a href="https://github.com/anthropics/claude-code/issues/96527" rel="noopener noreferrer"&gt;https://github.com/anthropics/claude-code/issues/96527&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub anthropics/claude-code #97387: &lt;a href="https://github.com/anthropics/claude-code/issues/97387" rel="noopener noreferrer"&gt;https://github.com/anthropics/claude-code/issues/97387&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Buda, 1M context is not agent memory: &lt;a href="https://buda.im/blog/claude-opus-5-5-context-window-agent-memory" rel="noopener noreferrer"&gt;https://buda.im/blog/claude-opus-5-5-context-window-agent-memory&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>claude</category>
      <category>mcp</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
