On the road to 0.4.0 — single-writer daemon, agent attribution, and the ND-Mem MCP App #158
jmeyer1980
announced in
Announcements
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Over the last few days we've landed a batch of features and fixes in the release candidates that take us from 0.3.9 toward 0.4.0. Here's what's new.
🧠 One brain, one writer: the single-writer daemon
The biggest change under the hood. Previously, every MCP client spun up its own server process, and multiple writers could silently overwrite each other's memories (last-writer-wins). Now a single daemon owns the memory store:
--daemonmode — the sole process that opensmemories.json, serving MCP over Streamable HTTP on127.0.0.1:3838No matter how many editors, agents, or apps you have open, there's exactly one writer. The data-loss failure mode is gone, and it's covered by a regression test.
🏷️ Agent attribution — know who wrote what
Memories now carry reliable agent identity, with a clock-in/clock-out model:
agent_idfrom the client'sinitializeinfo. No more passingagent_idon everystore_memory/update_memorycall — attribution just works.server_handshakeaccepts an optionalagent_idto override the auto-bound identity, and reports the session's current binding.kind:handoffwrite, onclose_task, or after an idle timeout (default 30 minutes, configurable viaNEURODIVERGENT_MEMORY_SESSION_IDLE_MS).This also makes tool use leaner: fewer parameters on every call, and the bridge no longer spawns its own MCP child — writes route straight to the shared daemon.
🖥️ The ND-Mem MCP App
The web app (served by the local bridge) is now a proper front door to your memory store. It reads
memories.jsonlive, listens for changes, and routes every write through MCP — so the daemon stays the single writer even when you're editing from the browser.Browse and read your memories with project auto-discovery, district carousels, search and filters, and a selected-card panel showing metadata, tags, and MCP routing details:
Edit any memory in place. The edit modal routes to the bridge, which forwards the change to the MCP
update_memorytool — only the fields you touched change:Write new memories from the browser with the New Card form — title, district, project, visibility, intensity, content, and tags, posted through the bridge to
store_memory:And a favorite: rename projects, with smart merging. Renaming to a name that already exists (matched case-insensitively, treating
-and_alike) merges into the existing project's canonical spelling — after asking you to confirm. A "did you mean…?" guard catches near-miss names before they become accidental duplicates.🔧 Hardening
tagsare now validated as an array of strings at every write boundary, so malformed payloads can't crash synthesis tooling downstreamTry it
Feedback, bug reports, and weird edge cases welcome — that's what the RC line is for. 🚀
Beta Was this translation helpful? Give feedback.
All reactions