Skip to content

mimo-mem — read-only browser for markdown memory stores

The assisting models accumulate durable memory as markdown files. This is a small, dependency-free viewer to read and audit those stores — the .md files are the source of truth, so it walks them directly and never writes.

It supports the reliable-production method: honest durable memory is part of reliable LLM-assisted work, and a memory store is only trustworthy if you can review it. The browser exists to surface drift — for example a name that was promoted into a notes file next to the real identifier in the codebase it was conflated with.


What it browses

Two kinds of store, side by side:

  • mimo — a MiMo Code store, laid out as <DATA>/memory/<scope>/<scope_id>/<key>.md (scope = global | projects | sessions | cc), where <DATA> is $MIMOCODE_HOME/data.
  • cc — a Claude Code per-project memory: a flat tree at ~/.claude/projects/<slug>/memory/<key>.md, auto-detected from the current working directory.

Each memory is addressed as <source>/<path>, and file access is confined to that source's root (traversal returns 404).

Run

python tools/mimo_mem/server.py            # auto-resolves mimo + cc
# then open http://127.0.0.1:4849

With no flags it auto-resolves the mimo root (--root, else $MIMOCODE_HOME/data/memory) and the cc root (--cc-root, else auto-detected from the cwd). To browse several stores at once, pass repeatable --source NAME=PATH[:layout] (layout mimo default, or flat); each NAME becomes a tree group and a search scope. Zero dependencies — stdlib http.server, any Python 3.10+.

What it shows

The mimo-mem browser: source/scope tree on the left, rendered markdown with find-in-page on the right.

  • Left pane: memories grouped source → scope → scope_id → key; each source group is collapsible.
  • Right pane: rendered markdown (frontmatter shown separately), with path, size, and mtime; ## headings fold; [[wikilink]]s that match a memory key become click-to-jump links.
  • Search box: substring search across all bodies, with:
  • term — case-insensitive substring across all sources;
  • cc:term / mimo:term — restrict to one source (alternation [cc|mimo]:term);
  • /pattern/ — case-insensitive regex (combinable with a scope, e.g. cc:/victory.?GateRank/).
  • Find-in-page highlights every hit with a match counter and a minimap.

Read-only by design

Only GET /, /api/list, /api/file, /api/search. It never writes to the stores, so it cannot corrupt the memory it is auditing, and path access is confined to each source's root.

Why it earns its keep

The motivating workflow: searching an identifier surfaces, side by side, a wrong durable entry (a misnomer promoted into a MEMORY.md) and the real identifier in a session note it was conflated from. Reviewing durable memory this way catches names and claims that have drifted from the codebase before they propagate into an artefact — the memory-side analogue of the golden rules.