Assembling the digest… kotlin-digest
TRENDING

EDITION 2026·W30
20 JULY 2026
32 articles · 7 sources
Archive →

The Kotlin world, assembled weekly, for Android engineers.

6 chapters · ordered by topic score · About & Contributing
Filter

FOCUS — select topics to show only those chapters.

TRENDING
███▇▇▇▆ compose-multiplatform 117 ███▇▇▇▆ compose 115 ███▇▇▆▆ kotlin 92 ███▇▇▆▆ jetbrains 57 ███▇▇▇▆ navigation 43 ██████▇ jetpack 41 ██▇▇▆▆▆ kmp 40 ███████ google-io 39 ███▇▇▇▆ material3 35 ███▇▇▇▆ android-developers 31 ███▇▇▆▆ clean-architecture 25 ████▇▆▆ architecture 22 ███▇▇▆▆ testing 18 ███▇▇▇▆ context-receivers 15 ▇███▇▇█ gradle-plugin 15 ██▇▇▆▆▅ ktor-server 14 ██▇▇▆▆▅ build-logic 13 ██▇▇▆▆▆ android-auto 12 ██▇▇▆▆▅ kotlin-backend 12 ██▇▇▆▆▆ ktor 10 ███▇▇▇▆ compose-multiplatform 117 ███▇▇▇▆ compose 115 ███▇▇▆▆ kotlin 92 ███▇▇▆▆ jetbrains 57 ███▇▇▇▆ navigation 43 ██████▇ jetpack 41 ██▇▇▆▆▆ kmp 40 ███████ google-io 39 ███▇▇▇▆ material3 35 ███▇▇▇▆ android-developers 31 ███▇▇▆▆ clean-architecture 25 ████▇▆▆ architecture 22 ███▇▇▆▆ testing 18 ███▇▇▇▆ context-receivers 15 ▇███▇▇█ gradle-plugin 15 ██▇▇▆▆▅ ktor-server 14 ██▇▇▆▆▅ build-logic 13 ██▇▇▆▆▆ android-auto 12 ██▇▇▆▆▅ kotlin-backend 12 ██▇▇▆▆▆ ktor 10

EDITION 2026·W30
20 JULY 2026
32 articles · 7 sources

The Kotlin world, assembled weekly, for Android engineers.

6 chapters · ordered by topic score · About & Contributing
Cover Story · Compose & UI
Proandroiddev 24 Jul

Navigation 3: Keep entryProvider from Becoming a Giant Switchboard

Shows how registering every destination directly inside Navigation 3's entryProvider turns it into an unmaintainable switchboard as an app grows. Proposes grouping related screens into EntryProviderScope extension functions per feature, so the root NavDisplay just composes feature entry points.

▸ SCOPE NAV BY FEATURE
fun EntryProviderScope<NavKey>.authFeature( onAuthSuccess: () -> Unit, onNavigateToSignup: () -> Unit ) { entry<LoginRoute> { LoginScreen( onLoginSuccess = onAuthSuccess, onSignupClick = onNavigateToSignup ) } }
navigationarchitecturecompose
Trending · Contents
compose-multiplatform███▇▇▇▆
compose███▇▇▇▆
kotlin███▇▇▆▆
jetbrains███▇▇▆▆
navigation███▇▇▇▆
jetpack██████▇
kmp██▇▇▆▆▆
google-io███████
material3███▇▇▇▆
android-developers███▇▇▇▆
clean-architecture███▇▇▆▆
architecture████▇▆▆

Compose & UI

11 stories

Kotlin Core

7 stories

Community

7 stories

Android Platform

6 stories

Architecture

1 stories

Interlude
Standards
Standards xkcd · Randall Munroe

Fortunately, the charging one has been solved now that we've all standardized on mini-USB. Or is it micro-USB? Shit.

§ 01

Compose & UI

Lib Compose Multiplatform 25 Jul

v1.12.10-alpha01+dev4546: Details

Eight Compose Multiplatform nightly builds landed this week across the 1.12.10-alpha01 and 1.12.0-beta03 dev channels. Each bumps the org.jetbrains.compose, Material3, Lifecycle, and Navigation3 artifact coordinates in lockstep; none carry documented API or behavior changes beyond the version bump.

▸ Also this week · 8 more builds
compose-multiplatformmaterial3navigationjetpack
Proandroiddev 24 Jul

