CommunityCodierung & Entwicklunggithub.com

Expo Skill Eval

Bewertet Expo-Fähigkeiten in diesem Repository End-to-End – Auslösegenauigkeit, generierte Codequalität und Laufzeit-Screenshots auf iOS-Simulator und Android-Emulator via Expo Go (Web optional). Verwende dies, wenn der Benutzer eine Expo-Fähigkeit evaluieren möchte, testen will, ob eine Fähigkeit funktionierenden Code produziert, eine Fähigkeit mit Geräte-Screenshots vergleichen oder überprüfen möchte, ob die Ausgabe einer Fähigkeit korrekt rendert.

Was ist Expo Skill Eval?

Das 'Expo Skill Eval'-Skill ermöglicht die automatisierte, End-to-End-Bewertung von anderen Expo-Skills in diesem Repository. Es prüft, ob ein Skill korrekt ausgelöst wird (Trigger Accuracy), ob der generierte Code qualitativ hochwertig ist (Code Checks) und ob die resultierende App auf einem iOS-Simulator oder Android-Emulator korrekt rendert (Runtime + Screenshots). Die Evaluierung läuft in einer isolierten, temporären Arbeitsumgebung und nutzt `claude -p`-Subprozesse, um die zu testenden Skills auszuführen. Es unterstützt sowohl Expo Go als auch Development Builds als Ausführungsumgebungen und kann auf iOS, Android und Web getestet werden. Der Benutzer wird durch einen geführten Prozess mit `AskUserQuestion`-Aufrufen geleitet, um den Umfang der Evaluierung (welcher Skill, welche Eingabeaufforderungen, welche Prüfungen, SDK-Version, Plattformen etc.) festzulegen. Für komplexe UI-Skills kann sogar ein Screenshot als Zielvorgabe hochgeladen werden, gegen den das Ergebnis verglichen wird.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/expo/skills/tree/main/.claude/skills/expo-skill-eval

Installed? Explore more Codierung & Entwicklung skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Was macht Expo Skill Eval?

Bewertet Skills in plugins/expo/skills/ hinsichtlich Auslösegenauigkeit, generierter Codequalität und/oder Laufzeit-Rendering in Expo Go.

Anforderungen: macOS mit Xcode (iOS-Simulatoren), Android SDK mit mindestens einem AVD und bun. Es wird keine weitere Geräte-Tooling vorausgesetzt.

Arbeitsbereichs-Stammverzeichnis: /private/tmp/expo-skill-eval-<skill-name>/iteration-N/ (z. B. /private/tmp/expo-skill-eval-expo-ui/iteration-4/).

Vor Beginn – Umfang klären

Bestätige alle folgenden Punkte im Voraus, bevor jegliche Pipeline-Arbeit beginnt – überspringe keinen (überspringe einen Punkt nur, wenn die Anfrage diese Wahl bereits angibt). Bündele sie in AskUserQuestion-Aufrufe mit ≤4 Fragen pro Aufruf, in dieser Reihenfolge:

  1. Welcher Skill evaluiert werden soll (falls nicht aus der Anfrage ersichtlich).
  2. Eingabeaufforderungen – welche Eingabeaufforderungen die Evaluierung steuern. Integrierte Eingabeaufforderungen (aus den Evaluierungsfällen des Skills) sind standardmäßig alle vorausgewählt; entferne eine, füge eine benutzerdefinierte Texteingabeaufforderung hinzu oder erzeuge eine aus einem hochgeladenen Screenshot (eine Ziel-UI, die der Skill reproduzieren muss). Siehe Eingabeaufforderungen unten.
  3. Was überprüft werden soll – eine Mehrfachauswahl von drei Optionen: Laufzeit + Screenshots / Auslösegenauigkeit / Code-Prüfungen (kein Gerät). Siehe Was überprüft werden soll unten.
  4. Expo SDK – neueste (Standard, automatisch erkannt) oder eine festgelegte Version.
  5. Runner – Expo Go (Standard) oder Development Build.
  6. Plattformen – iOS / Android / Web (biete immer alle drei an).
  7. Berechtigungs-Flag für claude -p – skip-permissions (Standard) oder accept-edits.
  8. Viewer-Bereitstellung – nur lokal (Standard) oder ein teilbares Artifact veröffentlichen.
  9. Wenn Auslösegenauigkeit ausgewählt ist – bestätige, dass das veröffentlichte expo-Plugin deaktiviert (oder nicht installiert) ist.

