independent research lab
ZBS GG
zbs·gg·no reset. no amnesia.

One endless conversation with your AI.

Pulse gives every AI agent two things it doesn’t have on its own: the feeling of one conversation that never resets, and the sense that it actually knows what you’re talking about right now. Whatever it does under the hood — memory, notes, a graph — doesn’t matter. Those two qualities do. Local-first, structured memories, raw transcript capture off by default.

install — Claude Code, full engine
npx @zbs-gg/pulse@preview init claude-code

● live on npm · developer preview · local-first · backend LLM off by default

Forget how it’s built. A good memory layer is invisible — you only feel two things.

one endless conversation

  • the agent picks up where you left off — new chat, new day, new machine
  • no re-explaining the project every morning
  • no “remind me what we decided” — it already carries the thread
  • the identity stays the same across model upgrades and harness switches

it knows what you’re talking about

  • it surfaces the right past moment for what you’re asking now — not the closest keyword
  • the same question gets a different, better answer depending on where you are
  • it brings back the decision that matters, not the noise around it
  • and it can show you why it surfaced that — every time

Under the hood it’s a state-aware memory engine. You’ll never have to care. If those two qualities hold, it’s working.

Continuity is the first thing to go on any real project. The longer and more serious the work, the harder it breaks.

obsidian notes / a doc

  • you become the memory: writing it down, keeping it current
  • the agent can’t read it unless you paste the right part
  • it goes stale the moment you stop tending it

manual paste

  • you re-feed context every session, by hand
  • you guess what’s relevant — and you guess wrong under load
  • it burns the context window on things the agent could have fetched itself

pinned messages / custom instructions

  • a fixed blob, not the right memory for this moment
  • it can’t grow past a few lines without crowding everything else
  • it’s the same for every question — so it’s rarely the answer to yours

Every one of these makes you the memory engine. That’s the job Pulse takes back.

Two mechanisms, mapped to the two qualities. What survives keeps the conversation continuous. What surfaces now is how it knows what you’re talking about.

◆ structural anchors stay bright. ● regular events fade. Anchor-aware decay decides what stays vivid and what’s allowed to blur — so months later the call you couldn’t take is still there, and Tuesday’s coffee isn’t in the way. That’s continuity that doesn’t drown.

salience over 365 days(◆ = structural anchors · ● = regular events)
regular: s = base · exp(−0.005 · days) → half-life ≈ 139danchor: s = max(base · exp(−0.0005 · days), base · 0.85) → preserved

Same question, different state, different memory — with the reason on every card. Drag the state toggle: the agent navigates the same history two different ways depending on what you actually need right now.

state-aware retrieval contrast·pulse trace fixture
where did we land on the retrieval refactor?
[FIXTURE · labeled, simulated]

state: shipping mode

emotion_role: action-context
[FIXTURE]

state: reflecting mode

emotion_role: meaning-context
[FIXTURE + PRECOMPUTED]
same graph · the active state highlights a different path
early 2026nowshippingshippingshippingshippingreflectingreflectingreflectingreflectingbothreflectingshippingshippingrefactordecisionparity gatererunCIfirst calltwo weeksit clickedtrustbaseline
shipping path reflecting path shared node

scores are illustrative retrieval scores from a labeled [FIXTURE], not benchmark numbers — no leaderboard claim lives here.

A real run of pulse demo on the live engine: a labeled, simulated corpus seeds in, one question runs in three user states, three different answers come back with their reasons — then the continuity pack the next session receives, then the wipe.

if the embedded player does not start, open the demo video directly.

Other tools do real things well. Here's an honest read along the only two axes that matter — and where each one may not fit.

claude-mem

  • good at: clean, automatic capture of your Claude sessions — solid continuity inside Claude
  • may not fit: it's tied to the Claude/Claude-Code world; it recalls what you discussed, not the right moment for your current state
  • one quality strong (continuity in-tool), the second thinner (no state-aware surfacing)

Mem0

  • good at: a capable, general memory API — facts and notes you can query from your own app
  • may not fit: it's a backend you wire up and host; it stores what was said, with no notion of which memory matters for this moment
  • great building block; not a drop-in companion that just works in your agent

Pulse

  • works in every harness — Claude Code, Cursor, VS Code, Codex, any MCP host
  • configurable to any setup, and one-touch to install
  • local embedders option — your memory and your context stay on your machine
  • both qualities by design: continuity that doesn't drown, and state-aware surfacing that knows what you mean now

Pulse isn't “more memory.” It's the two qualities, in whatever tool you already use, with nothing leaving the machine unless you turn it on.

no benchmark numbers on this page — those, with full methodology, live at zbs.gg/bench.

One command for the full engine in Claude Code. Or add the compatibility fallback to another host — clearly labeled, because it's keyword recall, not the Pulse engine.

full engine — Claude Code
Open in Claude Codedeep link — if nothing opens, run the command below
npx @zbs-gg/pulse@preview init claude-code
this is the full state-aware engine · then run pulse doctor, then pulse demo

● live on npm · developer preview · local-first · backend LLM off by default

Safe Mode · keyword recall (not the full engine)

keyword recall only — this is the compatibility fallback, not Pulse retrieval. no benchmark claim applies here, and pulse doctor will say so.

Add to Cursor

npx -y @zbs-gg/pulse@preview mcp
or add this as a stdio MCP server named "pulse" in Cursor settings

Install in VS Code

npx -y @zbs-gg/pulse@preview mcp
or add a stdio MCP server "pulse" running this command

Codex

Codex
codex mcp add pulse -- npx -y @zbs-gg/pulse@preview mcp
no deep link — copy and run

claude.ai supports remote connectors only — there's no local install here. Use Claude Code, Cursor, VS Code, or another local MCP host above.

pulse · local previewOpen in Claude CodeSafe Mode ↓