Navigation 3: Keep entryProvider from Becoming a Giant Switchboard

Shows how registering every destination directly inside Navigation 3's entryProvider turns it into an unmaintainable switchboard as an app grows. Proposes grouping related screens into EntryProviderScope extension functions per feature, so the root NavDisplay just composes feature entry points.

▸ SCOPE NAV BY FEATURE
fun EntryProviderScope<NavKey>.authFeature( onAuthSuccess: () -> Unit, onNavigateToSignup: () -> Unit ) { entry<LoginRoute> { LoginScreen( onLoginSuccess = onAuthSuccess, onSignupClick = onNavigateToSignup ) } }
navigationarchitecturecompose
Medium Kotlin Tag 21 Jul

A timer that lives in your IDE

A developer built a minimal IntelliJ timer/stopwatch plugin with Compose, Jewel, and Skiko, hosting composables via JewelComposePanel, keeping state in a project-level service as a sealed StateFlow hierarchy, and covering pitfalls around bundling Compose as platform modules across IDE major versions.

▸ SEALED TIMER STATE
sealed interface TimerState { val displaySeconds: Int data class Stopped(val totalSeconds: Int) : TimerState data class Running(val totalSeconds: Int, val remainingSeconds: Int) : TimerState data class Paused(val totalSeconds: Int, val remainingSeconds: Int) : TimerState }
composejetbrainssealed-classesflows
Proandroiddev 20 Jul

rememberDecoratedNavEntries Makes rememberSaveable Work Across Multiple NavBackStacks

Explains rememberDecoratedNavEntries, a lower-level Navigation 3 API that pairs each independent NavBackStack with its own decorated NavEntry collection so rememberSaveable UI state survives tab switches, configuration changes, and process death without screen-level changes.

▸ DECORATED NAV ENTRIES
val homeEntries = rememberDecoratedNavEntries( backStack = homeBackStack, entryDecorators = decorators, entryProvider = entryProvider { entry<Home> { HomeScreen() } entry<Form> { FormScreen() } } ) NavDisplay(entries = homeEntries)
navigationcompose
Medium Kotlin Tag 22 Jul

Course Review: Jetpack Compose Crash Course @ Udemy

A Medium review of a Udemy Jetpack Compose crash course finds it a solid refresher on animations, providers, and Compose fundamentals, but dated since it teaches Navigation 2 rather than the simpler Navigation 3.

composenavigation
Medium Android Tag 24 Jul

Google’s Android XR Is Here: Here’s What Developers Need to Know

Overviews Android XR for developers: Home Space vs Full Space app modes, declarative spatial UI via Jetpack Compose for XR (panels, depth, 3D entities), the Compose Glimmer toolkit for smart-glasses micro-UIs, Gemini Live API voice integration, and the built-in Android Studio XR emulator.

composejetpackandroid-api
Medium Kotlin Tag 24 Jul

Best Practices for Creating UI States in Jetpack Compose in 2026

Argues Jetpack Compose screens need more than Loading/Success/Error booleans, covering cached content shown during refresh, filters retained across process recreation, and retryable errors that don't hide existing data. Recommends separating business-driven screen state from transient UI element state.

composemvvmarchitecture
Medium Kotlin Tag 23 Jul

Why Jetpack Compose?

Reflects on a senior-interview question -- why does Compose exist -- and walks through how View-based UIs scatter UI truth across separate widgets requiring manual synchronization, while Compose centralizes state in one UI-state object the framework keeps consistent.

▸ MANUAL UI SYNC
usernameText.text = user.name progressBar.isVisible = false followButton.isEnabled = false toolbar.title = user.name verifiedBadge.isVisible = user.isVerified followersCount.text = user.followers.toString()
composearchitecture
Medium Kotlin Tag 21 Jul

Is Jetpack Compose Ready for Android TV Development in 2026?

Assesses whether Jetpack Compose is production-ready for Android TV in 2026, covering D-pad focus handling, focus restoration, performance on fragmented TV hardware, Media3 playback integration, and migration paths from Leanback. Recommends Compose for new TV apps and gradual migration for existing Leanback codebases.

composemedia3
Android Developers Blog 22 Jul

Optimize your apps for the next generation of Samsung Galaxy devices

Google guides Android developers on adapting apps for Samsung's new ultra-wide foldables and Wear OS 7, covering fluid layouts with Compose's new Grid/FlexBox/MediaQuery APIs, Window Size Classes, fold-aware design, CameraX for rotation-safe previews, and Wear Widgets via Jetpack Glance.

