# Public Object

Jesse Wilson on programming.

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

## Test & Set

DevFeed: [Test & Set](<https://devfeed.tech/articles/test-set-32253.md>)

Original publisher: [Read original article](<https://publicobject.com/2026/07/13/test-set/>)

Author: Jesse Wilson

Published: 2026-07-13T22:22:27Z

Content type: tutorial

Language: en

Sources: [Public Object](<https://devfeed.tech/sources/public-object.md>)

Topics: [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>), [Code](<https://devfeed.tech/topics/code.md>), [function](<https://devfeed.tech/topics/function.md>), [business logic](<https://devfeed.tech/topics/business-logic.md>)

Tags: [business-logic](<https://devfeed.tech/tags/business-logic.md>), [code](<https://devfeed.tech/tags/code.md>), [concurrency](<https://devfeed.tech/tags/concurrency.md>), [flaky-tests](<https://devfeed.tech/tags/flaky-tests.md>), [function](<https://devfeed.tech/tags/function.md>), [programming](<https://devfeed.tech/tags/programming.md>), [tests](<https://devfeed.tech/tags/tests.md>), [threads](<https://devfeed.tech/tags/threads.md>)

### AI overview

An article about managing concurrency in threaded programs. It discusses the limits of simple and stress tests, describes a trusted concurrency pattern, and presents a helper function that separates business logic from concurrency logic while retrying after a lost race.

### Source excerpt

Working with threads always feels hazardous to me. Non-determinism limits how much we can exercise with simple tests. Stress tests can shake out some bugs, but they're slow and potentially flaky. I don't like flaky tests. So I have a few concurrency patterns that I trust, and I

## Deconstructing OkHttp

DevFeed: [Deconstructing OkHttp](<https://devfeed.tech/articles/deconstructing-okhttp-32252.md>)

Original publisher: [Read original article](<https://publicobject.com/2026/05/22/deconstructing-okhttp/>)

Author: Jesse Wilson

Published: 2026-05-22T12:00:00Z

Content type: article

Language: en

Sources: [Public Object](<https://devfeed.tech/sources/public-object.md>)

Topics: [Library](<https://devfeed.tech/topics/library.md>), [Network](<https://devfeed.tech/topics/network.md>), [Code](<https://devfeed.tech/topics/code.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [implementation](<https://devfeed.tech/topics/implementation.md>), [Cache](<https://devfeed.tech/topics/cache.md>), [certificates](<https://devfeed.tech/topics/certificates.md>)

Tags: [architecture](<https://devfeed.tech/tags/architecture.md>), [cache](<https://devfeed.tech/tags/cache.md>), [certificates](<https://devfeed.tech/tags/certificates.md>), [https](<https://devfeed.tech/tags/https.md>), [implementation](<https://devfeed.tech/tags/implementation.md>), [kotlinconf](<https://devfeed.tech/tags/kotlinconf.md>), [ktor](<https://devfeed.tech/tags/ktor.md>), [library](<https://devfeed.tech/tags/library.md>), [network](<https://devfeed.tech/tags/network.md>), [okhttp](<https://devfeed.tech/tags/okhttp.md>), [performance](<https://devfeed.tech/tags/performance.md>), [presentation](<https://devfeed.tech/tags/presentation.md>), [retrofit](<https://devfeed.tech/tags/retrofit.md>), [testing](<https://devfeed.tech/tags/testing.md>)

### AI overview

A KotlinConf talk examines OkHttp's implementation rather than its basic usage, covering interceptor-based architecture, connection lifecycles, cache state machines, URL decoders, HTTPS testing certificates, performance, and extension mechanisms.

### Source excerpt

I presented this at KotlinConf on May 22, 2026. Also available on slides, YouTube, and Speaker Deck. OkHttp is a popular library for making network calls. You might use it directly, or with Ktor, Retrofit, Coil, or gRPC. But this is not a talk on how to use OkHttp. Instead,

## AI, Human Value, and the Costs of Fixing Software Bugs

DevFeed: [AI, Human Value, and the Costs of Fixing Software Bugs](<https://devfeed.tech/articles/humans-use-energy-and-water-too-32251.md>)

Original publisher: [Read original article](<https://publicobject.com/2026/03/07/humanity/>)

Author: Jesse Wilson

Published: 2026-03-07T04:29:40Z

Content type: opinion

Language: en

Sources: [Public Object](<https://devfeed.tech/sources/public-object.md>)

Topics: [Artificial Intelligence](<https://devfeed.tech/topics/ai.md>), [Programming](<https://devfeed.tech/topics/programming.md>), [Software](<https://devfeed.tech/topics/software.md>)

Tags: [agent](<https://devfeed.tech/tags/agent.md>), [ai](<https://devfeed.tech/tags/ai.md>), [energy](<https://devfeed.tech/tags/energy.md>), [programming](<https://devfeed.tech/tags/programming.md>), [software](<https://devfeed.tech/tags/software.md>)

### AI overview

This opinion article reflects on AI programming agents that fix software bugs while consuming energy and water. It argues that human worth should not be measured by economic output or treated as a liability because people need food and shelter.

### Source excerpt

An engineer I admire was lamenting about AI. He said that his new programming agent is excellent at fixing bugs! And all that it costs is a bunch of energy and many litres of water. He said that he could also have fixed those same bugs, and that he also

## A complaint urges Google to block an Android policy change affecting Canadian developers and users

DevFeed: [A complaint urges Google to block an Android policy change affecting Canadian developers and users](<https://devfeed.tech/articles/keep-android-open-32250.md>)

Original publisher: [Read original article](<https://publicobject.com/2026/02/21/keep-android-open/>)

Author: Jesse Wilson

Published: 2026-02-21T12:29:24Z

Content type: opinion

Language: en

Sources: [Public Object](<https://devfeed.tech/sources/public-object.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [Google](<https://devfeed.tech/topics/google.md>), [digital](<https://devfeed.tech/topics/digital.md>), [Software](<https://devfeed.tech/topics/software.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [canada](<https://devfeed.tech/tags/canada.md>), [competition](<https://devfeed.tech/tags/competition.md>), [developers](<https://devfeed.tech/tags/developers.md>), [distribution](<https://devfeed.tech/tags/distribution.md>), [fees](<https://devfeed.tech/tags/fees.md>), [google](<https://devfeed.tech/tags/google.md>), [ids](<https://devfeed.tech/tags/ids.md>), [open](<https://devfeed.tech/tags/open.md>), [policy](<https://devfeed.tech/tags/policy.md>)

### AI overview

The article reproduces a complaint to the Competition Bureau of Canada about a Google policy change for Android. It argues that requiring Canadian developers to submit identification and pay fees could reduce the openness of the Android platform and give Google greater control over software use and distribution.

### Source excerpt

Google is building a digital lock into Android. It's a very bad idea and I hate it. The excellent organizers at keepandroidopen.org encouraged me to complain to the Competition Bureau of Canada. What I sent wasn't well edited but it captures my anger. Please send your own! I found

## Flattening my Dependency Graph

DevFeed: [Flattening my Dependency Graph](<https://devfeed.tech/articles/flattening-my-dependency-graph-32249.md>)

Original publisher: [Read original article](<https://publicobject.com/2026/02/03/flattening-my-dependency-graph/>)

Author: Jesse Wilson

Published: 2026-02-03T05:28:50Z

Content type: opinion

Language: en

Sources: [Public Object](<https://devfeed.tech/sources/public-object.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Persistence](<https://devfeed.tech/topics/persistence.md>), [Dependency injection](<https://devfeed.tech/topics/dependency-injection.md>), [PostgreSQL](<https://devfeed.tech/topics/postgresql.md>), [Ktor](<https://devfeed.tech/topics/ktor.md>)

Tags: [dependency-injection](<https://devfeed.tech/tags/dependency-injection.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [ktor](<https://devfeed.tech/tags/ktor.md>), [modules](<https://devfeed.tech/tags/modules.md>), [persistence](<https://devfeed.tech/tags/persistence.md>), [postgresql](<https://devfeed.tech/tags/postgresql.md>)

### AI overview

The author describes structuring a Kotlin server's dependency graph using a three-module pattern for each feature: public API, implementation, and dependency-injection wiring. The approach aims to support parallel builds, reduce unnecessary rebuilds, and keep dependencies manageable.

### Source excerpt

Rounds has a Kotlin server that integrates a few things: PostgreSQL persistence via SQLDelight (hosted on PlanetScale!) WebAuthn4J for Passkeys kotlinx.html for dynamic web pages Ktor for HTTP binding The service uses six database tables. The business domain tables are Game and GameEvent. Support for auth, sessions, and collaborative

## Dynamic Tints with CSS and Kotlin/JS

DevFeed: [Dynamic Tints with CSS and Kotlin/JS](<https://devfeed.tech/articles/dynamic-tints-with-css-and-kotlin-js-32248.md>)

Original publisher: [Read original article](<https://publicobject.com/2026/01/30/css-tints/>)

Author: Jesse Wilson

Published: 2026-01-30T23:12:23Z

Content type: tutorial

Language: en

Sources: [Public Object](<https://devfeed.tech/sources/public-object.md>)

Topics: [CSS](<https://devfeed.tech/topics/css.md>), [ui](<https://devfeed.tech/topics/ui.md>), [color](<https://devfeed.tech/topics/color.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [SVG](<https://devfeed.tech/topics/svg.md>)

Tags: [animate](<https://devfeed.tech/tags/animate.md>), [color](<https://devfeed.tech/tags/color.md>), [css](<https://devfeed.tech/tags/css.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [svg](<https://devfeed.tech/tags/svg.md>), [ui](<https://devfeed.tech/tags/ui.md>)

### AI overview

A developer describes adding dynamic color tints to a game-scoring UI using CSS classes, transitions, and Kotlin/JS. The article also explains recoloring single-color SVG icons with CSS masks and dynamically inserted stylesheet rules.

### Source excerpt

I've been trying to build a remarkable UI for Rounds.app. One feature that turned out quite well is tinting the game name & menu bar icons when the winner changes. In this recording you can see colors change when I toggle the win condition: The title color changes

## Don't Block Suspend Functions

DevFeed: [Don't Block Suspend Functions](<https://devfeed.tech/articles/don-t-block-suspend-functions-32247.md>)

Original publisher: [Read original article](<https://publicobject.com/2026/01/22/dont-block-suspend-functions/>)

Author: Jesse Wilson

Published: 2026-01-22T04:32:49Z

Content type: tutorial

Language: en

Sources: [Public Object](<https://devfeed.tech/sources/public-object.md>)

Topics: [Coroutines](<https://devfeed.tech/topics/coroutines.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>), [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [async](<https://devfeed.tech/topics/async.md>), [Job](<https://devfeed.tech/topics/job.md>), [IO](<https://devfeed.tech/topics/io.md>)

Tags: [async](<https://devfeed.tech/tags/async.md>), [await](<https://devfeed.tech/tags/await.md>), [blocking](<https://devfeed.tech/tags/blocking.md>), [blog-post](<https://devfeed.tech/tags/blog-post.md>), [concurrency](<https://devfeed.tech/tags/concurrency.md>), [coroutines](<https://devfeed.tech/tags/coroutines.md>), [dispatcher](<https://devfeed.tech/tags/dispatcher.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [thread](<https://devfeed.tech/tags/thread.md>), [threads](<https://devfeed.tech/tags/threads.md>)

### AI overview

This Kotlin tutorial explains why blocking calls inside suspend functions can prevent other coroutines from running. It contrasts preemptive thread concurrency with cooperative coroutine concurrency and recommends avoiding blocking functions in suspending code, using the I/O dispatcher when necessary, and avoiding runBlocking.

### Source excerpt

Here's a program that launches 3 jobs. The first runs forever and the other two exchange a value. @Test fun test() = runTest { val channel = Channel<String>() val deferredA = async { while (isActive) { delay(1_000) } } val deferredB = async { channel.send("hello") } val deferredC = async { channel.receive() } deferredB.await(

## Rounds.app: Rebuilding an Android Score Pad as a Mobile Website

DevFeed: [Rounds.app: Rebuilding an Android Score Pad as a Mobile Website](<https://devfeed.tech/articles/rounds-app-32246.md>)

Original publisher: [Read original article](<https://publicobject.com/2026/01/15/rounds-app/>)

Author: Jesse Wilson

Published: 2026-01-15T01:57:01Z

Content type: article

Language: en

Sources: [Public Object](<https://devfeed.tech/sources/public-object.md>)

Topics: [App](<https://devfeed.tech/topics/app.md>), [Website](<https://devfeed.tech/topics/website.md>), [Android](<https://devfeed.tech/topics/android.md>), [Mobile](<https://devfeed.tech/topics/mobile.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [app](<https://devfeed.tech/tags/app.md>), [mobile](<https://devfeed.tech/tags/mobile.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [play-store](<https://devfeed.tech/tags/play-store.md>), [ui](<https://devfeed.tech/tags/ui.md>), [website](<https://devfeed.tech/tags/website.md>)

### AI overview

The author describes rebuilding Rounds, an Android score pad app originally published in 2012, as the mobile website Rounds.app after 13 years. The work in progress lets users create games, add scores, and share them, but currently has a mobile-only UI, no game deletion, and bugs.

### Source excerpt

In 2012, I published an Android score pad app named Rounds to the Play Store. I was quite proud of it! It used an iPod click wheel-style score entry UI and balanced capability with simplicity. Rounds' animated action bar in 2012 I joined Square, did a bunch of open source,

## Inside Burst's Test Interceptors

DevFeed: [Inside Burst's Test Interceptors](<https://devfeed.tech/articles/inside-burst-s-test-interceptors-32245.md>)

Original publisher: [Read original article](<https://publicobject.com/2025/09/06/inside-bursts-test-interceptors/>)

Author: Jesse Wilson

Published: 2025-09-06T04:27:03Z

Content type: article

Language: en

Sources: [Public Object](<https://devfeed.tech/sources/public-object.md>)

Topics: [Kotlin Multiplatform](<https://devfeed.tech/topics/kotlin-multiplatform.md>), [Compiler](<https://devfeed.tech/topics/compiler.md>), [Inheritance](<https://devfeed.tech/topics/inheritance.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [compiler](<https://devfeed.tech/tags/compiler.md>), [implementation](<https://devfeed.tech/tags/implementation.md>), [inheritance](<https://devfeed.tech/tags/inheritance.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [tests](<https://devfeed.tech/tags/tests.md>)

### AI overview

This article explains Burst's test interceptors, which provide JUnit-rule-like capabilities for connecting lifecycle behavior to test execution. It describes how Burst, a Kotlin Multiplatform library, uses a compiler plugin instead of reflection and handles interceptor ordering, inheritance, and independently compiled modules.

### Source excerpt

I recently posted on the Cash Code Blog announcing Burst's new test interceptors feature. They are similar to JUnit rules in API and capability. A Small API A typical use case is connecting some lifecycle to a test's execution. Perhaps we want a chess engine to be available

## Coroutines Party Tricks

DevFeed: [Coroutines Party Tricks](<https://devfeed.tech/articles/coroutines-party-tricks-32244.md>)

Original publisher: [Read original article](<https://publicobject.com/2025/06/25/coroutines-party-tricks/>)

Author: Jesse Wilson

Published: 2025-06-25T12:00:00Z

Content type: tutorial

Language: en

Sources: [Public Object](<https://devfeed.tech/sources/public-object.md>)

Topics: [Coroutines](<https://devfeed.tech/topics/coroutines.md>), [Android](<https://devfeed.tech/topics/android.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [code](<https://devfeed.tech/tags/code.md>), [coroutines](<https://devfeed.tech/tags/coroutines.md>), [developer](<https://devfeed.tech/tags/developer.md>), [droidcon](<https://devfeed.tech/tags/droidcon.md>), [presentation](<https://devfeed.tech/tags/presentation.md>), [video](<https://devfeed.tech/tags/video.md>)

### AI overview

A Droidcon NYC presentation explores unconventional Android coroutine techniques after covering coroutine implementation details, scopes, and contexts. It discusses slowing I/O, restructuring code, using reflection, and treating the user as a function.

### Source excerpt

I presented this at Droidcon NYC on June 25, 2025. Available as code, video, slides, Droidtube, & Speaker Deck. Coroutines are an important tool in the Android developer's toolbox. We use 'em to background our tasks, to parallelize our work, and to gracefully cancel operations. This is not a

## Understanding UIViewPropertyAnimator's Presentation-State Behavior

DevFeed: [Understanding UIViewPropertyAnimator's Presentation-State Behavior](<https://devfeed.tech/articles/uiviewpropertyanimator-is-too-cute-32243.md>)

Original publisher: [Read original article](<https://publicobject.com/2025/01/26/uiviewpropertyanimator/>)

Author: Jesse Wilson

Published: 2025-01-26T21:04:55Z

Content type: article

Language: en

Sources: [Public Object](<https://devfeed.tech/sources/public-object.md>)

Topics: [iOS](<https://devfeed.tech/topics/ios.md>), [Swift](<https://devfeed.tech/topics/swift.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [animation](<https://devfeed.tech/tags/animation.md>), [code](<https://devfeed.tech/tags/code.md>), [effect](<https://devfeed.tech/tags/effect.md>), [swift](<https://devfeed.tech/tags/swift.md>)

### AI overview

This article investigates how UIViewPropertyAnimator animates a UIButton's alpha in Swift. It observes that the animated visual state can differ from the property value, that changing some properties during animation may take effect after completion, and that only certain properties animate as expected. An update explains that CALayer.presentation() exposes properties during an animation.

### Source excerpt

I was using the old UIView APIs when I found some code that broke my brain. Here's Swift code to animates a UIButton from opaque to transparent over one second. let button = ... let animateOut = UIViewPropertyAnimator(duration: 1.0, curve: .easeInOut) { print("2 alpha=\(button.alpha)") button.alpha = 0.0

## Fail-Fast Error Handling for Resource Loading in iOS Apps

DevFeed: [Fail-Fast Error Handling for Resource Loading in iOS Apps](<https://devfeed.tech/articles/try-something-simpler-32242.md>)

Original publisher: [Read original article](<https://publicobject.com/2025/01/05/try-something-simpler/>)

Author: Jesse Wilson

Published: 2025-01-05T05:38:25Z

Content type: opinion

Language: en

Sources: [Public Object](<https://devfeed.tech/sources/public-object.md>)

Topics: [Error Handling](<https://devfeed.tech/topics/error-handling.md>), [iOS](<https://devfeed.tech/topics/ios.md>), [Swift](<https://devfeed.tech/topics/swift.md>), [Mobile](<https://devfeed.tech/topics/mobile.md>)

Tags: [crash](<https://devfeed.tech/tags/crash.md>), [error-handling](<https://devfeed.tech/tags/error-handling.md>), [ios](<https://devfeed.tech/tags/ios.md>), [mobile-apps](<https://devfeed.tech/tags/mobile-apps.md>), [swift](<https://devfeed.tech/tags/swift.md>)

### AI overview

The article reflects on whether iOS applications should fail fast or recover gracefully when resource loading fails. It argues that an unrecoverable, unexpected state may justify crashing, while acknowledging the risks of mobile deployments and future API changes.

### Source excerpt

The late Joe Armstrong had a great rule for error handling that stuck with me. 'If you can't do what you want to do try to do something simpler' I was thinking about this recently. I was writing code to embed resource files in an iOS application binary. Here'

## Testing safe area insets on iOS

DevFeed: [Testing safe area insets on iOS](<https://devfeed.tech/articles/testing-safe-area-insets-on-ios-32241.md>)

Original publisher: [Read original article](<https://publicobject.com/2024/11/20/testing-safe-area-insets-on-ios/>)

Author: Jesse Wilson

Published: 2024-11-20T20:04:48Z

Content type: tutorial

Language: en

Sources: [Public Object](<https://devfeed.tech/sources/public-object.md>)

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

Tags: [ci](<https://devfeed.tech/tags/ci.md>), [ios](<https://devfeed.tech/tags/ios.md>), [testing](<https://devfeed.tech/tags/testing.md>)

### AI overview

A developer describes testing safe area inset handling for edge-to-edge UI on iOS. The test required a visible view hierarchy and window, and it passed in CI after replacing one implementation detail. A later update presents a simpler solution involving overriding a superview function and requesting layout.

### Source excerpt

I'm adding edge-to-edge UI support in Redwood. My code asks the host platform how much of the screen is consumed by system bars and notches and things, and it returns us a measurement like '40 pixels at the top + 10 pixels at the bottom'. The iOS code to handle

## Limiting Failure Opportunities in Software Systems

DevFeed: [Limiting Failure Opportunities in Software Systems](<https://devfeed.tech/articles/bad-luck-tickets-32240.md>)

Original publisher: [Read original article](<https://publicobject.com/2024/11/13/bad-luck-tickets/>)

Author: Jesse Wilson

Published: 2024-11-13T05:08:26Z

Content type: opinion

Language: en

Sources: [Public Object](<https://devfeed.tech/sources/public-object.md>)

Topics: [systems](<https://devfeed.tech/topics/systems.md>), [Back end](<https://devfeed.tech/topics/backend.md>), [Databases](<https://devfeed.tech/topics/databases.md>), [Latency](<https://devfeed.tech/topics/latency.md>), [xz](<https://devfeed.tech/topics/xz.md>)

Tags: [backend](<https://devfeed.tech/tags/backend.md>), [database](<https://devfeed.tech/tags/database.md>), [latency](<https://devfeed.tech/tags/latency.md>), [systems](<https://devfeed.tech/tags/systems.md>), [xz](<https://devfeed.tech/tags/xz.md>)

### AI overview

This commentary introduces "bad luck tickets," a way to think about the number of opportunities for failure in a system. It applies the idea to team availability, information sharing, open-source dependencies, supply-chain risk, and fan-out database queries, including how parallel queries inherit the maximum latency of their individual shard queries.

### Source excerpt

My son's swim meet is coming up. If he's healthy, he'll compete. My daughter's hockey team has a game coming up. League rules say they must forfeit if they have fewer than 10 players. There's only 10 girls on the roster so they need everyone