WorkManager in 2026: unique work, chaining, and testing background jobs on Android
A practical guide to WorkManager on Android — unique work policies, chaining, expedited work, and how to actually test a background job before it ships.
Android App Links in 2026: why your https:// links still open in the browser
Digital Asset Links verification, the assetlinks.json gotchas, and the adb commands that tell you why Android won't hand a link to your app.
Room TypeConverters in 2026: storing enums, dates, and lists without corrupting your schema
A practical guide to Room TypeConverters on Android — enums, Instant/LocalDate, and lists — plus the mistakes that turn a converter into a silent data-corruption bug.
R8 and ProGuard for Kotlin, Room, and Compose: the crash that only happens in release
Why a Room + Compose Android app can work perfectly in debug and crash in production, and the specific R8/ProGuard keep rules that catch it before a user does.
The Android In-App Review API: asking for a rating without being annoying
A practical guide to Google's In-App Review API — how it actually works, where to trigger it, and why the usual 'rate us' popup is quietly hurting your Play Store rating.
Android app shortcuts and Quick Settings Tiles: logging water without opening the app
A practical guide to Android's dynamic ShortcutManager API and TileService — how to let a one-tap action skip the app entirely, with the pitfalls that trip most implementations.
Foreground service types on Android in 2026: picking the one your feature actually qualifies for
A practical guide to Android's foreground service type restrictions — dataSync, mediaPlayback, specialUse, shortService — and how to pick the right one without getting killed or rejected.
StateFlow vs SharedFlow in Jetpack Compose: modeling UI state without the replay bug
When to use StateFlow and when to use SharedFlow in a Compose ViewModel — and the one-time-event bug that shows up when you mix them up.
Room database indices in 2026: finding the query that's actually slow and fixing it
A practical guide to indexing a Room/SQLite database on Android — reading EXPLAIN QUERY PLAN, adding @Index without guessing, and the mistakes that silently defeat one.
Room's @Relation: querying one-to-many data on Android without N+1 queries
A practical guide to Room's @Relation annotation — modeling one-to-many data like categories and entries without N+1 queries or manual joins.
Type-Safe Navigation in Jetpack Compose: Routes as Data, Not Strings
How to replace string-based Compose Navigation routes with serializable Kotlin objects — type-safe arguments, nested graphs, and deep links that survive a refactor.
Android 16 Live Updates: putting Mintly's focus timer on the lock screen
A practical guide to Android 16's progress-centric notifications — ProgressStyle segments, promoted ongoing notifications, and what they add to a running Pomodoro timer.
Android notification channels in 2026: designing importance levels users won't mute
A practical guide to Android notification channels — importance levels, channel groups, why settings freeze after creation, and how to migrate them without losing user trust.
Paging 3 with Room: keeping a growing transaction list smooth on Android in 2026
How to page a Room-backed transaction list with Jetpack Paging 3 so years of data stay smooth in Compose — no RemoteMediator, no network, just a local database done right.
The Android 16 KB page size migration: what actually breaks and how to check your APK
Google now requires Android apps to support 16 KB memory pages. Here's what that means in practice, why native libraries are the ones that break, and how to verify yours are safe.
Structured concurrency on Android in 2026: scopes, cancellation, and the leaks they prevent
A practical guide to Kotlin structured concurrency on Android — viewModelScope vs lifecycleScope, why cancellation propagates, and the coroutine leaks it quietly rules out.
Recomposition in Jetpack Compose: what actually triggers it and how I stopped guessing
A practical guide to Jetpack Compose recomposition in 2026 — type stability, unstable lambdas, LazyColumn keys, and reading the compiler's own metrics report.
Full-text search in Room: adding instant search to a local-first Android app in 2026
A practical guide to Room's FTS4 support on Android — building a virtual search table, keeping it in sync with triggers, and why FTS5 needs a manual migration.
Backing up local-first data on Android in 2026: SAF export, Auto Backup, and a restore flow you can trust
How local-first Android apps back up user data without a server: SAF export/import, Auto Backup for App Data, and a restore that verifies before overwriting.
Testing a local-first Android app in 2026: Room, Flow, and Compose UI tests that catch real bugs
A practical testing strategy for local-first Android apps in 2026 — in-memory Room DAO tests, Turbine for Flow, and the few Compose UI tests actually worth writing.
Biometric authentication on Android in 2026: BiometricPrompt, the Keystore, and locking a local-first app
A practical guide to androidx.biometric on Android — BiometricPrompt, CryptoObject-backed keys, device credential fallback, and the mistakes that let a fingerprint check protect nothing.
Accessibility on Android in 2026: a TalkBack and Compose semantics checklist that ships
A practical Android accessibility checklist for 2026 — TalkBack, Compose semantics, touch targets, and the testing pass I run on every screen before release.
Health Connect on Android in 2026: reading and writing data without giving up local-first
A practical guide to Android's Health Connect API in 2026 — permissions, background reads, and why local-first apps should treat it as optional, not truth.
Edge-to-edge and predictive back on Android in 2026: what's mandatory now, and how not to break your UI
Edge-to-edge is now enforced on API 35+ and predictive back is the default gesture. A practical guide to Compose insets, WindowInsets, and PredictiveBackHandler.
Jetpack DataStore in 2026: migrating off SharedPreferences without losing a setting
A practical guide to moving from SharedPreferences to Jetpack DataStore on Android — the async pitfalls, the migration path that preserves existing values, and how to test it.
ML Kit barcode scanning on Android in 2026: how Stocky adds a pantry item in under a second
A practical 2026 guide to on-device barcode scanning with ML Kit and CameraX: format tuning, offline product lookup, and the partial-use math behind a pantry app.
Room database migrations in 2026: shipping schema changes without losing a row
A practical guide to Room database migrations on Android — AutoMigration, hand-written Migration objects, and how to test a migration before your users find the bug.
Baseline Profiles on Android: what actually moves your cold-start time in 2026
A practical guide to Android Baseline Profiles — generating one with Macrobenchmark, wiring it into Gradle, measuring the real gain, and the three other things that move cold start more.
Jetpack Glance in 2026: building a home-screen widget that never lies about your data
A practical guide to Jetpack Glance widgets on Android — state, click actions, and the update-quota trap that makes home-screen widgets show stale data.
Building Subly: the calendar math behind subscription renewal dates
Predicting a subscription's next charge date sounds trivial until you hit month-end billing, leap years, and trial conversions. Here's how Subly gets it right, on-device.
Building Mintly: keeping a focus timer accurate when Android kills the process
A running Pomodoro timer has a harder reliability problem than a one-shot reminder. Here's how Mintly survives Doze, process death, and screen-off drift with a foreground service and a wall-clock end time.
How I ship Android apps as a solo developer in 2026
An actual end-to-end launch playbook for shipping a Kotlin + Compose Android app alone in 2026 — scope, build, Play Store listing, and the boring bits that decide whether you ever launch.