We built a full CRM with AI agents. Here’s how.
Awnitboss (formerly Eidice) is our own CRM for real estate agents, on the web and on iPhone. It answers new leads, keeps each conversation going and hands off to the agent when someone wants to see a home or talk price. AI agents wrote the code. We designed the system that holds them to the standards of a senior engineering team, and this page shows how it works.
The product
Awnitboss answers new leads, keeps follow-up going and writes replies in each user’s style.
Oliver Labs LLC provides the software. Each agent's business remains the sender of its messages.

Screens show sample data.
The size of it
Counted from the code in November 2026. It runs on React and Vite on the web, Capacitor on iPhone, Node functions on Vercel and Postgres on Supabase.
- 19,000+
- commits in its history, including 3,200+ merged pull requests
- 9,600+
- files of checks that run against that code
- 6,000+
- deliberate faults, because each new or changed check has to catch one
- 739
- written rules for how features must behave, across 93 features
- 940+
- database changes, applied in order
- 470+
- database tables tied to one customer account
- 88
- scheduled jobs running behind the product
- 20
- automatic rules wired into each agent session, 9 of them able to stop an action first
What goes wrong with AI agents, and what stops it here
AI agents are fast and sure of themselves, including when they’re wrong, and asking them to be careful doesn’t help. So we built the system around them. Each way an agent fails has a rule, and a machine enforces the rules that matter most. Up to 13 agents work at once, and we use the best models for everything we do.
It says it’s done when it isn’t.
Required checks decide when work is done, and an agent’s own report doesn’t count. Work that fails one doesn’t merge.
It writes a test that can’t fail.
Each new or changed test ships with a deliberate fault, and it has to fail under that fault. If the fault is missing or the test misses it, a required check goes red.
It forgets what was decided.
Each session starts out knowing nothing. Decisions, rules and lessons are kept word for word and load at the start of each one.
Two agents collide.
Each session works in its own private copy of the code and owns its own files. If two touch the same file, both get told before the work collides.
It runs away with time and money.
Briefs are sized to finish in under about 150 steps. An agent gets told to wrap up at 120 and is stopped at 150, and at most 13 run at once.
It does something it shouldn’t.
Hard stops run before an action and can refuse it. The agent that drafts screens can’t touch server code, the database, tests or shipping.
It grades its own homework.
The agent that queues the work writes the always-and-never rules, so the one doing the work doesn’t set its own bar. Sensitive changes also get a review from a separate agent.
It states something false with confidence.
Findings get checked against the code before anything changes, and a fresh agent, given only the claim, works it out again.
What a senior engineer would ask
These are the questions we’d put to anyone who says AI built their software, with answers from our own system.
What happens to one message, from arrival to reply?
- It arrivesA text carries the provider’s signature, and a request with a bad one gets refused. The message is stored under one account.
- AI reads itA model reads the conversation and records what it sees: who wrote, what kind of message it is, whether they asked to stop. A reading never gives permission to send.
- Plain code decidesPlain code takes the agent’s settings and the situation and returns one verdict: send, draft for the agent, hand off or do nothing. Mandatory rules the agent can’t change can only make that verdict more careful.
- AI writes itA model writes the reply in the agent’s style, using only what the lead or the agent provided.
- It gets checkedRule-based scans read the finished text, and a second AI review for discriminatory language can only add a hold. Opt-outs get read again just before sending, and a message carrying a bank or routing number is blocked on each channel.
- It goes out onceThe send gets reserved first, so a retry or a second worker can’t send it again. The result and its reason are recorded.
How do you know a feature does what it was meant to do?
A feature gets a purpose line and always-and-never rules, written so a test can fail them. Each rule names its proof, and the proof has to fail on a deliberately broken copy. A rule with no passing proof counts as blocked.
How does one customer stay out of another customer’s data?
Row-level security is on for every table in the database, and a table with no access rule is closed to ordinary users. Server functions run with wider access, so they filter by account in code. A census lists the 470+ tables keyed to an account, so deleting an account reaches them all, and a daily check tests that anonymous visitors can read only public profile columns.
What happens when the same event arrives twice?
A payment event gets claimed first, committed when finished and released if it fails. A claim left behind by a crashed worker can be picked up again after five minutes. Scheduled sends are claimed the same way, so two workers can’t send one message.
How do you change a database that’s in use?
Each change is a numbered migration, tried inside a block that rolls back before it’s ever applied. Database changes go live before the code that needs them. A release gets refused when code that fails closed depends on tables that aren’t live yet, and a check compares the tables and columns the deployed code reads with the live database.
How does a change reach production?
It passes the required checks, then a merge queue runs the product and contract checks on top of the newest code. Production builds only from commits marked for release, and each release carries a note for customers. Then a robot account signs in and uses the product.
What do you do when a release goes wrong?
Risky behavior sits behind switches that turn it off without a new release, one pause stops all automatic messages across the platform, and the fix goes forward through the same checks.
How do you stop the AI from saying the wrong thing?
The model reads and writes, and plain code decides. A stop, a threat, a legal question or a request for licensed advice goes to the agent or ends the conversation. A proof runs each combination of the agent’s choices against each situation, and robots hold conversations with the live product over real email and text, including an exam its builders never see.
What happens when an AI provider goes down?
A failed call gets recorded with its cause, and a person using the app is told to try again. An automatic reply gets retried, and if no draft can be written, the conversation goes to the agent.
Who watches the AI bill?
AI calls check a monthly spending cap before they run, and if the spend can’t be read, the call doesn’t run. Reading whether someone asked to stop is exempt, because that has to work even at the cap. Production builds run only for releases, and we measure what each AI call and each cloud build costs.
How do you stop agents from overbuilding?
A standing rule says the smallest complete change wins. Before writing anything, an agent has to ask whether it needs to exist, whether the code base already has it and whether the platform does.
What happens if the person who knows this leaves?
Each agent session starts out knowing nothing, so the system can’t depend on anyone’s memory. Rules, decisions and lessons are written down and load automatically, and each finished change records what was built, what wasn’t and the evidence.
How do you know it still works next month?
A robot account uses the live product after each release and each day. More than 3,300 files of regression checks run each night, and another robot looks each hour for scheduled jobs that have stopped.
One lead, start to finish
Awnitboss is a CRM for real estate agents that does the communicating for them. Here’s what happens when someone reaches out.
A lead reaches out
From Zillow, the agent’s website, an open house sign-in or the inbox. They all land in one place.
Awnitboss answers, in the agent’s style
It writes from what the person said, about the home they asked about. It sends from the agent’s own address, so the lead’s next reply comes straight back to the agent’s inbox.
It keeps the conversation going
Most leads aren’t ready the day they reach out. A follow-up plan keeps in touch for as long as it takes, with each message written for that person, and it stops when they reply.
It notices what matters
When a lead mentions a birthday, a move or a closing date, it spots it and asks the agent once what to do with it.
It hands off to the agent
When someone wants to see a home or talk price, the conversation comes straight to the agent, with the lead’s whole file one tap away.
We’re not trying to sell you a CRM.
Awnitboss shows what this looks like when it runs. In your business the lead might be a customer request, an invoice or a new job. The routine work still runs on its own under rules you set, and a person takes over when it needs one.
What it connects
This is the same integration work we do for other companies: email, calendars, texting, payments, industry data and AI, all in one system.
- GmailReads the inbox and sends replies from the user’s own address.
- Microsoft OutlookThe same for Microsoft 365 mailboxes. Oliver Labs LLC is a Microsoft verified publisher.
- TwilioBusiness texting, registered with US carriers.
- Google CalendarAppointments land on the user’s calendar.
- Licensed dataA live third-party data feed under a signed vendor license.
- StripePlans, checkout and billing.
- ClaudeBring your CRM into Claude and take it from there.
Safety built into the product
We apply the same checks to what Awnitboss does on its own, most of all the messages it sends.
Checked before it sends
Before a message goes out, Awnitboss checks opt-outs on each channel, suppressions, unsubscribes and STOP replies.
It acts on the agent’s terms
Awnitboss answers on its own once the agent turns that on, and anything outside those terms goes to the agent.
A second look for discrimination
Automatic replies get a second AI review for discriminatory language, after the rule-based scan. It can only add a hold.
One switch pauses everything
A platform-wide pause stops all automatic messages at once, and each user has a Stop everything button of their own.
Ask us how any of it works
Write to hello@oliverlabsllc.com, or book a free first call to talk about your own business.