Jeder Punkt wird unten ausführlich beschrieben. Die Punkte 4–6 (SDK, Runner, Plattformen) passen natürlich in einen einzigen AskUserQuestion-Aufruf.

Wenn der zu evaluierende Skill nicht aus der Anfrage hervorgeht, liste die verfügbaren Skills aus plugins/expo/skills/ auf und frage, welcher evaluiert werden soll.

Wie der getestete Skill geladen wird – zwei Mechanismen, einer pro Phase (wähle nicht global einen aus): Executor-Läufe referenzieren ihn über den Dateipfad (SKILL_PATH = plugins/expo/skills/<skill>/SKILL.md, explizit gelesen), während die Trigger-Evaluierung ihn als Plugin lädt (--plugin-dir plugins/expo, sodass das Modell ihn automatisch anhand seiner Beschreibung auswählen kann). Beide zeigen auf die lokale, im Repository befindliche Version – das ist, was du evaluierst. Du benötigst kein spezielles Flag, um die Harness-Sitzung selbst zu starten (der Harness findet den Skill über den Repository-Pfad); die Mechanismen gelten für die von ihm erzeugten claude -p-Subprozesse. Siehe Schritte 1 und 3, warum sich die Phasen unterscheiden. Eine Vorab-Prüfung (erforderlich, wenn die Trigger-Evaluierung im Umfang enthalten ist): Wenn das veröffentlichte expo-Plugin installiert/aktiviert ist, deaktiviere es (über /plugin) bevor du den Harness startest und reaktiviere es danach. Eine einzige Deaktivierung ist eine globale Konfigurationsänderung, die sowohl von dieser Sitzung als auch von den erzeugten claude -p-Subprozessen übernommen wird. Warum dies für die Trigger-Evaluierung erforderlich ist: Diese Phase lädt den lokalen Skill über --plugin-dir, und ein zweites installiertes expo kollidiert damit – das Modell könnte das veröffentlichte expo:expo-ui auslösen, und da die Erkennung nur den Tool-Call-Namen sieht, würdest du stillschweigend die veröffentlichte Beschreibung anstelle deiner lokalen Änderungen bewerten (die Kollision könnte auch einfach einen Fehler verursachen). Die Executor-/Laufzeit-/Statischen Phasen sind nicht betroffen – sie lesen den getesteten Skill über seinen lokalen SKILL_PATH ohne --plugin-dir – daher kann ein Lauf ohne Trigger-Evaluierung die Deaktivierung überspringen. Das Deaktivieren von expo deaktiviert nicht expo-skill-eval (ein eigenständiges Projekt-Skill, nicht Teil des expo-Plugins), sodass der Harness verfügbar bleibt.

Mache dies dem Benutzer als explizite Vorab-Bestätigung deutlich – genauso, wie du bestätigst, welcher Skill evaluiert werden soll. Wenn die Trigger-Evaluierung im Umfang enthalten ist, bitte den Benutzer zu bestätigen, dass das veröffentlichte expo-Plugin deaktiviert (oder nicht installiert) ist, bevor du mit Schritt 1 beginnst; falls es noch aktiviert ist, pausiere und lass es den Benutzer über /plugin deaktivieren. Führe die Trigger-Evaluierung erst durch, wenn der Benutzer dies bestätigt – der Harness kann installierte Plugins nicht zuverlässig selbst erkennen (das Lesen der globalen Plugin-Konfiguration oder claude plugin list würde eine Eingabeaufforderung auslösen), daher handelt es sich um eine manuelle Bestätigung, keine automatische Prüfung.

