Use when creating, building, or integrating Stream Chat, Stream Video, or Stream Feeds in React Native Community CLI or Expo apps - new RN/Expo Chat / Video / Feeds apps from scratch, existing-app integration, stream-chat-react-native, stream-chat-expo, @stream-io/video-react-native-sdk, @stream-io/feeds-react-native-sdk, useCreateFeedsClient, StreamFeeds, StreamFeed, activity feed, timeline feed, notification feed, for-you feed, useFeedActivities, useActivityComments, reactions, comments, follows, migration/setup, channel list, message list, MessageComposer, attachment picker, image/file attachments, media picker, audio messages, threads, thread list, video call, livestream, audio room, ringing, CallContent, ParticipantView, React Navigation, Expo Router, theming, offline support, push notifications, and Chat / Video / Feeds UI customization. Not for Moderation review UI.
71
—
Does it follow best practices?
Impact
—
No eval scenarios have been run
Advisory
Suggest reviewing before use
Rules: Read RULES.md once per session. Every non-negotiable React Native Chat, Video, and Feeds rule is stated there.
This file is the single entrypoint: intent classification, product selection, project detection, and module pointers for Stream Chat React Native, Stream Video React Native, and Stream Feeds React Native work.
Before any tool call, decide the track from the user's input alone. Do not probe the filesystem first.
| Signal in user input | Track |
|---|---|
| "Build/create/scaffold a new React Native app", "create an Expo app", "new Stream Chat RN app", "new Stream Video RN app", "new Stream Feeds RN app", empty directory + React Native/Expo Chat / Video / Feeds | A - New app |
| "Add/integrate Stream Chat into this app", "wire Chat RN", "set up stream-chat-expo", "add a video call", "wire Stream Video", "set up @stream-io/video-react-native-sdk", "add an activity feed", "wire Stream Feeds", "set up @stream-io/feeds-react-native-sdk", "change/customize this Chat / Video / Feeds UI" | B - Existing app |
React Native, Expo, Expo Router, stream-chat-react-native, stream-chat-expo, @stream-io/video-react-native-sdk, @stream-io/feeds-react-native-sdk, Stream Chat RN, Stream Video RN, Stream Feeds RN, Chat React Native, Video React Native, Feeds React Native, migration | C - Reference lookup if the user only asks how/docs; otherwise B - Existing app |
Explicit product/runtime token: Chat React Native, Chat Expo, Video React Native, Video Expo, Feeds React Native, Feeds Expo | C - Reference lookup |
| Words "docs" or "documentation" around Stream Chat, Stream Video, or Stream Feeds 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 |
| "Audit/review/check an existing Stream Video integration against best practices", "is my video app production-ready?", "what am I missing before launch?" | C - Reference lookup (read-only) - run the Integration best-practices audit in references/VIDEO-REACT-NATIVE.md |
| "Install Stream packages", "set up Chat RN", "set up Video RN", "set up Feeds RN", "wire auth/token flow" with no broader feature request | D - Bootstrap / setup |
| Stream Moderation review UI or any other non-Chat / non-Video / non-Feeds 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 |
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.
Identify the product from the user's input or detected packages. Tracks A, B, and D all need the product before continuing; Track C selects the matching reference pair.
| Product signal | Product | References |
|---|---|---|
stream-chat-react-native, stream-chat-expo, channel, message, MessageComposer, thread, attachment, offline support | Chat | references/CHAT-REACT-NATIVE.md + references/CHAT-REACT-NATIVE-blueprints.md |
@stream-io/video-react-native-sdk, video call, livestream, audio room, ringing, CallContent, ParticipantView, screenshare, picture in picture | Video | references/VIDEO-REACT-NATIVE.md + references/VIDEO-REACT-NATIVE-blueprints.md |
@stream-io/feeds-react-native-sdk, useCreateFeedsClient, StreamFeeds, StreamFeed, activity feed, timeline feed, notification feed, for-you feed, useFeedActivities, useActivityComments, reactions, comments, follows, follow / unfollow, activity composer, activityWithStateUpdates | Feeds | references/FEEDS-REACT-NATIVE.md + references/FEEDS-REACT-NATIVE-blueprints.md |
| Two or more products in one app (chat alongside a video call, feeds + chat, feeds + video, etc.) | Combined | Load only the reference pairs for the products in scope. Nest the providers (e.g. <StreamVideo> inside <OverlayProvider><Chat> inside <StreamFeeds>); do not place them as siblings. See RULES.md and the manifest-selected /video/docs/react-native/advanced/chat-with-video.md for the Chat + Video interop notes |
If the request is ambiguous between products, ask one short question and wait:
Are you wiring Stream Chat (channels, messages), Stream Video (calls, livestream, audio rooms), or Stream Feeds (activity feed, timeline, comments, reactions, follows)? Or more than one in the same app?
This skill bundles Chat, Video, and Feeds React Native. If the user asks for Stream Moderation review UI or another non-bundled Stream RN product, say:
The React Native skill currently bundles Chat, Video, and Feeds references. I can help with any combination of those here, or switch to live docs for other products.
Do not invent missing React Native Moderation API details from memory.
builder.md and sdk.md. Run credentials.md before writing Chat, Video, or Feeds connection code or creating requested demo data.Use credentials.md once per session before writing code that connects to Stream Chat, Stream Video, or Stream Feeds.
It resolves:
UpdateUsers, GetOrCreateChannel, SendMessage; Video and Feeds do not require seed data because calls are ephemeral and activities can be posted at runtime)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, Video, or Feeds UI until credentials or a token-provider plan are resolved.
Read-only local probe. Use it to detect empty/new workspace, RN CLI vs Expo, New Architecture hints, navigation setup, and existing Stream packages.
bash -c 'echo "=== PACKAGE ==="; test -f package.json && grep -oE "\"(stream-chat-react-native|stream-chat-expo|@stream-io/video-react-native-sdk|@stream-io/feeds-react-native-sdk|@stream-io/react-native-webrtc|@stream-io/react-native-callingx|react-native|expo|@react-navigation/[^\"]+|expo-router|react-native-reanimated|react-native-worklets|react-native-teleport|@op-engineering/op-sqlite)\": *\"[^\"]*\"" package.json 2>/dev/null; echo "=== EXPO ==="; find . -maxdepth 2 \( -name "app.json" -o -name "app.config.js" -o -name "app.config.ts" -o -path "./app/_layout.*" \) -print 2>/dev/null; echo "=== NATIVE ==="; find . -maxdepth 2 \( -name "ios" -o -name "android" \) -type d -print 2>/dev/null; echo "=== CONFIG ==="; find . -maxdepth 2 \( -name "babel.config.js" -o -name "metro.config.js" \) -print 2>/dev/null; echo "=== EXPO_SDK ==="; node -e "try{console.log(require(\"./node_modules/expo/package.json\").version)}catch(e){try{console.log(require(\"./package.json\").dependencies.expo)}catch(e){console.log(\"-\")}}" 2>/dev/null; echo "=== EMPTY ==="; test -z "$(ls -A 2>/dev/null)" && echo "EMPTY_CWD" || echo "NON_EMPTY"'Hold the result in conversation context. Do not re-run unless the user changes directory, packages are installed, or the project shape changes.
Use the result to produce a one-line status, for example:
Empty workspace detected - defaulting to Expo new app unless the user asked for RN CLIExpo app detected - stream-chat-expo absent - Expo Router present - ready for Chat setupExpo app detected - Expo SDK 56+ - apply RULES.md > Expo Router SDK 56+ rule (no @react-navigation/*)Expo app detected - @stream-io/video-react-native-sdk absent - ready for Video setupExpo app detected - @stream-io/feeds-react-native-sdk absent - ready for Feeds setupRN CLI app detected - ios/android present - stream-chat-react-native installed - checking provider placementRN CLI app detected - both @stream-io/video-react-native-sdk and stream-chat-react-native installed - Chat + Video interop appliesExpo app detected - @stream-io/feeds-react-native-sdk and stream-chat-expo installed - nest StreamFeeds + Chat providers (no sibling mounts)No RN/Expo app detected in a non-empty directory - create a new app in a child directory or ask before reusing this directoryIf 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.
| Track | Module(s) |
|---|---|
| A - New app | builder.md + sdk.md + llms.txt docs lookup + product references (Chat / Video / Feeds) |
| B - Existing app | builder.md + sdk.md + llms.txt docs lookup + product references (Chat / Video / Feeds) |
| C - Reference lookup | sdk.md + references/DOCS.md + relevant product reference files |
| D - Bootstrap / setup | builder.md + sdk.md + llms.txt docs lookup |
Shared React Native and Expo patterns live in sdk.md.
Product-specific setup, docs lookup, gotchas, and UI blueprints live under references/:
llms.txt docs lookup (Chat, Video, Feeds): references/DOCS.mdreferences/CHAT-REACT-NATIVE.mdreferences/CHAT-REACT-NATIVE-blueprints.mdreferences/VIDEO-REACT-NATIVE.mdreferences/VIDEO-REACT-NATIVE-blueprints.mdreferences/FEEDS-REACT-NATIVE.mdreferences/FEEDS-REACT-NATIVE-blueprints.mdIf the requested product file is not bundled yet, say so plainly and only switch to live docs if the user asks.
Full detail: builder.md - use the new-app path.
| Phase | Name | What you do |
|---|---|---|
| A1 | Detect | Run Project signals. Empty workspace is valid for Track A. |
| A2 | Choose lane and product | Default to Expo if unspecified; use RN CLI when requested. Confirm product (Chat, Video, Feeds, or any combination). |
| A3 | Scaffold | Create the app with current framework tooling; do not explain full RN/Expo environment setup. |
| A4 | Install + wire | Use the manifest-selected Installation docs for each product, verify npm dist-tags, install package and peers, then wire providers and first UI. |
| A5 | Verify | Confirm install, root providers, permissions (Video: camera/mic), auth, and first rendered Chat / Video / Feeds screen. |
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. Note any existing Chat / Video / Feeds packages. |
| 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 / Video / Feeds reference/blueprint sections needed. |
| B4 | Verify | Confirm the requested Stream Chat / Video / Feeds flow builds and renders in the existing app. |
Load only the relevant files for the requested product:
llms.txt manifest lookup rules -> references/DOCS.mdsdk.mdreferences/CHAT-REACT-NATIVE.mdreferences/CHAT-REACT-NATIVE-blueprints.mdreferences/VIDEO-REACT-NATIVE.mdreferences/VIDEO-REACT-NATIVE-blueprints.mdreferences/FEEDS-REACT-NATIVE.mdreferences/FEEDS-REACT-NATIVE-blueprints.mdreferences/VIDEO-REACT-NATIVE.md (read-only review; produce findings before changing any code)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.
Use when the user wants package install and shared wiring more than a full feature build. Branch by product:
llms.txt lookup for the matching product's Installation docs and verify current npm dist-tagsstream-chat-react-native or stream-chat-expo; Video: @stream-io/video-react-native-sdk; Feeds: @stream-io/feeds-react-native-sdk + @react-native-community/netinfo)GestureHandlerRootView, place OverlayProvider and Chat, wire useCreateChatClient or the app's backend token providerStreamVideoClient and mount StreamVideouseCreateFeedsClient (returns undefined while connecting), mount <StreamFeeds client={client}> once near the app root, and (typically) wrap an OwnFeedsContextProvider that creates the user + timeline feeds and the self-followb81d80e
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.