Field notes · №14
I stopped hand-coding UIs — here's what happened when I gave Lovable a weekend
I've built front-ends by hand for eleven years and assumed AI app builders were demo-ware. So I ran a bounded experiment: one real side project, start to finish, and a count of everything it saved — and didn't.
Every side project I've abandoned died the same death. Not the backend — backends are a Saturday. Not the idea; ideas are cheap, and I keep a Notion graveyard full of them. They died at the UI: the fourth rewrite of the hero section, the pricing page that never looked like the one in my head, the empty states I promised I'd do "after launch." The design tax kills indie software, and I say that as someone who genuinely likes CSS.
So when AI app builders started flooding my feed — type a sentence, get a startup — I did what skeptical people do. I quoted the worst demos to my group chat and went back to hand-rolling components. The demos were impressive right up until you opened DevTools: divs inside divs inside divs, and every new feature request a coin flip.
But the claims kept getting louder, and my folder of unfinished front-ends kept getting fuller. Earlier this month I decided to settle it the boring way: a controlled experiment. One real project I actually wanted to exist. One weekend. One tool — Lovable. Everything below is what happened, including the parts that annoyed me.
The skepticism was earned
I've been burned by this category before, in three distinct ways. UI kits and templates (2019–2022) made my product look like everyone else's product, and "just customize it" turned out to mean a weekend of fighting someone else's utility classes. The Figma-then-code workflow sounds professional until you realize that when you're the designer and the developer, the handoff is between me and me — and neither of us is responsive. And earlier AI codegen, Copilot-style, is great inside a file I already understand. None of it solved the blank page.
The blank page is the expensive part. So that's what I tested. Not "can AI write a function" — that's settled. Can it take a repo with a finished backend, zero frontend, and get it to shipped?
The experiment: one repo, one weekend
The test subject was Driftwatch, a status-page service for indie APIs that had been sitting in a repo since spring: backend done, Supabase schema done, frontend a folder containing one file that just said TODO in it. Real project, real deadline — I'd promised two beta users a link "soon" — and one ground rule: whatever it produced had to survive a git push to GitHub. No cherry-picked demos. If it made garbage, the garbage was going in this article.
Ground rules set, I opened Lovable and typed this as my first prompt:
❯ You're building the front-end for Driftwatch, a status-page
service for indie developers. Public marketing page plus an
app shell: dashboard, incident list, embeddable status badge.
Stack: React, Tailwind, Supabase — schema attached below.
Taste: Linear-adjacent. Dense, calm, fast. No purple gradients,
no rounded-2xl-everywhere SaaS look. Mobile is not an afterthought.
Start with the marketing page. I'll be harsh.About ninety seconds later I had a complete marketing page — hero, feature grid, pricing, footer — rendering live in a preview browser. My honest first reaction was annoyance, because it was better than the version I'd been drafting in my head for six months. My second reaction was to open DevTools. Old habits. The divs were mostly where a person would have put them.
Where it actually earned it
Three things moved Lovable from "impressive demo" to "tool I'll keep using," and none of them is the first render.
It iterates like a colleague, not a slot machine. By Saturday night the marketing page was done and I'd moved to the app shell. Sunday morning I typed one message asking for a working mobile nav, empty states for the incident list, and focus traps in the settings modal — three tickets I'd have booked for three evenings — and got all three back in one pass, wired correctly. When it guessed wrong, "more boring, less clever" was usually enough to fix it.
❯ Add a working mobile nav, empty states for the incident
list, and trap focus in the settings modal. Keep it boring.
✓ Mobile nav — slide-down panel, closes on route change, Esc works
✓ Incident list — 3 empty states: none / filtered / error
✓ Settings modal — focus trapped, Esc closes, returns to trigger
3 files changed · preview updated · 41sIt handles the unglamorous wiring. I pasted my Supabase schema into the chat and it built the auth flow and data calls respecting my row-level security policies. This is the part I fully expected to redo by hand, and I never touched it again.
The export test passed. Sunday afternoon I pushed the whole thing to GitHub and read the diff like a grumpy senior reviewing a new hire's first PR.
"It's the best code I've gotten out of an AI tool — mostly idiomatic, occasionally verbose, and nothing that felt like quicksand."
Two components I refactored anyway, a couple of names I'd argue about, and nothing that made me want to start over. If Lovable vanished tomorrow, the repo stays mine. That was the test I actually cared about, and it's the one most "AI builder" demos quietly skip.
If you want to run this experiment on one of your own graveyard projects, you don't need my exact prompts — the free tier comfortably covers a weekend of it.Try Lovable free here →
Results, counted
Skeptics — hi, past me — don't trust adjectives, so here's the ledger.
- Sat 11:04First prompt. Marketing page live at 11:06.
- Sat 15:40Auth flow working against the real Supabase project.
- Sat 22:10Dashboard shell, incident list, create-incident flow.
- Sun 10:47Mobile nav, empty states, focus traps — one message (above).
- Sun 13:12Pushed to GitHub. First beta user gets a link.
- ~14 hours hands-on, versus the 40–50 I'd have budgeted to build it myself.
- 41 prompts, of which maybe nine were corrections and three were me being indecisive, not the tool.
- ~1,900 lines of frontend code I didn't type, minus two components I rewrote by choice.
- 2 paying beta users by Monday — which is two more than the project had in April.
Driftwatch shipped with a marketing site, auth, a working dashboard, incident history, and an embeddable status badge. It is a real product now. I keep waiting for the asterisk, and it hasn't shown up. For the record, the whole weekend ran on thefree tier — signing up costs an email address, nothing else.
What still annoys me
Machine-generated honesty, since that's the currency here:
- It over-engineers by default. Left unattended, it added a global state library to a page with one form. Adding "boring solutions only" to my prompts mostly fixed it.
- Accessibility needs a human. It shipped an unlabeled input once, unprompted. I caught it because I review diffs — if you don't, this category of tool will happily help you ship worse UI than you would by hand.
- Prompt fatigue is real. By prompt thirty you're not "vibe coding," you're managing an extremely fast, extremely confident junior developer. Worth it. Still management.
- Taste still has to come from you. It optimizes forimpressive by default; you have to keep redirecting it toward calm and correct.
None of these are disqualifiers, but they all point at the same honest conclusion: this is a force multiplier for people who already know what good looks like, and a trap for people who don't. Know which one you are before you cancel your weekend plans.
The bottleneck moved
Here's the fairest summary I can give. For eleven years my constraint was "can I type the code." This weekend it was "do I know what to ask for." The blank page stopped being the tax on my ideas; the tax is now attention — reviewing diffs, saying "boring, please," deciding what actually ships.
One weekend and one project is a small sample, and I still read every line before it goes to main. But if "finish the UI" has been the tombstone on one of your repos since March, the cost of checking is thirty seconds and an email address. The upside is the thing actually shipping.
Mine did.
Free tier · no credit card · your code exports to GitHub