Alas, my previous employer hit a bumpy patch. As a result, for the first time in a very long while — before LinkedIn really existed — I am #OpenToWork.
If anyone out there is in need of an Android/Kotlin Multiplatform developer, a serial entrepreneur, or a client-side developer advocate, perhaps I can be of service!
In the meantime, I am back to what I was doing as CommonsWare: working on interesting technologies, writing about them, helping others with them, and seeing where things go. There are a few changes:
-
My personal preference now is toward Kotlin Multiplatform, rather than pure-play Android projects.
-
I have long considered myself to be a teacher and a toolsmith. I did little toolsmithing during my main CommonsWare years, but I expect to be doing more of that, and more open source in general, in the future.
-
Part of that toolsmithing will be in service of using coding agents with local AI models alongside of, or in lieu of, hosted frontier models. I expect that those frontier models will get a lot more expensive, and I have ethical concerns about them. So I want to help developers leverage coding agents, just with less impact on their budgets and on society writ large. Pedal Assist Coding is where I will be doing most of my writing on that.
-
I hope to get into ATProto and ActivityPub this year and next, as a sneak peek of one of the areas you will see me working on.
But, while I am on those journeys, if your organization could use an extra pair of hands,
maybe I can help!
—Apr 15, 2026
Why have just one newsletter when you can have two? 😅
My second newsletter is Pedal Assist Coding. That name is weird enough that I dedicated the second issue to an explanation.
Overall, the newsletter is about coding agents and AI, just not in the “unabashed fanboi” mode that you see a lot of. LLMs, especially for coding agents, have tremendous potential. They also have tremendous problems, especially those using frontier models. I am not going to extol the virtues of running dozens of agents in a swarm and “tokenmaxxing”, but I also am not going to ignore the realities and potential of this technology.
Instead, I am focusing on how to using coding agents (and LLM technology more generally) with an eye towards ethics and developer security (DevSec), with a slight Kotlin Multiplatform bent. For example, today’s post is about the risks of coding agents doing harm to your development environment and one way to try to stop that. Future issues will:
-
Explain how I am blending a bit of frontier models with local models for a coding agent environment, in the hopes that local models will take on more and more of the work over time
-
Illustrate the rationale behind some of the Kotlin Multiplatform tooling I am building up in support of that frontier/local blend… including one I will talk more about here later this week
-
Demonstrate how to use coding agents for things other than pure coding, such as mutation testing or “red-teaming”
-
Highlight uses of LLMs that are not societal risks, but rather help smooth out rough edges in UX or tackle other small problems
If this sounds interesting to you, it is free to subscribe:
Or, add the RSS feed to your favorite feed reader, which does not have to be FeedFlow, though it is my current fave.
You can learn more about the intentions of the newsletter, such as frequency and scope, in my inaugural issue.
I do not know if I will be publishing this newsletter five years from launch, the way I have been for my Jetpack Compose/Compose Multiplatform newsletter. But, for a while, it will be my main vehicle for sharing my discoveries and disasters in small-scale AI and coding agents, with this blog serving more for Android stuff and general CommonsWare news.
—Apr 13, 2026
In terms of totally-new artifacts, androidx.sqlite:sqlite-async and its multiplatform targets are new:
androidx.sqlite:sqlite-async
androidx.sqlite:sqlite-async-android
androidx.sqlite:sqlite-async-iosarm64
androidx.sqlite:sqlite-async-iossimulatorarm64
androidx.sqlite:sqlite-async-js
androidx.sqlite:sqlite-async-jvm
androidx.sqlite:sqlite-async-linuxarm64
androidx.sqlite:sqlite-async-linuxx64
androidx.sqlite:sqlite-async-macosarm64
androidx.sqlite:sqlite-async-tvosarm64
androidx.sqlite:sqlite-async-tvossimulatorarm64
androidx.sqlite:sqlite-async-wasm-js
androidx.sqlite:sqlite-async-watchosarm32
androidx.sqlite:sqlite-async-watchosarm64
androidx.sqlite:sqlite-async-watchosdevicearm64
androidx.sqlite:sqlite-async-watchossimulatorarm64
The roster of nearly 600 updated artifacts can be found here.
—Apr 08, 2026
A long time ago, I published a bunch of Android libraries. Most have since been retired, and it has been quite some time since I published any new code.
I am starting to do more Kotlin Multiplatform work, and so I have published my first KMP library: cw-json.
This will be a collection of artifacts all dealing with JSON. Right now, two are available, both tied to JSON Pointer:
-
com.commonsware.json:kmp-jsonpointer is a JSON Pointer implementation for KMP, defining a JsonPointer type with functions to let you manipulate pointers
-
com.commonsware.json:kmp-jsonpointer-kxs lets you access and mutate JsonObject and JsonArray types from Kotlin Serialization JSON using pointers
Both artifacts are pretty small, but they are the first building blocks in something larger that I have planned.
They are pure Kotlin and are set up to support most major KMP platforms. If you encounter any problems, please raise an issue.
—Apr 07, 2026
It’s not April Fools! Media3 1.10.0 went stable!
Also, we have 1.1.0-beta01 of Navigation Event, including its various multiplatform targets.
Here is what we got overall:
androidx.gradle:gradle-version-catalog:2026.03.01
androidx.gradle:gradle-version-catalog-alpha:2026.03.01
androidx.gradle:gradle-version-catalog-beta:2026.03.01
androidx.media3:media3-cast:1.10.0
androidx.media3:media3-common:1.10.0
androidx.media3:media3-common-ktx:1.10.0
androidx.media3:media3-container:1.10.0
androidx.media3:media3-database:1.10.0
androidx.media3:media3-datasource:1.10.0
androidx.media3:media3-datasource-cronet:1.10.0
androidx.media3:media3-datasource-okhttp:1.10.0
androidx.media3:media3-datasource-rtmp:1.10.0
androidx.media3:media3-decoder:1.10.0
androidx.media3:media3-effect:1.10.0
androidx.media3:media3-effect-lottie:1.10.0
androidx.media3:media3-exoplayer:1.10.0
androidx.media3:media3-exoplayer-dash:1.10.0
androidx.media3:media3-exoplayer-hls:1.10.0
androidx.media3:media3-exoplayer-ima:1.10.0
androidx.media3:media3-exoplayer-midi:1.10.0
androidx.media3:media3-exoplayer-rtsp:1.10.0
androidx.media3:media3-exoplayer-smoothstreaming:1.10.0
androidx.media3:media3-exoplayer-workmanager:1.10.0
androidx.media3:media3-extractor:1.10.0
androidx.media3:media3-inspector:1.10.0
androidx.media3:media3-inspector-frame:1.10.0
androidx.media3:media3-muxer:1.10.0
androidx.media3:media3-session:1.10.0
androidx.media3:media3-test-utils:1.10.0
androidx.media3:media3-test-utils-robolectric:1.10.0
androidx.media3:media3-transformer:1.10.0
androidx.media3:media3-ui:1.10.0
androidx.media3:media3-ui-compose:1.10.0
androidx.media3:media3-ui-compose-material3:1.10.0
androidx.media3:media3-ui-leanback:1.10.0
androidx.navigationevent:navigationevent:1.1.0-beta01
androidx.navigationevent:navigationevent-android:1.1.0-beta01
androidx.navigationevent:navigationevent-compose:1.1.0-beta01
androidx.navigationevent:navigationevent-compose-android:1.1.0-beta01
androidx.navigationevent:navigationevent-compose-desktop:1.1.0-beta01
androidx.navigationevent:navigationevent-compose-iosarm64:1.1.0-beta01
androidx.navigationevent:navigationevent-compose-iossimulatorarm64:1.1.0-beta01
androidx.navigationevent:navigationevent-compose-js:1.1.0-beta01
androidx.navigationevent:navigationevent-compose-linuxarm64:1.1.0-beta01
androidx.navigationevent:navigationevent-compose-linuxx64:1.1.0-beta01
androidx.navigationevent:navigationevent-compose-macosarm64:1.1.0-beta01
androidx.navigationevent:navigationevent-compose-mingwx64:1.1.0-beta01
androidx.navigationevent:navigationevent-compose-tvosarm64:1.1.0-beta01
androidx.navigationevent:navigationevent-compose-tvossimulatorarm64:1.1.0-beta01
androidx.navigationevent:navigationevent-compose-wasm-js:1.1.0-beta01
androidx.navigationevent:navigationevent-compose-watchosarm32:1.1.0-beta01
androidx.navigationevent:navigationevent-compose-watchosarm64:1.1.0-beta01
androidx.navigationevent:navigationevent-compose-watchosdevicearm64:1.1.0-beta01
androidx.navigationevent:navigationevent-compose-watchossimulatorarm64:1.1.0-beta01
androidx.navigationevent:navigationevent-desktop:1.1.0-beta01
androidx.navigationevent:navigationevent-iosarm64:1.1.0-beta01
androidx.navigationevent:navigationevent-iossimulatorarm64:1.1.0-beta01
androidx.navigationevent:navigationevent-js:1.1.0-beta01
androidx.navigationevent:navigationevent-linuxarm64:1.1.0-beta01
androidx.navigationevent:navigationevent-linuxx64:1.1.0-beta01
androidx.navigationevent:navigationevent-macosarm64:1.1.0-beta01
androidx.navigationevent:navigationevent-mingwx64:1.1.0-beta01
androidx.navigationevent:navigationevent-testing:1.1.0-beta01
androidx.navigationevent:navigationevent-testing-android:1.1.0-beta01
androidx.navigationevent:navigationevent-testing-iosarm64:1.1.0-beta01
androidx.navigationevent:navigationevent-testing-iossimulatorarm64:1.1.0-beta01
androidx.navigationevent:navigationevent-testing-js:1.1.0-beta01
androidx.navigationevent:navigationevent-testing-jvm:1.1.0-beta01
androidx.navigationevent:navigationevent-testing-linuxarm64:1.1.0-beta01
androidx.navigationevent:navigationevent-testing-linuxx64:1.1.0-beta01
androidx.navigationevent:navigationevent-testing-macosarm64:1.1.0-beta01
androidx.navigationevent:navigationevent-testing-mingwx64:1.1.0-beta01
androidx.navigationevent:navigationevent-testing-tvosarm64:1.1.0-beta01
androidx.navigationevent:navigationevent-testing-tvossimulatorarm64:1.1.0-beta01
androidx.navigationevent:navigationevent-testing-wasm-js:1.1.0-beta01
androidx.navigationevent:navigationevent-testing-watchosarm32:1.1.0-beta01
androidx.navigationevent:navigationevent-testing-watchosarm64:1.1.0-beta01
androidx.navigationevent:navigationevent-testing-watchosdevicearm64:1.1.0-beta01
androidx.navigationevent:navigationevent-testing-watchossimulatorarm64:1.1.0-beta01
androidx.navigationevent:navigationevent-tvosarm64:1.1.0-beta01
androidx.navigationevent:navigationevent-tvossimulatorarm64:1.1.0-beta01
androidx.navigationevent:navigationevent-wasm-js:1.1.0-beta01
androidx.navigationevent:navigationevent-watchosarm32:1.1.0-beta01
androidx.navigationevent:navigationevent-watchosarm64:1.1.0-beta01
androidx.navigationevent:navigationevent-watchosdevicearm64:1.1.0-beta01
androidx.navigationevent:navigationevent-watchossimulatorarm64:1.1.0-beta01
—Apr 01, 2026