# Zach Klippenstein's Blog

Technical posts on Kotlin, Jetpack Compose, and technology.

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

## Adding content padding to Jetpack Compose text fields

DevFeed: [Adding content padding to Jetpack Compose text fields](<https://devfeed.tech/articles/basictextfield-bubble-wrap-30523.md>)

Original publisher: [Read original article](<https://blog.zachklipp.com/basictextfield-bubble-wrap/>)

Author: Zach Klippenstein

Published: 2025-02-01T02:30:03Z

Content type: tutorial

Language: en

Sources: [Zach Klippenstein's Blog](<https://devfeed.tech/sources/zach-klippenstein-s-blog.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Design system](<https://devfeed.tech/topics/design-system.md>), [bug](<https://devfeed.tech/topics/bug.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [bug](<https://devfeed.tech/tags/bug.md>), [design-system](<https://devfeed.tech/tags/design-system.md>), [hacking](<https://devfeed.tech/tags/hacking.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>)

### AI overview

A practical workaround for adding content padding to Jetpack Compose text fields. The article explains how to preserve useful padding in scrollable fields by detecting when the field reaches the end and adding padding incrementally.

### Source excerpt

A little hack for adding (content) padding to your (decoration) boxes.

## Centering in Compose

DevFeed: [Centering in Compose](<https://devfeed.tech/articles/centering-in-compose-30524.md>)

Original publisher: [Read original article](<https://blog.zachklipp.com/centering-in-compose/>)

Author: Zach Klippenstein

Published: 2024-11-22T00:44:18Z

Content type: tutorial

Language: en

Sources: [Zach Klippenstein's Blog](<https://devfeed.tech/sources/zach-klippenstein-s-blog.md>)

Topics: [Compose](<https://devfeed.tech/topics/compose.md>), [Code](<https://devfeed.tech/topics/code.md>), [Algorithm](<https://devfeed.tech/topics/algorithm.md>)

Tags: [algorithm](<https://devfeed.tech/tags/algorithm.md>), [android](<https://devfeed.tech/tags/android.md>), [article](<https://devfeed.tech/tags/article.md>), [compose](<https://devfeed.tech/tags/compose.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [layout](<https://devfeed.tech/tags/layout.md>)

### AI overview

This tutorial explains how centering works in Jetpack Compose by introducing its constraint-based layout system. It describes centering as positioning a child in the middle of its parent and connects that concept to Compose APIs and layout modifiers.

### Source excerpt

Let's talk about centering things. There is no Modifier.center() in Compose, nor is there a Center composable, and I think the reason for that is because once you understand Compose's layout system you'll find those concepts redundant. In this article I'm

## Talk: Deriving derived state: derivedStateOf explained

DevFeed: [Talk: Deriving derived state: derivedStateOf explained](<https://devfeed.tech/articles/talk-deriving-derived-state-derivedstateof-explained-30534.md>)

Original publisher: [Read original article](<https://blog.zachklipp.com/talk-deriving-derived-state-derivedstateof-explained/>)

Author: Zach Klippenstein

Published: 2024-07-17T18:53:00Z

Content type: tutorial

Language: en

Sources: [Zach Klippenstein's Blog](<https://devfeed.tech/sources/zach-klippenstein-s-blog.md>)

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

Tags: [android](<https://devfeed.tech/tags/android.md>), [article](<https://devfeed.tech/tags/article.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-state-series](<https://devfeed.tech/tags/compose-state-series.md>), [deep-dive](<https://devfeed.tech/tags/deep-dive.md>), [droidcon](<https://devfeed.tech/tags/droidcon.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [talks](<https://devfeed.tech/tags/talks.md>)

### AI overview

A deep dive into how Jetpack Compose's derivedStateOf works, presented as a follow-up to an earlier talk about Compose snapshots.

### Source excerpt

As a follow-up to my last snapshots talk, Opening the Shutter on Snapshots, I did a deep-dive into how Compose's derivedStateOf works.

## How derivedStateOf Works in Jetpack Compose's Snapshot System

DevFeed: [How derivedStateOf Works in Jetpack Compose's Snapshot System](<https://devfeed.tech/articles/how-derivedstateof-works-a-deep-d-er-ive-30529.md>)

Original publisher: [Read original article](<https://blog.zachklipp.com/how-derivedstateof-works-a-deep-d-er-ive/>)

Author: Zach Klippenstein

Published: 2024-07-16T16:58:52Z

Content type: tutorial

Language: en

Sources: [Zach Klippenstein's Blog](<https://devfeed.tech/sources/zach-klippenstein-s-blog.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [reactive](<https://devfeed.tech/topics/reactive.md>), [Library](<https://devfeed.tech/topics/library.md>), [factory function](<https://devfeed.tech/topics/factory-function.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [code](<https://devfeed.tech/tags/code.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-state-series](<https://devfeed.tech/tags/compose-state-series.md>), [function](<https://devfeed.tech/tags/function.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [reactive](<https://devfeed.tech/tags/reactive.md>), [snapshots](<https://devfeed.tech/tags/snapshots.md>), [state](<https://devfeed.tech/tags/state.md>)

### AI overview

This tutorial explains how derivedStateOf works within Jetpack Compose's reactive snapshot system. It introduces the returned object, related concepts such as restartable functions and state dependencies, and the role of state-derived calculations, using Compose source code and examples.

### Source excerpt

Compose's snapshot system is really neat. Once you know how it works, you can do some cool tricks with it, and derivedStateOf is a rich example

## Restartable functions from first principles

DevFeed: [Restartable functions from first principles](<https://devfeed.tech/articles/restartable-functions-from-first-principles-30533.md>)

Original publisher: [Read original article](<https://blog.zachklipp.com/restartable-functions-from-first-principles/>)

Author: Zach Klippenstein

Published: 2024-07-12T02:38:58Z

Content type: tutorial

Language: en

Sources: [Zach Klippenstein's Blog](<https://devfeed.tech/sources/zach-klippenstein-s-blog.md>)

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

Tags: [android](<https://devfeed.tech/tags/android.md>), [callback](<https://devfeed.tech/tags/callback.md>), [compose-state-series](<https://devfeed.tech/tags/compose-state-series.md>), [function](<https://devfeed.tech/tags/function.md>), [implementation](<https://devfeed.tech/tags/implementation.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [lambda](<https://devfeed.tech/tags/lambda.md>), [modifiers](<https://devfeed.tech/tags/modifiers.md>), [snapshot](<https://devfeed.tech/tags/snapshot.md>), [state](<https://devfeed.tech/tags/state.md>)

### AI overview

This tutorial explains how restartable functions work in Jetpack Compose. It describes how callers track state objects read by a function, observe changes, and re-execute or schedule the function when relevant state changes.

### Source excerpt

Often when thinking about Jetpack Compose state, we think in terms of what code will be re-executed when that state changes. We call functions

## How I migrated a dev.to blog to a personal domain

DevFeed: [How I migrated a dev.to blog to a personal domain](<https://devfeed.tech/articles/how-i-migrated-my-blog-30530.md>)

Original publisher: [Read original article](<https://blog.zachklipp.com/how-i-migrated-my-blog/>)

Author: Zach Klippenstein

Published: 2024-07-06T19:34:26Z

Content type: tutorial

Language: en

Sources: [Zach Klippenstein's Blog](<https://devfeed.tech/sources/zach-klippenstein-s-blog.md>)

Topics: [Website](<https://devfeed.tech/topics/website.md>), [Development](<https://devfeed.tech/topics/development.md>), [Markdown](<https://devfeed.tech/topics/markdown.md>), [GitHub Pages](<https://devfeed.tech/topics/github-pages.md>), [RSS Feed](<https://devfeed.tech/topics/rss-feed.md>), [ActivityPub](<https://devfeed.tech/topics/activitypub.md>)

Tags: [blog](<https://devfeed.tech/tags/blog.md>), [github-pages](<https://devfeed.tech/tags/github-pages.md>), [markdown](<https://devfeed.tech/tags/markdown.md>), [migrate](<https://devfeed.tech/tags/migrate.md>), [rss](<https://devfeed.tech/tags/rss.md>)

### AI overview

A personal account of migrating a blog from dev.to to a site on the author's personal domain. It describes requirements including customizable URLs, minimal maintenance, Markdown support, low cost, ActivityPub integration, and an RSS feed, along with reasons for wanting control over hosting and redirects.

### Source excerpt

About a week ago, I migrated my blog to a New blog site! As I explained in that post, I was previously posting on dev.to, and while it mostly worked fine to post the content, I did not like having my content live on a domain name and I

## A new blog site moves posts from dev.to to a Ghost-hosted site

DevFeed: [A new blog site moves posts from dev.to to a Ghost-hosted site](<https://devfeed.tech/articles/new-blog-site-30532.md>)

Original publisher: [Read original article](<https://blog.zachklipp.com/new-blog-site/>)

Author: Zach Klippenstein

Published: 2024-06-26T20:11:50Z

Content type: article

Language: en

Sources: [Zach Klippenstein's Blog](<https://devfeed.tech/sources/zach-klippenstein-s-blog.md>)

Topics: [ActivityPub](<https://devfeed.tech/topics/activitypub.md>), [Mastodon](<https://devfeed.tech/topics/mastodon.md>)

Tags: [blog](<https://devfeed.tech/tags/blog.md>), [mastodon](<https://devfeed.tech/tags/mastodon.md>)

### AI overview

The author announces that the blog has moved from dev.to to a Ghost-hosted site, while keeping the old posts available to preserve links. The author also hopes Ghost will eventually support ActivityPub integration for following and commenting from Mastodon.

### Source excerpt

Welcome, you've successfully found the new home of my blog! It used to be on dev.to, but I was not comfortable with my posts living under a domain name I didn't control. I've moved all my old posts over here, but I'

## Talk: Reimagining text fields in Compose

DevFeed: [Talk: Reimagining text fields in Compose](<https://devfeed.tech/articles/talk-reimagining-text-fields-in-compose-30536.md>)

Original publisher: [Read original article](<https://blog.zachklipp.com/talk-reimagining-text-fields-in-compose/>)

Author: Zach Klippenstein

Published: 2023-06-09T07:00:00Z

Content type: article

Language: en

Sources: [Zach Klippenstein's Blog](<https://devfeed.tech/sources/zach-klippenstein-s-blog.md>)

Topics: [Compose](<https://devfeed.tech/topics/compose.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [compose](<https://devfeed.tech/tags/compose.md>), [droidcon](<https://devfeed.tech/tags/droidcon.md>), [fields](<https://devfeed.tech/tags/fields.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [talk](<https://devfeed.tech/tags/talk.md>), [talks](<https://devfeed.tech/tags/talks.md>), [text](<https://devfeed.tech/tags/text.md>)

### AI overview

The article presents a talk about reimagining text fields in Compose and mentions work on a new BasicTextField.

### Source excerpt

I've spent the last six months working on a new BasicTextField. Check out what we've been working on!

## A discussion about Google's new BasicTextField in Jetpack Compose

DevFeed: [A discussion about Google's new BasicTextField in Jetpack Compose](<https://devfeed.tech/articles/back-on-code-with-the-italians-to-talk-about-basictextfield2-30528.md>)

Original publisher: [Read original article](<https://blog.zachklipp.com/cwti-new-jetpack-compose-basictextfield2/>)

Author: Zach Klippenstein

Published: 2023-05-18T07:00:00Z

Content type: article

Language: en

Sources: [Zach Klippenstein's Blog](<https://devfeed.tech/sources/zach-klippenstein-s-blog.md>)

Topics: [Compose](<https://devfeed.tech/topics/compose.md>), [Google](<https://devfeed.tech/topics/google.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [compose](<https://devfeed.tech/tags/compose.md>), [google](<https://devfeed.tech/tags/google.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [talk](<https://devfeed.tech/tags/talk.md>), [talks](<https://devfeed.tech/tags/talks.md>)

### AI overview

The article discusses a conversation about Google's new BasicTextField in Jetpack Compose. The supplied text also contains references to Compose layout, snapshots, and derivedStateOf, but their relationship to the article is unclear.

### Source excerpt

I was very excited to get to chat more with Seb and Ivan, this time about something I've been working on at Google: the new BasicTextField!

## Appearing on Code with the Italians to Discuss Compose Text

DevFeed: [Appearing on Code with the Italians to Discuss Compose Text](<https://devfeed.tech/articles/i-was-on-code-with-the-italians-30527.md>)

Original publisher: [Read original article](<https://blog.zachklipp.com/cwti-how-text-works-in-jetpack-compose/>)

Author: Zach Klippenstein

Published: 2022-10-13T07:00:00Z

Content type: article

Language: en

Sources: [Zach Klippenstein's Blog](<https://devfeed.tech/sources/zach-klippenstein-s-blog.md>)

Topics: [Compose](<https://devfeed.tech/topics/compose.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [compose](<https://devfeed.tech/tags/compose.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [talks](<https://devfeed.tech/tags/talks.md>)

### AI overview

The author discusses being invited to the Code with the Italians show to talk about Compose Text and describes the experience positively.

### Source excerpt

Code with the Italians invited Halil and me on the show to talk about Compose Text. This was my first time here and we had so much fun! Seb and Ivan are excellent hosts.

## Talk: Opening the shutter on snapshots

DevFeed: [Talk: Opening the shutter on snapshots](<https://devfeed.tech/articles/talk-opening-the-shutter-on-snapshots-30535.md>)

Original publisher: [Read original article](<https://blog.zachklipp.com/talk-opening-the-shutter-on-snapshots/>)

Author: Zach Klippenstein

Published: 2022-09-02T07:00:00Z

Content type: article

Language: en

Sources: [Zach Klippenstein's Blog](<https://devfeed.tech/sources/zach-klippenstein-s-blog.md>)

Topics: [Compose](<https://devfeed.tech/topics/compose.md>), [Algorithms](<https://devfeed.tech/topics/algorithms.md>), [Programming](<https://devfeed.tech/topics/programming.md>)

Tags: [algorithm](<https://devfeed.tech/tags/algorithm.md>), [android](<https://devfeed.tech/tags/android.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-state-series](<https://devfeed.tech/tags/compose-state-series.md>), [droidcon](<https://devfeed.tech/tags/droidcon.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [talk](<https://devfeed.tech/tags/talk.md>), [talks](<https://devfeed.tech/tags/talks.md>)

### AI overview

A talk about how Jetpack Compose's snapshot system algorithm works, including discussion of derivedStateOf. The talk was presented at droidcon NYC in 2022 and droidcon SF the following year.

### Source excerpt

I had so much fun writing about Compose's state system that I decided to give a talk about how the snapshot system's algorithm works. I gave this talk initially at droidcon NYC in 2022, then again the next year at droidcon SF.

## Talk: The Workflow Pattern, Composed

DevFeed: [Talk: The Workflow Pattern, Composed](<https://devfeed.tech/articles/talk-the-workflow-pattern-composed-30537.md>)

Original publisher: [Read original article](<https://blog.zachklipp.com/talk-the-workflow-pattern-composed/>)

Author: Zach Klippenstein

Published: 2022-06-03T07:00:00Z

Content type: article

Language: en

Sources: [Zach Klippenstein's Blog](<https://devfeed.tech/sources/zach-klippenstein-s-blog.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>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [compose](<https://devfeed.tech/tags/compose.md>), [droidcon](<https://devfeed.tech/tags/droidcon.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [talks](<https://devfeed.tech/tags/talks.md>)

### AI overview

A discussion resource for the "The Workflow Pattern, Composed" talk, covering Jetpack Compose with Square Workflow and presented at droidconSF 2022. It includes links to the slides.

### Source excerpt

Slides: The Workflow Pattern, Composed (droidconSF 2022) sources: Jetpack Compose with Square Workflow talk by Zach Klippenstein Dec 4th Agenda: Jetpack Compose with Square Workflow talk by Zach KlippensteinFind the resource here:1. Slides: https://www.slideshare.net/ZacharyKlippenstei... Android Dev Hangout, 2021

## Implementing snapshot-aware data structures

DevFeed: [Implementing snapshot-aware data structures](<https://devfeed.tech/articles/implementing-snapshot-aware-data-structures-30531.md>)

Original publisher: [Read original article](<https://blog.zachklipp.com/implementing-snapshot-aware-data-structures/>)

Author: Zach Klippenstein

Published: 2022-05-13T14:10:00Z

Content type: tutorial

Language: en

Sources: [Zach Klippenstein's Blog](<https://devfeed.tech/sources/zach-klippenstein-s-blog.md>)

Topics: [Compose](<https://devfeed.tech/topics/compose.md>), [Data structures](<https://devfeed.tech/topics/data-structures.md>), [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-state-series](<https://devfeed.tech/tags/compose-state-series.md>), [concurrency](<https://devfeed.tech/tags/concurrency.md>), [data-structures](<https://devfeed.tech/tags/data-structures.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>)

### AI overview

A tutorial explaining how Compose's snapshot system can expose different values to different snapshots. It develops snapshot-aware data structures from basic concepts and connects the underlying approach to multi-version concurrency control (MVCC).

### Source excerpt

Up to this point in this blog series, I've discussed how to use Compose's snapshot state system, some advantages of how it's designed, and the

## Compose Hackathon: Piece Table Benchmarking and Snapshot State

DevFeed: [Compose Hackathon: Piece Table Benchmarking and Snapshot State](<https://devfeed.tech/articles/compose-hackathon-day-the-rest-30526.md>)

Original publisher: [Read original article](<https://blog.zachklipp.com/compose-hackathon-day-the-rest/>)

Author: Zach Klippenstein

Published: 2022-05-09T21:11:00Z

Content type: article

Language: en

Sources: [Zach Klippenstein's Blog](<https://devfeed.tech/sources/zach-klippenstein-s-blog.md>)

Topics: [Compose](<https://devfeed.tech/topics/compose.md>), [AdventureX 2025](<https://devfeed.tech/topics/adventurex2025.md>), [Benchmark](<https://devfeed.tech/topics/benchmark.md>), [Concurrency](<https://devfeed.tech/topics/concurrency.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [benchmarks](<https://devfeed.tech/tags/benchmarks.md>), [compose](<https://devfeed.tech/tags/compose.md>), [concurrency](<https://devfeed.tech/tags/concurrency.md>), [hackathon](<https://devfeed.tech/tags/hackathon.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [spring-2022-compose-hackathon](<https://devfeed.tech/tags/spring-2022-compose-hackathon.md>)

### AI overview

This post documents continued work on a piece table during a Compose hackathon. Attempts to optimize piece management and replace a persistent list with a linked list remained slower than the original gap buffer, while profiling highlighted substantial snapshot-related overhead and the need to address parallel snapshot writes.

### Source excerpt

I meant to write this on Friday, but got caught up trying to gather some last bits of data after my dev environment fell over and decided to stop running benchmarks altogether. Since Wednesday... In the last post, I left off having built the piece table I initially meant

## Compose Hackathon: Day 2.5

DevFeed: [Compose Hackathon: Day 2.5](<https://devfeed.tech/articles/compose-hackathon-day-2-5-30525.md>)

Original publisher: [Read original article](<https://blog.zachklipp.com/compose-hackathon-day-2-5/>)

Author: Zach Klippenstein

Published: 2022-05-04T19:49:00Z

Content type: opinion

Language: en

Sources: [Zach Klippenstein's Blog](<https://devfeed.tech/sources/zach-klippenstein-s-blog.md>)

Topics: [Hackathon](<https://devfeed.tech/topics/hackathon.md>), [Code](<https://devfeed.tech/topics/code.md>), [unit test](<https://devfeed.tech/topics/unit-test.md>), [implementation](<https://devfeed.tech/topics/implementation.md>), [Java](<https://devfeed.tech/topics/java.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [code](<https://devfeed.tech/tags/code.md>), [compose](<https://devfeed.tech/tags/compose.md>), [hackathon](<https://devfeed.tech/tags/hackathon.md>), [java](<https://devfeed.tech/tags/java.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [spring-2022-compose-hackathon](<https://devfeed.tech/tags/spring-2022-compose-hackathon.md>), [unit-test](<https://devfeed.tech/tags/unit-test.md>)

### AI overview

A progress report from day 2.5 of a Compose hackathon describes work on abstract and concrete piece-table implementations, including snapshot support, shared unit tests, and benchmarks. It also discusses the lack of a standard Java or Kotlin interface for efficient multi-character copying.

### Source excerpt

Well, so much for blogging every day. Better late than never, right? Anyway, I have a good excuse: I've been super busy writing code and tests, and it's not going terribly. I'm calling this day 2.5 since I was up a large part