Wähle die Eingabeaufforderungen – integriert, benutzerdefiniert oder einen Ziel-Screenshot. Die Eingabeaufforderungen sind die Eingaben, die den Executor steuern (mit Skill und ohne Skill); sie sind getrennt von dem, was du überprüfst. Bestätige sie mit AskUserQuestion (überspringe, wenn die Anfrage bereits eine Eingabeaufforderung nennt):

  • Integrierte Eingabeaufforderungen – repräsentative Eingabeaufforderungen, die du durch Lesen des getesteten Skills (seine SKILL.md + references/) und references/runtime-matrix.md generierst, die die Standard-Anwendungsfälle des Skills abdecken. (Wenn der Skill bereits Evaluierungsfälle unter evals/evals.json enthält, nimm auch deren prompt-Felder auf – aber die meisten Skills haben das nicht, daher leitest du sie normalerweise ab.) Wähle alle voraus, sodass der Standardlauf die Standardfälle des Skills trainiert; lass den Benutzer beliebige abwählen.
  • Benutzerdefinierte Texteingabeaufforderung – eine einmalige Eingabeaufforderung, die der Benutzer eingibt. Verwende keinen dedizierten Optionsslot dafür: AskUserQuestion fügt automatisch einen „Gib etwas ein“ / Sonstiges-Eintrag hinzu, und alles dort Eingegebene wird zu einem benutzerdefinierten Textfall.
  • Erzeuge aus einem hochgeladenen Screenshot – der Benutzer gibt den Pfad zu einem Ziel-Screenshot an (eine zu reproduzierende UI). Dem Executor wird gesagt, er solle ihn öffnen – claude -p liest PNGs mit seinem Read-Tool – und eine dazu passende App erstellen; der Fall zeichnet den Pfad als reference_image auf, und die Bewertung vergleicht die generierte App mit diesem Ziel (Schritt 6). Dies ist der stärkste visuelle Test für ein UI-Skill: „Erstelle das.“

Beachte das 4-Optionen-pro-Frage-Limit von AskUserQuestion mit dieser Priorität (der zu vermeidende Fehler: die Upload-Option wird stillschweigend fallen gelassen, sobald die vier Slots voll sind):

  1. Reserviere immer einen Slot für „Erzeuge aus einem hochgeladenen Screenshot“. Es ist der ganze Sinn der visuellen Evaluierung und darf niemals die Option sein, die wegfällt.
  2. Füge keine explizite Option „Benutzerdefinierte Texteingabeaufforderung“ hinzu – der automatische Eintrag „Gib etwas ein“ / Sonstiges deckt dies bereits ab.
  3. **Fülle die verbleibenden ≤3 Slots mit den integrierten/repräsentativen Eingabeaufforderungen, vorausgewählt. Falls es mehr als 3 gibt, fasse sie zu einer vorausgewählten Option „Alle integrierten Eingabeaufforderungen (Standard)“ zusammen und biete in einer kurzen Nachfrage die Auswahl einer Teilmenge an, sodass die Upload-Option noch passt.

Präsentiere es als Mehrfachauswahl. Wenn „Erzeuge aus einem hochgeladenen Screenshot“ ausgewählt wird, frage in einer Nachfrage nach dem Pfad zum Zielbild. Jede ausgewählte Eingabeaufforderung (integriert, getippt oder Bild) wird zu einem Evaluierungsfall (ausgeführt mit und ohne Skill).

Bestätige immer, was überprüft werden soll, es sei denn, die Anfrage macht dies eindeutig. Präsentiere diese Optionen und lass den Benutzer eine oder mehrere auswählen (Standardeinstellungen fett basierend auf dem Eintrag des Skills in references/runtime-matrix.md):

