• OpenAI launches GPT-6 Astra with hacking risks in check

    What you need to know GPT-6 Astra is the first OpenAI model to hit the “critical” cybersecurity threat level, but deployment is moving forward with significant safeguards in place. It is currently limited to defensive tasks like secure code review. Advanced capabilities like exploit creation are blocked for now, but trusted users in the Daybreak…

    Read More

  • Test & Set

    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 use ’em a lot. AtomicReference is one…

    Read More

  • Deconstructing OkHttp

    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, we’ll open up the code…

    Read More

  • ‘Humans use Energy and Water too’

    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 consumes a bunch of energy…

    Read More

  • Flattening my Dependency Graph

    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 editing adds Account, Cookie, Passkey, and…

    Read More

  • Keep Android Open

    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 this website on the Keep Android…

    Read More

  • Dynamic Tints with CSS and Kotlin/JS

    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 when the winner changes I’ve got a…

    Read More

  • Don’t Block Suspend Functions

    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() deferredC.await()…

    Read More

  • Inside Burst’s Test Interceptors

    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 while a test is running: class ChessEngineTest…

    Read More

  • Rounds.app

    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, had a bunch of kids,…

    Read More