Skip to content
Skip to content
Goodspeed

Build apps with React Native

Every Goodspeed app is a React Native codebase; one TypeScript repo that compiles to native iOS and Android with no webview shortcuts. Goodspeed generates React Native as a standard part of every app, so the output is a working codebase from day one, not a scaffold you have to finish yourself.

WHAT GETS GENERATED

Built into every React Native build

Every app Goodspeed generates with React Native includes these production-ready patterns, wired together from the first build.

ItemDescriptionStrength
Screen components in app/(tabs)/File-based route components under app/(tabs)/ wire navigation, data fetching, and layout into production-ready screens.Architecture
Reusable UI primitives in components/ui/Typed NativeWind-styled primitives (Button, Card, Input, Badge) that match the app design system generated from gas.config.ts.Components
Native gesture + animation layerreact-native-gesture-handler and react-native-reanimated wired for swipe gestures, drag-to-dismiss, and shared-element transitions.UX
Platform-split code pathsPlatform.OS guards and .native.ts/.web.ts file extensions separate native-only modules (SecureStore, Camera) from web-compatible fallbacks.Compatibility
TypeScript throughoutFull tsc --noEmit gate in scripts/release.mjs rejects the build if the generated code has type errors before EAS Build runs.Quality
Offline queue against Supabaselib/offline.ts queues writes when the device has no network and replays them in order when connectivity returns.Reliability

Source: gas-template repository · Mobile Framework

REAL GENERATED CODE

A snippet from a React Native app the studio shipped

This pattern comes directly from the gas-template codebase, the foundation every Goodspeed app is generated on. The studio generates React Native code like this for every app in the pipeline, not just a hello-world scaffold.

  1. Platform split

    // lib/supabase.ts: platform-split storage adapters
    const ExpoSecureStoreAdapter = {
      getItem: async (key: string) => {
        try { return await SecureStore.getItemAsync(key); }
        catch { return null; }
      },
    };
    const WebStorageAdapter = {
      getItem: (key: string) =>
        Promise.resolve(typeof window !== 'undefined'
          ? window.localStorage.getItem(key) : null),
    };
GDaily Allergens

Today's log

Gluten
Tree nuts
Shellfish
Dairy
HomeScanLogProfile

START WITH REACT NATIVE

Your React Native app, generated