Lessons about engineering, product development, design, marketing, and anything you need to build a modern business.
Latest

Monarch: Minimal, Manageable, Migrations 🦋

Note: When I left Twitter to become an indie developer I committed to helping others with my work as much as I could. My goal has always been to make the lives of developers a little easier, so they can turn their ideas into, apps, products, and businesses. Every week this month I will be open sourcing something I've built for Plinky, my very own personal Open Source October. My career rests on the foundation that others have created, and I want to continue paying it forward by lowering the barrier for others to make what matters to them. Now, onto the post.

You don't always get it right the first time. That's why pencils have erasers — and why apps have migrations. In over two years of building Plinky, I've made a lot of mistakes changes. I've fixed bugs, rebuilt features completely, and overhauled the app's data architecture with Boutique.

All these changes required migrating user data to prevent a broken experience. Initially, I used a straightforward solution, running a handful of functions on app launch. But to simplify things over time, Monarch — a simple yet flexible migrations library. Continue Reading →

Building A Customizable Framer Component

Note: When I left Twitter to become an indie developer I committed to helping others with my work as much as I could. My goal has always been to make the lives of developers a little easier, so they can turn their ideas into, apps, products, and businesses. Every week this month I will be open sourcing something I've built for Plinky, my very own personal Open Source October. My career rests on the foundation that others have created, and I want to continue paying it forward by lowering the barrier for others to make what matters to them. Now, onto the post.

If you came here for the Buttondown Framer Component I've open sourced, you can skip the post below and grab the code on Buttondown’s official repo. But if you happen to be interested in the technical details of how to build a customizable Framer Component, keep reading for a walkthrough.


When I launched Plinky’s Links You’ll Love newsletter, I knew I needed a beautiful landing page to set the right expectation for quality. The problem? I'm sick and tired of writing HTML, CSS, and JavaScript, with zero interest in building a landing page from scratch. Continue Reading →

Introducing Recap: What's Old Is What's New Again

Note: When I left Twitter to become an indie developer I committed to helping others with my work as much as I could. My goal has always been to make the lives of developers a little easier, so they can turn their ideas into, apps, products, and businesses. Every week this month I will be open sourcing something I've built for Plinky, my very own personal Open Source October. My career rests on the foundation that others have created, and I want to continue paying it forward by lowering the barrier for others to make what matters to them. Now, onto the post.

What’s New? Nm, what’s new witchu?

We've all experienced launching one of our favorite apps, and seeing it's had a big update. When that happens you'll be greeted by screen that says "What's New", even Apple's apps do this. The What's New Screen is a great way to use one of the few moments an app has a user's attention, to let them know about the new value you've delivered.

Apple What's New Screens

Since launching Plinky I've released an update every month. With so many new features, I wanted to ensure that people know I'm adding a lot of value to Plinky. This led me to build my own version of a What's New Screen, in a library I call RecapContinue Reading →

Introducing Plinky: My Love Letter To Links

The post below was written by me, originally featured on the Plinky blog.

To celebrate the launch of Plinky you can get 50% off of a yearly subscription by redeeming this offer: plinky.app/offer/REDPANDA

There are few words I've ever said more excitedly than these: I want to tell you about my latest app, Plinky.

Plinky Screenshots

Plinky makes it incredibly easy to do something we do every day, save links for later. You may already have a way to save links, I know I've tried every method under the sun, to the point where I decided to build my own app. That app is Plinky, and today it's available to download on the App Store. Over the last 18 months people have been loving Plinky, because it fixes the same problems I ran into when I've tried to save links in the past. Continue Reading →

Reflections On An Open Source Project

I've been working on Boutique and Bodega for much of the last three months, officially celebrating the launch of Boutique and Bodega v2 today. If you’d like to learn more about what's new you can read about it in this tweet storm, or read a quick rundown below 1. But this post isn't about Boutique and Bodega, it's about the process of building Boutique and Bodega.

If you'd asked me in April if I'd spend three months this year working on an open source project, I would have said no way. I left my job at Twitter to be an indie developer building apps that represent my vision of personal productivity, but life is funny sometimes. Life teaches the same lesson over and over again — you can't predict what'll be important to you at any point in time. I built something to answer my own question, "what does a good SwiftUI architecture would look like?” for my own apps, and that's what came to be Boutique. But Boutique has blossomed into much more than just a new architecture, it's become a whole new way to build persistence layers, SwiftUI apps, and for me its created a community of people who find my work valuable. Boutique has quickly become a key part of my present and future app development plans, while remaining simple and approachable through many iterations. I've already integrated Boutique into more than half a dozen of my own apps, notably without many issues or much work, and every day I hear from people about how they're using it as well.

