Jonas Stamm

AI engineer, growth hacker, builder

Back to all posts
·5 min read

Why I Chose React Native Over Flutter for BauGPT

Why I Chose React Native Over Flutter for BauGPT

I get asked this question at every startup event. "Why React Native? Flutter is faster."

Here's the honest answer: I didn't pick React Native because it was technically superior. I picked it because it let me move faster with the team I have and the constraints I face.

The Decision Wasn't Technical

When I started BauGPT Mobile, I'd already built the entire backend and web app in TypeScript. Our WhatsApp bot runs on Node.js. Our API is TypeScript. Our internal tools are TypeScript.

Adding Dart to the stack would mean hiring someone who knows Dart. In Munich. For a construction AI startup. Good luck.

With React Native (Expo specifically), any JavaScript developer can jump into the codebase on day one. That's not a theoretical benefit. I hired a frontend dev who started shipping features the same week. No "learn Dart first" onboarding tax.

What Expo Actually Gives You

I'm running Expo SDK 54 with the new architecture (React Native 0.81). The stack:

  • expo-router for file-based routing — same mental model as Next.js
  • expo-secure-store for auth tokens
  • expo-image-picker and expo-file-system for construction site photo uploads
  • i18next for German/English localization

50 TypeScript files. 239 commits since November 2025. That's the entire mobile app.

The thing people miss about Expo: it's not "React Native with training wheels" anymore. It's the default way to build React Native apps. The managed workflow handles signing, building, and deploying. Our Fastlane beta_quick lane pushes a TestFlight build in 4 minutes.

// File-based routing. If you've used Next.js, you already know this.
// app/(main)/chat/[id].tsx → /chat/123
export default function ChatScreen() {
  const { id } = useLocalSearchParams();
  // ...
}

The Flutter Arguments I Considered

Flutter fans always bring up three things:

"Flutter is faster because of Skia rendering." For BauGPT, we're rendering chat messages and forms. Not a game engine. The performance ceiling of React Native's new architecture is higher than what our UI requires. We hit 60fps everywhere that matters.

"Flutter has better cross-platform parity." Fair point. But we're iOS-first in Germany, Android second. We don't need pixel-perfect parity. We need to ship fast on iOS and catch up on Android later. React Native gives us that.

"Flutter's widget system is more consistent." Also true. But React Native has a bigger ecosystem of community packages. When I needed construction-specific PDF generation, I found three React Native libraries. For Flutter: one, and it was poorly maintained.

What Actually Went Wrong

React Native isn't perfect. Here's what hurt:

The nested scroll problem. We have markdown tables inside a FlatList chat feed. Horizontal scroll inside vertical scroll. React Native's gesture system fought us on this for a week. Five different builds before we got it right. Flutter's sliver-based scroll system handles this natively. I'll admit that stung.

Hot reload breaks with native modules. Not often, but when it does, you restart Metro and wait 30 seconds. Flutter's hot reload is genuinely better. Faster, more reliable, fewer state issues.

The bridge is still confusing. Even with the new architecture, debugging performance issues means understanding JSI, Fabric, and TurboModules. The abstraction layers are complex. Flutter's "everything is a widget" model is simpler to reason about when things break.

What Made the Decision Easy

Two things sealed it:

1. Code sharing with the backend. Our AI prompt templates, validation logic, and type definitions are shared between the API and the mobile app. Same language, same types, same package. With Flutter, we'd maintain two versions of every shared module. In practice, this saves about 20% of development time.

2. The AI agent can write it. My development setup uses Claude Code as an autonomous coding agent. It ships features while I'm in meetings. Claude is substantially better at TypeScript/React than at Dart/Flutter. More training data, better patterns, fewer hallucinated APIs. When your primary developer is an AI, the AI's language proficiency matters more than the framework's benchmarks.

That second point sounds weird, but it's the practical reality. About 60% of our commits come from the AI agent. If I'd picked Flutter, that number would be lower because the agent would make more mistakes, need more corrections, and take longer per feature.

Six Months In

The numbers after six months of building BauGPT Mobile with React Native + Expo:

  • 50 TypeScript files (compact codebase, easy to navigate)
  • 239 commits, most pushed automatically
  • 10-20 TestFlight builds per week
  • Auth flow, chat, file uploads, localization, offline storage all working
  • One developer + one AI agent

Would I switch to Flutter if I started over? No. The ecosystem fit, code sharing, and AI compatibility make React Native the right choice for this specific project. If I were building a design-heavy consumer app with a team of 5 Dart developers, different answer.

Pick the framework that matches your constraints, not the one that wins benchmarks. Mine happens to be React Native.


Building BauGPT — AI for construction in Germany. The mobile app is live on TestFlight, Android coming soon.

Enjoyed this post?

Subscribe to get new posts in your inbox every week. No spam, unsubscribe anytime.

Get new posts in your inbox

Weekly insights on AI, growth engineering, and building.