12/16/2025
"I refreshed, but nothing changed."
Every developer has heard this. But when you're building a Flutter PWA to take advantage of ease of distribution and updates, yet your QA team reports not being able to see the new fixes and features, you know something funny is going on. And when you see this behavior across multiple releases over two months, and hard refreshes don't work, and restarting the browser doesn't work, and iOS Safari is fine but macOS Safari isn't, you know you're in for a journey.
Development went smoothly. Weekly releases, rapid iteration, happy client. Then Safari started holding onto cached content like it was the last lifeboat on the Titanic.
What followed was a two-month deep dive into service worker internals, custom update mechanisms, git hash version checking, CORS surprises, and one humbling false alarm where the "bug" turned out to be our system working exactly as designed.
The good news: our QA process caught every issue before production. Not a single user was affected. The lessons learned (about Safari's unique caching behavior, about building update mechanisms from day one, about keeping service workers focused on static assets) will inform every PWA we build going forward.
We wrote it all up so you don't have to learn it the hard way.
Link in comments!