adaptive-uijetpackwear-osandroid-api
§ 02

Kotlin Core

Commonsware 22 Jul

Goodbye, cw-json! Hello, kPointer!

CommonsWare retires cw-json in favor of kPointer, a Kotlin library that extracts values via JSON Pointer and dot-path syntax from JSON, YAML (yamlkt), and HTML/XML (Ksoup) through a shared adapter abstraction, with a conformance suite for custom adapters and future ports.

kotlinkmp
Medium Kotlin Tag 20 Jul

Why We Built a Kotlin Agent Harness Instead of Using One

First entry in a series on SoPhi, a Kotlin agent harness embedded in Spring Boot, explaining why the team wrote their own ~600-800 line agent loop instead of adopting Koog, LangChain4j, or Spring AI. Cites SoPhi's custom session format, TUI, and lazy skill loading as reasons no framework fit.

kotlinspring-kotlinarchitecture
Medium Kotlin Tag 20 Jul

String Manipulation and Templates in Kotlin: A Complete Guide for Beginners

Beginner walkthrough of Kotlin string handling: declaring strings, string templates and expression interpolation, concatenation, common String methods (trim, split, replace, case conversion), multiline strings, and structural equality, with Android-flavored examples like building API URLs.

▸ STRING TEMPLATE EXPR
val price = 499 val quantity = 3 println("Total Price: ${price * quantity}")
kotlinkotlin-stdlib
Medium Kotlin Tag 20 Jul

[MM’s] Engineering Weekly #69 — AI Meets the Modern JVM

Weekly JVM/Kotlin roundup marking Kotlin's 15th anniversary and its multiplatform growth, plus a case study on how default JPA settings caused subtle performance and correctness bugs in a Kotlin microservice, alongside Spring Boot 3.x end-of-life notices.

kotlinspring-kotlin
Medium Kotlin Tag 22 Jul

Classes and Objects in Kotlin: A Complete Beginner’s Guide

Beginner-level walkthrough of Kotlin classes and objects covering properties, primary constructors, default values, init blocks, nested classes, and member functions, illustrated with Student/Product/User examples relevant to everyday Android model classes.

kotlin
Medium Kotlin Tag 23 Jul

Constructors in Kotlin: Primary, Secondary Constructors, and init Blocks Explained

Explains Kotlin's primary and secondary constructors, init blocks, constructor delegation, and default parameter values, with require()/check() validation examples and simple Android-style model classes like User and Product.

▸ INIT BLOCK VALIDATION
class User(val age: Int) { init { require(age >= 18) { "Age must be at least 18." } } }
kotlin
Medium Kotlin Tag 24 Jul

Properties and Backing Fields in Kotlin: A Complete Guide

Walks through Kotlin property fundamentals: default getters/setters, custom getters for computed values, custom setters using the field backing keyword for validation, private setters, and lateinit. Includes Android-flavored examples like trimming email input and rejecting negative prices.

▸ VALIDATE VIA BACKING FIELD
var salary = 0 set(value) { field = if (value >= 0) value else 0 }
kotlin
Interlude
Dependency
Dependency xkcd · Randall Munroe

Someday ImageMagick will finally break for good and we'll have a long period of scrambling as we try to reassemble civilization from the rubble.

§ 03

Community

Jetbrains Blog 21 Jul

What’s new: Air gets more agents, local models, and Java/Kotlin code intelligence

JetBrains Air now connects to any ACP-compatible coding agent (GitHub Copilot, OpenCode, Cline, local Ollama models) alongside its bundled agents, adds IntelliJ-powered Java/Kotlin navigation and error diagnostics, Windows Docker task support, and an 'xhigh' reasoning effort option for Claude models.

jetbrainskotlin
Jetbrains Blog 21 Jul

Busy Plugin Developers Newsletter – Q2 2026

JetBrains' Q2 2026 plugin developer newsletter covers Marketplace changes (internal API usage notices, an open Exceptions tab), an IntelliJ Platform Gradle Plugin 2.18.1 update, Plugin Verifier 1.409, and links to guides on remote development, UI responsiveness, and the newly open-sourced LSP client API.

jetbrainsgradle-plugin
Jetbrains Blog 21 Jul

Introducing JetBrains Context: Repository Intelligence for Coding Agents