I can't say it's all been ups though, there have been plenty of downs as well. I’m writing this post not with the intention of convincing you to build an open source project, nor am I trying to dissuade you from participating in open source. I'm aiming to provide a balanced perspective because I would like nothing more than to see you build something that's important to you, to leave your dent in the universe. If that dent takes the shape of open source project then it would be an honor to have provided a head start based on what I've learned, knowing better what to expect than I did. Continue Reading →

Model View Controller Store: Reinventing MVC for SwiftUI with Boutique

This Twitter thread offers a concise high level 13-tweet summary of this post's announcements, but you miss out on a lot of important detail that I highly recommend reading if you plan to start using the libraries I've developed and introduce in this post, or if you'd like to read an interesting technical walkthrough.

This post was updated on August 22, 2022 to reflect the v2 release of Boutique and related API changes.


Apple has never provided a blessed architecture for SwiftUI, and many developers have spent thousands of hours filling the gaps with their own ideas. A familiar approach for many developers is to take the MVVM pattern many people adopted in their UIKit/AppKit apps and translate it to the needs of SwiftUI. That can work well enough, but you begin to see some cracks in the architecture when you need to manage state and data flow due to how heavily SwiftUI leans on having a single source of truth. Others have taken the path of integrating powerful libraries such as The Composable Architecture which provide you with the tools to reason about your entire application. TCA takes inspiration from redux, more specifically The Elm Architecture, two patterns that are rather incredible in how they allow you to define your entire application as a tree of state. But TCA's great power comes with great responsibility a very high learning curve, which can make it difficult to learn personally. TCA's goals are much more of a fit for solving problems with a very high level of complexity, which may not be necessary for every app.

When it comes to developer ergonomics and program provability MVVM and TCA live on opposite ends of the spectrum. MVVM is lenient and depends on convention while TCA apps are built with rigidity in mind to guarantee correctness. This post isn't meant to be a tour of architectures though, I've mentioned those two patterns to show that there's a spectrum of how we develop software, and I believe there's room for something in between.


If SwiftUI shows us anything it's that declarative programming is the future of software development, and we need an approach to software development that leans into the strengths of the paradigm without being overly constrictive. What's needed isn't a whole new architecture, but to bring together tried and true patterns with a new concept, the Store.  Continue Reading →

Maximum Design For Minimal Effort

Whether you're starting your design journey or if you've been doing design for years, nothing's more important than the fundamentals. The fundamentals are what help you get from 0 to 60, and when it comes to design it turns out that that 60% may be all you need. You can create something really beautiful by understanding color, spacing, typography, and animation, which is what we'll cover in this video. I gave this talk that at Pursuit, while live coding, showing you how to take an app from stock UIKit to something beautiful in only 15 minutes. I've been told quite a few times by people I've shared this talk with that it was invaluable for them, so if you've ever opened up Figma and thought "I don't know where to start", you should take 15 minutes to watch.

And if you need inspiration, here's a repository of resources I've put together to help you along your design journey. Continue Reading →

Coding As Creative Expression

I've seen many versions of this question posed over the years, and to Matthew's credit it's a very good question. As you can see in the replies people translate their lived experience writing code and answer art or science based on however they conceptualize and practice programming. A few years ago MIT conducted a study that concluded "reading computer code is not the same as reading language", answering the question of whether coding is art or science with a rigorously documented "both". While I'm hard-pressed to argue with science, I'd like to provide a different answer, one that's a little more conceptual. Continue Reading →

Creating Slick Color Palette APIs

The work of writing maintainable code is an ongoing endeavor and some of my favorite problems to solve are ones that build maintainable systems. Maintainable systems are ones you can learn once, easily manipulate, and ideally take from project to project. My favorite part of building maintainable systems is that it minimizes the amount of work I need to do when starting a new project, and like it is for many programmers hitting ⌘ + ⇪ + N to start a new project is one of the most satisfying feelings in the world for me. Continue Reading →

Putting the U in GraphQL

GraphQL has been on my list of technologies to learn for a few months now, and last week I came across Majid Jabrayilov's post, feeling pretty excited to tackle the subject. The post was very good, but it didn't answer the one question I've had as I've gone through numerous exercises to understand GraphQL, how do I make GraphQL requests without a library? Continue Reading →