All articlesReact NativeExpoRevenueCatStack

The stack that lets me ship a React Native app in two weeks

Expo, EAS, Supabase, RevenueCat, PostHog and Sentry, chosen once and never chosen again. What each one does, and what I refuse to add.

Filipi RafaelFilipi Rafael3 min read

The fastest way to ship the next app is to make no decisions about how. My stack was chosen once, in a document, and every app since has inherited it. This is that document, with the reasons.

Expo, with EAS for everything around the binary

Expo Router for navigation, TypeScript everywhere, one codebase for iOS and Android. EAS Build produces the binaries, EAS Submit pushes them to both stores, EAS Update ships JavaScript fixes over the air without a review queue. The last one is the quiet hero: a copy fix on launch day goes out in minutes, not days.

Native modules are the exception, not the rule. Swift and Kotlin come out only when a screen needs something Expo does not offer, and that decision is written down in the idea's score before the build starts.

Supabase as the only backend

Postgres, auth, storage and edge functions, in one project shared by every app, with a schema per app and row-level security on every table. I wrote a whole post about it. The short version: the next app's backend already exists.

Auth is social only. Sign in with Apple and Google, never email and password. Fewer screens to build, no password reset flow, and the store reviewers like it.

RevenueCat for money

Every app charges through in-app purchases, because Apple and Google require it for digital goods and because fighting that is a full-time job. RevenueCat sits in front of both stores: one SDK, entitlements that survive reinstalls, a dashboard that agrees with itself, and paywall experiments without an app update.

The default offer is the same for every app until data says otherwise: a weekly plan around five dollars, an annual plan around thirty, a short free taste, then a paywall that is hard but not rude.

PostHog for truth, Sentry for sleep

One PostHog project for the whole portfolio, every event tagged with the app it came from. Funnels are the only reports I read weekly: onboarding completion, paywall view to trial, trial to paid. Sentry catches the crashes, one project per app so the alerts have a name.

Resend for email, Vercel for the web

Transactional email from a subdomain, campaign email from another, both verified once and shared by every app. The landing pages live on this site, one folder per app, generated from a manifest, so a new app's page is an entry in a file rather than a project.

What I refuse to add

  • A second backend, ever. If Supabase cannot do it, the feature waits.
  • Web checkout. Stripe on a landing page means a second billing system, a second set of receipts and a fight with the stores. The funnel ends in the store.
  • A design system per app. Colours and the mascot change; the components, spacing and motion do not.
  • Anything with a review queue on the critical path of a first release: screen-time entitlements, HealthKit writes, background location.

Why this is the whole point

Two weeks is not a speed record. It is what is left when the stack, the backend, the billing, the analytics and the landing page are already decided. The only new thing in each build is the idea, which is the only thing that should be new.

Filipi Rafael

Filipi Rafael

Mobile software engineer, React Native

frafael.co

Keep reading