JetBrains Context is a new repository-intelligence layer that semantically indexes codebases so agents like Claude Code, Codex CLI and Junie can query relevant code instead of repeatedly re-exploring files; benchmarks show up to 68% fewer agent turns, 59% lower latency and 48% lower cost, across JetBrains IDEs, Air and VS Code.

jetbrains
Android Developers Blog 21 Jul

Build intelligent Android apps: Integrate into Android's intelligence system using AppFunctions

Explains Android AppFunctions, which compile annotated Kotlin functions into type-safe tools a privileged on-device agent can discover via 'Android MCP', letting the Jetpacker demo app expose expense-tracking, itinerary and voice-note actions to voice/text commands without manual UI navigation.

▸ APPFUNCTION SERIALIZABLE
implementation("androidx.appfunctions:appfunctions:1.0.0-alpha10") ksp("androidx.appfunctions:appfunctions-compiler:1.0.0-alpha10") @AppFunctionSerializable(isDescribedByKDoc = true) data class TripSerializable( val id: String, val title: String, val location: String )
android-developersandroid-apiksp
Android Developers Blog 21 Jul

Build intelligent Android apps: Cloud and hybrid inference

Third post in Google's Jetpacker series covers cloud and hybrid AI on Android via Firebase AI Logic: URL/Search/Maps grounding for up-to-date chatbot answers, plus a hybrid-inference API with PREFER_ON_DEVICE, PREFER_IN_CLOUD, ONLY_ON_DEVICE and ONLY_IN_CLOUD routing modes to balance cost, latency and offline support.

▸ HYBRID INFERENCE CONFIG
val reviewModel = Firebase.ai.generativeModel( modelName = "gemini-3.1-flash-lite", onDeviceConfig = OnDeviceConfig( inferenceMode = InferenceMode.PREFER_ON_DEVICE ) )
android-developersandroid-api
Android Developers Blog 21 Jul

Build intelligent Android apps: Introduction to Jetpacker

Introduces Jetpacker, Google's open-source I/O demo travel app, and frames the 'Build intelligent Android apps' series: choosing on-device, cloud or hybrid inference for itinerary summaries, receipt OCR, chat translation and AppFunctions system integration depending on privacy, cost and capability needs.

android-developersandroid-api
Android Developers Blog 21 Jul

Build intelligent Android apps: On-device inference

Shows how to use Gemini Nano 4 via ML Kit's Prompt API and Structured Output API for on-device Android features in Jetpacker: summarizing trip itineraries and extracting structured data from receipt photos, with prompt tuning cutting response latency from 13 seconds to under 2.

▸ GEMINI NANO PROMPT CONFIG
val previewFastConfig = generationConfig { modelConfig = modelConfig { releaseStage = ModelReleaseStage.PREVIEW preference = ModelPreference.FAST } } val geminiNano2BPreviewModel = Generation.getClient(previewFastConfig)
android-developersandroid-api
§ 04

Android Platform

Medium Android Tag 25 Jul

Android Passwordless Authentication: Implementing Passkeys with MVVM

Walks through implementing FIDO2/WebAuthn passkey registration and login on Android with the Credential Manager API (androidx.credentials 1.5.0), wired into an MVVM ViewModel with sealed UI states and a minimal Compose screen that triggers the sign-in flow.

▸ PASSKEY LOGIN CALL
suspend fun loginWithPasskey( activity: FragmentActivity, requestJson: String ): Result<GetCredentialResponse> { return try { val option = GetPublicKeyCredentialOption(requestJson) val request = GetCredentialRequest(listOf(option)) Result.success(credentialManager.getCredential(activity, request)) } catch (e: GetCredentialException) { Result.failure(e) } }
android-apimvvmcompose
Medium Android Tag 25 Jul

Secure Biometric Authentication in Android: The Complete Guide (MVVM)

Covers building a production biometric login flow with BiometricPrompt and BiometricManager wrapped in MVVM, using a sealed AuthState and a Compose UI. Stresses signing a backend challenge with a Keystore-held CryptoObject rather than trusting a boolean success callback.

▸ CHECK BIOMETRIC SUPPORT
fun isBiometricAvailable(): Boolean { val biometricManager = BiometricManager.from(context) return biometricManager.canAuthenticate( BiometricManager.Authenticators.BIOMETRIC_STRONG ) == BiometricManager.BIOMETRIC_SUCCESS }
android-apimvvmcompose
Medium Kotlin Tag 23 Jul

