A new Raycast clone ships every week now that AI has collapsed the cost of building one. Most of them are solving the wrong problem. The actual moat was never the launcher, it was what users could build on top of it.
Read →
Software Developer at Adobe building Photoshop. Writing about macOS tools, systems programming, and creative software.
A new Raycast clone ships every week now that AI has collapsed the cost of building one. Most of them are solving the wrong problem. The actual moat was never the launcher, it was what users could build on top of it.
Read →It started with the Facebook News Feed and ended with us mistaking dopamine for learning and notifications for community. A note on why uninstalling the app isn't enough anymore.
Read →A quiet account of what it feels like to keep your job in an industry that's letting people go in waves. Notes from a tired engineer, written late at night.
Read →AI made building software faster than it has ever been. It also made building bad software faster than it has ever been. Teams are confusing the two, and the cost is showing up everywhere except the dashboards that matter.
Read →Pin-based commenting has been the default for collaborative review for over a decade. It has a structural problem: pins anchor to coordinates, not to the things people actually care about. Here's what a better model could look like.
Read →A career in software is long, but every individual quarter wants to feel like a startup. Here's how I think about saying no, splitting time, owning a calendar, and protecting the version of yourself that has to keep doing this for thirty more years.
Read →The moment you write the word virtual, the compiler quietly adds an invisible pointer to every instance of your class. Here's what it looks like, why it's there, and how the bill grows when inheritance gets complicated.
Read →It seems like a contradiction. The same distribution that's hopelessly inadequate for generating images is at the heart of the most powerful image generators we have. The resolution is in what we're asking it to do.
Read →A pattern for treating unrelated types as if they shared a common interface, without making them inherit from anything. The same trick behind std::function, std::any, and a lot of modern C++ APIs.
Read →A short look at why naive history implementations corrupt their own past, and how a 50-year-old trick fixes it without paying the cost of copying everything.
Read →