What I learned building a PWA into a home-inspection site in two weekends
{{DRAFT — Michael review required}} Ghostwritten by Claude Code in Michael's voice.
Bluegrass Home Inspections is a client in Owensboro, Kentucky. The owner, David, didn't ask for a progressive web app. He asked for a way to stay in touch with homeowners after closing — because the inspection relationship, done well, is a decade-long relationship, not a one-time transaction.
I built the Homeowner Hub as a PWA dropped into the existing Next.js site. Two weekends. Here's what I learned.
The PWA path of least resistance
App stores are a distribution tax paid in approval cycles and 15% cuts. For a small service business, there's no good reason to pay it. A well-built PWA lives on the home screen, works offline, sends notifications — and the user got there from a link.
The install prompt on Android is native and works. The install prompt on iOS is a museum piece — you have to teach the user how to "Share → Add to Home Screen." I wrote a dismissable one-time onboarding that handles it. It's fine. It's not beautiful.
Offline-first matters more than you'd think
A homeowner inspecting their basement at 9 PM on a Sunday is often on bad carrier signal. Caching the report, the photos, and the reminders on first open means none of that UX is at the mercy of a single bar.
IndexedDB is awkward but correct for this. The service worker caches the shell + the latest report payload; the photos are lazy-loaded and pinned on view.
The surprise: seasonal reminders outperform the report
I assumed the report was the hero feature. The actual engagement driver turns out to be the seasonal reminders — gutter cleaning in October, water heater flush in spring, HVAC filter notes in July. The homeowner gets a light touch from their inspector four to six times a year instead of zero.
We're still two weeks from the first cohort's 30-day retention window, so the number I'd cite isn't honest yet. But qualitatively, the post-close relationship is a different kind of warm.
The footguns
- iOS PWA sessions are evicted aggressively. Persisting anything important requires Storage API or the user will lose state between launches.
- iOS doesn't support web push the same way. We use local notifications scheduled by the service worker instead, which is fine for seasonal stuff and wrong for time-critical alerts.
- The service worker scope needs to be the root of the app. Scoping it to a subdirectory will bite you.
Should you do this?
If your client has a relationship with the homeowner / customer / patient that outlives the transaction, yes. If the transaction is the relationship, no — you're solving a problem that doesn't exist, and the engineering overhead isn't free.
More on the Bluegrass project in the case study.