OptionWas sie tutWann als Standard vorschlagen
Laufzeit + ScreenshotsVollständige Pipeline: Fixture → Executor → Statische Prüfung → App auf iOS/Android ausführen und screenshoten. Der Runner (Expo Go oder Dev Build) ist eine separate Frage – benenne ihn hier nicht.Standard für jeden Skill, der einen App-Bildschirm rendert (die expo-go/dev-build-Zeilen in references/runtime-matrix.md). Erfordert einen gestarteten Simulator/Emulator.
AuslösegenauigkeitFühre realistische Eingabeaufforderungen über claude -p aus, überprüfe, ob der Skill gelesen wird. Misst den Recall (nur Soll-auslösende Abfragen).Immer als eigenständige Prüfung nützlich.
Code-Prüfungen (kein Gerät)tsc --noEmit + diff-bewusstes Lint + expo export, plus der Bewerter prüft den generierten Code gegen alle von dir bereitgestellten benutzerdefinierten Erwartungen. Kein Gerät.Standard für static-only- und n/a-Skills und immer dann, wenn du Codemuster überprüfen möchtest (korrekter Importpfad, ein Host-Wrapper, …), ohne die App auszuführen.
Präsentiere diese als EINE Mehrfachauswahlfrage – „Was möchtest du überprüfen?“ Dies sind Bewertungsdimensionen (wie beurteilt wird, was erstellt wird) – unterscheiden sich von der Phase der Eingabeaufforderungen (was erstellt werden soll). Der Benutzer kann jede Kombination wählen. Wenn eine Eingabeaufforderung ein hochgeladener Screenshot ist (siehe Eingabeaufforderungen), schließe „Laufzeit + Screenshots“ ein, damit der Harness die generierte App erfasst und der Bewerter sie mit dem Ziel vergleichen kann.

Lies references/runtime-matrix.md, um den Standardmodus des Skills zu finden, bevor du einen Vorschlag machst. Wenn die Anfrage bereits einen Modus angibt (z. B. „nur prüfen, ob er auslöst“, „auf dem Gerät ausführen“), überspringe die Frage und fahre fort.

Wähle die Expo SDK-Version – einmal, zu Beginn. Erkenne die neueste mit bash /abs/path/expo-skill-eval/scripts/latest-sdk.sh (es gibt die Hauptversion aus, z. B. 56; intern verwendet es bun, um npm view expo dist-tags --json auszuführen und die Hauptversion über JSON.parse/semver zu lesen, und dies wird von der Bash-Skript-Regel abgedeckt – führe also die Registry-Abfrage nicht selbst inline aus, was eine Eingabeaufforderung auslösen würde). Bestätige dann mit AskUserQuestion: Standardmäßig auf diese neueste SDK setzen oder den Benutzer eine ältere festlegen lassen (z. B. um ein versionsspezifisches Problem zu reproduzieren). Verwende die gewählte Version überall dort, wo das Fixture erstellt wird – übergib sie als <sdk>-Argument an make-fixture.sh und schreibe sie in den runtime.sdk jedes Evaluierungsfalls. Wenn die Anfrage bereits eine Version nennt („eval auf SDK 54“), überspringe die Erkennung und verwende sie.

Standardmäßig die neueste Version verwenden – sie bleibt kompatibel mit dem Expo Go, das expo start auf dem Gerät installiert. Das Festlegen einer SDK, die älter als das installierte Expo Go auf dem Gerät ist, führt dazu, dass expo start versucht, die Eingabeaufforderung „Empfohlene Expo Go-Version installieren?“ anzuzeigen; ohne TTY (die Snapshot-Skripte lesen stdin von /dev/null) stirbt es mit Input is required, but 'npx expo' is in non-interactive mode und jeder Snapshot schlägt fehl. Lege also nur dann eine ältere SDK fest, wenn du auch ein passendes Expo Go auf dem Simulator/Emulator vorinstallierst – ansonsten bleib bei der neuesten.

