Android & Kotlin Technical Articles

Detailed articles on Android development, Jetpack Compose internals, Kotlin coroutines, and open source library design by skydoves, Google Developer Expert and maintainer of Android libraries with 40M+ annual downloads. Read practical guides on Retrofit, Compose Preview, BottomSheet UI, coroutine compilation, and more.

Exclusive Articles
RSS

This is a collection of private or subscriber-first articles written by the Dove Letter, skydoves (Jaewoong). These articles can be released somewhere like Medium in the future, but always they will be revealed for Dove Letter members first.

Jetpack Compose Practical Animations

A growing catalog of self-contained Jetpack Compose animation walkthroughs covering animateAsState, AnimatedContent, AnimatedVisibility, Animatable, rememberInfiniteTransition, SharedTransitionLayout, gesture-driven motion, and Canvas particle systems — every constant tweakable live with Compose Hot Reload.

Compose
Wednesday, April 22, 2026
How Compose Synchronizes with Android's Choreographer

Every frame in a Compose application starts with a signal from the Android Choreographer. The Choreographer is the system component that schedules work to run in sync with the display's VSYNC pulse, ensuring that UI…

ComposeCoroutinesAndroid
Sunday, May 10, 2026
How LazyColumn Works Under the Hood

LazyColumn renders only the items that are visible on screen. Unlike a regular Column that composes every child upfront, LazyColumn defers composition until the layout phase, composes items on demand as they scroll into…

ComposeKotlin
Monday, May 4, 2026
SnapshotFlowManager: How Compose Shares Observation Infrastructure Across Snapshot Flows

Compose's snapshotFlow converts snapshot state reads into a Kotlin Flow. Each call to snapshotFlow registers its own apply observer with the snapshot system, watching for state changes that should trigger new emissions.…

ComposeKotlin
Sunday, April 26, 2026
Compose Strong Skipping Mode Does Not Make Your Types Stable

Strong Skipping Mode is one of the most misunderstood features in Jetpack Compose. A common belief is that enabling it makes all types stable, eliminating the need to think about stability entirely. This is wrong.…

ComposeKotlin
Saturday, April 25, 2026
How Navigation 3 Works Under the Hood

Navigation 3 is a ground up redesign of Jetpack navigation for Compose. Unlike Navigation 2, which adapted the Fragment based navigation model to Compose through NavController and XML graph definitions, Navigation 3 is…

ComposeKotlin
Tuesday, April 14, 2026
Optimize App Performance by Mastering Stability in Jetpack Compose

Compose's performance model centers on one idea: skip work that does not need to happen. When the runtime can prove that a composable's inputs have not changed, it skips re-execution entirely. This optimization, called…

ComposePerformanceAndroid
Friday, April 10, 2026
Build Your Own Landscapist Image Plugin in Jetpack Compose

Landscapist provides a composable image loading library for Jetpack Compose and Kotlin Multiplatform. Among its image composables, LandscapistImage stands out as the recommended choice: it uses Landscapist's own…

ComposeAndroidKotlin
Saturday, March 28, 2026
How Compose's Drawing System Works Under the Hood

Every Compose app draws images. Whether you call Image(painterResource(R.drawable.photo)) to display a bitmap, render a Material icon with Icon(Icons.Default.Search), or load a vector drawable, the same underlying…

ComposeKotlin
Saturday, March 21, 2026
The Seven Group Types in Compose

Every @Composable function you write produces invisible scaffolding. The Compose compiler wraps each Kotlin construct in a "group" that tells the runtime what it can do during recomposition. A conditional branch gets…

ComposeKotlin
Tuesday, March 17, 2026
How Compose Preview Works Under the Hood

Every Android developer using Compose has written @Preview above a composable and watched it appear in the Studio design panel. But what actually happens between that annotation and the rendered pixels? The answer…

ComposeAndroidKotlin
Sunday, March 15, 2026
Five Algorithms and Data Structures Hidden Inside Jetpack Compose

Jetpack Compose is a UI toolkit on the surface, but its internals draw from decades of computer science research. The runtime uses a data structure borrowed from text editors to store composition state. The modifier…

ComposeAndroidKotlin
Wednesday, March 11, 2026
How Compose Remembers: The Positional Memoization Behind remember and State

Every Compose developer has written remember { mutableStateOf(0) }. The value survives recomposition without any explicit storage reference. No ViewModel, no map, no key. Compose knows where the value belongs based on…

ComposeKotlin
Sunday, March 8, 2026
From Gap Buffer to Linked List: How Compose Rewrote Its SlotTable for Faster Recomposition

Jetpack Compose stores your entire composition tree in a data structure called the SlotTable. Every composable call, every remembered value, every key is recorded as groups and slots in this table. For years, the…

ComposeKotlin
Sunday, March 1, 2026
What Is a Snapshot? Understanding Compose's Isolated State World

Jetpack Compose manages UI state through a system called Snapshots, a concept borrowed from database theory that enables isolated, concurrent access to shared mutable state. When you write var count by…

ComposeKotlin
Sunday, February 22, 2026
The Snapshot System: How Compose Tracks and Batches State Changes

Jetpack Compose revolutionized Android UI development with its declarative approach, but what makes it truly powerful is the sophisticated machinery underneath. At the heart of Compose's reactivity lies the Snapshot…

ComposeKotlin
Sunday, February 22, 2026
Building a Google Maps Style Bottom Sheet with Jetpack Compose

