We Built Our Own CRM With AI Agents: 417 Commits, One Foreman
We built our own CRM and email marketing app, and AI agents wrote almost all of the code. Per our repo history, that’s 417 commits in about four and a half months, 302 of them co-authored by Claude. It was the right call for us. For most businesses it isn’t. The part worth telling is how it got built, because halfway through, the way we ran the agents changed.
I’m an agency owner who builds things the way some people restore old cars, so read this as a story about us and not as advice for you.
Why build it at all?
The repo gives a few reasons. The README opens with “$0/month at small volume.” Sending goes straight through Postmark, so bounces, complaints and suppressions flow back into a database we own. Our contacts originally came from a WordPress-plugin CRM, and the app still carries that plugin’s old suppressions, so part of the project was getting off it. And a lot of what we wanted was specific to how DigiSavvy sells: the SEO Snapshot lead magnet, event signups from Luma, reply tracking, site-visit automations.
Phase one: pair programming
From June through September it was one Claude session and me. I’d describe what I wanted, Claude would write it, I’d review it, we’d ship it. That’s how the foundations went in: CSV import, the email composer, Postmark sending, webhooks, and the drip automations with a visual canvas.
It worked, but it was slow in the way pair programming is slow. One conversation, one thing at a time. Those four months produced 136 commits. Then came October.
Phase two: the foreman and the workers
October alone has 281 commits. The difference was a pattern I now think of as foreman and workers. I wrote about handing a coding agent a seat before, in giving Grok Bot the integrator seat. This is the grown-up version.
- I ask in plain language, often with a screenshot. “Headings feel too tight.” “Send to multiple segments.” “Darker buttons, white text.”
- The foreman, a Claude session, turns that into a GitHub issue: the relevant code, the root cause, acceptance criteria, edge cases and test requirements.
- Workers, separate Claude agents, build in parallel. Each gets its own branch, has no network access and can’t push.
- The foreman gates every branch: rebase, type check, the full test suite (about 1,890 tests), and a real-browser check at phone and desktop widths. Then it merges, applies database changes, deploys and smoke-tests.
One rule surprised me: the foreman never writes code. Even a one-line fix goes to a worker, so the foreman’s attention stays on judgment. On October 18, eight requests went from chat to production in a single day, including multi-segment sends, a mobile dashboard fix and a restyle of buttons and cards.
Think about what that does to your own habits. The old way, a small agency owner would say “this feels off” and then waits a sprint or a month. Here, the same sentence became a spec, a branch, a test run and a deploy before the day ended. The bottleneck stopped being typing and became knowing what I actually wanted, which turns out to be the harder job.
Why does it hold together? Mostly boring things. Every agent reads the project guide before touching anything. A standing checklist asks “which parts of the app does this touch?” before shipping, and it includes a nasty one we call a kind leak: lists, segments and tags share one table, so a new kind of group can quietly show up in every picker. And the issues come first, so the spec is also the record of why we did it.
What did the AI get wrong?
Plenty. This is the part I’d have wanted someone to tell me.
- A rebase silently dropped two fields. A merge-conflict fix removed data the dashboard needed. The agent didn’t notice. The tests did.
- Workers missed late notes. They read the issue body, not the comments. Two of them claimed the same database migration number.
- Guessed prices. Workers with no web access guessed the prices of AI models and got them wrong.
- Workers can’t run everything. They can’t open network ports, so only the foreman runs the test suite. That makes the foreman the bottleneck, on purpose.
- A full disk. Many parallel agents plus test runs filled the dev machine’s disk and killed a worker mid-task. Cleaning up after each job is now a standing rule.
- “Finished” that wasn’t. Automations were marked done locally three times before a Cloudflare rule about Workers calling each other on the same domain showed up in production. Local-first checks can’t see everything.
What are the lessons?
- Write specs, not prompts. The issue doubles as the changelog and the decision record.
- Separate judgment from typing. One agent plans and gates, others build.
- Tests are the contract. Some of ours guard the AI assistant’s own limits.
- Keep a living project guide. Ours runs to roughly 2,450 lines and every agent reads it first, plus a standing “which parts does this touch?” checklist.
- Encode hard limits in code, not instructions. The in-app AI assistant can read data, draft campaigns and manage contacts. It can’t send, schedule, activate or enroll anyone, because those tools don’t exist.
- Verify what matters yourself. “Tests pass” and “it’s right” are different sentences.
What does it do today?
In plain English: contacts and companies with a sales pipeline board; email campaigns with a visual editor, scheduling and automatic resends to people who didn’t open; drip automations that branch on what someone does; replies captured next to the sends; website visit tracking for known contacts only, respecting Do Not Track; deliverability checks and alerts; Luma event syncing; and the lead-magnet pipeline behind our SEO Snapshot. That’s about 79,000 lines of code across 81 database migrations.





What does it cost to run?
The “$0/month” is the Cloudflare hosting at our volume. It leaves out two metered costs. Postmark bills per email, with plans that scale with monthly volume. The AI assistant bills per use through Anthropic. And development itself is token-heavy, so the AI bill is variable. I won’t put dollar figures here; check current plans instead of trusting a blog post.
What’s the catch?
You’re the vendor now. Uptime, security, backups, consent and unsubscribe handling, and no support team when a deploy breaks. We back up the database to separate storage every night because nobody else will. Only one person understands the product, and the AI understands the code only through the project guide and the tests. We also lack things mature platforms have: large-scale A/B testing, deep reporting, a template marketplace.
So should you copy this? Almost certainly not. We build software for a living and already run agents daily. For most of our clients, a mature platform like ActiveCampaign is still the right call: support, compliance and deliverability that you’d otherwise carry yourself. Our automation canvas borrows its look, which tells you what we think of it. If you want that set up properly, that’s our marketing automation work.
If you’re curious about the AI side, start with our AI consulting page, or read should you let AI build your website and building a plugin in the age of AI. Here’s what I’m still chewing on: if an AI can type the code in an afternoon, what’s left that’s actually hard?