Wähle den Runner – Expo Go (Standard) oder einen Development Build. Frage mit AskUserQuestion (überspringe, wenn die Anfrage bereits angibt, welcher):

  • Expo Go (Standard) – die Snapshot-Skripte führen die App mit expo start --ios / expo start --android unverändert aus. Schnell (keine native Kompilierung) und es führt alles aus, was Expo Go bündelt (einschließlich @expo/ui ab SDK 56+). Kann keinen benutzerdefinierten nativen Code ausführen (expo-modules, config plugins, native Abhängigkeiten, die nicht in Expo Go sind).
  • Development Build – die Snapshot-Skripte führen stattdessen expo run:ios / expo run:android aus und kompilieren einen nativen Dev-Client pro Fixture. Verwende dies für Skills, deren Ausgabe benutzerdefinierten nativen Code benötigt (die Fälle, die sonst static-only wären). Viel langsamer – expo run erstellt vor und kompiliert nativ jedes Fixture (Minuten, besonders beim ersten) und benötigt die vollständige iOS/Android-Build-Toolchain – wähle es also nur, wenn der Skill tatsächlich nativen Code erfordert. Speicherintensiv: Der native Build jedes Fixtures ist mehrere GB groß. Die Snapshot-Phase führt nach jedem Fixture clean-fixture.sh aus, um die Spitzennutzung auf ~einen Build zu begrenzen, bevorzuge aber dennoch weniger Evaluierungsfälle und eine einzelne Plattform für Dev-Build-Läufe und halte ein paar GB frei. clean-fixture.sh entfernt die Build-Ausgabe pro Fixture (node_modules, ios, android, .expo, dist und das iOS DerivedData des Fixtures) und behält den App-Quellcode + Git. Der Hebel für Dev-Build-Speicher ist weniger Evaluierungsfälle + eine Plattform – es gibt nur die Build-Ausgabe pro Fixture frei und berührt niemals gemeinsame Abhängigkeits-Caches, sodass nichts erneut heruntergeladen wird.

Übergib die Wahl an die Snapshot-Skripte über die Umgebungsvariable EXPO_SKILL_EVAL_RUNNER (expo-go Standard oder dev-build) und spiegele sie im runtime.mode jedes Evaluierungsfalls wider (expo-go oder dev-build). Siehe Schritt 5.

Wähle die Plattformen – frage immer, unabhängig vom Skill. Biete iOS / Android / Web (Mehrfachauswahl) mit AskUserQuestion an; Standardmäßig iOS + Android, aber biete immer Web als Option an – filtere nicht vorab nach Skill. Web ist für die meisten Skills eine gültige Wahl: Die universellen Komponenten von @expo/ui (Host, Row, Column, Button, List, …) rendern im Web, ebenso wie expo-dom, NativeWind/Tailwind, API-Routen und normales React Native. Das Einzige, was im Web nicht angezeigt wird, ist ein plattformspezifischer nativer Baum (@expo/ui/swift-ui oder @expo/ui/jetpack-compose), der dort leer rendert – und diese Leere ist selbst ein nützliches Signal, also ist es immer noch die Entscheidung des Benutzers. Web läuft über snapshot-web.sh (expo start --web + Playwright/Chromium) unabhängig vom Runner (expo run ist nur nativ; es gibt keinen Web-Dev-Build) und ist der am wenigsten genutzte Pfad. Schreibe die gewählte Menge in das runtime.platforms jedes Evaluierungsfalls und lasse run_snapshots.py sie durchlaufen.

Bestätige, wie claude -p-Subprozesse ausgeführt werden – einmal, vor Beginn. Frage mit AskUserQuestion, ob sie mit --dangerously-skip-permissions ausgeführt werden dürfen, und wende dann die gleiche Antwort auf jeden Subprozess dieses Laufs an (frage niemals während des Laufs erneut):

  • Berechtigungen überspringen (empfohlen) – übergib --dangerously-skip-permissions. Jeder Subprozess läuft unbeaufsichtigt in einem Wegwerf-Fixture unter /private/tmp/expo-skill-eval-* und kann Dateien schreiben und Setup-Befehle ohne Eingabeaufforderung ausführen.
  • Nur Bearbeitungen akzeptieren – übergib stattdessen --permission-mode acceptEdits. Bash/Installationen werden automatisch abgelehnt (kein TTY), daher können einige Evaluierungen möglicherweise nur teilweise Ergebnisse liefern.

