expo-web-to-native

Migrate a web React app to a native iOS/Android app with Expo, screen by screen.

Updated Sep 6, 2026
One-click install
npx skills add https://github.com/sombek/fitness-guidance-app --skill expo-web-to-native-sombek
Or copy as Structured Prompt for Agent
Please help me install this Agent Skill.
Skill: expo-web-to-native
Source: https://github.com/sombek/fitness-guidance-app/tree/main/mobile/.agents/skills/expo-web-to-native
Command: npx skills add https://github.com/sombek/fitness-guidance-app --skill expo-web-to-native-sombek

SYSTEM DOCUMENTATION & REQUIREMENTS

💡 This Skill includes references (resource) components.

What problem does it solve? Porting an existing web React app (Next.js, Vite, CRA) to native iOS/Android has no transpiler and no safe big-bang rewrite path. This Skill provides an ordered, strangler-fig migration playbook: stand up an Expo shell, run the whole web UI inside DOM components on day one, then nativize screens one at a time while the app stays shippable. ## Core Features & Use Cases - Assessment and worklist: Reads the repo, separates screens from backend routes, and buckets each screen as port-as-is, nativize-now, nativize-later, or hybrid in a durable migration-progress.md file. - Day-one DOM shell: Brings every screen over as an Expo DOM component so the full app runs on a phone before anything is nativized, shippable to TestFlight immediately. - Native redesign guidance: Maps web UX patterns to @expo/ui SwiftUI/Compose components, Expo Router navigation, and mobile interactions, with a false-friends reference translating web idioms (DOM, CSS, localStorage, React Router) to native equivalents. - Run-time verification: Compares the running web original (via agent-browser) against the native screen (via argent on a simulator) for content and behavior parity, including motion recordings. - Use Case: A team with a Next.js SaaS dashboard wants an iOS app. The Skill assesses routes, ships a DOM-component shell in week one, then nativizes the hot screens with @expo/ui while flagging that Stripe digital-goods payments must move to in-app purchase via RevenueCat. ## Quick Start Use the expo-web-to-native skill to assess this web React repo and start migrating it to a native Expo app screen by screen.

Frequently Asked Questions about expo-web-to-native

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I convert a Next.js app to a native mobile app?

There is no transpiler; you migrate incrementally with Expo. Scaffold an Expo Router shell mirroring your routes, run every screen as a DOM component so the app works on day one, then nativize screens one at a time with @expo/ui while the app stays shippable.

How to reuse web React code in React Native?

Use Expo DOM components ('use dom') to run existing web UI inside native routes as an interim shell. For permanent native screens, redesign with @expo/ui and RN primitives rather than porting the web layout, since idioms like div, className, and onClick do not carry over.

Can I use Stripe in an Expo app for subscriptions?

Not for digital goods: Apple and Google require in-app purchase via store IAP (typically RevenueCat) and take roughly 15-30%, so shipping Stripe for digital subscriptions risks rejection. Stripe's React Native SDK is allowed only for physical goods and services.

Does localStorage work in React Native?

Not by default, but expo-sqlite can polyfill it: importing 'expo-sqlite/localStorage/install' provides a global localStorage so existing web code works unchanged. There is no sessionStorage equivalent, and auth tokens should move to expo-secure-store sent as headers.

Why does my Expo screen build but render blank?

A clean expo export only proves the screen bundles, not that it renders. Verify by running both apps: capture the web original with agent-browser and drive the native simulator with argent, then compare structure and behavior for the same route.

When should I not use DOM components in Expo?

DOM components are an interim shell, not the end state: each carries roughly a 2 MB web runtime and cannot feel native. Layout routes also cannot be DOM components, and hot screens needing gestures, lists, or native feel should be nativized with @expo/ui.