The CRM That Maintains Itself
The CRM that maintains itself
Every CRM dies of stale data, because humans won't do data entry. So I built the one you never open — an agent runs it, your outreach tools feed it, and replies log themselves. One binary, and it's open source.
Here is the truth about every CRM you have ever used: it was accurate for about a week. Then someone stopped logging calls, stopped moving cards, stopped updating fields — because keeping a CRM current is data entry, and data entry is the work nobody wants. The tool that was supposed to remember your relationships slowly becomes a graveyard of half-remembered ones.
The whole category is built around a human clicking in a browser. HubSpot, Pipedrive, Attio — beautiful UIs, per-seat pricing, an API bolted on the side. They optimize the thing that's the actual problem: the human doing the entering.
So I built the opposite. crm-cli is a CRM with no UI at all — a single native binary whose primary user is an agent, not a person. It emits JSON, takes JSON, uses exit codes, and describes itself with help-json. Your agent drives it; your outreach tools feed it; the reply webhook updates it. The CRM stays current because nobody has to keep it current.
The whole loop, one binary
A relationship, start to finish, without a human touching a form:
crm ingest '[…leads…]' # contacts land — the sink for any lead engine
crm queue-bulk '[…campaign…]' # stage a channel-routed campaign (cold-mail + calls)
crm send --limit 20 # drip-send email over SMTP (Resend or any relay)
crm call --limit 20 # drip-dial AI cold-calls over Bland (your key)
crm serve # a webhook: email replies AND call outcomes — auto-logged
That last line is the point. Run crm serve behind a public URL, point a Resend webhook at it, and the CRM updates itself: an open logs an engagement, a reply moves the contact to replied, a bounce or a spam complaint auto-suppresses the address so you never email it again. A lead moves queued → sent → opened → replied on email, or queued → dialed → answered on the phone — and you never opened the CRM once. Email over SMTP, calls over Bland, both bring-your-own — one binary runs the whole outbound, and both channels log themselves back.
Under it: two tables, contacts and their event timeline. Above it: your agent, asking crm due for what's next and crm campaign --summary for where the pipeline stands. No seats. No fields to update. No browser tab.
It found its own first job
The proof came from another tool. I have a lead engine, grepapi, that I'd pointed at its own market — French B2B prospection agencies, the kind of business that lives on lead generation and would either buy the tool or resell it. It came back with 78 verified agencies, phones and emails enriched.
Then I ran exactly one command — crm ingest — and all 78 were in the CRM, channel-routed: 43 staged for cold-mail, 28 for calls, each with its outreach drafted and its next step queued. The lead engine found them; the CRM staged, will send, and will track them. Two halves of an autonomous go-to-market, and the handoff between them is a single JSON pipe.
That's the shape I keep coming back to: the human states intent, the agent runs the tools, and the tools speak JSON to each other. A CRM that can't be driven by an agent is a CRM that still needs the human to do the boring part.
Free and open, hosted when you want it off your machine
The engine is free and open source. It runs locally — one SQLite file you own, bring your own SMTP, uncapped, nothing leaving your machine. That's not a crippled free tier; it's the whole product. Make it great, because it's the thing people actually adopt.
You pay only when you want to stop running the ops. The hosted version — crmd, €19/mo — is the daemon as a service: the always-on reply webhook (no VPS, no public endpoint to babysit), scheduled sending, a hosted database with nightly backups, team access. It still sends through your Resend key and dials through your Bland key — I'm selling you the operations, not renting you a sending reputation or a calling one (cold calls are even more regulated than email; BYO keeps the account, consent, and opt-out list yours). (Managed deliverability is a harder, later thing; I'd rather ship the honest version now than the risky one.)
Open core, plainly: crm-cli is the free local engine and the credibility; crmd is crm-cli that never sleeps.
The honest part
It's new, and it's one person plus agents. The hosted tier is deliberately BYO-sending — I'm not going to pretend I run a warmed, DMARC-aligned sending fleet on day one, because I don't. There's no fancy pipeline UI; the interface is the CLI, on purpose. And like everything I ship, it's written in machin — the machine-first language — which means the whole thing is one small static binary with no runtime, no node_modules, no container.
That's the through-line across everything I build: rigor gets cheaper when the ceremony falls on machines instead of humans. A language an agent writes. A lead engine an agent runs. And now a CRM an agent maintains — so the data stops going stale, because keeping it fresh was the human's job, and there's no human in that loop anymore.
The binary is free: github.com/javimosch/machin-crm-cli. Want it always-on without the ops? crmd.intrane.fr.
crm-cli and crmd are built by Javier Arancibia — the same engineering that goes into intrane.fr.