Shopify published Under the River, the writeup of the substrate they built so agents could become real participants in how they ship code. Read past the Slack bot and there’s a bet. They state it plainly: “the corpus is the compounding asset; the privacy of an agent thread is a disadvantage.”
We made the same bet. An agent that only helps the person at the keyboard is autocomplete. An agent that learns from everyone is infrastructure. The disagreement is narrow, and it is about what you write down.
The corpus is the asset. The conversation isn’t.
River is public by default. The threads pile up in Slack, stay searchable, and the patterns get fed back into River’s skills later. The corpus is the chat. The signal gets pulled out after the fact.
We don’t keep the chat. We keep what the chat was about. Every interaction becomes an event in an append-only log: structured, embedded, searchable. Extraction happens once, at write time, instead of every time you read. The conversation is scaffolding. The event is the thing that lasts.
This is the warehouse, not the notebook. I wrote about that split in Filesystem vs Database for Agent Memory. The filesystem is where the agent thinks. The memory layer is where the company remembers.
Shopify are halfway here. River writes its own sessions to a river_sessions table. We have a table too. The difference is that ours is not a log bolted onto one agent. In Lobu the events log is the platform. Every agent reads it and writes it. They share one memory. A new agent inherits the whole history instead of starting on an empty table.
One memory. Everyone.
This is what turns a fast assistant into a useful one. You ask, and it already knows. The colleague who hit the same wall last week. The decision made in another channel. The customer a sales thread mentioned. One agent, one company memory, and it gets denser every day the company shows up.
One company is the easy version
Under the River never says the word “organization.” It doesn’t have to. Everything lives inside Shopify. One company, one corpus, shared by default.
That is the easy version. The hard one is many companies at once. The memory stays separate per org. The credentials per tenant. All on the same machines, and no org’s agent ever touches another’s data. That is the real work, and it is what Lobu is built around. Each org gets its own memory that compounds, on shared infrastructure, walled off from the rest. A single company never has to solve this. A product does.
Keep the agent away from the secrets
Their first lesson is to keep the harness out of the sandbox. The agent loop should not live where the code runs, so a bad turn has a small blast radius. We agree, and we draw a second line. The worker never holds a real secret. A proxy sits in front of it and swaps placeholder tokens for the real ones only as a request leaves the box. The agent uses credentials it never sees and can never leak.
The difference
River runs inside Shopify and that is where it stays. Lobu is the version you run yourself. Same memory, same agent everyone talks to, except the database is yours and the data never leaves your org. The only thing we really had to add is the part where it holds up for a thousand companies on one install, not one company that owns the whole place.
Start with the docs, or read how the memory layer works.