I shipped a critical bug fix. Two weeks later, 40% of users were still on the broken version. Auto-updates off. They didn't know an update existed. In-app updates solved this. The prompt shows inside the app — no Play Store hunting required. This guide walks through a production-ready implementation: a sealed-class state model, a StateFlow -based wrapper around Play Core's callback API, a Hilt-injected ViewModel, and the Compose snackbar that asks for the restart. Code samples are real — pulled straight out of a shipping app, not pseudo-code. What this post covers: Flexible vs immediate updates — and when to use which Wiring Play Core into your Gradle build Modeling the update lifecycle with a sealed class A StateFlow wrapper around the Play Core callback API Hilt ViewModel + Activity setup The restart snackbar (Indefinite duration matters) Testing without debug build limitations Gotchas that cost me one-star reviews The full Play Core in-app updates documentation covers the API surface; this post is about…