I spent two days building a website for a handyman in Indianapolis. That probably doesn't sound like much. But it's the first project shipped through Alpha Dog Agency, and shipping for someone else changes the work entirely.

Rob Becht runs Becht Pride Residential Services. Painting, restoration, remodeling, decks, fences, power washing. The kind of business where the phone ringing is the whole growth strategy. His old site was a Wix template that hadn't been touched in years.

I built V1 in a session. Ten service pages. A gallery with 47 real project photos pulled from the old Wix export. Lightbox viewer, tab filtering by category, testimonials carousel, scroll-reveal animations, Google Maps embed. Static HTML and vanilla JavaScript. No build tools. Open the index file and it works.

Rob looked at it and said: too much. Fewer services. Lead with restoration, not the general handyman pitch. Lose the proprietor photo.

I didn't argue. I built V2 the next day. Six focused restoration categories, stock images on the service cards, a new hero shot, tighter copy. Both versions live in the repo as separate directories, fully deployable, nothing destroyed. The client got what he asked for. The history stayed intact.

V1 tried to say everything. V2 says one thing well.

The accidental platform

The contact form on Rob's site posts to the Ada Landings API. The same Cloudflare Worker I built for dental landing pages. The one I wrote about a few weeks ago.

I didn't plan this. Ada Landings was purpose-built for dental practices. A Worker that reads a Supabase row, renders a branded landing page, captures form submissions, sends email notifications via Resend. Multi-tenant, edge-rendered, zero client-side JavaScript.

But when Rob needed a contact form, I didn't build a new backend. I pointed his form at the existing API. It worked immediately. The Worker doesn't care whether the lead is about teeth cleaning or deck staining. Data comes in, gets stored, notification goes out.

In the same week, I migrated Ada Landings' image storage from Supabase Storage to Cloudflare R2. The logic was straightforward: the Worker already runs on Cloudflare's network, so routing images through Supabase means an unnecessary cross-network hop. R2 sits on the same edge. Zero egress fees. Faster serving, cheaper at scale. Ten commits in one session. Bucket binding, image routes, CORS headers, authenticated uploads, migration script, usage tracking. The old Supabase Storage schema stays in the database marked deprecated, not deleted.

A dental landing page builder now has its own image pipeline, its own upload flow, and its first non-dental client. I didn't rename it. I didn't refactor it into a "platform." It just grew into one because the next use case fit.

The finished site. Static HTML, no framework, contact form wired to the Ada Landings API.

Two lessons from the same week

First: client feedback is a different animal. V1 was my vision of what Rob's business should look like online. V2 was his. He was right. The site needed to say one thing clearly, not ten things impressively. I kept both versions because the before-and-after tells a useful story about the difference between building for yourself and building for someone.

Second: the best platforms are discovered, not designed. I've watched enough software projects fail because someone tried to build a general-purpose tool on day one. Ada Landings worked because I built something specific and real, used it, and then noticed it was more general than I thought. The abstraction emerged from use.