iPX Directory

Directory Technology

Zac Sweers

Listed, no subscribers yet

Paste it into any podcast app or feed reader to subscribe.

Musings on Kotlin, mobile, open source, and building good things.

Latest posts

How to Take an 11 Month Sabbatical

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 2026
Introducing Kempt

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 2026
πŸš‡ Metro is Stable

New 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 2026
I have two passing tests

which isn't many, but it's two more than I had yesterday

8 Mar 2026
Two Pillars of (Engineering) Management

A 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 2026
Metro 0.11.0 and MEEPs!

Metro 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 2026
Re: Dependency Injection vs. Service Locators

This 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 2026
Where are all the staff+ Android product engineers?

Over 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 2026
Sponsoring Metro

Metro 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 2026
Metro's Design Doc

Back 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 2025
Forklifts Require Training

Sleepwalking 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 2025
Don't use Type-safe Project Accessors with Kotlin Gradle DSL

Another 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 2025
Introducing Metro

I'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 2025
One Last View of Mom

We 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 2025
Gradle Footguns: Don't add potentially-empty providers to collection properties

After 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