← Journal

April 2026

Choosing a Stack

Before writing any product code for dawncast, I had to decide what to build it with. This is the kind of decision that can eat weeks if you let it. I tried not to let it.

The requirements were simple. I needed a mobile app (iOS first, Android eventually). I needed to move fast, because I am one person. And I needed something I could maintain long-term without hating my life.

Why not native?

I considered going fully native with Swift and SwiftUI. The developer experience is genuinely good now, and the performance ceiling is as high as it gets. But writing the same app twice (once for iOS, once for Android) is brutal for a solo developer. Even if Android is not the priority right now, I did not want to paint myself into a corner.

Flutter was on the list briefly. Dart is fine, but the ecosystem felt thinner than what I was used to, and I did not want to learn a new language and a new framework at the same time as trying to ship a product.

React Native and Expo

I landed on React Native with Expo, and I am happy with the choice. Here is why.

I already know React and TypeScript well. That alone saved me weeks of ramp-up time. The mental model is the same: components, hooks, state management. The only new parts are the native APIs and navigation patterns, which Expo makes surprisingly painless.

Expo specifically was the tipping point. The managed workflow handles builds, signing, OTA updates, and a bunch of other things that would otherwise eat entire weekends. expo-router gives me file-based routing that feels like Next.js. And EAS Build means I do not need a Mac mini sitting in a closet running Xcode for CI.

The backend

For the API, I am using Next.js with route handlers. Yes, the same framework that powers this website. It is already deployed on Vercel, it handles serverless functions well, and I can share types between the API and a future web client without any extra tooling.

The AI pieces (briefing generation, summarization) run through the Anthropic API. Claude handles the heavy lifting of turning raw data into a coherent morning briefing. More on that in a future post.

The trade-off I accepted

React Native is not as fast as native Swift, and there are edges where it shows. Animations can be finicky. Some native APIs require writing a bridge module or finding a community package that does it for you. The debugging experience can be rough when something breaks deep in the native layer.

But for a content-driven app like dawncast, where the core experience is reading and listening, the performance gap is negligible. I would rather ship a polished cross-platform app in two months than a perfect native app in six.

The actual lesson

The best stack is the one that gets out of your way. For me, right now, that is React Native, Expo, Next.js, and TypeScript everywhere. It is not the most interesting answer. But interesting answers are for conference talks. I am trying to ship a product.