jetc.dev Newsletter Issue #299
Published: 2026-01-27
This week, we look at security, PinnableContainer, and nested scrolling. Plus, we see a Gradle plugin to add tvOS support to Compose Multiplatform.
Note that the “One Off the Stack, One Off the Slack” section may tend to come and go in future issues, and it is gone in this one. The Kotlinlang Slack archive has not updated in weeks, and Stack Overflow is “a hit or miss proposition” nowadays.
Composable Commentary
Posts, videos, and other new information related to Jetpack Compose!
Medium: Android Security in the Age of Jetpack Compose: From Task Hijacking to Tapjacking
Often, we think of security when it comes to things like communication with servers. However, UIs can have security issues. Roman Speranskii walks us through a few attacks and demonstrates how to defend against them in your Compose for Android apps.
Navigation 3 for Compose Multiplatform: Should You Migrate?
Greg Williams reviews the state of Nav3 in Compose Multiplatform and whether it makes sense to adopt it in your project, especially if you already have a working Nav2 implementation.
ImmutableList vs. List in Jetpack Compose: Rethinking “Best Practice” After Strong Skipping Mode
Sutaek Oh explores whether or not there remains value in using ImmutableList and similar
types, now that Strong Skipping Mode is the default for Compose builds. The conclusion is that
ImmutableList has limited benefits, and occasional costs, over just using List.
Medium: You Shall Not Pass or Dispose
Burak Karaduman points out a challenge with some user interfaces, like chatbots: a composable
might be active (e.g., receiving a streamed response from AI) yet still be scrollable off
the screen. If our composable gets disposed mid-stream, we could run into some performance
issues or other challenges. The solution is PinnableContainer(), the focus of this post.
How to fix the Compose preview naming problem
Alex Zhukovich
(Mastodon, Bluesky)
reminds us of the role of PreviewParameterProvider in creating composable
previews. Alex then demonstrates how the new getDisplayName() function that you can override
in your provider gives you the option of having better names than “uiState 0”, “uiState 1”, etc.
Unlock MultiPreviews in Compose Multiplatform: The Super Provider Pattern
In Compose for Android development, we are used to multi-previews, where a single annotation
triggers multiple previews, especially based on overall UI state (e.g., dark/light theme).
Gemma Lara Savill notes that this is not presently available in Compose Multiplatform and
demonstrates a workaround, using PreviewParameterProvider.
Introducing the Experimental Styles API in Jetpack Compose
Jaewoong Eum
(Mastodon, Bluesky)
walks us through the upcoming Style API in Compose Foundation, for managing
core UI states, especially those tied to interaction events, such as widget backgrounds.
Building a WebView control for Compose Desktop
Danylo Didkovskyi and the jxBrowser team is building a WebView-style widget for Compose for
Desktop. This post outlines some of the unique challenges in wrapping a Chromium-based browser
in a composable, including routing input events.
Demystifying Nested Scrolling in Jetpack Compose
Wilberforce Uwadiegwu takes us on a deep dive into nested scrolling, such as the classic parallax
effect applied to app bars as the content scrolls towards or away from the top of the collection.
This post explains the use of NestedScrollConnection, how it connects to scrollable containers,
and how to consume scroll events, fling velocities, etc.
Other Interesting Links
- Medium: How I got tired of writing boilerplate in Compose and wrote my own Emmet-like plugin for Android Studio
- Medium: Shared element transitions in Jetpack Compose
- Medium: State Hoisting in Jetpack Compose: Common Mistakes That Kill Performance
- Medium: Stop Using PlayerView in Compose: Media3 PlayerSurface Done Right
- Medium: The Silent Performance Killer: How a Single Lambda Nearly Destroyed My Compose UI
- Medium: Why Your LazyColumn Drops Frames — Part 2: Hidden Patterns
- Reducing Unnecessary Recompositions in Jetpack Compose
- Video: Compose beyond row and column
- Video: Compose Navigation made easy with Navigation 3
- Video: Exporting Jetpack Compose Animations as Shareable Videos
Resource Roundup
100% pure code!
GitHub: sajidalidev / compose-tvos
Sajid Ali has extended Compose Multiplatform support to include tvOS, by way of a Gradle plugin.
You wind up with new targets like tvosArm64(), and they get some tvOS-compatible Compose
Multiplatform targets in lieu of standard ones.
GitHub: felixny / InkFlow
GitHub user felixny brings us a “beautiful Jetpack Compose UI library for creating fluid motion effects and animations with organic ink bleed reveals.”
GitHub: robyrawat / SuperChart
Ravi Rawat brings us line, bar, and pie charts for Compose for Android and Material3.
GitHub: ArcaDone / AwesomeUI
GitHub user ArcaDone implemented ProgressionChart(), DeformableCornerItem(), TrackerContainer(),
RadarChart(), and more composables.
GitHub: miller198 / ComposeCircleAudioVisualizer
Seungkyu Kim brings us circular audio visualizations, with support for FFT and waveform data sources, normalization/filtering/scaling data transformations, and more.
Or, you can subscribe to the Atom feed or follow Mark Murphy in the Fediverse.
Recent Issues:
- 2026-01-20: Compose Multiplatform 1.10! 🎉 Compose Hot Reload! Bottom nav bar accessibility! Responsive tab rows! And... a no-Chromium desktop WebView?!?
- 2026-01-13: Memory leaks! Image-loading libraries! Screenshot testing! SVGs!
- 2026-01-06: Media3 stable release! Frame rates! Testing recomposition counts! Compose for Desktop! And... how will 2026 compare to 2025?!?