Relationship management for people and their agents
Open CRM keeps account memory that holds up to both: every fact shows the note it came from, your coding agent works the same records you do, and nothing it proposes lands until you approve it. Your data is a folder on your computer.
The demo is the real browser edition with synthetic records. Whatever you type stays in your own browser storage.
We built this for ourselves. Open CRM carries the way we run our own accounts at Zentrik, the same operating model we depend on every day, published as its own product rather than described in a blog post.
A CRM assumes a person keeps the file
An ARM, Agent Relationship Management, assumes a person and their agents keep it together, which changes what the records have to guarantee. Four properties make a system one, and Open CRM is the first open implementation.
- one write pathPeople and agents change the same records
- The app, the crm command, and the MCP server submit the same validated operations. There is no agent-only side channel and no import that skips the checks.
- groundedEvery fact cites the note that says so
- What you know about an account is recorded as claims: needs, risks, goals, objections, commitments, facts. A claim without evidence is drawn as a hunch wherever it appears.
- reviewedNothing an agent proposes lands on its own
- An agent change is validated, then held as a proposal with its evidence until a person approves it. Direct mode is a deliberate choice, and every direct change is logged with the agent name.
- yoursPrivate by design, and yours to change
- workspace.json holds every record, with generated Markdown views beside it. Back it up, keep it in git, or move it. Nothing requires an account with a hosted service, and the model is small enough to read in an afternoon, so you can shape it to how you understand your customers.
Two commands, then open the folder in your agent
Needs Node 22.18 or newer. The workspace folder is the product: your agent reads its contract, runs the same command you do, and proposes work you review in the app.
Create a workspace and open the app
git clone https://github.com/Zentrik-AI/zentrik-open-crm.git cd zentrik-open-crm && npm install npm run crm -- init ~/crm --demo cd ~/crm && ./crm ui
Point an agent at the same folder
cd ~/crm claude # or codex, or open the folder in Cursor
Ask it to run the daily review. Its proposals appear under Review as it works, each one carrying the notes behind it.
Walk into the call knowing what was said and what you owe
Account memory is the point. Everything else exists to keep it honest.
- before a callWhat changed, what is owed, who decides
- Each account computes what happened since the last verified contact, what each side committed to, which roles on the buying committee are missing, and the questions worth asking. Your agent reads the same page with crm brief.
- after a callSources become memory
- Drop a transcript or email into the inbox and ask the agent to process it. It keeps the file by content hash, writes notes that cite it, and proposes the claims and next actions the source supports.
- when you compareSorted tables, and the shapes a table cannot hold
- Accounts has a table when the question is a comparison: sort by value, last verified contact, how much of what you know is grounded, or what is due next. Unknown values stay at the bottom in both directions. When a table is the wrong shape, the brief, the trace and the Book answer instead.
- any timeThe chain from source to action
- From a task, a claim, a note, or a person, the trace shows the source, what was taken from it, and what it led to. Weak memory is visible: crm lint names hunches, stale evidence, overdue commitments, and accounts with nobody who signs off.
Account work stays in Open CRM, product decisions happen in Zentrik
Open CRM notices when several accounts say the same thing and stops there. Deciding what to build from that evidence is product work.
When a pattern is worth acting on, Open CRM hands over the sources behind it: the notes, the accounts they came from, and the identity that keeps a retry from duplicating anything. An agent connected to the Zentrik MCP server can ingest the same bundle directly.
The handoff carries sources, never conclusions, and it only happens when someone asks for it. Open CRM works the same if you never connect Zentrik at all.
Before you clone it
Is Open CRM really open source?
Yes. It is Apache 2.0 on GitHub, and it runs on your machine. Fork it, change it, or run it for your team without asking us.
Does it send my CRM data to Zentrik?
No. Records stay in your browser storage or in your workspace folder. The only way anything leaves is when you export it yourself.
Do I need Zentrik to use it?
No. Open CRM is a complete CRM on its own. Zentrik matters when account evidence turns into a product decision: the CRM notices when several accounts say the same thing and hands over the sources behind it, and you decide what to build in Zentrik.
Do you use this yourselves?
Yes. Open CRM is the way we run our own accounts at Zentrik, published as its own product. That is also why the boundary with Zentrik is drawn where it is: we wanted account work and product decisions to stay separate in our own work before we asked anyone else to adopt it.
Which agents can work it?
Claude Code, Codex, and Cursor read the contract in the workspace folder and run the crm command directly. Anything that can run a shell command or speak MCP can work the same records.
Can an agent change a record without me?
Not in review mode, which is the default. Proposals wait under Review with the evidence behind them until you approve or reject. You can switch a workspace to direct mode when you trust the loop, and every change still carries the name of whoever made it.
Start with one relationship worth remembering
Try the browser edition, or clone the repository and give your agent a workspace it can actually work.