●TOOLING — Rork's developer repos keep moving: rork-xcode was updated on July 16, rork-device on July 15, and rork-plist on July 13●OPUS46 — Claude Opus 4.6 is live in Rork, and Rork Max is built to assemble apps on top of Claude Code●SIM — A cloud iOS simulator runs in the browser, with one click to install on a device and two clicks to publish to the App Store●MAX — Rork Max emits pure Swift rather than React Native, reaching iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and even iMessage●NATIVE — That opens up HealthKit, ARKit and LiDAR, NFC, Dynamic Island, Live Activities, 3D through Metal, and on-device inference with Core ML●SEED — Rork raised a $15M seed led by Left Lane Capital, with Peak XV and a16z Speedrun joining the round●TOOLING — Rork's developer repos keep moving: rork-xcode was updated on July 16, rork-device on July 15, and rork-plist on July 13●OPUS46 — Claude Opus 4.6 is live in Rork, and Rork Max is built to assemble apps on top of Claude Code●SIM — A cloud iOS simulator runs in the browser, with one click to install on a device and two clicks to publish to the App Store●MAX — Rork Max emits pure Swift rather than React Native, reaching iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and even iMessage●NATIVE — That opens up HealthKit, ARKit and LiDAR, NFC, Dynamic Island, Live Activities, 3D through Metal, and on-device inference with Core ML●SEED — Rork raised a $15M seed led by Left Lane Capital, with Peak XV and a16z Speedrun joining the round
Rork Max × Expo Router Web: Deploy iOS, Android & Web from a Single Codebase
A complete guide to adding web support to your Rork Max app using Expo Router v5. Covers platform-specific UI branching, SEO meta tags, Cloudflare Pages deployment, and a unified CI/CD pipeline for iOS, Android, and Web.
"We have an iOS and Android app — can we also ship a web version?" It's a common question, and the traditional answer involves maintaining a separate Next.js or Remix codebase, doubling or tripling your maintenance burden every time you add a feature.
Expo Router v5's web support changes this equation significantly. Your Rork Max–generated React Native app can be compiled for the browser with minimal additional code. This guide covers everything from the initial setup to SEO optimization, Cloudflare Pages deployment, and a unified CI/CD pipeline that ships all three platforms on every commit.
How Expo Router Web Works
Expo Router is a file-system routing library built on React Navigation. Under the hood, web builds use react-native-web to map React Native primitives to DOM elements: <View> becomes <div>, <Text> becomes <span>, and so on.
Your app/ directory structure becomes your URL structure:
# Development — opens in browser alongside the simulatornpx expo start --web# Production static buildnpx expo export --platform web# Output: dist/ directory with HTML, JS, and CSS files
✦
Thank you for reading this far.
Continue Reading
What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.
WHAT YOU'LL LEARN
✦Configure Expo Router v5 web support to manage iOS, Android, and Web from a single codebase
✦Platform branching with Platform.select and .web.tsx file extensions for platform-specific UI
✦Deploy to Cloudflare Pages with automatic SSL, custom domains, and a unified GitHub Actions CI/CD pipeline
Secure payment via Stripe · Cancel anytime
✦
Unlock This Article
Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.
Expo Router uses the browser's History API on web. <Link> components automatically render as <a> tags, giving you correct SEO semantics and keyboard accessibility without any extra work:
import { Link } from 'expo-router';// Renders as <a href="/articles/my-article"> on web// Navigates natively on iOS/Android<Link href="/articles/my-article" asChild> <TouchableOpacity> <Text>Read Article</Text> </TouchableOpacity></Link>
A single push to main queues iOS and Android builds on EAS while simultaneously deploying the latest web version to Cloudflare's global edge network.
Performance Optimization for Web
Optimized Images with expo-image
import { Image } from 'expo-image';import { Platform } from 'react-native';// expo-image automatically serves WebP/AVIF on web// with lazy loading and blur placeholder built inconst OptimizedImage = ({ uri, ...props }: ImageProps) => ( <Image source={{ uri }} placeholder={{ blurhash: 'L6PZfSi_.AyE_3t7t7R**0o#DgR4' }} contentFit="cover" transition={200} {...props} style={[props.style, Platform.OS === 'web' && { maxWidth: '100%' }]} />);
Font Loading Without Layout Shift
// app/_layout.tsxexport default function RootLayout() { const [loaded] = useFonts({ 'SpaceMono-Regular': require('../assets/fonts/SpaceMono-Regular.ttf'), }); useEffect(() => { if (loaded) SplashScreen.hideAsync(); }, [loaded]); // On web, render immediately with system font fallback // rather than blocking the entire page render if (!loaded && Platform.OS !== 'web') return null; return <Slot />;}
Common Issues and Fixes
window is not defined
Occurs when browser-specific APIs are used in universal code. Guard with typeof window !== 'undefined' or Platform.OS === 'web'.
Scrolling behaves differently on Web
Add contentContainerStyle={{ flexGrow: 1 }} to <ScrollView> for consistent behavior across platforms.
AsyncStorage on Web@react-native-async-storage/async-storage works on web as a localStorage wrapper. Be aware of private browsing limitations and storage quotas.
Gesture Handler limited on Webreact-native-gesture-handler has partial web support. For web-only interactions, fall back to native DOM events (onMouseEnter, onClick) using the .web.tsx file extension pattern.
A Note from an Indie Developer
Closing Thoughts
Expo Router's web support won't give you a 100% code-share rate — realistic estimates are 60–80% depending on how much native hardware you use. But that's still a dramatic reduction compared to maintaining three independent codebases.
Your Rork Max–generated app is already structured in a way that's compatible with this approach. Add web support, configure Cloudflare Pages, and you've tripled your potential audience while keeping your development overhead nearly the same. That's a compelling proposition for any indie developer.
Share
Thank You for Reading
Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.