DEV Community

Cover image for Ship a React Native app in days, not months
Chris F A
Chris F A

Posted on • Originally published at applighter.com

Ship a React Native app in days, not months

TL;DR

  • ~4 weeks of every React Native project is setup, not product
  • One HSL-derived theming primitive kills grep-and-replace rebranding
  • A hybrid data provider means the repo runs on the simulator with zero env vars
  • RLS policies belong in the migration, not in your head at 2am
  • Stripe webhook → entitlement grant → authorized download is 3–5 days of small correct decisions
  • Agent-legible codebases (small files, typed providers, NativeWind) are a real speed multiplier in 2026

If you've ever started a React Native project on Monday and looked up on Friday to realize you've written zero product code — only auth, DB migrations, and EAS config — this post is for you.

Applighter customers ship in days, not months. Not because they're faster developers, but because the patterns below are already in the repo when they clone it.

The setup tax

Every React Native project pays it:

Task Days
Auth (email + OAuth) 3–5
DB schema + RLS 2–4
Stripe + entitlements 3–5
AI streaming 4–7
EAS build/submit 1
Design system 2–3
Push 2
Total ~4 weeks

Before line one of your product code.

Pattern 1: one theming primitive

// app/apps/lib/theme.ts
export function applyProductTheme(brandHex: string) {
  const hsl = hexToHsl(brandHex)
  // propagates to background, foreground, primary, secondary,
  // muted, accent, destructive — all HSL-derived
  return buildPalette(hsl)
}
Enter fullscreen mode Exit fullscreen mode

One color in, full palette out. Rebrand an app in 20 minutes, not a weekend of grep-and-replace.

Pattern 2: hybrid data provider

// app/apps/lib/data/provider.ts
export async function getProductData(slug: string) {
  try {
    const data = await fetchFromSupabase(slug)
    if (data) return data
  } catch {}
  return staticFallback[slug]  // ships in the bundle
}
Enter fullscreen mode Exit fullscreen mode

Cloned repo runs on the simulator without env vars. First-run latency: 60 seconds, not 90 minutes.

Pattern 3: RLS pre-baked

-- supabase/migrations/20260112085737_create_transactions_table.sql
alter table transactions enable row level security;

create policy "users read own transactions"
  on transactions for select
  using (auth.uid() = user_id);
Enter fullscreen mode Exit fullscreen mode

Every table ships with the policy. You audit, you don't design.

Reference: Supabase RLS docs.

Pattern 4: Stripe → grant → download

// app/api/webhook/stripe/route.ts
if (event.type === "checkout.session.completed") {
  const { isBundle, targets } = await resolveGrantTargets(supabase, productId)
  await grantProducts(supabase, {
    userId,
    productId,
    licenseType,
    source: "stripe_purchase",
  }, targets)
  await sendReceiptEmail({ userId, downloadUrl })
}
Enter fullscreen mode Exit fullscreen mode

Bundles expand into individual grants. Guest checkouts validated by session_id. Single/Multiple/Enterprise license types. It's the code you'd write in day 4 of a Stripe integration — but it's already there.

Pattern 5: EAS ready

// eas.json
{
  "build": {
    "development": { "developmentClient": true, "distribution": "internal" },
    "preview": { "distribution": "internal" },
    "production": { "autoIncrement": true }
  },
  "submit": { "production": {} }
}
Enter fullscreen mode Exit fullscreen mode

/ship slash command → eas build --profile production && eas submit. See Expo EAS docs.

Pattern 6: agent-legible codebase

Every template ships with a .claude/ directory of slash commands. /add-screen, /swap-backend, /audit-security. They work because the codebase is:

  • Small files, obvious responsibilities
  • NativeWind classes (Tailwind semantics)
  • Typed data providers
  • Colocated components with their tests

An agent (Claude Code, Cursor) can extend it without wandering. That's a real speed multiplier in 2026.

Comparison

From scratch Free boilerplate Applighter
Time to TestFlight 4–6 weeks 2–3 weeks 3–5 days
Backend You build Not included Supabase, wired
Payments You build Not included Stripe + grants
RLS You design N/A Pre-baked
Updates You maintain Repo-dependent Lifetime
Cost ~$8–20k dev time Free + hidden time $79 one-time

Compare with other template projects to see the market.

What ships in days vs. weeks

Bimodal distribution across ~500 customers:

  • 3–5 days: rebrand-and-launch on an existing template (weather, fitness, e-learning)
  • 2–4 weeks: novel AI product built on template infrastructure (voice notes, PDF chat, calorie tracker)

Both compress the ground-up equivalent by ~4x.

When not to use a template

  • Building something the data model doesn't stretch to fit (games, real-time collab)
  • Learning React Native for its own sake
  • Need a stack we don't ship (Firebase, Convex, bare RN)

FAQ

Do I need Supabase experience? No. Templates run with the DB seeded.

Can I skip the theming layer? Yes. Default colors ship out of the box.

What if a new Expo SDK breaks it? Updates are pushed to your dashboard. Pull and diff.

Refunds? 7-day money-back, documented in the refund policy on applighter.com.

Try one

The full template catalog lives on applighter.com — $79 one-time, full source, lifetime updates.

What's the piece of setup that eats the most of your time on a new RN project? Drop it in the comments — theming, RLS, or Stripe entitlements are the three I'd bet on.

Top comments (0)