Expo

Open-source framework for building universal native apps with React that run on Android, iOS, and the web.

Framework
npm
v57.0.25
52,467 stars
MIT License

Repository Health

Pre-computed score based on development activity, maintenance, community, maturity, and trend momentum. How we score it →
88 /100 Excellent
Development Activity 100
Maintenance 72
Community 80
Maturity 60
Momentum 40

Technical Analysis

AI-assessed by reading the actual repository — architecture, code quality, innovation, and documentation. How we score it →
86 /100 Excellent
Architecture 88
Code Quality 78
Innovation 88
Learning Curve 72

Expo is an open-source framework that lets you build universal native applications for Android, iOS, and the web from a single JavaScript and TypeScript codebase written with React. It ships a universal runtime, a broad library of native modules, a powerful CLI, file-based routing via Expo Router, and the Expo Modules API for authoring your own native code.

Beyond the SDK, Expo scaffolds new projects with create-expo-app, bundles with a preconfigured Metro setup, and manages native configuration through config plugins so you rarely need to touch Xcode or Android Studio. It underpins a huge share of the React Native ecosystem and integrates deeply with Expo Application Services (EAS) for cloud builds, submissions, and over-the-air updates.

What You Get

  • A universal runtime plus the registerRootComponent entry point that boots your React app natively across Android, iOS, tvOS, and web.
  • The expo CLI for starting a dev server, running on simulators/devices, and prebuilding native projects, plus create-expo-app scaffolding.
  • A large library of first-party native modules (camera, file system, fonts, notifications, and more) with automatic native autolinking.
  • The Expo Modules API for authoring your own Swift/Kotlin native modules with a typed JavaScript bridge.
  • File-based navigation through Expo Router and a preconfigured Metro bundler, Babel preset, and config-plugin system for native setup.

Common Use Cases

  • Shipping a cross-platform mobile app to the App Store and Google Play from one React codebase.
  • Building a universal app that targets mobile and the web simultaneously with shared UI and logic.
  • Prototyping quickly with Expo Go and Snack, then graduating to custom native code via development builds.
  • Adding native capabilities (camera, notifications, secure storage) without writing platform-specific glue by hand.
  • Automating cloud builds, store submissions, and over-the-air updates through EAS integration.

Under The Hood

Architecture — The expo package is the entry point of a large pnpm/Turbo monorepo. Its public surface (src/Expo.ts) re-exports the runtime from expo-modules-core (EventEmitter, SharedObject, NativeModule, requireNativeModule) and adds framework glue: registerRootComponent wraps React Native’s AppRegistry.registerComponent, runs AppRegistry.runApplication on web, wires Fast Refresh and dev tooling, and polyfills globals via the Expo.fx side-effect module. Native modules are discovered through expo-modules-autolinking and configured declaratively with config plugins (@expo/config-plugins), while the expo binary shells into @expo/cli for the dev server, prebuild, and device runners.

Tech Stack — Written primarily in TypeScript (~57% of the repo) with substantial Kotlin, Swift, and Objective-C for the native layers. It depends on expo-modules-core, a curated set of first-party modules (expo-asset, expo-constants, expo-file-system, expo-font, expo-keep-awake), @expo/cli, @expo/metro/@expo/metro-config, and babel-preset-expo; React, React Native, react-dom, and react-native-web are peer dependencies. Builds run through expo-module-scripts, with Metro as the bundler and Babel as the transform pipeline.

Code Quality — The codebase is strictly typed and linted with oxlint and tsc typechecking, with platform-specific file variants (.web.tsx, .ios.tsx) cleanly separating targets. Tests exist and run under Jest, though the expo package itself carries a modest unit-test suite (a handful of specs in src/__tests__); the bulk of testing lives across sibling packages and app fixtures in the monorepo. Naming is consistent and public APIs are documented with JSDoc annotations.

API Design — Developer experience is a core strength: a new app is one create-expo-app command, and booting is a single registerRootComponent(App) call. The public API is small and well-named, native capabilities are added by installing a module rather than editing native projects, and documentation at docs.expo.dev is extensive with an API reference, guides, and in-browser Snack examples. Deprecated exports are annotated with migration hints, easing upgrades.

Used by 438 apps in this directory

TypeScript
85%
Apache 2.0

superset

AI Code Assistants · AI Development

14,690

Orchestrate an army of AI coding agents—Claude Code, Codex, Gemini CLI, and more—running simultaneously in isolated git worktrees from a single Electron desktop app.

View details
86
Repo Health
80
Technical
64
Dependency
Built with
TypeScript 85%
Updated 1 weeks ago
TypeScript
85%
Apache 2.0

superset

AI Code Assistants · AI Development

14,690

Orchestrate an army of AI coding agents—Claude Code, Codex, Gemini CLI, and more—running simultaneously in isolated git worktrees from a single Electron desktop app.

View details
86
Repo Health
80
Technical
64
Dependency
Built with
TypeScript 85%
Updated 1 weeks ago
TypeScript
85%
Apache 2.0

superset

AI Code Assistants · AI Development

14,690

Orchestrate an army of AI coding agents—Claude Code, Codex, Gemini CLI, and more—running simultaneously in isolated git worktrees from a single Electron desktop app.

View details
86
Repo Health
80
Technical
64
Dependency
Built with
TypeScript 85%
Updated 1 weeks ago
TypeScript
98%
Apache 2.0

Tianji

Analytics · Monitoring

3,100

Replace Google Analytics, UptimeKuma, and Prometheus with one self-hosted platform that tracks websites, monitors uptime, and reports server health.

View details
86
Repo Health
76
Technical
65
Dependency
Built with
TypeScript 98%
Updated 1 weeks ago
TypeScript
98%
Apache 2.0

Tianji

Analytics · Monitoring

3,100

Replace Google Analytics, UptimeKuma, and Prometheus with one self-hosted platform that tracks websites, monitors uptime, and reports server health.

View details
86
Repo Health
76
Technical
65
Dependency
Built with
TypeScript 98%
Updated 1 weeks ago
TypeScript
98%
Apache 2.0

Tianji

Analytics · Monitoring

3,100

Replace Google Analytics, UptimeKuma, and Prometheus with one self-hosted platform that tracks websites, monitors uptime, and reports server health.

View details
86
Repo Health
76
Technical
65
Dependency
Built with
TypeScript 98%
Updated 1 weeks ago
TypeScript
98%
Apache 2.0

Tianji

Analytics · Monitoring

3,100

Replace Google Analytics, UptimeKuma, and Prometheus with one self-hosted platform that tracks websites, monitors uptime, and reports server health.

View details
86
Repo Health
76
Technical
65
Dependency
Built with
TypeScript 98%
Updated 1 weeks ago
TypeScript
98%
Apache 2.0

Tianji

Analytics · Monitoring

3,100

Replace Google Analytics, UptimeKuma, and Prometheus with one self-hosted platform that tracks websites, monitors uptime, and reports server health.

View details
86
Repo Health
76
Technical
65
Dependency
Built with
TypeScript 98%
Updated 1 weeks ago
TypeScript
98%
Apache 2.0

Tianji

Analytics · Monitoring

3,100

Replace Google Analytics, UptimeKuma, and Prometheus with one self-hosted platform that tracks websites, monitors uptime, and reports server health.

View details
86
Repo Health
76
Technical
65
Dependency
Built with
TypeScript 98%
Updated 1 weeks ago

Join founders buildingwith open source

Opinionated takes, migration guides, cost-saving tips, and insights from the open source ecosystem.

Subscribe on Substack
Join 750+ subscribers