Expo Tailwind Setup
CherryHQ/cherry-studio-app
Set up Tailwind CSS v4 in Expo with react-native-css and NativeWind v5 for universal styling
Add voice & video calling to a React Native app FROM SCRATCH with the headless CometChat Calls SDK v5 (@cometchat/calls-sdk-react-native@5) — no prebuilt UI Kit.
$ npx skills add cometchat/cometchat-skills --skill cometchat-react-native-v5-sdk -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install cometchat/cometchat-skills cometchat-react-native-v5-sdk --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/cometchat/cometchat-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/cometchat-react-native-v5-sdk .claude/skills/cometchat-react-native-v5-sdk && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "cometchat-react-native-v5-sdk" agent skill from https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-react-native-v5-sdk into .claude/skills/cometchat-react-native-v5-sdk/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cometchat-react-native-v5-sdk", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-react-native-v5-sdkType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add cometchat/cometchat-skills --skill cometchat-react-native-v5-sdk -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install cometchat/cometchat-skills cometchat-react-native-v5-sdk --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cometchat/cometchat-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/cometchat-react-native-v5-sdk .agents/skills/cometchat-react-native-v5-sdk && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "cometchat-react-native-v5-sdk" agent skill from https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-react-native-v5-sdk into .agents/skills/cometchat-react-native-v5-sdk/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cometchat-react-native-v5-sdk", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add cometchat/cometchat-skills --skill cometchat-react-native-v5-sdk -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install cometchat/cometchat-skills cometchat-react-native-v5-sdk --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cometchat/cometchat-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/cometchat-react-native-v5-sdk .cursor/skills/cometchat-react-native-v5-sdk && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "cometchat-react-native-v5-sdk" agent skill from https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-react-native-v5-sdk into .cursor/skills/cometchat-react-native-v5-sdk/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cometchat-react-native-v5-sdk", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/cometchat/cometchat-skills.git --path skills/cometchat-react-native-v5-sdk--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add cometchat/cometchat-skills --skill cometchat-react-native-v5-sdk -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install cometchat/cometchat-skills cometchat-react-native-v5-sdk --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cometchat/cometchat-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/cometchat-react-native-v5-sdk .gemini/skills/cometchat-react-native-v5-sdk && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "cometchat-react-native-v5-sdk" agent skill from https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-react-native-v5-sdk into .gemini/skills/cometchat-react-native-v5-sdk/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cometchat-react-native-v5-sdk", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install cometchat/cometchat-skills cometchat-react-native-v5-sdkInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add cometchat/cometchat-skills --skill cometchat-react-native-v5-sdk -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/cometchat/cometchat-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/cometchat-react-native-v5-sdk .github/skills/cometchat-react-native-v5-sdk && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "cometchat-react-native-v5-sdk" agent skill from https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-react-native-v5-sdk into .github/skills/cometchat-react-native-v5-sdk/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cometchat-react-native-v5-sdk", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add cometchat/cometchat-skills --skill cometchat-react-native-v5-sdk -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install cometchat/cometchat-skills cometchat-react-native-v5-sdk --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cometchat/cometchat-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/cometchat-react-native-v5-sdk .opencode/skills/cometchat-react-native-v5-sdk && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "cometchat-react-native-v5-sdk" agent skill from https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-react-native-v5-sdk into .opencode/skills/cometchat-react-native-v5-sdk/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cometchat-react-native-v5-sdk", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
cometchat-react-native-v5-sdkAdd voice & video calling to a React Native app FROM SCRATCH with the headless CometChat Calls SDK v5 (@cometchat/calls-sdk-react-native@5) — no prebuilt UI Kit.
Cometchat React Native V5 SDK is an agent skill from cometchat/cometchat-skills. Add voice & video calling to a React Native app FROM SCRATCH with the headless CometChat Calls SDK v5 (@cometchat/calls-sdk-react-native@5) — no prebuilt UI Kit. init→login→generateToken→render <CometChatCalls.Component, granular event listeners, in-call actions (mute/video/layout/record/raise-hand), meet-style session rooms AND 1:1 ringing (Chat SDK signaling + Calls SDK media). Triggers: 'add calling from scratch react native', 'standalone video call RN', 'headless calls sdk react native', 'build my own call…
Its SKILL.md is about 5.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including reference files (for example `references/docs-map.md` and `references/ringing-voip.md`). Compatibility notes: React Native 0.71+ (old architecture AND New Architecture incl. bridgeless); Node 18+; iOS 13.0+ / Xcode 14+; Android minSdk 24…
It sits in Mobile, covering Cross-platform mobile apps and Design systems. It works with CometChat, React Native, Expo and Android. The repository describes itself as: Add CometChat chat & messaging and voice & video calls to any React, Next.js, React Native, Angular, Android, iOS, or Flutter project through your AI coding agent. Works with… The licence is MIT.
Read from SKILL.md and the folder at commit 911b108. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npmnpxnodeFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npm and npx, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
AUTH_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
React Native 0.71+ (old architecture AND New Architecture incl. bridgeless); Node 18+; iOS 13.0+ / Xcode 14+; Android minSdk 24. @cometchat/calls-sdk-react-native@^5 (5.0.5) + 6 pinned peer deps (see Prerequisites). 1:1 ringing also needs @cometchat/chat-sdk-react-native@^4 for signaling. Bare RN and Expo prebuild/dev-client; NOT Expo Go (native WebRTC module).
From compatibility in the SKILL.md frontmatter.
Cometchat React Native V5 SDK loads about 5.2k tokens when it runs, and up to ~12k if it reads all its reference files. Until then it costs about 165 tokens; SKILL.md has 1,859 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from cometchat/cometchat-skills at commit 911b108, republished under its MIT licence (© cometchat). 1,859 words, ~5,189 tokens.
.claude/skills/cometchat-react-native-v5-sdk/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.Ground truth:
@cometchat/calls-sdk-react-native@5+ catalogrn-calls-v5.json(the closed symbol list — everyCometChatCalls.*below exists in it). Official docs:/calls/react-native/**= v5 · Docs MCP. Fetch exactsessionSettingsfields, event names and action signatures from the docs (references/docs-map.md) — never memory. APPEND to the user's app — additive wiring only (RULES.md). This is the HEADLESS path (no UI Kit); for the prebuilt drop-in call UI usecometchat-react-native-callsinstead.
-core sibling; it is self-contained for meet-style calling.@cometchat/chat-sdk-react-native@4) for call signaling — signatures fetched from docs via references/docs-map.md (§ "1:1 RINGING"). It does NOT depend on the React Native UI Kit.cometchat-react-native-core + cometchat-react-native-calls — not this skill."add calling from scratch / without the UI Kit", "standalone voice/video in React Native", "build my own call screen", "headless calls SDK", "meeting-room join by session id", "one-on-one ringing call". Precondition: the caller chose the from-scratch / standalone path (the "add calling" router asks this). If they want the prebuilt call UI, route to cometchat-react-native-calls.
npm install @cometchat/calls-sdk-react-native@5
# 6 REQUIRED peer deps — versions are pinned by the SDK; do not float them
npm install @react-native-async-storage/async-storage@^2.1.2 react-native-background-timer@^2.4.1 \
react-native-performance@^5.1.2 react-native-svg@^15.12.0 react-native-url-polyfill@2.0.0 \
react-native-webrtc@124.0.7npm install @cometchat/chat-sdk-react-native@4cd ios && pod install && cd ... Add to ios/<App>/Info.plist:<key>NSCameraUsageDescription</key><string>Camera access is required for video calls</string>
<key>NSMicrophoneUsageDescription</key><string>Microphone access is required for voice and video calls</string>references/ringing-voip.md).android/app/src/main/AndroidManifest.xml as <uses-permission android:name="android.permission.X" />:
INTERNET · CAMERA · RECORD_AUDIO · MODIFY_AUDIO_SETTINGS · ACCESS_NETWORK_STATE · BLUETOOTH (add android:maxSdkVersion="30") · BLUETOOTH_CONNECT.
API 23+ also requires a RUNTIME request (PermissionsAndroid.requestMultiple([CAMERA, RECORD_AUDIO]) or react-native-permissions) BEFORE starting a call. A manifest entry alone is not enough. A call that must survive backgrounding needs the FOREGROUND_SERVICE* family + WAKE_LOCK + POST_NOTIFICATIONS as well — references/ringing-voip.md § Part 2b.newArchEnabled as the app needs it. The SDK ships as a legacy native module and runs through RN's interop layer, so behaviour is identical on both.npx @cometchat/skills-cli@3 auth login → provision use --app-id <id> --json (@3 pins the CLI major that matches the v5 skills). Mint auth tokens server-side for production; never ship the Auth Key. Rebuild the app after installing (npx react-native run-ios / run-android) — this is a native dependency, so Metro-only reload will not pick it up.CometChatCalls.initFromSettings(...) (once, check the result) → CometChatCalls.login(uid, authKey) or loginWithAuthToken(token) → then generateToken / render / listeners. Nothing renders or joins before init+login resolve.
CometChatCalls.initFromSettings(settings) — the ai-agent / telemetry-attributed path (persists integrationSource="ai-agent"), parallel to the chat core (RULES.md §5). It is INTENTIONALLY undocumented (ai-agent-only, @nodoc — DOCS-BACKLOG F4/C1), so the CometChatSettings shape is baked in references/docs-map.md; pass it INLINE (no physical cometchat-settings.json file needed). The publicly-documented CometChatCalls.init({ appId, region }) is the FALLBACK only.{ success: false, error: {...} } | { success: true, error: null }. A bare await CometChatCalls.initFromSettings(s) that ignores .success silently continues on a validation failure and the call fails later with a confusing error. Always branch on .success.generateToken; v5 has its own login/loginWithAuthToken and caches the token internally, so generateToken(sessionId) takes no auth token. Passing one is the v4 pattern.const u = await CometChat.getLoggedinUser(); if (u) await CometChatCalls.loginWithAuthToken(u.getAuthToken());. The token is a User method (getAuthToken()) — there is NO top-level CometChat.getUserAuthToken() on the RN Chat SDK (that name is on the Calls SDK; the migration doc's v4 tab shows it wrongly — DOCS-BACKLOG). Full note: references/docs-map.md § 1:1 RINGING.sessionId lands in the same call: generateToken(sessionId) → render <CometChatCalls.Component>. No ringing.CometChat.initiateCall → peer CallListener.onIncomingCallReceived → acceptCall/rejectCall → CometChatCalls.generateToken(call.getSessionId()) → render the Component. Fetch Chat-SDK signatures via references/docs-map.md § "1:1 RINGING".⚠️ RINGING ALWAYS INCLUDES VoIP — build both halves, never ask. Signaling alone is a websocket event: it rings the callee only while their app is open, so backgrounded or killed they get nothing and the call times out (45s). Half a feature. Whenever ringing is chosen,
references/ringing-voip.mdis REQUIRED — emit the native VoIP setup in the SAME build and name the steps that are the user's (VoIP cert, Firebase, Xcode capabilities). Meet-style has no ringing and needs none of it.
CometChatCalls.init · CometChatCalls.initFromSettings · CometChatCalls.login · CometChatCalls.loginWithAuthToken · CometChatCalls.logout · CometChatCalls.getLoggedInUser · CometChatCalls.getUserAuthToken · CometChatCalls.isUserLoggedIn · CometChatCalls.addLoginListener / removeLoginListenerCometChatCalls.generateToken · CometChatCalls.Component (the React component you RENDER to join — there is no joinSession on React Native) · CometChatCalls.leaveSession · CometChatCalls.endSessionForAllCometChatCalls.addEventListener(eventName, cb, { signal? }) → unsubscribe() (event names: FETCH the full list from /calls/react-native/events)Component already renders all of these (see the first pitfall). Only reach for them when the user EXPLICITLY asks to replace the built-in controls: muteAudio/unmuteAudio/toggleAudio · pauseVideo/resumeVideo/toggleVideo · switchCamera · setLayout · startRecording/stopRecording/toggleRecording · startStreaming/stopStreaming · startTranscription/stopTranscription · raiseHand/lowerHand/toggleHand · pinParticipant/unpinParticipant · muteParticipant · pauseParticipantVideo · showParticipantList/hideParticipantList/toggleParticipantList · setChatButtonUnreadCountCometChatCalls.setAudioMode · CometChatCalls.AUDIO_MODECometChatCalls.enablePictureInPictureLayout / disablePictureInPictureLayoutCometChatCalls.CallLogRequestBuilder (verified against installed @cometchat/calls-sdk-react-native@5, 2026-09-10) — new CometChatCalls.CallLogRequestBuilder().setLimit(n).setAuthToken(CometChatCalls.getUserAuthToken() ?? "").build() → fetchNext(): Promise<CallLog[]> — every fetchNext() needs .setAuthToken(...) (no auto fallback; it rejects "Auth Token is required"). There is NO CometChat.CallLogRequestBuilder on the Chat SDK (@cometchat/chat-sdk-react-native, any version) — do not emit it. CometChatCalls.CallLog is the log model. For the transcript opt-in add .setHasTranscriptions(true) (filters to transcribed calls and attaches transcripts) — same token. Paginated history is the read — there is no working single-call-detail method (see deprecated note).CometChatCalls.Transcription · CometChatCalls.TranscriptRequestBuilder · TranscriptDeprecated v5 compat surface — do NOT emit:
CallSettingsBuilder,CallAppSettingsBuilder,OngoingCallListener,startSession,endSession,switchToVideoCall,getCallDetails(a@deprecated/unsupportedvoidNO-OP on the v5 class — the functionalPromise<CallLog[]>form is only on the v4-compat class; useCallLogRequestBuilder.fetchNext()). They still run (v5 is a drop-in for v4) but are the OLD API, and v5-only events never reach anOngoingCallListener. Use plain settings +addEventListener+leaveSession. Not on React Native at all (present on web — emitting them is a hallucination):joinSession,startScreenSharing/stopScreenSharing, virtual-background methods, audio/video device enumeration (getAudioInputDevices&c.). A symbol is real iff it's inrn-calls-v5.json— confirm THERE, then fetch its signature fromreferences/docs-map.md.
addEventListener RETURNS an unsubscribe function AND accepts { signal }. Prefer one AbortController per screen: pass signal to every listener and call controller.abort() in the effect cleanup — one teardown, no leaks. Register listeners BEFORE the Component mounts, and call CometChatCalls.leaveSession() on unmount. Never leak.
CometChatCallsis a SINGLETON with ONE active session. Mount exactly oneComponent. Every action (leaveSession,muteAudio,setLayout, …) takes no session id — it always targets the active session. To move to another call:leaveSession()→ awaitonSessionLeft→generateToken(next)→ re-render with the new token.
// STRICT-TS-CLEAN: RN exports no settings type — narrow with `as const`, or inline the object
// in the JSX prop (as below) where contextual typing narrows it. A hoisted bare literal fails tsc.
import { useEffect, useState } from "react";
import { View } from "react-native";
import { CometChatCalls } from "@cometchat/calls-sdk-react-native";
// 1. once at app start — ai-agent telemetry default; init({appId,region}) is the public-doc fallback
const res = await CometChatCalls.initFromSettings({
appId: APP_ID, region: REGION, credentials: { authKey: AUTH_KEY },
});
if (!res.success) throw new Error(res.error.message); // Result object, NOT a rejection
// 2. after the user authenticates
await CometChatCalls.login(UID, AUTH_KEY); // or loginWithAuthToken(token)
function CallScreen({ sessionId }: { sessionId: string }) {
const [callToken, setCallToken] = useState<string | null>(null);
useEffect(() => { // 3. listeners BEFORE the component mounts
const controller = new AbortController();
const { signal } = controller;
CometChatCalls.addEventListener("onSessionLeft", () => {/* pop the screen */}, { signal });
CometChatCalls.addEventListener("onParticipantJoined", (p) => {/* … */}, { signal });
return () => { controller.abort(); CometChatCalls.leaveSession(); }; // 6. one teardown
}, []);
useEffect(() => { // 4. token BEFORE render
CometChatCalls.generateToken(sessionId)
.then(({ token }) => setCallToken(token))
.catch((e) => console.error(e.errorCode, e.errorDescription));
}, [sessionId]);
if (!callToken) return null; // or a loader
return (
<View style={{ flex: 1 }}> {/* MUST be sized */}
{/* 5. JOIN = RENDER. No joinSession on React Native. */}
<CometChatCalls.Component
callToken={callToken}
sessionSettings={{ sessionType: "VIDEO", layout: "TILE" }}
/>
{/* NO control buttons here — the Component already renders mute/video/camera/leave/layout. */}
</View>
);
}Fetch the full sessionSettings field list from /calls/react-native/session-settings. On Android, request runtime CAMERA + RECORD_AUDIO permissions before this screen mounts.
npx expo prebuild, then declare perms in app.json (expo.ios.infoPlist NSCamera/NSMicrophone; expo.android.permissions CAMERA/RECORD_AUDIO/MODIFY_AUDIO_SETTINGS/BLUETOOTH_CONNECT) — NOT by hand-editing Info.plist/AndroidManifest (a prebuild discards manual edits). Build with npx expo run:ios / run:android or EAS.leaveSession(); do not keep a backgrounded Component mounted on a hidden tab.<CometChatCalls.Component> renders a COMPLETE call UI — mute, camera, switch-camera, layout, recording, participant list, raise hand and the red leave button. Do NOT add your own buttons around it; they duplicate the SDK's and drift out of sync. Action methods are for CUSTOM controls ONLY (only when the user EXPLICITLY asks) — hide the built-ins first via sessionSettings hide* flags.joinSession — does not exist on RN; joining IS rendering the Component. startSession is the deprecated v4 path.View with no flex: 1 or explicit height it renders invisibly. The RN analogue of web's zero-dimension container.initFromSettings/init resolve { success, error } rather than rejecting. await alone hides a validation failure.generateToken — the v4 pattern. In v5 you login() first and the SDK holds the token.getUserMedia prompt to fall back on.onSessionLeft, then join.leaveSession — every listener must be unsubscribed (or its AbortController aborted) and leaveSession() called on unmount.OngoingCallListener for v5 events — onSessionJoined, onConnectionLost, onLeaveSessionButtonClicked, onCallLayoutChanged and the onParticipant* family arrive ONLY via addEventListener; a v4 listener silently never fires for them.show* builder methods became v5 hide* props (showEndCallButton(true) → hideLeaveSessionButton: false; copying a v4 snippet inverts intent); and muteAudio(true|false) split into muteAudio()/unmuteAudio(), pauseVideo()/resumeVideo().^, no latest. The trap: react-native-performance 6.x is published but the SDK peer is ^5.1.2, and a floated ^6 makes every later npm install fail with ERESOLVE (surfacing long after). Mismatched react-native-webrtc fails at native link. Verify: npm ls react-native-performance react-native-webrtc.sessionSettings without narrowing (strict TS — the docs' own examples fail this). sessionType/layout/audioMode are string-literal unions, so a hoisted object literal widens them to string and fails tsc (TS2322). React Native exports NO settings type — CometChatCalls is the package's ONLY named export (verified against installed @cometchat/calls-sdk-react-native@5.0.4 .d.ts/.d.mts; there is no importable Transcript/CallLog/settings type), so web's "annotate as SessionSettings" trick is impossible. sessionType is "VOICE" | "VIDEO" — there is NO "AUDIO" value (a voice call is sessionType: "VOICE"). Narrow with as const, or keep the object inline in the JSX prop. When you DO need a model type, DERIVE it from the class: type CallLog = InstanceType<typeof CometChatCalls.CallLog>, and for the audio mode use (typeof CometChatCalls.AUDIO_MODE)[keyof typeof CometChatCalls.AUDIO_MODE]:const sessionSettings = { sessionType: "VIDEO", layout: "TILE" } as const; // ✅
<CometChatCalls.Component callToken={token} sessionSettings={{ sessionType: "VIDEO" }} /> // ✅ inline
const bad = { sessionType: "VIDEO", layout: "TILE" }; // ❌ widens to stringas const (C15 fixed there), but /calls/react-native/session-settings still has illustrative fences that hoist a bare literal (TS2322 on copy). Narrow every hoisted sessionSettings.references/ringing-voip.md.sessionSettings fields and action params are FETCHED from docs, never guessed.CometChatCalls.* symbol emitted appears in rn-calls-v5.json (node test-suite/scripts/verify-catalog.mjs --family rn-calls-v5).@cometchat/calls-sdk-react-native@5 .d.ts (test-suite/typecheck/rn-v5).node test-suite/scripts/sdk-smoke.mjs --family rn-calls-v5 [--live|--dry] covers init→login→generateToken→listener-teardown. The media render is NOT covered — Component needs a real device/simulator with native WebRTC, so the node smoke proves wiring only. Verify the actual call surface on a simulator/device, and 1:1 ringing needs TWO logged-in clients (one client proves the outgoing half only). Flag "dry-mock only, not live-certified" honestly where true.© cometchat, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 2 other files (references) in skills/cometchat-react-native-v5-sdk of cometchat/cometchat-skills.
Open the folder on GitHubat commit 911b108
Cometchat React Native V5 SDK next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Cometchat React Native V5 SDK this skillcometchat/cometchat-skills | 129 | — | ~5.2k | Automated safety check: Pass | MIT | |
| Expo Tailwind SetupCherryHQ/cherry-studio-app | 4k | 8 repos | ~3k | Automated safety check: Pass | MIT | |
| Screenmapaleqsio/screenmap | 239 | — | ~7.2k | Automated safety check: Pass | MIT | |
| Expo Brownfield Integrationmweinbach/agent-coworker | 156 | 2 repos | ~900 | Automated safety check: Notes | Custom licence | |
| Expo UIarcboxlabs/linkcode | 155 | — | ~1.2k | Automated safety check: Pass | MIT | |
| Simfleetentropyconquers/simfleet | 117 | — | ~1.5k | Automated safety check: Pass | MIT |
CherryHQ/cherry-studio-app
Set up Tailwind CSS v4 in Expo with react-native-css and NativeWind v5 for universal styling
aleqsio/screenmap
Generate a visual navigation map of an Expo / React Native or NativeScript app.
mweinbach/agent-coworker
Helps add Expo and React Native to an existing native iOS or Android app, and choose between a prebuilt AAR or XCFramework and a fully integrated build.
arcboxlabs/linkcode
Framework (OSS). An agent skill from arcboxlabs/linkcode.
entropyconquers/simfleet
Operate a simfleet device fleet: slimmed iOS simulators and Android emulators, parallel React Native worktree lanes with leased Metro ports, the native build cache, and per-agent device claims.
talsec/Free-RASP-ReactNative
Performs strict code reviews on React Native plugin projects covering TypeScript, the Kotlin (Android) and Swift (iOS) native bridges, and the Expo config plugin.
cometchat/cometchat-skills
Adds voice and video calling to an Android app in Kotlin with the headless CometChat Calls SDK v5, covering meeting-style rooms, 1:1 ringing calls, call logs and recording.
cometchat/cometchat-skills
Builds chat on Android with your own UI against the headless CometChat Chat SDK v5, covering install, Jetifier conflicts, credentials and init-before-login ordering.
cometchat/cometchat-skills
Picks and customizes CometChat's Angular UI Kit components by their verified component list, exact input and output event names, and the surfaces that have no kit component at all.
cometchat/cometchat-skills
Enables or builds CometChat features such as polls, reactions, smart replies and pinned messages in an Angular app, first classifying how much client code each one needs.
cometchat/cometchat-skills
Decides where CometChat chat UI goes in an Angular app: a dedicated route, a dashboard panel, a support widget or the full multi-pane app, with thread and search panels.
cometchat/cometchat-skills
Add voice & video calling to any iOS app FROM SCRATCH with the headless CometChat Calls SDK v5 (CometChatCallsSDK, via Swift Package Manager) — no UI Kit.
Works with
Categories
Add voice & video calling to a React Native app FROM SCRATCH with the headless CometChat Calls SDK v5 (@cometchat/calls-sdk-react-native@5) — no prebuilt UI Kit. Cometchat React Native V5 SDK is an agent skill from cometchat/cometchat-skills. Add voice & video calling to a React Native app FROM SCRATCH with the headless CometChat Calls SDK v5 (@cometchat/calls-sdk-react-native@5) — no prebuilt UI Kit.
Cometchat React Native V5 SDK fits situations like: tasks that involve Cross-platform mobile apps; tasks that involve Design systems.
Run `npx skills add cometchat/cometchat-skills --skill cometchat-react-native-v5-sdk -a claude-code`. Or copy the skill folder (skills/cometchat-react-native-v5-sdk in cometchat/cometchat-skills) into .claude/skills/cometchat-react-native-v5-sdk in your project. Claude Code loads it when a task matches its description.
Run `npx skills add cometchat/cometchat-skills --skill cometchat-react-native-v5-sdk -a codex`. Or copy the skill folder (skills/cometchat-react-native-v5-sdk in cometchat/cometchat-skills) into .agents/skills/cometchat-react-native-v5-sdk in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add cometchat/cometchat-skills --skill cometchat-react-native-v5-sdk -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/cometchat-react-native-v5-sdk, .gemini/skills/cometchat-react-native-v5-sdk, .github/skills/cometchat-react-native-v5-sdk and .opencode/skills/cometchat-react-native-v5-sdk in your project.
Going by SKILL.md and its folder, Cometchat React Native V5 SDK needs the command-line tools its instructions call (npm, npx and node) and credentials named AUTH_KEY. Our summary lists: Node.js. Compatibility (from SKILL.md): React Native 0.71+ (old architecture AND New Architecture incl. bridgeless); Node 18+; iOS 13.0+ / Xcode 14+; Android minSdk 24. @cometchat/calls-sdk-react-native@^5 (5.0.5) + 6 pinned peer deps (see Prerequisites). 1:1 ringing also needs @cometchat/chat-sdk-react-native@^4 for signaling. Bare RN and Expo prebuild/dev-client; NOT Expo Go (native WebRTC module)..
SKILL.md contains no URLs. Its commands use npm and npx, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Cometchat React Native V5 SDK is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.2k tokens (SKILL.md is roughly 21k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 6.7k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Cometchat React Native V5 SDK: Expo Tailwind Setup (CherryHQ/cherry-studio-app, 4k stars), Screenmap (aleqsio/screenmap, 239 stars), Expo Brownfield Integration (mweinbach/agent-coworker, 156 stars) and Expo UI (arcboxlabs/linkcode, 155 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
cometchat (a GitHub organization) maintains it in cometchat/cometchat-skills, which has 129 GitHub stars. The repository holds 97 skills in this directory. The repository was last updated on October 5, 2026.
Source: cometchat/cometchat-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.