Building in Public #2: Chasing Quality, and Becoming vorx.com
By Peter Coppinger
Frustrating days. The kind where you question the whole thing. But I got somewhere by the end, so let me tell it in order.
The problem: our single-page sites were noticeably worse than the best tools out there, and slower to build. I'd been poking at prompts for days, hoping to luck into quality.
Hope is not a strategy.
Sixty landing pages and a lucky find
So I did the unreasonable thing. I generated sixty landing pages from the market leader across twelve prompts, and put AI to work analysing the whole corpus: layout patterns, section structures, what makes them feel designed. Somewhere in the middle of that, one of the builds shipped with a stray planning file left inside it, a little gift that confirmed what the analysis was already telling me. They're not conjuring these sites from thin air; there's a strong system underneath with design directions and customisation on top.
Fine. If it's a systems game, I can play a systems game. I rebuilt our landing generation the same way, as a seeded composition the AI fills in, and ran round after round of before/after comparisons, hunting down the formulaic 'tells' that make AI sites look AI-generated. Ten iterations later the outputs were genuinely good. I logged the run as reaching parity and allowed myself a whole evening of feeling smug. The same harness, a fortnight on, with build times on my own results and output I was no longer embarrassed to put beside anyone.

This is the rig I built to do it: pick a direction, a scheme, an accent, a radius, a display font, then shuffle the layout and look at what comes out. Turning taste into knobs you can actually turn.

Then Saturday night happened
Then, Saturday night, the smugness fell over. Testing more prompts I realised the seed system is too constrained. It makes nice sites that all look like cousins. The thing that got me to parity is the thing that caps how good we can be.
Back to the drawing board. Again.
I'd be lying if I said that didn't sting. But every round of this fight has taught me something the next system gets to keep: the test suite, the tells list, the quality bar itself.
And the project got its name
Big identity week: the project officially became vorx.com. Renaming a product across five repositories (domains, emails, branding, redirects, config) is the sort of job that sounds like an afternoon and takes days of careful sweeps. Worth it. Typing the short domain still gives me a little jolt of yes.
The generated apps grew up a lot this week. Real backend features landed one after another: a SQL editor, secret management, scheduled jobs, file storage, user management with row-level security.
This is the whole thesis: a Vorx app isn't a demo, it's a real system with the unfashionable parts included.
Previews in the cloud
Previews went to the cloud too. Every project now gets its own little machine that boots on demand, with proper signed-token auth in front of it. Getting cold starts, wake-ups and stale-sync edge cases right took most of a week of whack-a-mole. An edit that silently doesn't reach the preview is the most trust-destroying bug we can ship, so I hunted every variant of it I could find.
The expensive lesson
Now, the expensive lesson. To speed up builds I split generation into parallel lanes: fan the work out, collect the results, profit, right? Wrong. I measured it properly and the parallel version cost dramatically more per build without being reliably faster, because every lane pays the full context bill separately. One coherent pass over shared context wins. I reverted it and wrote up the numbers so future-me doesn't get seduced by the same idea. Measure. Always measure.
Also shipped: proper team invites, with multi-email input and a little confetti moment when a new person lands.
Somebody's first thirty seconds in your product deserve confetti.
One quieter milestone that mattered to me: sync IDs now come from a single global sequence, a collision class that would have bitten us at scale, fixed before anyone ever hit it. Nobody will ever notice. That's the point.
Mid-week I was in Germany for quarterly planning at my other company, then a few precious days at Europa Park with the family. Roller coasters are an excellent hard reset for a stuck brain.
Just shipped
- Feature: sharing your build now earns credits: post it on X or LinkedIn, submit the link, get 15 credits.
- Bug fix: the language picker now actually saves your choice instead of reverting on the next page load.
- Feature: fleet coordination now works from anywhere. A hosted endpoint, not my home Wi-Fi.
- Feature: Mission Control is served online, locked to the company's own accounts.
- Feature: generated apps can now be installed like native apps, icon and all.
- Feature: a performance gate flags exactly which change slowed a generated app down.
- Feature: generated apps can connect to Google Sheets: append rows, read rows.
- Feature: generated apps can schedule real recurring jobs, not fake ones.
- Feature: owners get told immediately if their published app's database ever disappears.
- Feature: Apple login for generated apps.
- Bug fix: edits interrupted by a deploy now resume instead of silently vanishing.
- Bug fix: the cookie consent banner was never actually visible on production, so nobody was ever asked.
- Bug fix: generated apps were asking their database for tables that were never created. It hit 18 live projects.
- Bug fix: a code slip in generated apps could crash the whole page on load. Caught and fixed.
- Bug fix: publishing showed a "failed" message while the site was actually live. Fixed.
- Bug fix: agents quietly working from stale code can no longer ignore the staleness.
- Bug fix: a fresh browser window said "please log in again" to people who were logged in.
- Bug fix: demo data stopped booking appointments on days the business is closed.
- Bug fix: copied credentials could point a new project at the wrong database. Sealed.
- Bug fix: an overeager cleanup job was deleting healthy backends. Stopped.
- Feature: sharing your build now earns credits: post it on X or LinkedIn, submit the link, get 15 credits.
- Bug fix: the language picker now actually saves your choice instead of reverting on the next page load.
- Feature: fleet coordination now works from anywhere. A hosted endpoint, not my home Wi-Fi.
- Feature: Mission Control is served online, locked to the company's own accounts.
- Feature: generated apps can now be installed like native apps, icon and all.
- Feature: a performance gate flags exactly which change slowed a generated app down.
- Feature: generated apps can connect to Google Sheets: append rows, read rows.
- Feature: generated apps can schedule real recurring jobs, not fake ones.
- Feature: owners get told immediately if their published app's database ever disappears.
- Feature: Apple login for generated apps.
- Bug fix: edits interrupted by a deploy now resume instead of silently vanishing.
- Bug fix: the cookie consent banner was never actually visible on production, so nobody was ever asked.
- Bug fix: generated apps were asking their database for tables that were never created. It hit 18 live projects.
- Bug fix: a code slip in generated apps could crash the whole page on load. Caught and fixed.
- Bug fix: publishing showed a "failed" message while the site was actually live. Fixed.
- Bug fix: agents quietly working from stale code can no longer ignore the staleness.
- Bug fix: a fresh browser window said "please log in again" to people who were logged in.
- Bug fix: demo data stopped booking appointments on days the business is closed.
- Bug fix: copied credentials could point a new project at the wrong database. Sealed.
- Bug fix: an overeager cleanup job was deleting healthy backends. Stopped.
Stay updated: one founder, an army of AI agents, building this in public.
Get each new diary entry by email: the wins, the failures, and the one number we're chasing. No spam, unsubscribe any time.