Ein nacktes claude -p ohne beide Flags kann überhaupt keine Dateien schreiben. Wenn die Anfrage bereits eine Präferenz angibt („Berechtigungen überspringen“, „verwende das gefährliche Flag nicht“), überspringe die Frage.

Bestätige, wie die Ergebnis-Viewer bereitgestellt werden – einmal, zu Beginn. Die Veröffentlichung auf claude.ai ist nach außen gerichtet, daher niemals während des Laufs überraschend durchführen; frage im selben AskUserQuestion zu Beginn (zusammen mit dem Berechtigungs-Flag):

  • Nur lokal (Standard) – generate_viewer.py schreibt viewer.html und öffnet es im lokalen Browser. Nichts verlässt den Rechner.
  • Teilbares Artifact veröffentlichen – zusätzlich den Viewer als claude.ai Artifact (eine standardmäßig private Webseite, die der Benutzer mit Teammitgliedern teilen kann) ganz am Ende rendern. Führe dies nur durch, wenn der Benutzer hier zustimmt.

Wenn die Anfrage bereits angibt, ob geteilt/veröffentlicht werden soll, überspringe die Frage. Siehe den Abschnitt Viewer für die Veröffentlichungsmechanik.

Evaluierungsfall-Schema

Du generierst die Evaluierungsfälle des Laufs – einen pro gewählter Eingabeaufforderung – und schreibst sie in <workspace>/iteration-N/evals.json (der Viewer liest sie von dort). Jeder Fall e...

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

expo/add-app-clip

Add an iOS App Clip target to an Expo app. Use when the user mentions App Clip, AASA, apple-app-site-association, appclips, smart app banner, or wants to ship a lightweight iOS Clip invoked from a URL alongside their parent app.

expo/building-native-ui

Complete guide for building beautiful apps with Expo Router. Covers fundamentals, styling, components, navigation, animations, patterns, and native tabs.

expo/eas-update-insights

Check the health of published EAS Updates: crash rates, install/launch counts, unique users, payload size, and the split between embedded and OTA users per channel. Use when the user asks how an update is performing, whether a rollout is healthy, how many users are on the embedded build vs OTA, or wants to gate CI on update health.

expo/expo-api-routes

Guidelines for creating API routes in Expo Router with EAS Hosting

expo/expo-brownfield

Integrate Expo and React Native into an existing native iOS or Android app. Use when the user mentions brownfield, embedding React Native in a native app, AAR/XCFramework, or adding Expo to an existing Kotlin/Swift project. Covers both the isolated approach and the integrated approach.

expo/expo-cicd-workflows

Helps understand and write EAS workflow YAML files for Expo projects. Use this skill when the user asks about CI/CD or workflows in an Expo or EAS context, mentions .eas/workflows/, or wants help with EAS build pipelines or deployment automation.

expo/expo-deployment

Deploying Expo apps to iOS App Store, Android Play Store, web hosting, and API routes

expo/expo-dev-client

Build and distribute Expo development clients locally or via TestFlight

expo/expo-examples

Framework (OSS). Expo's official example projects - the expo/examples repo of ~70 `with-*` integrations (Stripe, Clerk, Supabase, OpenAI, maps, Reanimated, SQLite, Skia, NativeWind, and more). Use when integrating a third-party library or service into an existing Expo app and you want the canonical, version-matched pattern to adapt, or when scaffolding a new project from one with `npx create-expo --example`.

expo/expo-module

