# zsmb.co

Recent content on zsmb.co

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## Setting up Compose Multiplatform previews

DevFeed: [Setting up Compose Multiplatform previews](<https://devfeed.tech/articles/setting-up-compose-multiplatform-previews-27055.md>)

Original publisher: [Read original article](<https://zsmb.co/compose-multiplatform-preview-setup/>)

Author: Márton Braun

Published: 2025-07-29T07:00:00Z

Content type: tutorial

Language: en

Sources: [zsmb.co](<https://devfeed.tech/sources/zsmb-co.md>)

Topics: [compose-multiplatform](<https://devfeed.tech/topics/compose-multiplatform.md>), [Kotlin Multiplatform](<https://devfeed.tech/topics/kotlin-multiplatform.md>), [Android Studio](<https://devfeed.tech/topics/android-studio.md>), [IntelliJ IDEA](<https://devfeed.tech/topics/intellij-idea.md>), [Tooling](<https://devfeed.tech/topics/tooling.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-studio](<https://devfeed.tech/tags/android-studio.md>), [compose-multiplatform](<https://devfeed.tech/tags/compose-multiplatform.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [intellij](<https://devfeed.tech/tags/intellij.md>), [intellij-idea](<https://devfeed.tech/tags/intellij-idea.md>), [kmp](<https://devfeed.tech/tags/kmp.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [marton-braun](<https://devfeed.tech/tags/marton-braun.md>), [multiplatform](<https://devfeed.tech/tags/multiplatform.md>), [tooling](<https://devfeed.tech/tags/tooling.md>), [zsmb](<https://devfeed.tech/tags/zsmb.md>), [zsmb-co](<https://devfeed.tech/tags/zsmb-co.md>), [zsmb13](<https://devfeed.tech/tags/zsmb13.md>), [zsmbco](<https://devfeed.tech/tags/zsmbco.md>)

### AI overview

A tutorial on setting up Compose Multiplatform previews for common code. It explains how to install the Kotlin Multiplatform IDE plugin, create a correctly configured project with the KMP wizard, and use previews in IntelliJ IDEA or Android Studio. An Android target is required.

### Source excerpt

Compose Multiplatform now has support for previews in common code. Here's how you can get started with using them.

## How I Finally Memorized Modifier Ordering in Compose

DevFeed: [How I Finally Memorized Modifier Ordering in Compose](<https://devfeed.tech/articles/how-i-finally-memorized-modifier-ordering-in-compose-27080.md>)

Original publisher: [Read original article](<https://zsmb.co/remembering-modifier-order/>)

Author: Márton Braun

Published: 2024-06-04T09:00:00Z

Content type: tutorial

Language: en

Sources: [zsmb.co](<https://devfeed.tech/sources/zsmb-co.md>)

Topics: [ordering](<https://devfeed.tech/topics/ordering.md>), [Compose](<https://devfeed.tech/topics/compose.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [ui](<https://devfeed.tech/topics/ui.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [compose](<https://devfeed.tech/tags/compose.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [marton-braun](<https://devfeed.tech/tags/marton-braun.md>), [ordering](<https://devfeed.tech/tags/ordering.md>), [ui](<https://devfeed.tech/tags/ui.md>), [zsmb](<https://devfeed.tech/tags/zsmb.md>), [zsmb-co](<https://devfeed.tech/tags/zsmb-co.md>), [zsmb13](<https://devfeed.tech/tags/zsmb13.md>), [zsmbco](<https://devfeed.tech/tags/zsmbco.md>)

### AI overview

A tutorial explains how to remember modifier ordering in Jetpack Compose. It connects component APIs that accept a Modifier parameter with the way modifiers are applied, concluding that modifiers are applied last-to-first and inside-to-outside.

### Source excerpt

For the longest time, I proudly had no idea of how Modifier ordering works, and would just guess and then guess again when something didn't look quite right. Here's how I finally ended up remembering how the ordering works.

## Building a macOS screen saver in Kotlin

DevFeed: [Building a macOS screen saver in Kotlin](<https://devfeed.tech/articles/building-a-macos-screen-saver-in-kotlin-27054.md>)

Original publisher: [Read original article](<https://zsmb.co/building-a-macos-screen-saver-in-kotlin/>)

Author: Márton Braun

Published: 2024-03-05T12:00:00Z

Content type: tutorial

Language: en

Sources: [zsmb.co](<https://devfeed.tech/sources/zsmb-co.md>)

Topics: [kotlin-multiplatform-libraries](<https://devfeed.tech/topics/kotlin-multiplatform-libraries.md>), [Kotlin Multiplatform](<https://devfeed.tech/topics/kotlin-multiplatform.md>), [macOS](<https://devfeed.tech/topics/macos.md>), [multiplatform](<https://devfeed.tech/topics/multiplatform.md>), [interoperability](<https://devfeed.tech/topics/interoperability.md>), [Code](<https://devfeed.tech/topics/code.md>), [GitHub](<https://devfeed.tech/topics/github.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [binaries](<https://devfeed.tech/tags/binaries.md>), [build](<https://devfeed.tech/tags/build.md>), [code](<https://devfeed.tech/tags/code.md>), [contributions](<https://devfeed.tech/tags/contributions.md>), [development](<https://devfeed.tech/tags/development.md>), [github](<https://devfeed.tech/tags/github.md>), [installation](<https://devfeed.tech/tags/installation.md>), [interoperability](<https://devfeed.tech/tags/interoperability.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlin-multiplatform](<https://devfeed.tech/tags/kotlin-multiplatform.md>), [macos](<https://devfeed.tech/tags/macos.md>), [marton-braun](<https://devfeed.tech/tags/marton-braun.md>), [multiplatform](<https://devfeed.tech/tags/multiplatform.md>), [zsmb](<https://devfeed.tech/tags/zsmb.md>), [zsmb-co](<https://devfeed.tech/tags/zsmb-co.md>), [zsmb13](<https://devfeed.tech/tags/zsmb13.md>), [zsmbco](<https://devfeed.tech/tags/zsmbco.md>)

### AI overview

This tutorial documents the creation of a custom macOS screen saver built almost entirely in Kotlin with Kotlin Multiplatform. It covers customization options, release binaries, installation, and the challenges of working with macOS screen saver APIs and interoperability.

### Source excerpt

This article documents how I created my own custom screen saver for macOS, built almost entirely in Kotlin, using the powers of Kotlin Multiplatform compiled to macOS. Join me for a tale of Kotlin success and macOS failures.

## The conflation problem of testing StateFlows

DevFeed: [The conflation problem of testing StateFlows](<https://devfeed.tech/articles/the-conflation-problem-of-testing-stateflows-27057.md>)

Original publisher: [Read original article](<https://zsmb.co/conflating-stateflows/>)

Author: Márton Braun

Published: 2023-08-15T14:00:00Z

Content type: tutorial

Language: en

Sources: [zsmb.co](<https://devfeed.tech/sources/zsmb-co.md>)

Topics: [Testing](<https://devfeed.tech/topics/testing.md>), [Coroutines](<https://devfeed.tech/topics/coroutines.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [coroutine-testing](<https://devfeed.tech/tags/coroutine-testing.md>), [coroutines](<https://devfeed.tech/tags/coroutines.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlinx](<https://devfeed.tech/tags/kotlinx.md>), [marton-braun](<https://devfeed.tech/tags/marton-braun.md>), [stateflow](<https://devfeed.tech/tags/stateflow.md>), [testing](<https://devfeed.tech/tags/testing.md>), [tests](<https://devfeed.tech/tags/tests.md>), [ui](<https://devfeed.tech/tags/ui.md>), [viewmodel](<https://devfeed.tech/tags/viewmodel.md>), [zsmb](<https://devfeed.tech/tags/zsmb.md>), [zsmb-co](<https://devfeed.tech/tags/zsmb-co.md>), [zsmb13](<https://devfeed.tech/tags/zsmb13.md>), [zsmbco](<https://devfeed.tech/tags/zsmbco.md>)

### AI overview

This article explains how StateFlow conflation affects tests. It compares asserting on the StateFlow state property with collecting emitted values, and discusses testing intermediate values when rapid updates may be skipped by slow collectors.

### Source excerpt

StateFlow behaves as a state holder and a Flow of values at the same time. Due to conflation, a collector of a StateFlow might not receive all values that it holds over time. This article covers what that means for your tests.

## Celebrating 5 years of Kotlin on Android

DevFeed: [Celebrating 5 years of Kotlin on Android](<https://devfeed.tech/articles/celebrating-5-years-of-kotlin-on-android-27033.md>)

Original publisher: [Read original article](<https://android-developers.googleblog.com/2022/08/celebrating-5-years-of-kotlin-on-android.html>)

Author: Márton Braun

Published: 2022-08-17T19:00:00Z

Content type: opinion

Language: en

Sources: [zsmb.co](<https://devfeed.tech/sources/zsmb-co.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Android](<https://devfeed.tech/topics/android.md>), [Google](<https://devfeed.tech/topics/google.md>), [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Jetpack](<https://devfeed.tech/topics/jetpack.md>), [Mobile](<https://devfeed.tech/topics/mobile.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-development](<https://devfeed.tech/tags/android-development.md>), [coroutines](<https://devfeed.tech/tags/coroutines.md>), [developer-relations](<https://devfeed.tech/tags/developer-relations.md>), [google](<https://devfeed.tech/tags/google.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [open-source](<https://devfeed.tech/tags/open-source.md>)

### AI overview

Google celebrates five years of Kotlin on Android by revisiting Kotlin's official support announcement at Google I/O, its role in modern Android app development, and ongoing support efforts. The post highlights Kotlin's use in Jetpack libraries and Jetpack Compose.

### Source excerpt

Five years ago, at the 2017 Google I/O Keynote, Kotlin became an officially supported language for Android development. With this post, let's celebrate by revisiting that initial story, some important steps along the way, and by looking at the ongoing efforts by Google to support Kotlin.

## 5 years of Kotlin on Android -- the extended interviews

DevFeed: [5 years of Kotlin on Android -- the extended interviews](<https://devfeed.tech/articles/5-years-of-kotlin-on-android-the-extended-interviews-27040.md>)

Original publisher: [Read original article](<https://medium.com/androiddevelopers/5-years-of-kotlin-on-android-the-extra-bits-a7dcd17480a9>)

Author: Márton Braun

Published: 2022-08-17T18:50:00Z

Content type: article

Language: en

Sources: [zsmb.co](<https://devfeed.tech/sources/zsmb-co.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Android](<https://devfeed.tech/topics/android.md>), [Google](<https://devfeed.tech/topics/google.md>), [jetbrains](<https://devfeed.tech/topics/jetbrains.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [blog-post](<https://devfeed.tech/tags/blog-post.md>), [interviews](<https://devfeed.tech/tags/interviews.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>)

### AI overview

Extended interview material marking five years of official Kotlin support on Android. The article discusses Google's early evaluation of Kotlin, its collaboration with JetBrains, the Kotlin Foundation, and efforts to guide the language's evolution.

### Source excerpt

Interview material for the 5 years of Kotlin on Android celebration that did not make it into the main blog post.

## Migrating to the new coroutines 1.6 test APIs

DevFeed: [Migrating to the new coroutines 1.6 test APIs](<https://devfeed.tech/articles/migrating-to-the-new-coroutines-1-6-test-apis-27041.md>)

Original publisher: [Read original article](<https://medium.com/androiddevelopers/migrating-to-the-new-coroutines-1-6-test-apis-b99f7fc47774>)

Author: Márton Braun

Published: 2022-06-29T20:00:00Z

Content type: tutorial

Language: en

Sources: [zsmb.co](<https://devfeed.tech/sources/zsmb-co.md>)

Topics: [Coroutines](<https://devfeed.tech/topics/coroutines.md>), [Testing](<https://devfeed.tech/topics/testing.md>), [migration](<https://devfeed.tech/topics/migration.md>), [unit tests](<https://devfeed.tech/topics/unit-tests.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [coroutines](<https://devfeed.tech/tags/coroutines.md>), [deprecated](<https://devfeed.tech/tags/deprecated.md>), [junit](<https://devfeed.tech/tags/junit.md>), [migration](<https://devfeed.tech/tags/migration.md>), [testing](<https://devfeed.tech/tags/testing.md>), [unit-tests](<https://devfeed.tech/tags/unit-tests.md>)

### AI overview

This tutorial explains how to migrate Android projects from deprecated coroutines 1.6 testing APIs to the new APIs. It covers using runTest, handling the main thread in unit tests, and testing Flow collection.

### Source excerpt

See the steps we took to migrate our samples to the new APIs, and then get started on migrating your own project!

## Wrap-up 2021

DevFeed: [Wrap-up 2021](<https://devfeed.tech/articles/wrap-up-2021-27095.md>)

Original publisher: [Read original article](<https://zsmb.co/wrap-up-2021/>)

Author: Márton Braun

Published: 2021-12-31T09:00:00Z

Content type: opinion

Language: en

Sources: [zsmb.co](<https://devfeed.tech/sources/zsmb-co.md>)

Topics: [devrel](<https://devfeed.tech/topics/devrel.md>), [Android](<https://devfeed.tech/topics/android.md>), [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [SDKs](<https://devfeed.tech/topics/sdks.md>), [Documentation](<https://devfeed.tech/topics/documentation.md>), [XML](<https://devfeed.tech/topics/xml.md>), [ui](<https://devfeed.tech/topics/ui.md>), [Open Source](<https://devfeed.tech/topics/open-source.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-engineer](<https://devfeed.tech/tags/android-engineer.md>), [compose](<https://devfeed.tech/tags/compose.md>), [devrel](<https://devfeed.tech/tags/devrel.md>), [documentation](<https://devfeed.tech/tags/documentation.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [marton-braun](<https://devfeed.tech/tags/marton-braun.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [sdk](<https://devfeed.tech/tags/sdk.md>), [xml](<https://devfeed.tech/tags/xml.md>), [zsmb](<https://devfeed.tech/tags/zsmb.md>), [zsmb-co](<https://devfeed.tech/tags/zsmb-co.md>), [zsmb13](<https://devfeed.tech/tags/zsmb13.md>), [zsmbco](<https://devfeed.tech/tags/zsmbco.md>)

### AI overview

A personal 2021 wrap-up describing Márton Braun's work at Stream, including his transition from Android Engineer to Android Developer Advocate, contributions to Android teams and tooling, and departure from the company in December.

### Source excerpt

Another year over, a new one's almost begun. Here's a brief summary of what I've done in this one.

## Adventures in Tracking Upload Progress With OkHttp and Retrofit

DevFeed: [Adventures in Tracking Upload Progress With OkHttp and Retrofit](<https://devfeed.tech/articles/adventures-in-tracking-upload-progress-with-okhttp-and-retrofit-27034.md>)

Original publisher: [Read original article](<https://dev.to/zsmb13/adventures-in-tracking-upload-progress-with-okhttp-and-retrofit-1gff>)

Author: Márton Braun

Published: 2021-12-10T16:00:00Z

Content type: tutorial

Language: en

Sources: [zsmb.co](<https://devfeed.tech/sources/zsmb-co.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [SDKs](<https://devfeed.tech/topics/sdks.md>), [API](<https://devfeed.tech/topics/api.md>), [Code](<https://devfeed.tech/topics/code.md>), [implementation](<https://devfeed.tech/topics/implementation.md>), [Usability](<https://devfeed.tech/topics/usability.md>), [User experience (UX)](<https://devfeed.tech/topics/ux.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [api](<https://devfeed.tech/tags/api.md>), [coding](<https://devfeed.tech/tags/coding.md>), [community](<https://devfeed.tech/tags/community.md>), [development](<https://devfeed.tech/tags/development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [implementation](<https://devfeed.tech/tags/implementation.md>), [inclusive](<https://devfeed.tech/tags/inclusive.md>), [networking](<https://devfeed.tech/tags/networking.md>), [okhttp](<https://devfeed.tech/tags/okhttp.md>), [retrofit](<https://devfeed.tech/tags/retrofit.md>), [sdk](<https://devfeed.tech/tags/sdk.md>), [software](<https://devfeed.tech/tags/software.md>), [usability](<https://devfeed.tech/tags/usability.md>), [ux](<https://devfeed.tech/tags/ux.md>)

### AI overview

This article explains how Stream's Android team refined file-upload progress tracking in the Stream Chat Android SDK. It presents an initial Retrofit and OkHttp callback-based implementation, discusses its usability issues, and describes a cleaner implementation using a custom OkHttp request body with progress callbacks.

### Source excerpt

Tracking file upload progress can have some unexpected complexities. This article tells the story of how we refined our implementation of this feature in the Stream Chat Android SDK.

## All About Opt-In Annotations

DevFeed: [All About Opt-In Annotations](<https://devfeed.tech/articles/all-about-opt-in-annotations-27075.md>)

Original publisher: [Read original article](<https://zsmb.co/opt-in-annotations/>)

Author: Márton Braun

Published: 2021-09-28T15:00:00Z

Content type: tutorial

Language: en

Sources: [zsmb.co](<https://devfeed.tech/sources/zsmb-co.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Library](<https://devfeed.tech/topics/library.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [article](<https://devfeed.tech/tags/article.md>), [code](<https://devfeed.tech/tags/code.md>), [compilation](<https://devfeed.tech/tags/compilation.md>), [compilation-error](<https://devfeed.tech/tags/compilation-error.md>), [guide](<https://devfeed.tech/tags/guide.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [marton-braun](<https://devfeed.tech/tags/marton-braun.md>), [visibility](<https://devfeed.tech/tags/visibility.md>), [zsmb](<https://devfeed.tech/tags/zsmb.md>), [zsmb-co](<https://devfeed.tech/tags/zsmb-co.md>), [zsmb13](<https://devfeed.tech/tags/zsmb13.md>), [zsmbco](<https://devfeed.tech/tags/zsmbco.md>)

### AI overview

A guide to Kotlin opt-in annotations, explaining how to create opt-in marker annotations, mark APIs as requiring opt-in, and use those APIs correctly. It also discusses severity levels, compilation behavior, and applications in libraries and multi-module projects.

### Source excerpt

Have you ever encountered APIs that show warnings or errors when you use them, saying that they're internal or experimental? In this guide, you'll learn everything you need to know about opt-in APIs in Kotlin: how to create and use them, and all their nuances.

## A Bit of Gradle Housekeeping

DevFeed: [A Bit of Gradle Housekeeping](<https://devfeed.tech/articles/a-bit-of-gradle-housekeeping-27046.md>)

Original publisher: [Read original article](<https://zsmb.co/a-bit-of-gradle-housekeeping/>)

Author: Márton Braun

Published: 2021-09-01T20:00:00Z

Content type: tutorial

Language: en

Sources: [zsmb.co](<https://devfeed.tech/sources/zsmb-co.md>)

Topics: [Gradle](<https://devfeed.tech/topics/gradle.md>), [Android](<https://devfeed.tech/topics/android.md>), [Android Gradle Plugin](<https://devfeed.tech/topics/android-gradle-plugin.md>), [configuration](<https://devfeed.tech/topics/configuration.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-gradle-plugin](<https://devfeed.tech/tags/android-gradle-plugin.md>), [build](<https://devfeed.tech/tags/build.md>), [build-tools](<https://devfeed.tech/tags/build-tools.md>), [configuration](<https://devfeed.tech/tags/configuration.md>), [deprecated](<https://devfeed.tech/tags/deprecated.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [groovy](<https://devfeed.tech/tags/groovy.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [marton-braun](<https://devfeed.tech/tags/marton-braun.md>), [properties](<https://devfeed.tech/tags/properties.md>), [zsmb](<https://devfeed.tech/tags/zsmb.md>), [zsmb-co](<https://devfeed.tech/tags/zsmb-co.md>), [zsmb13](<https://devfeed.tech/tags/zsmb13.md>), [zsmbco](<https://devfeed.tech/tags/zsmbco.md>)

### AI overview

This tutorial explains how to simplify Android Gradle project configuration by removing obsolete build-tool, Java, and Kotlin JVM target settings and replacing deprecated SDK version properties. It also discusses keeping project source-set configuration simple.

### Source excerpt

While cleaning is traditionally a spring activity, let me invite you to do it at the end of summer this time around. In this article, we'll take a look at some Gradle configuration that you can probably clean up in your Android project.

## Keeping public API in check with the Kotlin binary validator plugin

DevFeed: [Keeping public API in check with the Kotlin binary validator plugin](<https://devfeed.tech/articles/keeping-public-api-in-check-with-the-kotlin-binary-validator-plugin-27035.md>)

Original publisher: [Read original article](<https://dev.to/zsmb13/keeping-public-api-in-check-with-the-kotlin-binary-validator-plugin-2b6m>)

Author: Márton Braun

Published: 2021-07-14T07:00:00Z

Content type: tutorial

Language: en

Sources: [zsmb.co](<https://devfeed.tech/sources/zsmb-co.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Library](<https://devfeed.tech/topics/library.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [API](<https://devfeed.tech/topics/api.md>), [configuration](<https://devfeed.tech/topics/configuration.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [api](<https://devfeed.tech/tags/api.md>), [coding](<https://devfeed.tech/tags/coding.md>), [community](<https://devfeed.tech/tags/community.md>), [compatibility](<https://devfeed.tech/tags/compatibility.md>), [configuration](<https://devfeed.tech/tags/configuration.md>), [development](<https://devfeed.tech/tags/development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [inclusive](<https://devfeed.tech/tags/inclusive.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [library](<https://devfeed.tech/tags/library.md>), [modules](<https://devfeed.tech/tags/modules.md>), [plugin](<https://devfeed.tech/tags/plugin.md>), [software](<https://devfeed.tech/tags/software.md>), [validation](<https://devfeed.tech/tags/validation.md>)

### AI overview

A tutorial on using JetBrains' experimental Kotlin binary compatibility validator Gradle plugin to track public API changes in library projects. It explains how the plugin generates API description files, requires intentional updates when APIs change, and verifies committed API dumps to detect incompatible binary changes.

### Source excerpt

As your library code is evolving over time, you have to be mindful of changes in your public API. Here's how you can keep it in check.

## Announcing requireKTX

DevFeed: [Announcing requireKTX](<https://devfeed.tech/articles/announcing-requirektx-27052.md>)

Original publisher: [Read original article](<https://zsmb.co/announcing-requirektx/>)

Author: Márton Braun

Published: 2021-06-17T18:00:00Z

Content type: release

Language: en

Sources: [zsmb.co](<https://devfeed.tech/sources/zsmb-co.md>)

Topics: [Library](<https://devfeed.tech/topics/library.md>), [Android](<https://devfeed.tech/topics/android.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [error-messages](<https://devfeed.tech/tags/error-messages.md>), [errors](<https://devfeed.tech/tags/errors.md>), [github](<https://devfeed.tech/tags/github.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [library](<https://devfeed.tech/tags/library.md>), [marton-braun](<https://devfeed.tech/tags/marton-braun.md>), [zsmb](<https://devfeed.tech/tags/zsmb.md>), [zsmb-co](<https://devfeed.tech/tags/zsmb-co.md>), [zsmb13](<https://devfeed.tech/tags/zsmb13.md>), [zsmbco](<https://devfeed.tech/tags/zsmbco.md>)

### AI overview

This article announces requireKTX, a library that adds extensions for conveniently requiring values from common Android types and data sources. Instead of returning nullable types or default values, the extensions throw meaningful exceptions with explanatory error messages.

### Source excerpt

Introducing a new library to conveniently require values from common Android types.

## Clean Chat Example App with Jetpack Compose

DevFeed: [Clean Chat Example App with Jetpack Compose](<https://devfeed.tech/articles/clean-chat-example-app-with-jetpack-compose-27036.md>)

Original publisher: [Read original article](<https://getstream.io/blog/jetpack-compose-clean-chat-example/>)

Author: Márton Braun

Published: 2021-06-08T18:00:00Z

Content type: tutorial

Language: en

Sources: [zsmb.co](<https://devfeed.tech/sources/zsmb-co.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Compose](<https://devfeed.tech/topics/compose.md>), [ui](<https://devfeed.tech/topics/ui.md>), [Android](<https://devfeed.tech/topics/android.md>), [Code](<https://devfeed.tech/topics/code.md>), [Font](<https://devfeed.tech/topics/font.md>), [Metropolis](<https://devfeed.tech/topics/metropolis.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [app](<https://devfeed.tech/tags/app.md>), [build](<https://devfeed.tech/tags/build.md>), [code](<https://devfeed.tech/tags/code.md>), [color](<https://devfeed.tech/tags/color.md>), [compiler](<https://devfeed.tech/tags/compiler.md>), [compose](<https://devfeed.tech/tags/compose.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [metropolis](<https://devfeed.tech/tags/metropolis.md>), [palette](<https://devfeed.tech/tags/palette.md>), [resource](<https://devfeed.tech/tags/resource.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>), [ui](<https://devfeed.tech/tags/ui.md>)

### AI overview

This tutorial reviews a Jetpack Compose chat UI sample, covering color management, custom Metropolis fonts, theme configuration, composable functions, and compiler optimizations.

### Source excerpt

Jetpack Compose makes it easy to build beautiful UI. Check out this Chat UI sample, and learn some exciting bits of Compose along the way!

## Pi Practice App in Compose

DevFeed: [Pi Practice App in Compose](<https://devfeed.tech/articles/pi-practice-app-in-compose-27076.md>)

Original publisher: [Read original article](<https://zsmb.co/pi-practice-app-in-compose/>)

Author: Márton Braun

Published: 2021-04-18T18:00:00Z

Content type: tutorial

Language: en

Sources: [zsmb.co](<https://devfeed.tech/sources/zsmb-co.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Compose](<https://devfeed.tech/topics/compose.md>), [Android](<https://devfeed.tech/topics/android.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [ui](<https://devfeed.tech/topics/ui.md>), [navigation](<https://devfeed.tech/topics/navigation.md>), [deprecated](<https://devfeed.tech/topics/deprecated.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [api](<https://devfeed.tech/tags/api.md>), [code](<https://devfeed.tech/tags/code.md>), [compose](<https://devfeed.tech/tags/compose.md>), [deprecated](<https://devfeed.tech/tags/deprecated.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [marton-braun](<https://devfeed.tech/tags/marton-braun.md>), [navigation](<https://devfeed.tech/tags/navigation.md>), [ui](<https://devfeed.tech/tags/ui.md>), [zsmb](<https://devfeed.tech/tags/zsmb.md>), [zsmb-co](<https://devfeed.tech/tags/zsmb-co.md>), [zsmb13](<https://devfeed.tech/tags/zsmb13.md>), [zsmbco](<https://devfeed.tech/tags/zsmbco.md>)

### AI overview

A Jetpack Compose walkthrough that rebuilds a simple Android app for practicing the digits of pi. It covers project setup, navigation, a keypad, progress display, and a high-scores screen, while comparing parts of the implementation with the older deprecated Anko Layouts approach.

### Source excerpt

In another detailed Jetpack Compose walkthrough, we'll look at implementing a simple app for practicing the digits of pi!

## Prime Table Generator in Jetpack Compose

DevFeed: [Prime Table Generator in Jetpack Compose](<https://devfeed.tech/articles/prime-table-generator-in-jetpack-compose-27079.md>)

Original publisher: [Read original article](<https://zsmb.co/prime-table-generator-jetpack-compose/>)

Author: Márton Braun

Published: 2021-03-25T16:00:00Z

Content type: tutorial

Language: en

Sources: [zsmb.co](<https://devfeed.tech/sources/zsmb-co.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Android](<https://devfeed.tech/topics/android.md>), [coding](<https://devfeed.tech/topics/coding.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [coding](<https://devfeed.tech/tags/coding.md>), [compose](<https://devfeed.tech/tags/compose.md>), [exercise](<https://devfeed.tech/tags/exercise.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [marton-braun](<https://devfeed.tech/tags/marton-braun.md>), [projects](<https://devfeed.tech/tags/projects.md>), [zsmb](<https://devfeed.tech/tags/zsmb.md>), [zsmb-co](<https://devfeed.tech/tags/zsmb-co.md>), [zsmb13](<https://devfeed.tech/tags/zsmb13.md>), [zsmbco](<https://devfeed.tech/tags/zsmbco.md>)

### AI overview

A tutorial that revisits a prime-number visualization project and rebuilds it for Android using Jetpack Compose. It explains the prime table design, creates a grid of squares, and begins implementing individual square rendering with Compose APIs.

### Source excerpt

I've dusted off one of my oldest (and favourite) coding projects, and rewrote it in Jetpack Compose as a nice little practice exercise.

## Build an Android Chat app with Jetpack Compose

DevFeed: [Build an Android Chat app with Jetpack Compose](<https://devfeed.tech/articles/build-an-android-chat-app-with-jetpack-compose-27042.md>)

Original publisher: [Read original article](<https://proandroiddev.com/android-chat-app-jetpack-compose-dec472140ff1>)

Author: Márton Braun

Published: 2021-03-19T15:00:00Z

Content type: tutorial

Language: en

Sources: [zsmb.co](<https://devfeed.tech/sources/zsmb-co.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Android](<https://devfeed.tech/topics/android.md>), [SDKs](<https://devfeed.tech/topics/sdks.md>), [App](<https://devfeed.tech/topics/app.md>), [ui](<https://devfeed.tech/topics/ui.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-studio](<https://devfeed.tech/tags/android-studio.md>), [api](<https://devfeed.tech/tags/api.md>), [app](<https://devfeed.tech/tags/app.md>), [compose](<https://devfeed.tech/tags/compose.md>), [github](<https://devfeed.tech/tags/github.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [messaging](<https://devfeed.tech/tags/messaging.md>), [real-time](<https://devfeed.tech/tags/real-time.md>), [sdk](<https://devfeed.tech/tags/sdk.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>), [ui](<https://devfeed.tech/tags/ui.md>)

### AI overview

This tutorial explains how to build a functional Android chat app with Jetpack Compose and the Stream Chat Android SDK. It uses Stream Chat ViewModels and a real-time backend service while noting that dedicated Compose support was still planned.

### Source excerpt

In this tutorial, you'll learn how to build a real, functional chat app using Jetpack Compose and the Stream Chat Android SDK.

## Jetpack Compose: First Impressions and Learning Resources

DevFeed: [Jetpack Compose: First Impressions and Learning Resources](<https://devfeed.tech/articles/jetpack-compose-first-impressions-and-learning-resources-27037.md>)

Original publisher: [Read original article](<https://getstream.io/blog/jetpack-compose-impressions-resources/>)

Author: Márton Braun

Published: 2021-03-05T19:00:00Z

Content type: opinion

Language: en

Sources: [zsmb.co](<https://devfeed.tech/sources/zsmb-co.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Compose](<https://devfeed.tech/topics/compose.md>), [Android](<https://devfeed.tech/topics/android.md>), [SDK](<https://devfeed.tech/topics/sdk.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [app](<https://devfeed.tech/tags/app.md>), [components](<https://devfeed.tech/tags/components.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-ui](<https://devfeed.tech/tags/compose-ui.md>), [getting-started](<https://devfeed.tech/tags/getting-started.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [learning](<https://devfeed.tech/tags/learning.md>), [modular](<https://devfeed.tech/tags/modular.md>), [resources](<https://devfeed.tech/tags/resources.md>), [sdk](<https://devfeed.tech/tags/sdk.md>), [ui-components](<https://devfeed.tech/tags/ui-components.md>)

### AI overview

The article shares first impressions of Jetpack Compose in beta and recommends learning resources for getting started. It also describes a modular SDK that provides customizable Compose UI components for Android apps.

### Source excerpt

Jetpack Compose is finally in beta. Here are my first impressions using its beta, and some recommended resources for getting started with it.

## Compose O'Clock

DevFeed: [Compose O'Clock](<https://devfeed.tech/articles/compose-o-clock-27056.md>)

Original publisher: [Read original article](<https://zsmb.co/compose-o-clock/>)

Author: Márton Braun

Published: 2021-03-02T16:00:00Z

Content type: tutorial

Language: en

Sources: [zsmb.co](<https://devfeed.tech/sources/zsmb-co.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Compose](<https://devfeed.tech/topics/compose.md>), [Android](<https://devfeed.tech/topics/android.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [compose](<https://devfeed.tech/tags/compose.md>), [github](<https://devfeed.tech/tags/github.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [marton-braun](<https://devfeed.tech/tags/marton-braun.md>), [zsmb](<https://devfeed.tech/tags/zsmb.md>), [zsmb-co](<https://devfeed.tech/tags/zsmb-co.md>), [zsmb13](<https://devfeed.tech/tags/zsmb13.md>), [zsmbco](<https://devfeed.tech/tags/zsmbco.md>)

### AI overview

A step-by-step tutorial showing how to build a clock design with Jetpack Compose, including composables for digits, columns, styling, layout, and time data.

### Source excerpt

I started learning Jetpack Compose this week. Two days into that adventure, here's a quick look at how a neat clock design can be built up in Compose, step-by-step.

## Publishing Android libraries to MavenCentral in 2021

DevFeed: [Publishing Android libraries to MavenCentral in 2021](<https://devfeed.tech/articles/publishing-android-libraries-to-mavencentral-in-2021-27038.md>)

Original publisher: [Read original article](<https://getstream.io/blog/publishing-libraries-to-mavencentral-2021/>)

Author: Márton Braun

Published: 2021-02-04T16:00:00Z

Content type: tutorial

Language: en

Sources: [zsmb.co](<https://devfeed.tech/sources/zsmb-co.md>)

Topics: [Library](<https://devfeed.tech/topics/library.md>), [Maven](<https://devfeed.tech/topics/maven.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [GitHub Actions](<https://devfeed.tech/topics/github-actions.md>), [API](<https://devfeed.tech/topics/api.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [bintray](<https://devfeed.tech/tags/bintray.md>), [ci](<https://devfeed.tech/tags/ci.md>), [github](<https://devfeed.tech/tags/github.md>), [github-actions](<https://devfeed.tech/tags/github-actions.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [guide](<https://devfeed.tech/tags/guide.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [integrity](<https://devfeed.tech/tags/integrity.md>), [libraries](<https://devfeed.tech/tags/libraries.md>), [maven-repository](<https://devfeed.tech/tags/maven-repository.md>), [mavencentral](<https://devfeed.tech/tags/mavencentral.md>), [release](<https://devfeed.tech/tags/release.md>), [repositories](<https://devfeed.tech/tags/repositories.md>), [signing](<https://devfeed.tech/tags/signing.md>), [sonatype](<https://devfeed.tech/tags/sonatype.md>), [tutorials](<https://devfeed.tech/tags/tutorials.md>)

### AI overview

A step-by-step, updated guide to publishing Android and other libraries to MavenCentral in 2021. It covers Gradle publishing, GPG signing, Sonatype infrastructure, Maven publishing plugins, and GitHub Actions CI, with context on JitPack and JCenter.

### Source excerpt

MavenCentral is the place to be for Android libraries, but publishing there is no easy task. With JCenter going away soon, this problem is more timely than ever. Here's the step-by-step guide on how to do it.

## Sealed goodies coming in Kotlin 1.5

DevFeed: [Sealed goodies coming in Kotlin 1.5](<https://devfeed.tech/articles/sealed-goodies-coming-in-kotlin-1-5-27082.md>)

Original publisher: [Read original article](<https://zsmb.co/sealed-goodies-coming-in-kotlin-1-5/>)

Author: Márton Braun

Published: 2021-01-19T14:00:00Z

Content type: article

Language: en

Sources: [zsmb.co](<https://devfeed.tech/sources/zsmb-co.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [interfaces](<https://devfeed.tech/topics/interfaces.md>), [Inheritance](<https://devfeed.tech/topics/inheritance.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [classes](<https://devfeed.tech/tags/classes.md>), [inheritance](<https://devfeed.tech/tags/inheritance.md>), [interfaces](<https://devfeed.tech/tags/interfaces.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [marton-braun](<https://devfeed.tech/tags/marton-braun.md>), [pattern-matching](<https://devfeed.tech/tags/pattern-matching.md>), [preview](<https://devfeed.tech/tags/preview.md>), [sealed](<https://devfeed.tech/tags/sealed.md>), [sealed-classes](<https://devfeed.tech/tags/sealed-classes.md>), [zsmb](<https://devfeed.tech/tags/zsmb.md>), [zsmb-co](<https://devfeed.tech/tags/zsmb-co.md>), [zsmb13](<https://devfeed.tech/tags/zsmb13.md>), [zsmbco](<https://devfeed.tech/tags/zsmbco.md>)

### AI overview

This article explains Kotlin sealed classes and previews planned Kotlin 1.5 improvements, including relaxed inheritance restrictions and the introduction of sealed interfaces. It also discusses interoperability with newer Java sealed constructs.

### Source excerpt

Kotlin 1.5 will bring exciting new features, among them improvements to sealed classes and an introduction of sealed interfaces. Let's take a look at what that will look like!

## Wrap-up 2020

DevFeed: [Wrap-up 2020](<https://devfeed.tech/articles/wrap-up-2020-27094.md>)

Original publisher: [Read original article](<https://zsmb.co/wrap-up-2020/>)

Author: Márton Braun

Published: 2020-12-30T20:00:00Z

Content type: opinion

Language: en

Sources: [zsmb.co](<https://devfeed.tech/sources/zsmb-co.md>)

Topics: [Job](<https://devfeed.tech/topics/job.md>), [systems](<https://devfeed.tech/topics/systems.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [career](<https://devfeed.tech/tags/career.md>), [interviews](<https://devfeed.tech/tags/interviews.md>), [job-search](<https://devfeed.tech/tags/job-search.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [marton-braun](<https://devfeed.tech/tags/marton-braun.md>), [personal](<https://devfeed.tech/tags/personal.md>), [work](<https://devfeed.tech/tags/work.md>), [zsmb](<https://devfeed.tech/tags/zsmb.md>), [zsmb-co](<https://devfeed.tech/tags/zsmb-co.md>), [zsmb13](<https://devfeed.tech/tags/zsmb13.md>), [zsmbco](<https://devfeed.tech/tags/zsmbco.md>)

### AI overview

A personal 2020 year-in-review covering the author's experiences during the pandemic, job changes, work at Skyscanner, charitable donations, and reflections on engineering culture and learning.

### Source excerpt

Let's send this one off so that we can get started on a better one. The "usual" recap of what I've done this year.

## Mastering API Visibility in Kotlin

DevFeed: [Mastering API Visibility in Kotlin](<https://devfeed.tech/articles/mastering-api-visibility-in-kotlin-27073.md>)

Original publisher: [Read original article](<https://zsmb.co/mastering-api-visibility-in-kotlin/>)

Author: Márton Braun

Published: 2020-11-04T17:00:00Z

Content type: tutorial

Language: en

Sources: [zsmb.co](<https://devfeed.tech/sources/zsmb-co.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [API](<https://devfeed.tech/topics/api.md>), [Library](<https://devfeed.tech/topics/library.md>), [modules](<https://devfeed.tech/topics/modules.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [api](<https://devfeed.tech/tags/api.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [libraries](<https://devfeed.tech/tags/libraries.md>), [marton-braun](<https://devfeed.tech/tags/marton-braun.md>), [multi-module-project](<https://devfeed.tech/tags/multi-module-project.md>), [zsmb](<https://devfeed.tech/tags/zsmb.md>), [zsmb-co](<https://devfeed.tech/tags/zsmb-co.md>), [zsmb13](<https://devfeed.tech/tags/zsmb13.md>), [zsmbco](<https://devfeed.tech/tags/zsmbco.md>)

### AI overview

This article explains how minimizing API visibility in Kotlin libraries and multi-module projects reduces the declarations that must be maintained, limits compatibility concerns, and makes APIs easier to learn and use.

### Source excerpt

When designing a library, minimizing your API surface - the types, methods, properties, and functions you expose to the outside world - is a great idea. This doesn't apply to just libraries: it's a consideration you should make for every module in a multi-module project.

## Effective Class Delegation

DevFeed: [Effective Class Delegation](<https://devfeed.tech/articles/effective-class-delegation-27061.md>)

Original publisher: [Read original article](<https://zsmb.co/effective-class-delegation/>)

Author: Márton Braun

Published: 2020-09-29T20:00:00Z

Content type: tutorial

Language: en

Sources: [zsmb.co](<https://devfeed.tech/sources/zsmb-co.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Inheritance](<https://devfeed.tech/topics/inheritance.md>), [Java](<https://devfeed.tech/topics/java.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [bytecode](<https://devfeed.tech/tags/bytecode.md>), [delegation](<https://devfeed.tech/tags/delegation.md>), [implementation](<https://devfeed.tech/tags/implementation.md>), [inheritance](<https://devfeed.tech/tags/inheritance.md>), [interface](<https://devfeed.tech/tags/interface.md>), [java](<https://devfeed.tech/tags/java.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [marton-braun](<https://devfeed.tech/tags/marton-braun.md>), [override](<https://devfeed.tech/tags/override.md>), [subclass](<https://devfeed.tech/tags/subclass.md>), [superclass](<https://devfeed.tech/tags/superclass.md>), [zsmb](<https://devfeed.tech/tags/zsmb.md>), [zsmb-co](<https://devfeed.tech/tags/zsmb-co.md>), [zsmb13](<https://devfeed.tech/tags/zsmb13.md>), [zsmbco](<https://devfeed.tech/tags/zsmbco.md>)

### AI overview

This tutorial explains how Kotlin class delegation can implement an interface by forwarding calls to a contained object. It contrasts this concise approach with Java solutions motivated by Effective Java's recommendation to favor composition over inheritance.

### Source excerpt

One of the most significant items of the Effective Java book is Item 18: Favor composition over inheritance. Let's see how Kotlin promotes this with class delegation.

[Next page](<https://devfeed.tech/sources/zsmb-co.md?cursor=WyIyMDIwLTA5LTI5VDIwOjAwOjAwKzAwOjAwIiwgImVmMmY5NWJlLTdhZjAtNGYyMC05ZjZlLTgwYWZhYzEwNDY4NyJd>)