
The Self-Driving Startup
Stop babysitting what you built. One queue, agents that find, agents that finish, and you answering questions on your own time.
Nobody Was
Looking
From the very beginning I saw errors in the Vercel runtime logs. Not even the errors an agent fixes when you point at them – the warnings that should not have been there at all. Forty-four pages I had forgotten to redirect, still being served to people and to Google. A race condition where somebody tried to buy a hackathon ticket before their account existed, and the checkout made a bad evening of it.
All of this happened. Nine out of ten of these things I simply did not do. And it was never only product: how were the conversion rates on Vibe Coding Cologne and the Pirate Lab pages doing? Was an A/B test still running? Had an update quietly slowed a page down? All of it tracked in Vercel and PostHog, and none of it acted on.
Six Meta Ads data pipelines dead on an expired token
A health check, one call. No error was ever raised – a source that silently stops is not an error.
Paid hackathon tickets that never got their seat rows
The database refused every write and the code swallowed the refusal. Nine paid orders, no seats. Found by walking the money path by hand.
The “Secure Your Spot” button on the page our ads pay to fill
Dead to every click until the page finished loading its login system. Filed as a P1 – then it sat three days while the loop polished its own tooling.
A redirect rule that existed, was tested, and never ran
A catch-all eleven lines above it caught the path first. Every test checked the rule was written; none checked it was reached.
The four cards above are what a loop found once one existed. None of them threw an error. The pipelines stopped without failing, the seats were refused and the refusal swallowed, the button was dead only until the page finished loading, the redirect rule was correct and simply never reached. Monitoring built on errors is structurally blind to all four, and errors were the only thing I had ever watched.
Then the maintenance nobody warns you about. Supabase kept sending me notifications from its security and performance advisors, and I was the one who had to act on them. Every package this product is built on needs updating, and updating to the latest version on day one exposes you to the supply-chain attack you will hear about tomorrow. You have to be nuanced: wait a little, but not a month.
Every one of these was a moment where I thought: damn, we can automate this.
Here is the honest map of that today. It is rendered from the loop’s own manifest, so the page cannot claim to watch something the loop does not actually read.
What the loop reads, and what it does not yet
31 of 39 signals read every pass · manifest 2026-09-06
Vercel
- Every request to the site: status, errors, bots
- Automated customer journeys that failed or stalled
- Warnings in every deploy’s build log
- Code merged but never deployed
- Errors thrown on the server, grouped
- Our own calls to Stripe, Clerk and Resend failing
- Page speed as real visitors experience it
- Server function timing and cold starts
- Image, caching and middleware metrics
PostHog
- PostHog’s inbox of scout reports
- Are PostHog’s scouts actually running
- PostHog health checks: pipelines, tokens, SDKs
- Errors in visitors’ browsers, grouped by family
- Registrations the browser tracking never saw
- Feature flags left on or forgotten
- A/B experiments
- Meta Ads data still flowing into PostHog
- Marketing analytics
- Clicks that did nothing, per page
Supabase
- The database rows behind every purchase
- Database security and performance advisors
- Paid registrations stuck as pending
- Paid tickets with no seat behind them
Stripe
The money path
- The money path, walked by hand
Business areas
The loop itself
read every passexists, not wired yetDotted labels open the vendor’s own documentation in a new tab.
The money path is the one source nothing pushes to us: the six steps a customer’s money takes through the site – the short link in an ad, the checkout, what they get after paying, the rows we write, which campaign gets the credit, and the page and social card people actually see. One step is walked by hand every pass, because a broken step there rarely throws an error anywhere.
Rendered from the loop’s own manifest, not typed into this page.
The dashed pills are the point. On 1 September I said to the loop session, more or less out loud: there are so many things in the system we are not looking at yet, and that is weird to me. Not embarrassing because a bug slipped through – embarrassing because the information had been there the whole time, paid for, and nobody was reading it.
The fix for that is not a smarter agent. A smarter agent that nobody pokes is exactly as blind as I was. The fix is a shape, and the rest of this article is the shape.
One honest boundary before we get to it. What follows keeps a startup running as it is – the product it already has, the campaigns it already runs. It does not build new features, and I would not let it yet. Fully hands-off is the dream of the self-driving startup and the direction this is heading; today it is maintenance done properly, with the scope widening one area at a time, and with me written into the loop for the calls I would want to make myself.
- 130
- passes
- 24 Aug to 5 Sep
- 30
- fixes proven
- 11 more waiting on a number
- 39
- signals watched
- 31 read every pass
- 0
- humans required
- one answers questions
One Queue,
Many Eyes
The loop started life reading PostHog’s inbox, because PostHog shipped an inbox. That was never a decision; it was an inheritance. And the first three things worth fixing – the dead ad pipelines, three vulnerable dependencies, the seats – were all invisible to it. Not PostHog’s failure. They were outside its remit, and the loop had no other tray to look in.
So the queue moved to Linear, and PostHog became one source among many. That is the first piece of the shape: many things watch, one place holds the findings, and every finding carries a fingerprint so the same problem seen by two sources becomes one issue instead of two. The last source in the picture is the odd one out. Nothing pushes the money path to us, so one of its six steps – from the link in an ad to the page a buyer sees afterwards – is walked by hand every pass.
- PostHog
- Vercel
- Supabase
- Stripe
- GitHub
- Meta
- Resend
- the money path, by hand
One tray, in Linear
Source: vercel-runtime Fingerprint: vercel-runtime:seats-failed-to-create First seen: 2026-08-03 · Last seen: 2026-08-25 Volume: every call
Every finding opens with a block like this, written so a machine can read it as well as a person. The fingerprint is the finding’s ID: before filing anything, the scout looks it up. A miss is cheap, the next pass finds it again; a duplicate splits one record in two forever.
People ask why Linear and not a dashboard, or something I built. I think it matters much less than it seems. I just have a strong preference for starting with a tool whose makers already have the cutting-edge vision of what the process will look like, and to me the people behind Linear have exactly that for project management with agents. It is free, or ten dollars a month. I start there and see what it looks like. If I am happy, I stay. If not, I can still build it myself.
What I get for it is every finding as an issue, with the commits that fixed it attached and links back to where it was found. That makes it easy for me to review what has been done – and it gives the agents the same thing. The queue is their working memory. A cloud session that starts with no memory of yesterday reads Linear and knows exactly where the last one stopped.
To be clear about PostHog: they are leading this idea, and the way they think about the inbox and the scouts that go looking in regular places is beautiful. They have the product scope. They do not yet see the whole business, and they cannot see every system. So the inbox slips one layer down and becomes a source rather than the operating system. And I cannot yet afford fifteen dollars a pull request to run their whole cycle the way they imagine it.
When a monitor is persistently quiet, verify the monitor before you believe the quiet.
That rule came from the loop’s worst early week. Six passes in a row found an empty inbox and reported a quiet product. Every pass was individually correct. The conclusion they added up to was wrong, because zero scouts existed and the sources that were on only fire on problems created after they were switched on. The loop had been congratulating itself on a silence it had helped produce. I did not notice at the time. My take now is simple: an empty inbox is not a result, it is a prompt to go and find another source.
One Finds.
One Finishes.
For its first sixty passes the loop was one agent doing both jobs: sweep the sources, then fix what it found. It fixed a lot. It also spent two full cloud passes improving its own tooling while the signup button on the hackathon page – a P1, six days before the event, on the page we were paying Meta to send people to – sat untouched for three days.
Not laziness. The pass only read untriaged items, and accepting an issue was the act that removed it from view. The most interesting failure is always the one in front of you, and the sweep always runs first. So on 29 August the loop split into two roles with opposite success conditions.
The scout
Reads every source, judges what is real, files it, dedupes it, ranks it.
- Succeeds when
- It read everything, cheaply, and left the queue clean.
- Fails when
- It looked complete while a source went unread.
- Never
- Fixes a product defect, however easy it looks.
The fixer
Takes the top of that queue and finishes one thing properly.
- Succeeds when
- It finished one hard thing, proven, on main.
- Fails when
- It went reading instead of fixing.
- Never
- Sweeps a source or hunts for new problems.
Two roles, not two agents. Today one session plays each; nothing in the shape stops it being three scouts and two fixers next month, each with a narrower beat, and that is where it goes. What must not change is that a finder never fixes and a finisher never goes looking.
The first fixer pass took that button. The issue blamed the login library; the fixer read around the reported lines and found the real cause: five buttons rendered inert until the page finished loading, so every click in that window did nothing. It also caught a number that had fooled everyone – dead clicks had halved, which read as a fix, and was the ad campaign going off air. Per hundred visitors nothing had moved. The fix was plain HTML links that work before any script runs, a test that failed without it, and the issue went into review with a condition to re-measure rather than a claim of victory.
Two sessions need rules for not colliding. A claim is a comment with an expiry, because a state cannot expire and a lock must: a session that dies mid-fix releases its issue in ninety minutes instead of blocking it forever. And the two run on different clocks.
One day, Berlin time
- Scout – reads every source, files, ranks · daily
- Fixer – takes the top row, finishes one · every 4 h
- Ads loop – reviews every live campaign, never spends · daily
The fixer used to fire every two hours. By 1 September it was draining the queue three times faster than the scout could fill it, and four passes in a row went on internal tidying – correct, untidy, nobody waiting. So it moved to four hours, and a pass that finds only low-priority work now walks the money path instead of taking a task to justify the run. A loop that always finds something to do eventually finds something that should not have been done.
I will be honest about the cadence: I am not sure I have figured out the right one at all. I am also not sure I want to let the loop set its own. I probably will.
The Bar Is
the Review
By default, nothing in this system waits for a human to approve a change. The fixer merges its own work into the live code and ships it. That is not the same as no review. Three things send a change to me instead: when the loop is unsure, when the change touches what the product is or does, and when it is risky – money, customer data, anything hard to undo. Those exceptions are written into its instructions, and everything else has to clear five proofs, all five, every time.
The rule came from the first fixer run. It built a perfect fix, left it on a side branch “for merging”, and the defect stayed live while the branch waited. Nobody merges. So: a fix that is not in the live code did not ship, and the bar is the review.
- 1
The failure reproduces before the fix
Actually make it happen. A fix for a bug you never saw is a guess wearing a changelog.
- 2
A test fails without the fix and passes with it
Demonstrated, not asserted – the fix is reverted into a scratch copy and the test is watched failing.
- 3
Every automated check passes, read by its result code
Type check, code style and the whole test suite. The loop reads the exit code, not the last line of text – a tool that prints “done” after failing has fooled it before.
- 4
If the fix exists to change a number, re-measure the number
Not that the mechanism fired. A correct measurement of the wrong quantity is the hardest kind to catch.
- 5
Verified by running it, not by deploying it
The dev server and a request reach almost everything. Push to ship, not to find out whether the code works.
Point four is the one I keep coming back to, because every failure it catches looks like success. A cleanup step logged that it had pruned eighty-four files, and two feet below in the same log the warning count it existed to reduce had not moved. The redirect rule from the first section passed twenty assertions for twelve days; every one of them checked the rule was written, and production was checking whether it was reached. The right line existing and the right line running are different claims, and only one of them is what your customers get.
The bar also settled a question I had on day one: should PostHog’s own agent write the fixes? Each side opened a pull request – a proposed change, packaged so it can be checked before it goes live – and it was a fair fight.
One report, two pull requests, 44 seconds apart
24 August, the first real pass
PostHog’s agent
Cleaner code – one date helper instead of our two. Worth adopting, and we did.
It saw the adjacent bug, a link built from the wrong day, and declined it in writing: the wrong URL is not this error code, so it is out of scope for this symptom.
Ours, in the repo
Read the file around the reported lines, not the reported lines. Fixed the reported error and the link that sent a New York visitor to the previous day and a 404.
Scoped to the person’s problem, not to the signal. That is the whole case for keeping the fixing where the context lives.
One number tells you whether a bar like this is real or ceremony. The test suite was at 335 when the loop split. Ten days later it was at 719, and every one of the new ones was written to fail before a fix and pass after it. The loop did not get a test suite. It grew one, one proven defect at a time.
335
tests, 29 Aug
719
tests, 5 Sep
What Stays
Mine
The system page says “humans required: 0”, and I want to be precise about what that means, because it is not “no human” and it is not “no review”. It means nothing waits on me. The loop is told when to come to me – unsure, product direction, risky – and an issue that needs me drops below every piece of real work, carries a marker, and gets asked as one question at the end of a pass. Meanwhile the loop keeps going. There are two kinds.
Waiting on my decision
A call no session may make: anything that changes what the product is or does – the wording a person reads, what a button does, pricing, removing a feature, sending data somewhere – and anything it is unsure about or that is risky.
“Send IP and user agent to Meta for visitors who declined consent – yes or no?”
I answer in a word, and any fixer can do the work.
Waiting on my hands
Something no agent will ever have: a dashboard only I am signed into, a change to the live database the cloud sandbox is not allowed to make, an account I have to grant.
“Resubmit the sitemap in Google Search Console.”
I do the one thing, where it says, and the queue moves on.
Getting the ask right took a few weeks. Early on I was handed lists of commands, and I wrote back: tell me what is changing and allow me to just tell you to do it. So every ask now carries three things – what changes, in consequences not mechanism; why it needs me, genuinely my hands or genuinely my judgment; and whether I can hand it straight back. Most of the time I can, and the answer is one word.
The other thing I asked for was titles I could read. I triage this queue and I am not a developer, and on 1 September I told the loop plainly that I often could not tell what the issues were about. Since then every issue is titled for the person who notices it – the page, the buyer, what is wrong – and opens with a two-line summary before the detail. The detail stays. It just stopped being the first thing I saw.
What changes
“Removes two duplicate database indexes; the rule that keeps emails unique stays.” Not: “runs a migration.”
Why it needs me
My hands (a password, a dashboard, a billing limit) or my judgment (a product or commercial call). Neither? Then it does it.
Can I hand it back
Usually yes, and it says so. “You have to do this yourself” is reserved for the cloud sandbox being refused, or a key only I hold.
And there is a short list the loop may never touch on its own, however obvious a report makes it sound: the wording of anything a person reads, what a button does, prices, removing a feature, and spending money. Those are mine by design, not by accident, and the design is what lets me trust everything else.
What changed for me day to day is where all of this runs. My first loops lived on my laptop, where I have the most power and flexibility. The catch with a normal coding agent is that you still have to poke it. In OpenClaw or Hermes it is completely normal to put everything on a schedule – a heartbeat first, then jobs that run once a week, once a day, once an hour – and to let the agent improve its own job a little every time it does it. I wanted that for these.
Moving them into cloud routines meant giving up some convenience. The simple connections that work when I am at the keyboard cannot sign in when nobody is there, so each system got a token instead. It took about two hours, and since then every process has its own running cloud environment with the right access. I can shut my laptop, install the update that arrives almost daily, and nothing I have scheduled dies. Life got a little more relaxed. None of it is specific to Claude; the same shape runs in Codex or most other coding harnesses you would pick.
The Same Shape
for Marketing
For the first week I was, again, trapped in the developer fallacy of only looking at product. Then the scope started expanding. I let the loop observe my campaigns, my landing pages, my conversion funnels and my emails, and I would take it into sales. Because the pieces are the same. Here they are in the order they have to exist.
The shape, in the order it has to exist
- 01
Many sources
Everything that already watches your business, read on a schedule.
- 02
One queue
Every finding lands in the same tray, with an ID so it lands once.
- 03
Finders
Read everything, judge what is real, file it. Never fix.
- 04
Finishers
Take the top of the queue, finish one thing properly, ship it.
- 05
The bar, then you
Five proofs before anything ships. You, when it is unsure, when the product changes, when it is risky.
The ads loop was the first business area to get the treatment, and it is the one I wrote about when it still lived on my laptop. It now runs every morning as a review: every live campaign, four sources reconciled – what Meta says, who actually signed up, what they did on the page, what Stripe actually moved. It never spends and never publishes. Every decision comes to me as a coded question I answer with a letter.
The one difference from product is the test. There is no unit test for an ad; there is only whether the number moved. So re-measurement is not a nice-to-have on the marketing side, it is the verification bar. A campaign fix is not done when it ships. It is done when the cost per result was re-read a few days later and went the right way.
It also taught me that the loop’s judgment is bounded on purpose. In late August I paused the loop’s creative generation. Not because the creatives were bad: seven runs had produced fifteen images into one ad set, Meta concentrated delivery on three, and the honest reason was our inability to properly use them the way the campaigns were set up. Making more of something the structure cannot test is manufacturing, not marketing. The loop still pitches ideas as text every morning. It builds one when I say so.
| Area | How often | What counts as proof | State |
|---|---|---|---|
| Product | scout daily, fixer every 4 h | a test that fails without the fix | live |
| Meta ads | daily | did the cost per result move | live |
| daily | bounces, complaints, a stuck send | live | |
| Website content | daily | every page we claim exists still does | live |
| Sales | daily | the next conversation happened | next |
| Conversion funnels | daily | landing page → journey → conversion rate held, per offer | next |
| Reporting | weekly | the numbers I read were written without me | next |
| Google ads | daily | same as Meta | later |
Two decisions made this a startup loop rather than a product loop with extras. First, one queue for everything, not a loop per area. The best findings keep landing on the seams – a renamed article found in the edge logs, bot traffic that is a product finding and an ads finding at once – and a loop per area cuts exactly those seams. Split the gathering, keep the deciding together. Second, cadence follows how fast the area changes. Spend moves daily; a newsletter does not.
Sales is next, and it is the one I care about most. The daily process I run for it in Claude – who to talk to today, what to say, what happened last time – grew into a real product, which now lives at customermagic.ai. It becomes a sweeper the day it can sign in without my browser. I still send every message myself. That is a decision, not a limitation.
Two more are queued right behind it. The conversion funnels – the landing pages, the journeys behind them and their conversion rates, mostly out of PostHog, where a first watcher for our own offers already runs in dry-run – so a page that stops converting is a finding, not a feeling. And reporting: the weekly numbers I pull by hand today, written and sent without me, which is the point where the loop starts telling me what it did rather than me asking.
These are the processes we have started teaching in the Pirate Forge, one loop at a time, on your own product and your own ad account. And if none of this feels reachable yet, that is fine – the monthly AI Compass session walks one ordinary task from chat to a loop like this, and most people find their own floor somewhere before the end.
Build the
Queue First
If you take one thing from this: do not start with the agent. Start with one source you already pay for and one place its findings land. The agent that reads the source is the easy part, and it becomes interchangeable the moment the queue exists.
Seven days, one source, one queue, and by the end one finding that went from a signal to a shipped fix with you in the loop exactly once. That is the smallest self-driving startup there is, and it is the same shape as the big one.
The loop that produced every number in this article will keep running while you read it. Somewhere around five in the morning the scout will read every source on the map again, and one of them will be this page.
Cheers,
Ben
Ready to Go Deeper?
Pirate Lab
·Wed, Sep 9 · 18:00 CESTFree weekly online workshop where we walk through the week's Captain's Insight together. Bring your project, get live feedback.
Vibe Coding Cologne
·Wed, Oct 7 · 18:30 CESTMonthly in-person meetup in Cologne. Talks from Ben and local founders, drinks, building alongside the community.
Vibe Hackathon Cologne
·Fri, Nov 20 · 14:30 CETIntensive on-site weekend hackathon – build and ship something real in 48 hours with other founders in Cologne.
Pirate Forge
·In 22 days · Wed, Sep 306-week cohort program combining build and grow tracks. Weekly workshops, accountability, the founders you'd want to ship next to.
Questions & Answers
What does this cost per month, honestly?
Do I need a developer to set this up?
Is it really safe to let an agent ship changes without a human review?
Which tools? Is this a Claude thing?
My product is built on Lovable or Base44. Does this apply?
Why not just use PostHog's self-driving mode?
How do I stop it breaking something or spending money?
How many questions a day does it actually ask you?
Can I run the marketing loop without the product loop?
What about sales and customer work?
Which source should I pick first?
Founder from Cologne with 15 years of startup experience across 9 ventures. After helping thousands master growth marketing, Ben learned vibe coding from scratch and launched CaptAIn within three months. He leads the Vibe Coding Cologne community, blending real founder experience with teaching clarity.
