Running in production as you read this
Each system below has a real user who would notice within a day if it stopped. For each one: what it does, what changed, and the part that was genuinely hard. Clients are described by industry until they agree in writing to be named.
One client, two systems
Engineering
Regulatory document drafting agent
Hydrogeology engineering firm
Repeat client
The problem. Regulatory well-project documents took an engineer hours of copy-paste drafting per project, from templates plus site data.
What we built. A production document agent behind an authenticated web app: engineers submit project data, the agent drafts the full regulatory document set in the firm's own format, with background job processing and status polling.
What changed
- The regulatory document set for a well project now drafts itself from the project data
- Drafting that took an engineer hours now takes minutes of review
- Client came back and commissioned a second system
What was hard. The documents had to come out in the firm's own template, not a lookalike, so the checks compare every draft against real past submissions. Drafting takes long enough that it cannot happen while somebody waits on a page, so it runs in the background and the page reports where it has got to.
The longer versionOperations
Warehouse stock intelligence agent
Same engineering firm, second contract
The problem. Stock answers lived in an ERP nobody wanted to query. Finding what is in the warehouse meant asking the one person who knew.
What we built. A second production agent for the same client: natural-language answers over live warehouse data, with its own access-controlled portal alongside the document system.
What changed
- Second contract from the same client, scoped in a fraction of the time
- Both systems run side by side on shared infrastructure
- Deployed with one-command deploy scripts and monitoring
What was hard. Stock lives in an accounting system with no clean API, so the agent answers from a mirrored, timestamped copy and always says how old the numbers are. A confident wrong quantity is worse than no answer.
Marketing
Google Ads operations agent
Digital marketing agency
Agency client
The problem. Campaign management work was eating senior time: repetitive checks, reporting, and client-by-client housekeeping across accounts.
What we built. An agent that automates the agency's Google Ads operations workflows, with per-client metadata in Supabase and containerized deployment on the agency's VPS.
What changed
- Routine campaign operations run without a human driving them
- Second phase commissioned after the first shipped
- Runs alongside other automation services on shared infra
What was hard. Every client account is different, so the rules live as per-client metadata rather than in the code, and the agency's own people edit them without a deploy.
Publishing
Multi-phase AI content production pipeline
International publishing client
The problem. A multi-stage book production process needing orchestration across drafting, review, and delivery workflows. Too complex for one prompt, too manual as-is.
What we built. A pipeline split into separate stages, each one able to run, fail and be retried on its own, driven from a chat window the client already had open all day.
What changed
- Three phases delivered and extended across follow-on work
- Client operates the pipeline day to day without us
- Survived platform updates thanks to documented update cycle
What was hard. The tools it is built on keep upgrading underneath it, so every stage has a written update routine and a way back, and the client runs both without calling us.
Voice AI
The night it said the appointment was booked
We build voice agents for other people. So we built one for ourselves, gave it a real phone number, and let it answer.

Real screenshot, not a rendering.
For the first weeks it was a pleasure to listen to. It picked up on the first ring at any hour, it let you interrupt it, it quoted the prices and the opening times correctly, and every call ended politely. Nothing in the logs said otherwise. If we had shipped it then, we would have shipped it proud.
What kept bothering us is that a phone call cannot be read back. A chat agent makes its mistakes on a screen where somebody eventually notices. A voice agent makes them out loud, once, to a person who then hangs up and gets on with their day. Whatever it got wrong left the building with the caller.
So we built something to catch it. A second voice agent, given a customer to play and a reason to call, phones the real receptionist on the real number and has a real argument with it. Books things. Changes its mind. Asks for something the business does not offer. Gets annoyed. Everything it touches is live: the calendar it books into, the record it writes, the agent answering.
What it found
"Your appointment is set for Tuesday." Half a minute later, asked to confirm it, the same agent said it could not find an upcoming booking on that number. There was none. It had announced the appointment while it was still only proposing one. A caller who hangs up on the first sentence leaves believing they have a slot, and nobody discovers otherwise until they turn up.
A time nobody could book. Ask for three in the afternoon and the agent agreed warmly, then failed, every single time. It was passing the time along the way a person says it and the booking underneath only understood the way a machine writes it. The failure was swallowed in silence, so there was no error to find. Only a caller who was never booked.
A table on a day the kitchen was shut. The agent checked the opening hours when it offered times, and never checked them again when it wrote the booking down. Name a closed Monday yourself and it took the reservation. The customer would have arrived at a locked door with a confirmation in their pocket.
"Take me off your list." On an outbound call somebody asked to never be called again. The agent agreed, sincerely, and nothing was written down, because it had never been told the number it was dialling. The next batch would have rung the same person. That is the one with a lawyer at the end of it.
Read those again and notice what they have in common. Not one of them sounds like a fault. Each one is a call that went well, right up until the part nobody was there to hear. That is the whole problem with putting an agent on a phone line, and it is why a demo proves nothing.
What changed because of it
The rules the agent works under stopped being descriptions of good behaviour and became prohibitions. Nothing may be called booked, set or confirmed until the booking exists, and a booking that failed has to be described as failed. A name and a number get read back, digit by digit, and agreed before they are used. A question with no answer in the knowledge base gets an honest "I don't have that" and an offer to call back, never a plausible neighbouring fact. An opt-out is a record or it is nothing.
We also learned to distrust our own test rig. One round accused the agent of mangling prices, and we shipped a fix for it. Then we scored the same calls against what the agent itself had said, rather than against our recording of it, and the agent had been right all along. The fault was in our microphone. We reverted the change and withdrew the finding, and now every run is judged on the agent's own words.
That rig still phones the receptionist before anything ships. It is the difference between a voice agent that sounds convincing and one you would put your own number on, and it is what a client gets when we build them one.
The longer version, with what a month on our own line looked likeYour system could be next on this page
The first reply is free. Paid work starts at a written number: a quote if something should stop being manual, a diagnostic from $500£400€450 if something is broken.