Create, build, and integrate Stream Chat React Native apps in React Native Community CLI and Expo. Use for new RN/Expo Chat apps from scratch, existing app integration, Stream Chat RN, stream-chat-react-native, stream-chat-expo, migration/setup, channel list, message list, MessageComposer, attachment picker, image/file attachments, media picker, camera upload, audio messages, threads, thread list, React Navigation, Expo Router, theming, offline support, push notifications, and Chat customization. Chat only in v1; not for Stream Video, Feeds, or Moderation UI.
Create, build, and integrate Stream Chat React Native apps in React Native Community CLI and Expo. Use for new RN/Expo Chat apps from scratch, existing app integration, Stream Chat RN, stream-chat-react-native, stream-chat-expo, migration/setup, channel list, message list, MessageComposer, attachment picker, image/file attachments, media picker, camera upload, audio messages, threads, thread list, React Navigation, Expo Router, theming, offline support, push notifications, and Chat customization. Chat only in v1; not for Stream Video, Feeds, or Moderation UI.
license
See LICENSE in repository root
compatibility
Supports new or existing React Native CLI and Expo apps that can run Stream Chat RN with React Native New Architecture. The `stream` CLI is the default credentials and requested demo-data path; pasted API key and token are accepted as fallback.
C - Reference lookup if the user only asks how/docs; otherwise B - Existing app
Words "docs" or "documentation" around Stream Chat React Native / Expo work
C - Reference lookup
"How do I {X} in React Native/Expo?", "What does {SDK component/hook/prop} do?"
C - Reference lookup
"Install Stream packages", "set up Chat RN", "wire auth/token flow" with no broader feature request
D - Bootstrap / setup
Video, Feeds, Moderation review UI, or non-Chat Stream RN product
Reject bundled scope and route to live docs only if the user wants docs
Bare /stream-react-native with no args
List the tracks briefly and wait
Disambiguation flow
If the request is ambiguous between wiring code and reference lookup, ask one short question and wait:
Do you want me to wire this into the project, or just map the React Native SDK pattern and files?
If the user wants a new app but did not name Expo or RN CLI, default to Expo because it is the shortest successful path. Use RN CLI when the user asks for it or when native project constraints require it.
Scope rejection
This v1 skill bundles Chat React Native only. If the user asks for Stream Video, Feeds, or Moderation UI in React Native, say:
The React Native skill currently bundles Chat references only. I can help with Chat RN here, or switch to live docs for Video/Feeds.
Do not invent missing React Native Video or Feeds API details from memory.
After classification
Tracks A, B, D -> run Project signals, then continue in builder.md and sdk.md. Run credentials.md before writing Chat connection code or creating requested demo data.
Track C -> skip credentials and project probes if the product + runtime are explicit. Only run a read-only probe if RN CLI vs Expo is ambiguous and the answer affects the guidance.
Step 0.5: Credentials, token, and demo data (tracks A, B, D only)
Use credentials.md once per session before writing code that connects to Stream Chat.
It resolves:
Stream API key
user id and display name
user token or token provider plan
optional demo data, only when requested, via Stream CLI calls such as UpdateUsers, GetOrCreateChannel, and SendMessage
For Track A, it is acceptable to scaffold the app first if the runtime or target directory must be resolved before credentials. Do not render a connected Chat UI until credentials or a token-provider plan are resolved.
Project signals (tracks A/B/D - once per session; Track C on demand only)
Read-only local probe. Use it to detect empty/new workspace, RN CLI vs Expo, New Architecture hints, navigation setup, and existing Stream packages.
No RN/Expo app detected in a non-empty directory - create a new app in a child directory or ask before reusing this directory
If there is no RN/Expo project and Track A applies, scaffold one through builder.md > 2. New app scaffold. If Track B/D applies in a non-RN directory, ask before creating a child app because that changes project ownership.
Run Project signals. Empty workspace is valid for Track A.
A2
Choose lane
Default to Expo if unspecified; use RN CLI when requested.
A3
Scaffold
Create the app with current framework tooling; do not explain full RN/Expo environment setup.
A4
Install + wire
Use the primary llms.txt manifest to read Installation docs, verify npm dist-tags, install the selected package and peers, then wire providers and first Chat UI.
A5
Verify
Confirm install, Babel plugin, root providers, auth, and first rendered Chat screen.
Track B - Existing app
Full detail:builder.md - use the existing-project path.
Phase
Name
What you do
B1
Detect
Run Project signals and inspect existing app structure before editing.
B2
Preserve
Keep Expo/RN CLI lane, package manager, navigation stack, and auth architecture unless asked to migrate.
B3
Integrate
Use llms.txt lookup for the requested area, then load only the Chat reference/blueprint sections needed.
B4
Verify
Confirm the requested Stream Chat flow builds and renders in the existing app.
If the user asks for exact API details not bundled here, use references/DOCS.md to fetch the right manifest and selected markdown page. If implementation still needs source-level confirmation, inspect the installed package under the target app's node_modules after dependencies are installed. Do not use machine-specific documentation paths.
Track D - Bootstrap / setup
Use when the user wants package install and shared wiring more than a full feature build:
detect RN CLI vs Expo
use llms.txt lookup for Installation docs and verify current npm dist-tags
install the correct Chat package and required peers
add Reanimated/Worklets Babel plugin as the last plugin
wrap the entry point with GestureHandlerRootView
place OverlayProvider and Chat correctly
wire useCreateChatClient or the app's backend token provider
stop before product-specific UI if the user only asked for setup