Skip to content
MSM
7 min readMichael Schmidt

What I learned building a PWA into a home-inspection site in two weekends

Draft — Michael review required

{{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.

#pwa#offline-first#case-study