Stream - skill router
This skill picks the track from the user's input and delegates to a specialized sub-skill. It does no scaffolding, CLI, or docs work itself - those live in dedicated skills.
Read first: RULES.md. Non-negotiable rules apply, including the Peer skills procedure (Glob path + install command + install policy + Skill-vs-Read-inline rule).
Peer manifest: peers.yaml (schema: peers.schema.json) is the single source of truth for peer skill names, Glob paths, install commands, and routing signals. Every peer installs silently on demand. Read it before installing or routing to a peer.
After picking a sub-skill: follow the procedure in RULES.md > Peer skills - Glob the entry's SKILL.md path, install it if missing (always silently - every peer is silent-install), then Skill tool (if listed) or Read inline. Do not call Skill before the Glob; it surfaces a confusing "Unknown skill" error. Do not stop after naming the track.
By task
Build or integrate Stream in a platform-specific app -> peer pack from peers.yaml (check peer signals first)
- Match user input or cwd against each peer's
signals (e.g. swift / swiftui / .xcodeproj -> stream-swift; react native / expo / stream video react native -> stream-react-native)
- All peers install silently on demand - install if missing, then route, no prompt
- Peer signals take precedence over the
stream-builder rows below. A request like "add a video call to my Expo app" or "scaffold a React Native app with Stream Video" matches stream-react-native, not stream-builder - the platform token wins.
Build / enhance / audit / migrate a web app with Stream (React / Next.js) -> use the stream-react skill (the default web pack when no other platform signal is present)
- "build me a Chat/Video/Feeds app", "scaffold", "create a new ...", "add Chat to this app", "integrate Video", "drop Feeds into ...", "upgrade/migrate ... to vN" - and no platform signal (no
react native, expo, swift, ios, android, etc.)
- React / Next.js tokens (
stream-chat-react, @stream-io/video-react-sdk, useCreateChatClient, MessageList, ...) with a build/integrate verb also route here
- Covers Track A (scaffold, Steps 0-7), Track E (enhance an existing project), Track F (read-only best-practices audit), Track M (migrate/upgrade an SDK version)
Build with the framework-agnostic builder -> use the stream-builder skill only when the user names it explicitly ("use stream-builder", "/stream-builder")
stream-builder is the generic builder being extended to other app kinds; web React/Next.js defaults to stream-react above
Audit/review an existing Stream Video integration against best practices (read-only - no scaffolding, no CLI, no build steps)
- Peer signal (
react native / expo) -> stream-react-native; web / React / Next.js or no platform signal -> stream-react (Track F)
- Video only. The dedicated best-practices audit covers Stream Video. Chat/Feeds have no dedicated audit checklist yet -
stream-react handles those requests with a general docs-based review and says so up front.
- Triggers: "audit/review my video integration", "is my video app production-ready?", "what am I missing before launch?"
- Routes here even when the request contains "check" - the audit intent takes precedence over the
stream-cli "check {anything}" route below
Query Stream data via the CLI -> use the stream-cli skill
- "list calls", "show channels", "any flagged", "find users"
- Literal CLI:
stream api ..., stream config ..., stream auth ...
- Tricky bodies and filter syntax live in the sub-skill's cookbook
- Required for every
stream api call - including ad-hoc "let me check" queries from inside other sub-skills. No guessing endpoint names from training data; route through stream-cli (or read ~/.stream/cache/API.md) first. See RULES.md > CLI safety.
Install the Stream CLI -> use the stream-cli skill
- "install the CLI", "set up stream" with no project context
- Bootstrap (binary install, SHA-256 verification, TTY confirmation) ships with the CLI sub-skill
Search Stream SDK documentation -> use the stream-docs skill
- "docs", "documentation", explicit SDK token (
Chat React, Video iOS, Feeds Node, Moderation)
- "how do I ... in ", "how does <hook/component/method> work?", "what does do?"
- No CLI needed - answers come from getstream.io with citations
Pick a track
Scan the user's input for the signals below in order. The classifier is deterministic - no probes, no fetches, no CLI checks at this stage.
| Signal in user input |
Sub-skill |
Upgrade / migrate an installed SDK (build/integrate intent - matched before the docs rows): "upgrade/migrate/bump/update stream-chat-react to vN", "migrate to the new SDK version", "bump my Stream version" - an upgrade verb (upgrade/migrate/bump/update) + a Stream package token, no peer signal. Peer signal (react native / expo / an @stream-io/*-react-native-* token) -> stream-react-native instead (its own migration flow). |
stream-react (Track M) |
Audit/review an existing integration (read-only - matched before the SDK-token / docs rows below): "audit/review my video integration", "audit my Chat React integration", "review my Video React app", "is my video app production-ready?", "what am I missing before launch?" - audit/review intent even when an SDK token like Chat React / Video React is present. Peer signal (react native / expo) -> stream-react-native; web / React / Next.js or no platform signal -> stream-react (Track F - Video has a dedicated checklist; Chat/Feeds get a general docs-based review, stated up front). Also wins over the stream-cli "check {anything}" row below whenever the request frames a best-practices / production-readiness review rather than a data query. |
matching platform pack (read-only audit) |
Explicit SDK/framework token: Chat React, Video iOS, Feeds Node, Moderation, etc. (with or without version), and no build/integrate verb and no audit/review intent (upgrade/migrate/bump/update count as build/integrate verbs -> migration row above; "audit/review" -> audit row above) |
stream-docs |
| Words "docs" or "documentation" (and no build/integrate verb) |
stream-docs |
"How do I {X} in {framework}?", "How does {hook/component/method} work?", "What does {SDK thing} do?" - and no build/integrate verb. If the request is "how do I add/build/integrate/scaffold {X} in {framework}" and {framework} matches a peer signal, the peer row below wins instead. |
stream-docs |
| Operational verbs + Stream noun: "list calls", "show channels", "any flagged", "find users", "check {anything}" |
stream-cli |
stream api, stream config, stream auth (literal CLI invocation) |
stream-cli |
| "Install the CLI", "set up stream" with no project context |
stream-cli |
Build/integration intent + a token matching a peer's signals in peers.yaml (e.g. swift / .xcodeproj -> stream-swift; react native / expo / stream video react native / stream video rn -> stream-react-native). This row takes precedence over the web stream-react rows below whenever a peer signal is present, and also wins over the docs how-to rows above whenever the request contains a build/integrate verb (add, build, integrate, scaffold, wire, set up, create, upgrade, migrate, bump, update) alongside the peer signal. Note: react native / react-native (and @stream-io/*-react-native-* tokens) are stream-react-native signals and win over the web react default - including for upgrade/migrate/update requests, which the RN pack handles itself. |
matching peer (installed silently if missing) |
Literal mention of stream-builder / /stream-builder (the framework-agnostic builder) |
stream-builder |
"Build me a ... app", "scaffold", "create a new ..." + Stream product, OR a React/Next.js token (stream-chat-react, @stream-io/video-react-sdk, useCreateChatClient, ...) + build/integrate verb, and no peer signal present |
stream-react (web/Next.js, the default when no platform signal is given) |
| "Add Chat/Video/Feeds to this app", "integrate Stream into", "upgrade/migrate ... to vN" - existing project, and no peer signal present |
stream-react (web/Next.js, the default when no platform signal is given) |
| Operational verb wrapped in how-to phrasing (e.g. "how do I list my calls?" - docs or CLI) |
Ask one disambiguator |
Preflight carve-outs. stream-docs answers from documentation only - no preflight, no shell commands, no project inspection. Read-only / local-only tracks also skip preflight: a platform pack's audit track (e.g. stream-react Track F) and migrate track (e.g. stream-react Track M) only inspect/edit local files and the live docs - they do not provision orgs/apps or call stream api, so they need no CLI, auth, or preflight. Only build/integrate work (scaffold a new app, add a product to an existing one) runs preflight before doing real work.
Docs vs platform packs. A pure how-to or method-lookup question about an iOS/Android/etc. SDK symbol stays in stream-docs - don't pull in a platform pack for a documentation answer. Platform packs (e.g. stream-swift) are for building or integrating - scaffolding projects, wiring packages, generating views.
React framework scope. stream-react scaffolds (Track A) a Next.js app. For enhance / audit / migrate on a non-Next.js React project (Vite, CRA, Remix, TanStack Start, etc.) stream-react still owns it - the Stream SDK wiring is identical - but the agent must adapt the Next.js-specific bits: the server-side token route lives in the project's own backend (not a Next.js /api route), and verification uses the project's build command (npm run build), not next build. Never assume Next.js APIs on a non-Next project.
Disambiguator. If the input fits more than one row (typically operational verb + how-to phrasing), ask one short question and wait. Don't probe before the answer:
Want me to look up the SDK method (docs) or run it now via CLI?
After the answer, route as if the user had given that signal directly.
Bare /stream with no args. Render the menu under "Quick navigation" verbatim, then wait for input. No shell execution, no probing, no install.
Quick navigation
For a bare /stream (and whenever the user wants to pick a skill directly), output the block below verbatim - keep the Core / Platform SDKs split, the examples, and the closing line - then wait:
Stream - Chat - Video - Feeds - Moderation. Tell me what you want, or pick a skill directly:
Core
/stream-react - scaffold, enhance, audit, or migrate a React / Next.js web app with Stream (the default for web) - e.g. "build me a chat app"
/stream-cli - query data, run stream api / config / auth, install the CLI - e.g. "list my channels"
/stream-docs - search live SDK docs, with citations - e.g. "how does useChannel work?"
/stream-builder - the framework-agnostic builder (web defaults to /stream-react; pick this only if you name it explicitly)
Platform SDKs
/stream-swift - Swift - SwiftUI - UIKit - iOS
/stream-android - Android - Jetpack Compose - Kotlin
/stream-react-native - React Native - Expo
/stream-flutter - build or integrate Stream Chat into a Flutter app (install confirmed first)
New to a skill? Just describe the task - I'll install the right one automatically.
The closing line is load-bearing: typing an uninstalled slash command errors with "Unknown skill" before this router runs, so natural-language description is the only dead-end-proof path - it routes here and the missing peer is installed per peers.yaml. Keep this menu in sync with peers.yaml: every peer there appears here under Core or Platform SDKs, and new platforms get a bullet under Platform SDKs when their entry is added.
Hand-off
See preamble: install if missing, invoke via Skill tool, don't stop. Cross-cutting rules in RULES.md apply to every sub-skill, including Cross-track follow-ups (offer, don't auto-execute, the natural next action across track boundaries).
Support
If the user asks for support or how to contact someone, direct them to getstream.io/contact.
Source: GetStream/agent-skills — distributed by TomeVault.
1---2name: stream3description: Stream router for Chat, Video, Feeds, and Moderation. Use when the user wants to build a new app with Stream, scaffold a project, add Chat/Video/Feeds/Moderation to an existing app, integrate Stream, build for Swift/SwiftUI/UIKit/iOS/Xcode, query Stream data, list channels, list calls, show flagged messages, find users, run stream api / stream config / stream auth commands, install the Stream CLI, set up Stream, search Stream SDK documentation, look up Stream React/iOS/Android/Node/Flutter/Unity SDK methods, ask how-to questions about Stream hooks/components/methods, configure moderation blocklists or automod, set up webhooks, or anything tagged Chat React, Video iOS, Feeds Node, Moderation, etc. Routes to the right sub-skill based on the task. Use when this capability is needed.4---56# Stream - skill router78This skill picks the track from the user's input and delegates to a specialized sub-skill. **It does no scaffolding, CLI, or docs work itself** - those live in dedicated skills.910> **Read first:** [`RULES.md`](RULES.md). Non-negotiable rules apply, including the **Peer skills** procedure (Glob path + install command + install policy + Skill-vs-Read-inline rule).11>12> **Peer manifest:** [`peers.yaml`](peers.yaml) (schema: [`peers.schema.json`](peers.schema.json)) is the single source of truth for peer skill names, Glob paths, install commands, and routing signals. Every peer installs silently on demand. Read it before installing or routing to a peer.13>14> **After picking a sub-skill:** follow the procedure in RULES.md > Peer skills - Glob the entry's `SKILL.md` path, install it if missing (always silently - every peer is silent-install), then Skill tool (if listed) or Read inline. Do not call `Skill` before the Glob; it surfaces a confusing "Unknown skill" error. Do not stop after naming the track.1516---1718## By task1920**Build or integrate Stream in a platform-specific app** -> peer pack from [`peers.yaml`](peers.yaml) (**check peer signals first**)21- Match user input or cwd against each peer's `signals` (e.g. `swift` / `swiftui` / `.xcodeproj` -> `stream-swift`; `react native` / `expo` / `stream video react native` -> `stream-react-native`)22- All peers install silently on demand - install if missing, then route, no prompt23- **Peer signals take precedence over the `stream-builder` rows below.** A request like "add a video call to my Expo app" or "scaffold a React Native app with Stream Video" matches `stream-react-native`, not `stream-builder` - the platform token wins.2425**Build / enhance / audit / migrate a web app with Stream (React / Next.js)** -> use the `stream-react` skill (the default web pack when no other platform signal is present)26- "build me a Chat/Video/Feeds app", "scaffold", "create a new ...", "add Chat to this app", "integrate Video", "drop Feeds into ...", "upgrade/migrate ... to vN" - and **no platform signal** (no `react native`, `expo`, `swift`, `ios`, `android`, etc.)27- React / Next.js tokens (`stream-chat-react`, `@stream-io/video-react-sdk`, `useCreateChatClient`, `MessageList`, ...) with a build/integrate verb also route here28- Covers Track A (scaffold, Steps 0-7), Track E (enhance an existing project), Track F (read-only best-practices audit), Track M (migrate/upgrade an SDK version)2930**Build with the framework-agnostic builder** -> use the `stream-builder` skill **only when the user names it explicitly** ("use stream-builder", "/stream-builder")31- `stream-builder` is the generic builder being extended to other app kinds; web React/Next.js defaults to `stream-react` above3233**Audit/review an existing Stream Video integration against best practices** (read-only - no scaffolding, no CLI, no build steps)34- Peer signal (`react native` / `expo`) -> `stream-react-native`; web / React / Next.js or no platform signal -> `stream-react` (Track F)35- **Video only.** The dedicated best-practices audit covers Stream **Video**. Chat/Feeds have no dedicated audit checklist yet - `stream-react` handles those requests with a general docs-based review and says so up front.36- Triggers: "audit/review my video integration", "is my video app production-ready?", "what am I missing before launch?"37- Routes here even when the request contains "check" - the audit intent takes precedence over the `stream-cli` "check {anything}" route below3839**Query Stream data via the CLI** -> use the `stream-cli` skill40- "list calls", "show channels", "any flagged", "find users"41- Literal CLI: `stream api ...`, `stream config ...`, `stream auth ...`42- Tricky bodies and filter syntax live in the sub-skill's cookbook43- **Required for every `stream api` call** - including ad-hoc "let me check" queries from inside other sub-skills. No guessing endpoint names from training data; route through `stream-cli` (or read `~/.stream/cache/API.md`) first. See [`RULES.md`](RULES.md) > CLI safety.4445**Install the Stream CLI** -> use the `stream-cli` skill46- "install the CLI", "set up stream" with no project context47- Bootstrap (binary install, SHA-256 verification, TTY confirmation) ships with the CLI sub-skill4849**Search Stream SDK documentation** -> use the `stream-docs` skill50- "docs", "documentation", explicit SDK token (`Chat React`, `Video iOS`, `Feeds Node`, `Moderation`)51- "how do I ... in <framework>", "how does <hook/component/method> work?", "what does <SDK thing> do?"52- No CLI needed - answers come from getstream.io with citations5354---5556## Pick a track5758Scan the user's input for the signals below in order. The classifier is deterministic - no probes, no fetches, no CLI checks at this stage.5960| Signal in user input | Sub-skill |61|---|---|62| **Upgrade / migrate an installed SDK** (build/integrate intent - matched **before** the docs rows): "upgrade/migrate/bump/update `stream-chat-react` to vN", "migrate to the new SDK version", "bump my Stream version" - an upgrade verb (`upgrade`/`migrate`/`bump`/`update`) + a Stream package token, **no peer signal**. Peer signal (`react native` / `expo` / an `@stream-io/*-react-native-*` token) -> `stream-react-native` instead (its own migration flow). | `stream-react` (Track M) |63| **Audit/review an existing integration** (read-only - matched **before** the SDK-token / docs rows below): "audit/review my video integration", "audit my Chat React integration", "review my Video React app", "is my video app production-ready?", "what am I missing before launch?" - audit/review intent **even when an SDK token like `Chat React` / `Video React` is present**. Peer signal (`react native` / `expo`) -> `stream-react-native`; web / React / Next.js or no platform signal -> `stream-react` (Track F - Video has a **dedicated checklist**; Chat/Feeds get a general docs-based review, stated up front). **Also wins over the `stream-cli` "check {anything}" row below** whenever the request frames a best-practices / production-readiness review rather than a data query. | matching platform pack (read-only audit) |64| Explicit SDK/framework token: `Chat React`, `Video iOS`, `Feeds Node`, `Moderation`, etc. (with or without version), and **no build/integrate verb and no audit/review intent** (`upgrade`/`migrate`/`bump`/`update` count as build/integrate verbs -> migration row above; "audit/review" -> audit row above) | `stream-docs` |65| Words "docs" or "documentation" (and no build/integrate verb) | `stream-docs` |66| "How do I {X} in {framework}?", "How does {hook/component/method} work?", "What does {SDK thing} do?" - and **no build/integrate verb**. If the request is "how do I add/build/integrate/scaffold {X} in {framework}" and `{framework}` matches a peer signal, the peer row below wins instead. | `stream-docs` |67| Operational verbs + Stream noun: "list calls", "show channels", "any flagged", "find users", "check {anything}" | `stream-cli` |68| `stream api`, `stream config`, `stream auth` (literal CLI invocation) | `stream-cli` |69| "Install the CLI", "set up stream" with no project context | `stream-cli` |70| **Build/integration intent + a token matching a peer's `signals` in [`peers.yaml`](peers.yaml)** (e.g. `swift` / `.xcodeproj` -> `stream-swift`; `react native` / `expo` / `stream video react native` / `stream video rn` -> `stream-react-native`). **This row takes precedence over the web `stream-react` rows below whenever a peer signal is present, and also wins over the docs how-to rows above whenever the request contains a build/integrate verb (`add`, `build`, `integrate`, `scaffold`, `wire`, `set up`, `create`, `upgrade`, `migrate`, `bump`, `update`) alongside the peer signal.** Note: `react native` / `react-native` (and `@stream-io/*-react-native-*` tokens) are `stream-react-native` signals and win over the web `react` default - including for upgrade/migrate/update requests, which the RN pack handles itself. | matching peer (installed silently if missing) |71| **Literal mention of `stream-builder` / `/stream-builder`** (the framework-agnostic builder) | `stream-builder` |72| "Build me a ... app", "scaffold", "create a new ..." + Stream product, OR a React/Next.js token (`stream-chat-react`, `@stream-io/video-react-sdk`, `useCreateChatClient`, ...) + build/integrate verb, **and no peer signal present** | `stream-react` (web/Next.js, the default when no platform signal is given) |73| "Add Chat/Video/Feeds to this app", "integrate Stream into", "upgrade/migrate ... to vN" - existing project, **and no peer signal present** | `stream-react` (web/Next.js, the default when no platform signal is given) |74| Operational verb wrapped in how-to phrasing (e.g. "how do I list my calls?" - docs *or* CLI) | **Ask one disambiguator** |7576**Preflight carve-outs.** `stream-docs` answers from documentation only - no preflight, no shell commands, no project inspection. **Read-only / local-only tracks also skip preflight:** a platform pack's **audit** track (e.g. `stream-react` Track F) and **migrate** track (e.g. `stream-react` Track M) only inspect/edit local files and the live docs - they do **not** provision orgs/apps or call `stream api`, so they need no CLI, auth, or preflight. Only **build/integrate** work (scaffold a new app, add a product to an existing one) runs preflight before doing real work.7778**Docs vs platform packs.** A pure how-to or method-lookup question about an iOS/Android/etc. SDK symbol stays in `stream-docs` - don't pull in a platform pack for a documentation answer. Platform packs (e.g. `stream-swift`) are for *building or integrating* - scaffolding projects, wiring packages, generating views.7980**React framework scope.** `stream-react` scaffolds (Track A) a **Next.js** app. For enhance / audit / migrate on a **non-Next.js** React project (Vite, CRA, Remix, TanStack Start, etc.) `stream-react` still owns it - the Stream SDK wiring is identical - but the agent must adapt the Next.js-specific bits: the server-side token route lives in the project's own backend (not a Next.js `/api` route), and verification uses the project's build command (`npm run build`), not `next build`. Never assume Next.js APIs on a non-Next project.8182**Disambiguator.** If the input fits more than one row (typically operational verb + how-to phrasing), ask one short question and wait. Don't probe before the answer:8384> Want me to look up the SDK method (docs) or run it now via CLI?8586After the answer, route as if the user had given that signal directly.8788**Bare `/stream` with no args.** Render the menu under "Quick navigation" **verbatim**, then wait for input. No shell execution, no probing, no install.8990---9192## Quick navigation9394For a bare `/stream` (and whenever the user wants to pick a skill directly), output the block below **verbatim** - keep the Core / Platform SDKs split, the examples, and the closing line - then wait:9596> **Stream** - Chat - Video - Feeds - Moderation. Tell me what you want, or pick a skill directly:97>98> **Core**99> - `/stream-react` - scaffold, enhance, audit, or migrate a React / Next.js web app with Stream (the default for web) - e.g. *"build me a chat app"*100> - `/stream-cli` - query data, run `stream api / config / auth`, install the CLI - e.g. *"list my channels"*101> - `/stream-docs` - search live SDK docs, with citations - e.g. *"how does useChannel work?"*102> - `/stream-builder` - the framework-agnostic builder (web defaults to `/stream-react`; pick this only if you name it explicitly)103>104> **Platform SDKs**105> - `/stream-swift` - Swift - SwiftUI - UIKit - iOS106> - `/stream-android` - Android - Jetpack Compose - Kotlin107> - `/stream-react-native` - React Native - Expo108> - `/stream-flutter` - build or integrate Stream Chat into a Flutter app (install confirmed first)109>110> New to a skill? Just describe the task - I'll install the right one automatically.111112The closing line is load-bearing: typing an uninstalled slash command errors with "Unknown skill" *before* this router runs, so natural-language description is the only dead-end-proof path - it routes here and the missing peer is installed per [`peers.yaml`](peers.yaml). Keep this menu in sync with `peers.yaml`: every peer there appears here under Core or Platform SDKs, and new platforms get a bullet under Platform SDKs when their entry is added.113114---115116## Hand-off117118See preamble: install if missing, invoke via `Skill` tool, don't stop. Cross-cutting rules in [`RULES.md`](RULES.md) apply to every sub-skill, including **Cross-track follow-ups** (offer, don't auto-execute, the natural next action across track boundaries).119120---121122## Support123124If the user asks for support or how to contact someone, direct them to [getstream.io/contact](https://getstream.io/contact/).125126---127> Source: [GetStream/agent-skills](https://github.com/GetStream/agent-skills) — distributed by [TomeVault](https://tomevault.io).128<!-- tomevault:4.0:skill_md:2026-06-16 -->