A sequel to the last one , but a bit longer. On Leaving Slack After nearly 6 years, I left Slack in August of 2025. It was for a combination of reasons that added up to "it's time". The biggest reason was that Salesforce (who acquired Slack while I was there) would not grant tenured/high level Slack employees equity refreshers. So, I was on track to make ~30% less in 2025 than I was in, say, 2023.
29 Jun 2026Musings on Kotlin, mobile, open source, and building good things.
Latest posts
Formatting should be boring, in the best possible way. kempt is a little hobby project I've put together to get away from Spotless/Gradle and simplify setting up commit hooks across my projects. π‘ TL;DR: kempt is a single-entry point CLI that delegates to language-specific formatters with easy installation, automatic binary management, git hook integration, license headers, whitespace handling, an
23 Jun 2026New here? Metro is a multiplatform, compile-time dependency injection framework for Kotlin implemented as a compiler plugin. Metro 1.0.0 is out now and stable . This means that its runtime APIs (runtime, MetroX artifacts, Gradle plugin, etc.) are now API-stable unless annotated with an experimental annotation. This is an exciting milestone! Metro's come a long way since its early days in November
27 Apr 2026which isn't many, but it's two more than I had yesterday
8 Mar 2026A former colleague once described their view of management as a role measured by two* pillars. As an IC, I really like this framing of it and it's helped me a ton of times in knowing how to best work with different types of EMs over the years. You can kinda think of them on a Y-axis where 100 is great and 0 is awful/non-existent. Pillar 1: Technical familiarity This pillar is the manager's technic
3 Mar 2026Metro 0.11.0 is out now and it's a fun milestone in Metro's development. Up to this point most of the work in Metro has been focused around the foundation, interop, and frankly feature parity. It's in a really good place on that front now! Now, Metro will try to push the envelope and explore more advanced and new features. It's done a little of this prior to now, like dynamic graphs . To broaden i
25 Feb 2026This is a port of a write-up I did in the Kotlin Lang slack here in response to the question "Dagger vs. Hilt vs. Koin vs. Metro vs. <what comes next>. Serious question: Are there any compelling reasons to switch from Koin to Metro in a Compose Kotlin multiplatform project?" I think it's largely better to think of the frameworks [OP] listed as two categories that solve different problems in differ
20 Feb 2026Over the years I've heard (and experienced) both sides of a rather odd coin in the Android developer world. Side 1: Companies, particularly startups and small teams, want staff+ Android product engineers and struggle to find them. Side 2: Staff+ Android engineers struggle to find jobs if they involve product work. Companies/non-Android folks in general are surprised by the apparent lack of high le
9 Feb 2026Metro is the proudest work of my career. Ever since starting it on vacation in November 2024, building it has been an incredible journey and the community reception has been nothing short of wonderful. It sits at the intersection of several fields I've come to specialize in, ranging from metaprogramming to compilers to static analysis to dependency injection itself. I've learned a lot along the wa
29 Jan 2026Back in December 2024, I was around a month into working on Metro (at the time still called Lattice) and realized it crossed the threshold from "is this anything" to "oh shit this has wheels". I'd been talking informally with a few folks in the community at the time, but it was ready for a proper design review to get more feedback. So, like anyone, I spent the holidays writing a 30-something page
6 Nov 2025Sleepwalking into labor collapse A lot gets covered in today's discourse about AI in software development. Most of it is noise, ranging from nihilism that we're all writing mediocre code anyway so why does it matter to endless wannabe AI influencers doing engagement bait on Twitter. Every new model release gets a bunch of threadicles π amounting to the 2025 version of "Safari feels snappier". Some
18 Aug 2025Another Gradle footgun Gradle 7.0 introduced the type-safe project accessors feature for IDE support of referencing projects in dependencies. This allowed you to replace this: dependencies { implementation(project(":lib1")) } with this dependencies { implementation(projects.lib1) } This is great! Improved IDE support is always a good thing for developer experience and it's super convenient to have
2 Jul 2025I'm excited to share something new I've been working on the past few months! Metro is a compile-time dependency injection framework that draws heavy inspiration from Dagger , Anvil , and Kotlin-Inject . It seeks to unify their best features in one, cohesive solution while adding a few new ones and implemented as a compiler plugin. For some time, it's felt like the Kotlin community has wanted for a
3 Apr 2025We said goodbye to mom in May after a five year battle with cancer. She left on her own terms, under the care of the wonderful University of Vermont hospice network and Act 39. The day mom passed, my dad and sister asked me to stay with her after she went to sleep. Everyone has their own role to play in these moments. After all the work theyβd done and endured living with her in the years leading
17 Feb 2025After pairing with Tony Robalik on a recent weird behavior I was seeing in Gradle, we encountered a deliciously evil bug in Gradle. It's documented a little in Gradle 8.7's release notes (see Better API for updating collection properties ), but the basic premise is below. abstract class MyTask : DefaultTask() { @get:Input abstract val listProperty: ListProperty<String> } listProperty.add("one") li
11 Sep 2024