I ve been using Codex, Claude Code, and OpenClaw for different kinds of work:
Codex (now @ChatGPT by OpenAI )is strong at long-context planning and execution.
@Claude Code acts like a supervisor and a second pair of eyes.
@OpenClaw is like my daily operations intern.
I know there are many other agent harnesses. Many are open-source, including OpenHands, @Pi Coding Agent , and Hermes.
Hey Product Hunt 👋
I'm Richard, co-founder of HarnessRouter. Today we're launching Harness Memory, which gives agents built on HarnessRouter a long-term memory.
Here's why we built it. Every agent we built kept forgetting things, like what a user told it yesterday or what it figured out last session. It was worse whenever we switched harnesses, say from Claude Code to Hermes, or from Pi to Codex, because we had to wire memory up all over again each time. We kept thinking memory should be part of the agent instead of something you glue on afterwards.
So that's what Harness Memory does:
It's built in. When you build an agent, HarnessRouter picks a memory engine that fits the agent's job and tells you why. The options are Mem0, Graphiti, Hindsight and ReMe, or you can bring your own. Some agents shouldn't remember anything, like a translator that only transforms input, and those get no memory at all.
It works in every session. The agent recalls memory when each turn starts, uses it through tools during the turn, and records what it learned when the turn ends. You don't write any glue code.
It works across harnesses. A Claude Code agent, a Hermes agent, and a Codex agent can share one memory. In our demo, Codex saves a weekend plan, and Claude Code recalls that plan in a completely new session.
We built it for agents that serve lots of people, so we were strict about a few things:
Every user of the agent gets their own piece of memory, kept apart from everyone else's. Each memory needs its own access grant. Without a grant there's no access, and a model can't widen its own access.
Agents can forget, but only people can erase. We never give an agent erase memory via a tool. When a fact changes, Harness Memory saves a new version, so the history stays.
Memory informs the agent, but never instructs it. Recalled memory reaches the agent fenced off from its instructions, and each record is labeled with who wrote it. On the Memory page, people can see, edit or delete what's stored.
We also made it open. The memory layer is an open spec, the Harness Memory Protocol, which is the Memories chapter of the Unified Harness Protocol. Any memory service can plug in as a provider. If a provider doesn't support something, we report the gap rather than skip it silently.
Harness Memory is available today in the open-source Community Edition, and on HarnessRouter Cloud.
We'd love to hear from you:
What's the one thing you most wish your agent remembered?
Which memory engine should we support next?
We're around all day, so ask us anything 🙌
@renchu_song memory surviving a harness switch is the bit I'd care about most. I'd also want to open it and read what it remembered, otherwise it's hard to trust
@farzam_habibi Thanks! The memory lives outside the harness, so it isn't tied to Claude Code or Codex. To move to another harness, add an agent on the new one and switch the same memory on in its settings, and everything it remembered comes along. In our demo a Codex agent saves a weekend plan, and a Claude Code agent recalls it in a brand-new session.
And yes, you can open it. Each memory has a Data tab that lists every record and who wrote it, and you can edit or delete any of them.
Congrats on the launch!
A lot of what we save points at a file or a function. the note still reads fine long after the thing it names is gone.
Does recall know when a memory is pointing at something that no longer exists? 🤔
@seenew Thanks so much! 🙏 You've put your finger on exactly what we're building next: keeping memory in sync with the sources it came from.
Think of it like classic ETL, except the sources are unstructured (your repo, docs, tickets) and the target is the agent's memory. When the source changes, the memory follows, so a renamed function or a deleted file doesn't leave a stale note behind.
Would love to hear which sources you'd want connected first! 🙂
Congrats on shipping this, the cross-harness demo is slick. We have a handful of team rules every agent should follow, like "use pnpm, not npm" and our commit message format. Can I pin those so every agent gets them every time, instead of hoping recall happens to surface them?
Thank you! That's what standing instructions are for. Open the record on the memory's Data tab and switch on Standing instruction, and every agent that uses that memory gets it at the start of each task, not only when recall finds it. Only a person can set one, from the console. An agent can't create or change it, so a chat can't talk an agent into adding new rules for everyone.
The cross-harness part is what sold me — I run Claude Code and Codex side by side, and right now each one starts from zero on whatever the other figured out. Memory living outside the harness so a fact saved in one shows up in the other is the piece I'd actually use every day. The per-user separation with access grants matters a lot too, and only people being able to erase memory is the right call. One thing I'm curious about: when two harnesses write conflicting versions of the same fact, how does it decide which one wins?
@jcbuilds Thank you, great question! It depends on how the fact got there.
For what the engine draws from conversations, each engine has its own rule. In Graphiti, a newer fact that contradicts an older one closes it, and the old one stays readable, marked as superseded with the date. Mem0 updates the fact and keeps its earlier versions. Hindsight consolidates facts in the background, and each summary links to the facts it came from.
When an agent saves something on purpose, it's kept word for word. So if Claude Code and Codex each save a different version, both are kept, each labelled with the agent that wrote it, and neither silently overwrites the other. You keep the right one on the Data tab, or an agent forgets the stale one. A standing instruction set by a person can't be changed by any agent.
shared memory across claude code and codex with access control, really neat. congrats Kuanze
@mohitvishwakarma thank you for your support! Harness memory is a top ask from our developer community, and we hear it. Looking forward to seeing what our customers will build with it!
Love that it's open source. How do you keep memory from going stale or bloated over time? Is there pruning or summarization, and can I scope memories per project?
@zain_sheikh Thanks Zain, really glad the open source part resonates! 🙌
Each memory engine handles stale or bloated memory in its own way:
- Mem0 updates or drops a fact when a newer one contradicts it.
- Graphiti keeps facts on a timeline, so a newer fact replaces the old one.
- Hindsight consolidates in the background.
When a turn starts, the agent recalls only the top matches for what was just asked and skips repeats, so it doesn't load the whole memory. Memories don't expire by age today. Instead you can see everything an agent remembers, and why, under Memories in the console, and edit or delete any of it.
A memory belongs to its workspace and doesn't reach into another one. Inside a workspace, each harness agent plugged with its own memor(ies), kept separately for each person if the agent serves multiple users. You can also share one memory across several agents when they should know the same things. It's a N * M combination: you can plug any number of memories in the same workspace to a single harness, and each memory can be plugged into any number of agent harnesses in the same workspace.
Would love to hear what you build with it!