Update, Maintenance & Changelog

The ops surfaces — a force/soft update gate, a full-screen maintenance takeover, and an in-app changelog / "What's New" sheet. All driven by RemoteAppConfig, so you trigger them from your backend without shipping an app update.

📱Update sheet — lightlight/docs/screens/update-light.png
📱Maintenance screen — darkdark/docs/screens/update-dark.png

core/designsystem/ops/KitUpdateComponents.kt · feature/changelog/ChangelogScreen.kt

The components

KitUpdateSheet(required = true, onUpdate = ::openPlayStore)   // force update — non-dismissible
KitUpdateSheet(required = false, onUpdate = ::openPlayStore)  // soft update — dismissible
KitWhatsNewSheet(changelog = entries, onDismiss = ::markSeen) // version-bump popup
KitMaintenanceScreen(message = msg)                           // full-screen takeover

UpdateGate (wrapping the nav host) decides what to show, in order: maintenance → force update → soft update → auto "What's New".

How it's driven

UpdateManager + ChangelogManager read conventional keys from RemoteAppConfig:

min_supported_version   → below this = forced update
latest_version          → above current = soft update offer
maintenance_mode        → true = maintenance screen
maintenance_message     → shown on the maintenance screen
app_changelog           → JSON parsed into the What's New sheet

Pick where those live with:

/kit-setup-updates      # LOCAL (offline) · Supabase · Firebase

The kit ships LOCAL by default, so the gate compiles and runs offline. Point it at Supabase or Firebase and flipping maintenance_mode or bumping min_supported_version in your dashboard hits every installed app on next launch — the kill switch.

In-app changelog

ChangelogScreen (Settings → About → What's new) lists all releases. On a version bump, the KitWhatsNewSheet shows automatically (suppressed on a fresh install) via a DataStore lastSeenVersionCode.

Features

  • Force update (blocking) + soft update (dismissible)
  • Maintenance mode with a custom message
  • Auto "What's New" on version bump
  • 100% backend-driven — no app update needed to trigger any of it

Configure with /kit-setup-updates · deep dive: Features → Ops