Guide for creating and writing Expo native modules and views using the Expo Modules API (Swift, Kotlin, TypeScript). Covers module definition DSL, native views, shared objects, config plugins, lifecycle hooks, autolinking, and type system. Use when building or modifying native modules for Expo.

expo/expo-observe

Use for anything related to EAS Observe — adding `expo-observe` to an Expo project (AppMetricsRoot/ObserveRoot HOC, markInteractive, the useObserve hook, and the Expo Router / React Navigation integrations for per-route metrics), querying via the EAS CLI (`eas observe:metrics-summary`, `observe:metrics`, `observe:routes`, `observe:events`, `observe:versions`), or interpreting the resulting metrics (cold/warm launch, TTR, TTI, navigation cold/warm TTR, update download, and the TTI frameRate params for triaging slow startups).

expo/expo-overview

Framework (OSS). Entry point and router for every Expo or EAS task. Load this skill first — before writing code and before choosing another expo-* / eas-* skill — when the request, PRD, or spec mentions Expo, EAS, Expo Go, or an expo-* package, or the project has an `expo` dependency in `package.json`. Within that gate it also covers app specs and designs to implement (tabs, stacks, maps, lists, navigation, building from a screenshot), and phrasings like 'implement a mobile app', 'make my app look native', 'add navigation', 'fetch some data', 'upgrade my SDK', 'add Expo to my existing native app', 'ship to the App Store', or 'I'm new to Expo, where do I start'. A fully specified request (SDK pinned, libraries named, layout given) still routes through here — the shared setup rules still apply. Do NOT load it when neither signal is present: a bare React Native project with no `expo` dependency is not Expo work. Detects the real goal, routes to the right expo-* / eas-* skill, and owns the shared setup rules.

expo/expo-router

Framework (OSS). Navigation and routing for Expo Router. Covers file-based routes, groups and dynamic routes, folder organization, Link with previews and context menus, native Stack, page titles, modals and form sheets, NativeTabs, headers and toolbars, and header search bars.

expo/expo-tailwind-setup

Set up Tailwind CSS v4 in Expo with react-native-css and NativeWind v5 for universal styling

expo/expo-ui

Framework (OSS). Build native UI with the @expo/ui package: real SwiftUI on iOS and Jetpack Compose on Android. Default to @expo/ui for sheets (BottomSheet), pickers, sliders, toggles, menus, and grouped-form sections — do NOT reach for Reanimated, @gorhom/bottom-sheet, or RN built-in Picker/Switch; use @expo/ui instead. Fall back to RN built-ins only when @expo/ui is missing the component. NOTE: @expo/ui List renders native grouped rows like an iOS Settings screen — it is NOT a virtualized list; use FlatList/FlashList for large datasets. Covers universal components (Host, Column, Row, Button, Text, List, BottomSheet, FieldGroup, Switch, Slider, Picker, Menu), drop-in replacements for RN community libraries, and platform-specific SwiftUI/Jetpack Compose trees. Not for Expo Router navigation, Reanimated, or data fetching.

expo/expo-ui-jetpack-compose

`@expo/ui/jetpack-compose` package lets you use Jetpack Compose Views and modifiers in your app.

expo/expo-ui-swiftui

`@expo/ui/swift-ui` package lets you use SwiftUI Views and modifiers in your app.

expo/expo-upgrade

Framework (OSS). Guidelines for upgrading Expo SDK versions and fixing dependency issues

expo/native-data-fetching

Use when implementing or debugging ANY network request, API call, or data fetching. Covers fetch API, React Query, SWR, error handling, caching, offline support, and Expo Router data loaders (`useLoaderData`).

expo/skills

Build and submit iOS and Android apps with EAS to TestFlight, the App Store, or Google Play. Supports Expo and other React Native projects, plus existing native apps. Use for eas.json setup, release pipelines, signing, app versions and build numbers, store submissions, and listing metadata. For Expo websites and API routes, use eas-hosting; for adding React Native screens to a native app, use expo-brownfield.

Verwandte Skills