Universal App
A Universal App in Catalyst is a single React application that runs as:
- a server-rendered web app
- an Android app (native webview host)
- an iOS app (native webview host)
The philosophy is simple: keep product logic shared, while allowing platform-specific behavior only where it adds user value.
How It Works
In Catalyst, a universal app is still a web app at its core:
- the UI is the same React application used on the web
- the app still follows the SSR and hydration model
- a native WebView container hosts that app on Android and iOS
- native features are exposed through
WebBridgeand framework hooks
The result is a web-first architecture with native delivery and native capabilities when required.
Design Principles
- Shared-first: Write features once; avoid forked product logic.
- Performance-first: SSR for web, optimized startup for native shells.
- Progressive native: Add native capabilities through hooks when needed.
- Operational simplicity: One repo, one architecture, multi-platform output.
Core Features
- SSR + hydration model
- Universal routing model
- Server and client fetcher model
- Universal cache management
- Native bridge APIs (camera, file, storage, haptics, notifications)
- Build targets for Android and iOS
Architecture Overview
- Web Layer: Shared React pages, routes, and SSR output.
- Server Layer: Node server that renders HTML and coordinates route data.
- Bridge Layer:
WebBridgeconnects JavaScript to native capabilities. - Native Layer: Android and iOS shells host the WebView and execute platform APIs.
Configuration Surface
Universal app behavior is controlled through WEBVIEW_CONFIG, including:
portLOCAL_IPuseHttpsaccessControl.allowedUrlssplashScreennotifications.enabledandroid.buildOptimisationios.appBundleId