Google Maps popularized a bottom sheet pattern that most Android developers recognize immediately: a small panel peeking from the bottom of the screen, expandable to a mid height for quick details, and draggable to full…

ComposeCoroutinesAndroid
Sunday, February 15, 2026
Compose Stability Analyzer 0.7.0: Recomposition Cascade and Live Heatmap

Jetpack Compose's stability system determines whether a composable function can be skipped during recomposition. When all parameters are stable, Compose can compare them and skip the function entirely if nothing…

ComposeKotlin
Friday, February 13, 2026
DerivedState: Hash-Based Invalidation Without Tracking Dependencies

Compose's derivedStateOf provides a way to create computed state that only triggers recomposition when the computed result actually changes. When you write val fullName by remember { derivedStateOf { "${firstName.value}…

ComposeKotlin
Tuesday, February 10, 2026
Compose Identity Mechanisms: How key() Transforms Into Movable Groups

Jetpack Compose manages UI state through a sophisticated identity system that determines when composables should be reused versus recreated. When you wrap content in key(userId) { UserCard(user) }, you're providing…

ComposeKotlin
Thursday, February 5, 2026
Runtime Saveable: How Compose Preserves State Across Process Death

Jetpack Compose introduced a declarative paradigm for Android UI, but declarative doesn't mean stateless. User interactions create state like scroll positions, text field contents, and expanded sections that must…

ComposeKotlin
Monday, January 26, 2026
Introducing the Experimental Styles API in Jetpack Compose

Jetpack Compose's Modifier system has been the primary way to apply visual properties to composables. You chain modifiers like background(), padding(), and border() to build up the appearance and behavior of UI…

ComposeAndroidKotlin
Wednesday, January 21, 2026
The Three Phases: Composition, Layout, and Drawing

Jetpack Compose transforms declarative UI code into pixels on screen through a pipeline of three distinct phases: Composition, Layout, and Drawing. When you change a state variable, Compose doesn't redraw everything, it…

ComposeKotlin
Sunday, January 11, 2026
Building complex layouts with Layout() and understanding measure/placement

Building complex user interfaces in Jetpack Compose often requires going beyond the standard Box, Row, and Column layouts. While these composables handle most common scenarios beautifully, there are times when you need…

ComposeKotlin
Tuesday, January 6, 2026
Recompose Scopes: How Compose Knows What to Update

Jetpack Compose's declarative UI paradigm promises simplicity: you describe your UI as a function of state, and the framework handles updates automatically. But behind this elegant abstraction lies a sophisticated…

ComposeKotlin
Tuesday, January 6, 2026
How Compose Compiler infers stability and decide their types?

Jetpack Compose uses a smart recomposition system to optimize UI updates. At the heart of this optimization is stability inference - the compiler's ability to determine whether a type's values can change over time.…

ComposeKotlin
Monday, November 24, 2025
What is Remote Compose, and how can you leverage it to build server-driven UI

Building dynamic user interfaces has long been a fundamental challenge in Android development. The traditional approach requires recompiling and redeploying the entire application whenever the UI needs to change—a…

ComposeKotlin
Monday, November 24, 2025
Compose Hot Reload: Make changes to your UI code in a Compose Multiplatform application, and see the results in real time

Table of Contents Introduction Architecture Overview Core Modules hot-reload-agent hot-reload-orchestration hot-reload-runtime-jvm hot-reload-gradle-plugin hot-reload-core hot-reload-analysis The Hot Reload Flow…

Kotlin MultiplatformCompose MultiplatformCompose
Tuesday, October 14, 2025
Compose Compiler Stability Inference System

A comprehensive study of how the Compose compiler determines type stability for recomposition optimization. Table of Contents Compose Compiler Stability Inference System Table of Contents Chapter 1: Foundations 1.1…

ComposeAndroidKotlin
Friday, October 3, 2025
An Exploration of the Internal Mechanism of Crossfade Composable

In Jetpack Compose, Crossfade provides a simple and declarative way to animate the transition between two different UI states. When the targetState passed to it changes, it smoothly fades out the old content while…

ComposeArchitectureKotlin
Sunday, September 28, 2025
derivedStateOf Internals: The Cost of Observation / Why derivedStateOf is expensive?

The derivedStateOf API in Jetpack Compose provides a convenient mechanism for creating memoized state that automatically updates when its underlying dependencies change. While essential for performance optimization in…

ComposeArchitectureKotlin
Sunday, September 28, 2025
A Study of the Jetpack Compose SlotTable Internals

The SlotTable is the in-memory data structure that represents the UI tree of a Jetpack Compose application. Instead of a traditional tree of objects, it's a highly optimized, flat structure designed for extremely fast…

ComposeArchitectureAndroid
Sunday, September 28, 2025
Google recently has official launched compose-runtime-annotation library

Google has recently launched the official runtime-annotation library, which serves a similar purpose to the community-built compose-stable-marker library. The idea behind compose stable markers originated from the…

ComposeKotlin
Sunday, August 31, 2025
A Study of API Guidelines for Building Better Jetpack Compose Components

The Jetpack Compose ecosystem has grown exponentially in recent years, and it is now widely adopted for building production-level UIs in Android applications. We can now say that Jetpack Compose is the future of Android…

ComposeAndroidKotlin
Sunday, August 24, 2025

Like what you see?

Subscribe to Dove Letter to get weekly insights about Android and Kotlin development, plus access to exclusive content and discussions.