I built my first AppFunction and hit 5 walls, here’s every fix

Walks through exposing a Kotlin NoteRepository's CRUD methods as Android AppFunctions so an AI agent can discover and call them, documenting five gaps encountered between the alpha API's documentation and a working end-to-end integration.

▸ NOTE REPOSITORY INTERFACE
interface NoteRepository { suspend fun getAllNotes(): List<NoteEntity> suspend fun createNote(title: String, content: String): String suspend fun updateNote(id: String, title: String?, content: String?): NoteEntity? suspend fun deleteNote(id: String): Boolean }
android-apikotlin
Android Developers Blog 20 Jul

Upcoming Changes to the Nearby Connections API

Android Developers Blog post announcing the Nearby Connections API will stop automatically turning on Wi-Fi and Bluetooth radios for first- and third-party apps, effective late 2026. Developers must manage radio state manually and prompt users to enable it themselves.

android-apiandroid-developers
Proandroiddev 23 Jul

From Cloud LLM to On-Device Whisper: Turning Speech into Structured Actions on Android

Rebuilds a voice-to-transaction Android feature entirely on-device, replacing the earlier Firebase AI Logic/Gemini cloud approach: whisper.cpp transcribes via JNI on a dedicated single-thread coroutine dispatcher, and a deterministic Kotlin parser (not an LLM) extracts the structured intent. Covers the Gradle/CMake NDK setup and the Hilt-swapped service interface.

▸ PIN JNI TO ONE THREAD
private val inferenceDispatcher = Executors.newSingleThreadExecutor { r -> Thread(r, "whisper-inference") }.asCoroutineDispatcher() suspend fun transcribe(audioData: FloatArray, language: String): String = withContext(inferenceDispatcher) { check(contextPtr != 0L) { "released" } WhisperLib.fullTranscribe(contextPtr, threads, audioData, language) }
android-apicoroutineshilt
Commonsware 22 Jul

22 July 2026 Artifact Wave

Weekly Jetpack artifact roundup: Media3 reaches 1.11.0-rc01 after a single beta, covering ExoPlayer, Transformer, session, Compose UI, and Cast modules, alongside new Gradle version-catalog releases.

media3version-catalog
§ 05

Architecture

Medium Kotlin Tag 22 Jul

Offline-First Android Architecture: The Complete Engineering Guide

Engineering guide to offline-first Android apps: Room as the single source of truth, an outbox table for durable pending writes, full/incremental/hybrid sync strategies, sync-token approaches, and field-level conflict resolution such as last-write-wins versus merge rules.

▸ OUTBOX PATTERN ENTITY
@Entity(tableName = "outbox") data class OutboxEntry( @PrimaryKey val id: String = UUID.randomUUID().toString(), val entityType: String, val entityId: String, val operation: Operation, val payload: String, val createdAt: Long = System.currentTimeMillis(), val retryCount: Int = 0, val lastError: String? = null )
architectureroomclean-architectureflows
Interlude
Containers
Containers xkcd · Randall Munroe

All services are microservices if you ignore most of their features.

The Back Page · Games
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

Across

2Kotlin's WebAssembly compilation target (wasmJs) (4)
5Modifier for a function that can pause and resume (7)
6Coroutine builder returning a Deferred (5)
9Copies a function's body into each call site (6)
15Enum member accessor that replaced values() (7)
16Promise to initialise a non-null 'var' later (8)
17Suspendable, lightweight unit of concurrency (9)
19Modifier letting you call a function without dots or parens (5)
20Compose call that caches a value across recompositions (8)
21@___ function that emits Jetpack Compose UI (10)

Down

1when ___ condition, e.g. 'is Foo if (x.ready)' (Kotlin 2.1) (5)
3Keeps an inline function's type parameter available at runtime (7)
4@JvmInline ___ class: a zero-overhead wrapper type (5)
5Lazy collection, evaluated element-by-element on demand (8)
7Hot pipe that passes values between coroutines (7)
8Cold asynchronous stream of values (4)
10Object holding a class's static-like members (9)
11___ parameters: the reworked successor to context receivers (7)
12Coroutine builder that fires and forgets, returning a Job (6)
13Restricts a class hierarchy to a known set of subtypes (6)
14Nickname for the ?: operator (5)
18Modifier to overload +, get, or invoke (8)

No articles match your current filters.

Try broadening your selection or reset all filters.