{"id":"9a9f8241-1270-4641-884e-e0f4bec953e3","shortId":"SJH3p9","kind":"skill","title":"cometchat-native-bare-patterns","tagline":"Integration patterns for bare React Native CLI projects — pod install, Info.plist + AndroidManifest permissions, Apple privacy manifest, native module linking, Metro config.","description":"## Purpose\n\nTeaches Claude how to integrate CometChat into a bare React Native CLI project. Covers:\n\n- Installing the full peer-dependency set + native-module autolinking\n- `pod install` cadence for iOS\n- Editing `ios/<AppName>/Info.plist` for iOS permissions\n- Editing `android/app/src/main/AndroidManifest.xml` for Android permissions\n- Android-specific async-storage Maven repo gotcha\n- **Apple privacy manifest** (`ios/<AppName>/PrivacyInfo.xcprivacy`) — required for App Store compliance\n- Wiring `index.js` + `App.tsx` with the provider chain\n\n**Read `cometchat-native-core` first** (init/login/wrapper chain + anti-patterns), then `cometchat-native-components`, then `cometchat-native-placement`.\n\nGround truth: `docs/ui-kit/react-native/react-native-cli-integration.mdx`, `apple-privacy-manifest-guide.mdx`, `react-native-conversation.mdx` + `react-native-one-to-one-chat.mdx` + `react-native-tab-based-chat.mdx`, and `examples/SampleApp/`.\n\n---\n\n## Use this skill when\n\n- Project has `ios/` and `android/` folders at the root\n- `package.json` `main` is `index.js` (classic RN entry)\n- No `expo` in `package.json` dependencies\n- User says \"React Native CLI\", \"bare RN\", \"ejected Expo\", or \"custom native modules\"\n\n**Do NOT use this skill when:**\n- Project has `expo` in dependencies + `app.json`/`app.config.js` → use `cometchat-native-expo-patterns`\n- Project is Expo that's prebuilt into `ios/` + `android/` folders → this can go either way. If the user's workflow is \"I edit app.json and run `expo prebuild`\", stay on expo-patterns. If they've fully committed to bare (deleted `app.json`, edit `Info.plist` directly), this skill applies.\n\n---\n\n## Prerequisites\n\n- Xcode 15+ for iOS (required for Apple privacy manifest)\n- Android Studio with SDK 34+\n- CocoaPods installed (`brew install cocoapods` on macOS)\n- `react-native-cli` or `@react-native-community/cli` usable via `npx`\n- React Native **>=0.77** — older versions may work but are not officially supported by the UI Kit\n\n---\n\n## Step 1 — Install dependencies\n\n```bash\n# Core SDK + UI Kit\nnpm install @cometchat/chat-sdk-react-native\nnpm install @cometchat/chat-uikit-react-native\n\n# Required peer deps (natively linked)\nnpm install \\\n  @react-native-async-storage/async-storage \\\n  @react-native-clipboard/clipboard \\\n  @react-native-community/datetimepicker \\\n  react-native-gesture-handler \\\n  react-native-localize \\\n  react-native-safe-area-context \\\n  react-native-svg \\\n  react-native-video\n\n# dayjs + punycode — no native code but required\nnpm install dayjs punycode\n```\n\nBare RN uses autolinking, so no `react-native link` step is needed. Just confirm everything installed cleanly — if `npm install` errored mid-way, native modules won't be wired up correctly.\n\n### Optional — calling SDK\n\nOnly if the user's flow includes voice / video calls:\n\n```bash\nnpm install \\\n  @cometchat/calls-sdk-react-native \\\n  @react-native-community/netinfo \\\n  react-native-background-timer \\\n  react-native-callstats \\\n  react-native-webrtc\n```\n\nWebRTC bloats the binary. Skip until the user actually wants calls.\n\n---\n\n## Step 2 — iOS: pod install + Info.plist + PrivacyInfo\n\n### 2a. Pod install\n\nAfter **every** `npm install` of a native module (including the initial install above), run:\n\n```bash\ncd ios && pod install && cd ..\n```\n\nWithout this, Xcode will fail to build with \"module not found\" errors for native classes. The warning signs:\n\n- `No such module 'RNGestureHandler'` during build\n- `Undefined symbol: _OBJC_CLASS_$_RNCAsyncStorage` during linking\n- Build succeeds but runtime crash: \"TurboModuleRegistry.getEnforcing(...): 'RNAsyncStorage' could not be found\"\n\nIf pod install fails, see `cometchat-native-troubleshooting` § iOS pod install failures.\n\n### 2b. Info.plist permissions\n\nOpen `ios/<AppName>/Info.plist` and add:\n\n```xml\n<key>NSCameraUsageDescription</key>\n<string>Allow camera access to send photos and make video calls</string>\n\n<key>NSMicrophoneUsageDescription</key>\n<string>Allow microphone access to send voice messages and make calls</string>\n\n<key>NSPhotoLibraryUsageDescription</key>\n<string>Allow photo library access to send photos</string>\n\n<key>NSPhotoLibraryAddUsageDescription</key>\n<string>Allow saving photos from chat to your library</string>\n```\n\n**Permission-string best practice**: the `Usage` strings show in the system prompt when iOS asks the user for permission — write them as user-facing copy, not developer notes. `\"Camera access for video calls\"` is fine; `\"for media upload\"` isn't a real reason a user would accept.\n\n**Merge, don't replace.** The user may have existing permission strings for other libraries — add only what's missing, don't wipe the file.\n\n### 2c. Apple Privacy Manifest — `PrivacyInfo.xcprivacy`\n\n**Required for App Store submission since iOS SDK 17 / Xcode 15.** If it's missing or incomplete, App Store Connect rejects the upload.\n\nCreate `ios/<AppName>/PrivacyInfo.xcprivacy` with this exact content:\n\n```xml\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n    <key>NSPrivacyAccessedAPITypes</key>\n    <array>\n        <dict>\n            <key>NSPrivacyAccessedAPIType</key>\n            <string>NSPrivacyAccessedAPICategoryFileTimestamp</string>\n            <key>NSPrivacyAccessedAPITypeReasons</key>\n            <array>\n                <string>C617.1</string>\n            </array>\n        </dict>\n        <dict>\n            <key>NSPrivacyAccessedAPIType</key>\n            <string>NSPrivacyAccessedAPICategoryUserDefaults</string>\n            <key>NSPrivacyAccessedAPITypeReasons</key>\n            <array>\n                <string>CA92.1</string>\n            </array>\n        </dict>\n        <dict>\n            <key>NSPrivacyAccessedAPIType</key>\n            <string>NSPrivacyAccessedAPICategorySystemBootTime</string>\n            <key>NSPrivacyAccessedAPITypeReasons</key>\n            <array>\n                <string>35F9.1</string>\n            </array>\n        </dict>\n    </array>\n    <key>NSPrivacyCollectedDataTypes</key>\n    <array/>\n    <key>NSPrivacyTracking</key>\n    <false/>\n</dict>\n</plist>\n```\n\nThese 3 reason codes match what the kit's own `examples/SampleApp/ios/SampleApp/PrivacyInfo.xcprivacy` ships:\n\n| API category | Reason code | What it's for |\n|---|---|---|\n| `NSPrivacyAccessedAPICategoryFileTimestamp` | `C617.1` | File-modified timestamps (RN bundler) |\n| `NSPrivacyAccessedAPICategoryUserDefaults` | `CA92.1` | AsyncStorage (UserDefaults backend on iOS) |\n| `NSPrivacyAccessedAPICategorySystemBootTime` | `35F9.1` | Uptime for scheduling (RN + video cache) |\n\n> **Optional fourth entry:** if your app does explicit free-space checks before media uploads, add `NSPrivacyAccessedAPICategoryDiskSpace` / `E174.1` too. The kit's sample doesn't ship this entry, so it isn't required for a default integration.\n\nAfter adding:\n\n1. Open `ios/<AppName>.xcworkspace` in Xcode\n2. Right-click the app folder in the navigator → \"Add Files to \\\"\\<AppName\\>\\\"\"\n3. Select `PrivacyInfo.xcprivacy` — make sure \"Add to targets: \\<AppName\\>\" is checked\n4. Rebuild\n\n**If the user already has a `PrivacyInfo.xcprivacy`**, merge the 4 API types into their existing `NSPrivacyAccessedAPITypes` array — don't replace the whole file.\n\n### 2d. Install pods after Info.plist / PrivacyInfo changes\n\n```bash\ncd ios && pod install && cd ..\n```\n\n---\n\n## Step 3 — Android: AndroidManifest + Maven repo\n\n### 3a. AndroidManifest permissions\n\nOpen `android/app/src/main/AndroidManifest.xml` and add inside `<manifest>` (before `<application>`):\n\n```xml\n<uses-permission android:name=\"android.permission.INTERNET\" />\n<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n<uses-permission android:name=\"android.permission.CAMERA\" />\n<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />\n<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\" />\n<uses-permission android:name=\"android.permission.VIBRATE\" />\n\n<!-- Android 12 and below -->\n<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" android:maxSdkVersion=\"32\" />\n<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\" android:maxSdkVersion=\"32\" />\n\n<!-- Android 13+ (API 33+) -->\n<uses-permission android:name=\"android.permission.READ_MEDIA_IMAGES\" />\n<uses-permission android:name=\"android.permission.READ_MEDIA_VIDEO\" />\n<uses-permission android:name=\"android.permission.READ_MEDIA_AUDIO\" />\n```\n\n**Merge, don't replace.** Keep the user's existing permissions for other libraries.\n\n### 3b. Android: async-storage Maven repo (REQUIRED)\n\n`@react-native-async-storage/async-storage` v3+ ships a **local Maven artifact** that autolinking can't find by default. Without this fix, `./gradlew assembleDebug` fails with:\n\n```\nCould not find :react-native-async-storage_async-storage: on any of the paths.\n```\n\nAdd the local Maven repo to `android/build.gradle`:\n\n```gradle\nallprojects {\n    repositories {\n        google()\n        mavenCentral()\n        // Required for @react-native-async-storage/async-storage v3+\n        maven {\n            url = uri(project(\":react-native-async-storage_async-storage\").file(\"local_repo\"))\n        }\n    }\n}\n```\n\nWithout this fix, the whole Android build fails early. This is a UI Kit-specific gotcha because the kit pins async-storage v3+.\n\n### 3c. Android: Metro config for custom fonts or assets (if applicable)\n\nIf the project uses custom icon fonts or bundled assets, confirm `react-native.config.js` includes:\n\n```js\nmodule.exports = {\n  assets: [\"./src/assets/fonts/\"],   // only if the user has custom fonts\n};\n```\n\nRun `npx react-native-asset` to link. Not required for the UI Kit itself — only relevant if the user extends with custom icons.\n\n---\n\n## Step 4 — Wire `index.js` + `App.tsx` with the provider chain\n\n### 4a. `index.js` — gesture handler FIRST\n\n```js\n// index.js\nimport \"react-native-gesture-handler\";   // MUST be the first import\nimport { AppRegistry } from \"react-native\";\nimport App from \"./App\";\nimport { name as appName } from \"./app.json\";\n\nAppRegistry.registerComponent(appName, () => App);\n```\n\n**The `react-native-gesture-handler` import must be line 1.** Not line 2. Not after React. Without it, swipe gestures on the composer and bottom sheets silently break — often only in release builds, which makes it hard to catch during development.\n\n### 4b. `App.tsx` — provider wrapper chain\n\n```tsx\n// App.tsx\nimport React from \"react\";\nimport { GestureHandlerRootView } from \"react-native-gesture-handler\";\nimport { SafeAreaProvider } from \"react-native-safe-area-context\";\nimport { CometChatThemeProvider } from \"@cometchat/chat-uikit-react-native\";\nimport { CometChatProvider } from \"./src/providers/CometChatProvider\";\nimport { AppNavigator } from \"./src/navigation/AppNavigator\";\nimport Config from \"react-native-config\";  // or read from an env source\n\nexport default function App() {\n  return (\n    <GestureHandlerRootView style={{ flex: 1 }}>\n      <SafeAreaProvider>\n        <CometChatThemeProvider>\n          <CometChatProvider\n            appId={Config.COMETCHAT_APP_ID!}\n            region={Config.COMETCHAT_REGION!}\n            authKey={Config.COMETCHAT_AUTH_KEY!}\n            uid=\"cometchat-uid-1\"   // dev mode only\n          >\n            <AppNavigator />\n          </CometChatProvider>\n        </CometChatThemeProvider>\n      </SafeAreaProvider>\n    </GestureHandlerRootView>\n  );\n}\n```\n\nThe `CometChatProvider` itself lives in `src/providers/CometChatProvider.tsx` per `cometchat-native-core` § 6 — reuse that implementation.\n\n---\n\n## Step 5 — Env vars\n\nBare RN has no built-in env var system. Pick one:\n\n### Option A — `react-native-config` (most common)\n\n```bash\nnpm install react-native-config\ncd ios && pod install && cd ..\n```\n\nCreate `.env` at project root:\n\n```\nCOMETCHAT_APP_ID=your_app_id\nCOMETCHAT_REGION=us\nCOMETCHAT_AUTH_KEY=your_auth_key\n```\n\nRead via:\n\n```tsx\nimport Config from \"react-native-config\";\nconst appId = Config.COMETCHAT_APP_ID;\n```\n\n**iOS post-setup**: Xcode needs to know about the `.env` file. Either use `react-native-config`'s Xcode build-phase script (documented in its README) or create a `.xcconfig` file. Without this, `Config.*` returns `undefined` on iOS.\n\n### Option B — `react-native-dotenv` (`@env` imports, very common)\n\n```bash\nnpm install --save-dev react-native-dotenv\n```\n\nAdd to `babel.config.js`:\n\n```js\nmodule.exports = {\n  presets: ['module:@react-native/babel-preset'],\n  plugins: [\n    ['module:react-native-dotenv', { moduleName: '@env' }],\n  ],\n};\n```\n\nCreate `.env` and consume via `@env` imports:\n\n```ts\nimport { COMETCHAT_APP_ID, COMETCHAT_REGION, COMETCHAT_AUTH_KEY } from '@env';\n```\n\n**⚠️ `react-native-dotenv` is a babel-time plugin — `.env` changes need a Metro cache reset (validated 2026-05-14).**\n\nThe plugin reads `.env` at babel compile time and inlines values. Editing `.env` and reloading does NOT pick up new values — Metro keeps the previously bundled inline value forever. Workflow when creds change:\n\n```bash\npkill -9 -f \"react-native start\"\nnpx react-native start --reset-cache\n\n# react-native start does NOT run `adb reverse` like run-android does —\n# restore the port forwarding manually:\nadb reverse tcp:8081 tcp:8081\n\n# Then force-stop + relaunch the app\nadb shell am force-stop com.<package>\nadb shell monkey -p com.<package> -c android.intent.category.LAUNCHER 1\n```\n\nSilent failure mode: device shows \"unable to load scripts\" (no adb reverse) OR app boots with old credentials (cache not cleared). Hit twice on the rn-new / rn-existing cohorts 2026-05-14.\n\n### Option C — `babel-plugin-dotenv-import`\n\nSimpler but less mature. Only if the user's already picked this.\n\n### Option D — hardcoded constants (NEVER for production)\n\nFor a quick dev-mode proof-of-concept only, just declare the values as constants in a dedicated config file:\n\n```ts\n// src/config/cometchat.ts\nexport const CONFIG = {\n  APP_ID: \"YOUR_APP_ID\",\n  REGION: \"us\",\n  AUTH_KEY: \"YOUR_AUTH_KEY\",\n};\n```\n\nAdd `src/config/cometchat.ts` to `.gitignore`. Obviously do not commit real credentials.\n\n### Never put `REST_API_KEY` in the client\n\nThe REST API key is server-only. Production user management + auth token minting happens on a backend you control — see `cometchat-native-production`.\n\n---\n\n## Step 6 — Run + verify\n\n### First run\n\n```bash\n# iOS\nnpx react-native run-ios\n\n# Android\nnpx react-native run-android\n```\n\nFirst build takes several minutes. Subsequent runs with the Metro bundler already running are fast.\n\n### Verify\n\n1. `npx tsc --noEmit` — TypeScript check\n2. Open the chat screen in the simulator\n3. Tap the composer — keyboard should open smoothly\n4. Tap the \"+\" attachment button — action sheet should slide up (gesture handler)\n5. Send a message — it should appear immediately\n\nIf any of these fail, see `cometchat-native-troubleshooting`.\n\n### Re-run cadence\n\n| Change | Command |\n|---|---|\n| JSX / TS changes | Fast Refresh handles it; `r` in Metro to reload |\n| Added / removed a dep without native code | Restart Metro |\n| Added / removed a native module | `cd ios && pod install && cd ..` then run-ios |\n| Changed `Info.plist` | `run-ios` (Xcode picks up changes) |\n| Changed `AndroidManifest.xml` | `run-android` |\n| Changed `android/build.gradle` | `./gradlew clean` then `run-android` |\n\n---\n\n## Hard rules\n\n1. **`pod install` is mandatory after every native dep change.** Missing this → build fails with \"module not found\" or crashes at runtime with \"TurboModuleRegistry could not find X\".\n\n2. **`import \"react-native-gesture-handler\"` is the FIRST line of `index.js`.** Before React. Before any other import. Missing → swipe gestures silently break (often only in release builds).\n\n3. **Android requires the local Maven repo entry** for `@react-native-async-storage/async-storage` v3+ (see § 3b). Without it, the Android build fails at the assembly step.\n\n4. **The Apple Privacy Manifest is required for App Store submission.** Skip it and your app gets rejected. Either create `PrivacyInfo.xcprivacy` (§ 2c) or merge the 4 API types into an existing one.\n\n5. **Merge permissions into `Info.plist` and `AndroidManifest.xml`, don't replace.** Wiping out the user's existing permissions breaks their other features.\n\n6. **The four-wrapper chain is at the app root (`App.tsx`), not per-screen.** Re-wrapping per screen causes duplicate init + login, dropped WebSockets, and a 2-3 second flicker on first mount.\n\n7. **`REST_API_KEY` is never in the client.** Use an external backend for token minting — see `cometchat-native-production`.\n\n8. **Every `<CometChatMessageList>` must include `hideReplyInThreadOption`** unless you're wiring a full thread panel (see `cometchat-native-placement` § Hard rule 5).\n\n---\n\n## Common questions\n\n**Q: \"TurboModuleRegistry.getEnforcing(...): 'RNAsyncStorage' could not be found\"**\nForgot `pod install`. Run `cd ios && pod install && cd ..` then rebuild.\n\n**Q: Android build fails with \"Could not find :react-native-async-storage_async-storage:\"**\nSee § 3b — add the local Maven repo entry to `android/build.gradle`.\n\n**Q: App Store rejected the build with \"ITMS-91053: Missing API declaration\"**\nApple Privacy Manifest is incomplete. Use the full 4-API-type declaration in § 2c.\n\n**Q: Composer swipe gestures don't work in production**\n`import \"react-native-gesture-handler\"` isn't the first line of `index.js`. Move it above all other imports.\n\n**Q: `CometChatUIKit.login({uid: \"...\"})` resolves but components don't render**\nYou're probably rendering before `init()` completes. Gate rendering on `CometChatProvider`'s `isReady` state — see `cometchat-native-core` § 6.\n\n**Q: I want to support Expo AND bare in the same codebase**\nUse Expo + `npx expo prebuild` to generate native projects on demand. Stay on `cometchat-native-expo-patterns`.\n\n---\n\n## Skill routing reference\n\n| Skill | When to route |\n|---|---|\n| `cometchat-native-core` | Init / login / wrapper chain / anti-patterns |\n| `cometchat-native-components` | Component prop reference |\n| `cometchat-native-placement` | Where chat goes (stack / tabs / modal / bottom sheet / embedded) |\n| `cometchat-native-expo-patterns` | Expo managed workflow |\n| `cometchat-native-bare-patterns` | This skill — bare RN CLI |\n| `cometchat-native-features` | Calls, extensions, AI |\n| `cometchat-native-theming` | Theme customization |\n| `cometchat-native-customization` | Text formatters, events, custom views |\n| `cometchat-native-production` | Server-side auth tokens + user management |\n| `cometchat-native-troubleshooting` | pod install fails, build errors, missing modules, privacy manifest rejection |","tags":["cometchat","native","bare","patterns","skills","agent-skills","ai-agent","chat","claude-code","cursor","messaging","nextjs"],"capabilities":["skill","source-cometchat","skill-cometchat-native-bare-patterns","topic-agent-skills","topic-ai-agent","topic-chat","topic-claude-code","topic-cometchat","topic-cursor","topic-messaging","topic-nextjs","topic-react","topic-react-native","topic-ui-kit"],"categories":["cometchat-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/cometchat/cometchat-skills/cometchat-native-bare-patterns","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add cometchat/cometchat-skills","source_repo":"https://github.com/cometchat/cometchat-skills","install_from":"skills.sh"}},"qualityScore":"0.463","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 27 github stars · SKILL.md body (18,642 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:04:53.911Z","embedding":null,"createdAt":"2026-05-07T13:05:14.044Z","updatedAt":"2026-05-18T19:04:53.911Z","lastSeenAt":"2026-05-18T19:04:53.911Z","tsv":"'-05':1412,1543 '-14':1413,1544 '-3':1977 '-9':1449 '-91053':2079 '/app':1075 '/app.json':1081 '/async-storage':308,882,938,1880 '/babel-preset':1365 '/cli':261 '/clipboard':313 '/datetimepicker':318 '/gradlew':899,1801 '/info.plist':60,522 '/netinfo':407 '/privacyinfo.xcprivacy':82,668 '/src/assets/fonts':1007 '/src/navigation/appnavigator':1166 '/src/providers/cometchatprovider':1162 '0.77':267 '1':282,771,1095,1188,1205,1509,1692,1809 '15':232,653 '17':651 '2':433,777,1098,1698,1837,1976 '2026':1411,1542 '2a':439 '2b':517 '2c':638,1915,2097 '2d':827 '3':690,791,841,1706,1866 '34':244 '35f9.1':686,725 '3a':846 '3b':869,1883,2062 '3c':980 '4':802,813,1040,1714,1894,1919,2091 '4a':1048 '4b':1127 '5':1225,1726,1926,2024 '6':1220,1654,1947,2154 '7':1983 '8':2004 '8081':1485,1487 'accept':613 'access':529,540,552,596 'action':1719 'actual':429 'ad':770,1762,1771 'adb':1470,1482,1495,1502,1520 'add':524,628,747,787,796,852,919,1355,1610,2063 'ai':2247 'allow':527,538,549,557 'allproject':927 'alreadi':807,1561,1687 'android':67,70,133,190,240,842,870,960,981,1475,1668,1675,1798,1806,1867,1887,2046 'android-specif':69 'android.intent.category.launcher':1508 'android/app/src/main/androidmanifest.xml':65,850 'android/build.gradle':925,1800,2070 'androidmanifest':17,843,847 'androidmanifest.xml':1795,1932 'anti':104,2201 'anti-pattern':103,2200 'api':701,814,1623,1630,1920,1985,2081,2093 'api-typ':2092 'app':85,645,660,737,782,1073,1084,1183,1192,1266,1269,1293,1384,1494,1523,1598,1601,1902,1909,1956,2072 'app.config.js':175 'app.json':174,205,223 'app.tsx':90,1043,1128,1133,1958 'appear':1732 'appid':1190,1291 'appl':19,78,237,639,1896,2083 'apple-privacy-manifest-guide.mdx':119 'appli':229 'applic':990 'appnam':790,799,1079,1083 'appnavig':1164 'appregistri':1067 'appregistry.registercomponent':1082 'area':332,1153 'array':820 'artifact':888 'ask':580 'assembl':1892 'assembledebug':900 'asset':988,1000,1006,1020 'async':73,306,872,880,909,912,936,947,950,977,1878,2056,2059 'async-storag':72,871,911,949,976,2058 'asyncstorag':719 'attach':1717 'auth':1199,1275,1278,1389,1605,1608,1639,2270 'authkey':1197 'autolink':52,356,890 'b':1336 'babel':1400,1419,1548 'babel-plugin-dotenv-import':1547 'babel-tim':1399 'babel.config.js':1357 'backend':721,1645,1995 'background':411 'bare':4,9,36,155,221,353,1228,2162,2234,2238 'bash':285,399,456,834,1248,1345,1447,1659 'best':568 'binari':424 'bloat':422 'boot':1524 'bottom':1110,2220 'break':1113,1860,1943 'brew':247 'build':468,485,493,961,1118,1316,1677,1821,1865,1888,2047,2076,2281 'build-phas':1315 'built':1233 'built-in':1232 'bundl':999,1439 'bundler':716,1686 'button':1718 'c':1507,1546 'c617.1':678,710 'ca92.1':682,718 'cach':731,1408,1462,1528 'cadenc':55,1747 'call':387,398,431,536,547,599,2245 'callstat':416 'camera':528,595 'catch':1124 'categori':702 'caus':1968 'cd':457,461,835,839,1255,1259,1776,1780,2038,2042 'chain':94,102,1047,1131,1952,2199 'chang':833,1404,1446,1748,1752,1785,1793,1794,1799,1818 'chat':561,1701,2215 'check':743,801,1697 'class':476,489 'classic':142 'claud':29 'clean':370,1802 'clear':1530 'cli':12,39,154,255,2240 'click':780 'client':1627,1991 'clipboard':312 'cocoapod':245,249 'code':346,692,704,1768 'codebas':2166 'cohort':1541 'com':1501,1506 'cometchat':2,33,97,108,113,178,510,1203,1217,1265,1271,1274,1383,1386,1388,1650,1741,2001,2019,2151,2181,2193,2204,2211,2224,2232,2242,2249,2255,2264,2275 'cometchat-native-bare-pattern':1,2231 'cometchat-native-compon':107,2203 'cometchat-native-cor':96,1216,2150,2192 'cometchat-native-custom':2254 'cometchat-native-expo-pattern':177,2180,2223 'cometchat-native-featur':2241 'cometchat-native-plac':112,2018,2210 'cometchat-native-product':1649,2000,2263 'cometchat-native-them':2248 'cometchat-native-troubleshoot':509,1740,2274 'cometchat-uid':1202 'cometchat/calls-sdk-react-native':402 'cometchat/chat-sdk-react-native':292 'cometchat/chat-uikit-react-native':295,1158 'cometchatprovid':1160,1189,1210,2145 'cometchatthemeprovid':1156 'cometchatuikit.login':2127 'command':1749 'commit':219,1617 'common':1247,1344,2025 'communiti':260,317,406 'compil':1420 'complet':2141 'complianc':87 'compon':110,2131,2206,2207 'compos':1108,1709,2099 'concept':1580 'config':26,983,1168,1173,1245,1254,1284,1289,1312,1330,1591,1597 'config.cometchat':1191,1195,1198,1292 'confirm':367,1001 'connect':662 'const':1290,1596 'constant':1567,1587 'consum':1377 'content':672 'context':333,1154 'control':1647 'copi':591 'core':99,286,1219,2153,2195 'correct':385 'could':500,903,1833,2030,2050 'cover':41 'crash':497,1828 'creat':666,1260,1324,1374,1913 'cred':1445 'credenti':1527,1619 'custom':160,985,995,1013,1037,2253,2257,2261 'd':1565 'dayj':342,351 'declar':1583,2082,2095 'dedic':1590 'default':767,895,1181 'delet':222 'demand':2177 'dep':298,1765,1817 'depend':47,149,173,284 'dev':1206,1350,1575 'dev-mod':1574 'develop':593,1126 'devic':1513 'direct':226 'docs/ui-kit/react-native/react-native-cli-integration.mdx':118 'document':1319 'doesn':755 'dotenv':1340,1354,1371,1396,1550 'drop':1972 'duplic':1969 'e174.1':749 'earli':963 'edit':58,64,204,224,1425 'either':195,1307,1912 'eject':157 'embed':2222 'entri':144,734,759,1873,2068 'env':1178,1226,1235,1261,1305,1341,1373,1375,1379,1392,1403,1417,1426 'error':374,473,2282 'event':2260 'everi':443,1815,2005 'everyth':368 'exact':671 'examples/sampleapp':124 'examples/sampleapp/ios/sampleapp/privacyinfo.xcprivacy':699 'exist':622,818,864,1540,1924,1941 'explicit':739 'expo':146,158,171,180,184,208,213,2160,2168,2170,2183,2226,2228 'expo-pattern':212 'export':1180,1595 'extend':1035 'extens':2246 'extern':1994 'f':1450 'face':590 'fail':466,507,901,962,1738,1822,1889,2048,2280 'failur':516,1511 'fast':1690,1753 'featur':1946,2244 'file':637,712,788,826,952,1306,1327,1592 'file-modifi':711 'find':893,905,1835,2052 'fine':601 'first':100,1052,1064,1657,1676,1846,1981,2116 'fix':898,957 'flex':1187 'flicker':1979 'flow':394 'folder':134,191,783 'font':986,997,1014 'forc':1490,1499 'force-stop':1489,1498 'forev':1442 'forgot':2034 'formatt':2259 'forward':1480 'found':472,503,1826,2033 'four':1950 'four-wrapp':1949 'fourth':733 'free':741 'free-spac':740 'full':44,2014,2090 'fulli':218 'function':1182 'gate':2142 'generat':2173 'gestur':322,1050,1059,1089,1105,1144,1724,1842,1858,2101,2111 'gesturehandlerrootview':1139,1185 'get':1910 'gitignor':1613 'go':194 'goe':2216 'googl':929 'gotcha':77,971 'gradl':926 'ground':116 'handl':1755 'handler':323,1051,1060,1090,1145,1725,1843,2112 'happen':1642 'hard':1122,1807,2022 'hardcod':1566 'hidereplyinthreadopt':2008 'hit':1531 'icon':996,1038 'id':1193,1267,1270,1294,1385,1599,1602 'immedi':1733 'implement':1223 'import':1055,1065,1066,1072,1076,1091,1134,1138,1146,1155,1159,1163,1167,1283,1342,1380,1382,1551,1838,1855,2107,2125 'includ':395,450,1003,2007 'incomplet':659,2087 'index.js':89,141,1042,1049,1054,1849,2119 'info.plist':16,225,437,518,831,1786,1930 'init':1970,2140,2196 'init/login/wrapper':101 'initi':452 'inlin':1423,1440 'insid':853 'instal':15,42,54,246,248,283,291,294,302,350,369,373,401,436,441,445,453,460,506,515,828,838,1250,1258,1347,1779,1811,2036,2041,2279 'integr':6,32,768 'io':57,59,62,81,131,189,234,434,458,513,521,579,649,667,723,773,836,1256,1295,1334,1660,1667,1777,1784,1789,2039 'isn':605,762,2113 'isreadi':2147 'itm':2078 'js':1004,1053,1358 'jsx':1750 'keep':860,1436 'key':1200,1276,1279,1390,1606,1609,1624,1631,1986 'keyboard':1710 'kit':280,289,696,752,969,974,1028 'kit-specif':968 'know':1302 'less':1554 'librari':551,564,627,868 'like':1472 'line':1094,1097,1847,2117 'link':24,300,362,492,1022 'live':1212 'load':1517 'local':327,886,921,953,1870,2065 'login':1971,2197 'maco':251 'main':139 'make':534,546,794,1120 'manag':1638,2229,2273 'mandatori':1813 'manifest':21,80,239,641,1898,2085,2286 'manual':1481 'match':693 'matur':1555 'maven':75,844,874,887,922,940,1871,2066 'mavencentr':930 'may':270,620 'media':603,745 'merg':614,811,856,1917,1927 'messag':544,1729 'metro':25,982,1407,1435,1685,1759,1770 'microphon':539 'mid':376 'mid-way':375 'mint':1641,1998 'minut':1680 'miss':632,657,1819,1856,2080,2283 'modal':2219 'mode':1207,1512,1576 'modifi':713 'modul':23,51,162,379,449,470,482,1361,1367,1775,1824,2284 'module.exports':1005,1359 'modulenam':1372 'monkey':1504 'mount':1982 'move':2120 'must':1061,1092,2006 'name':1077 'nativ':3,11,22,38,50,98,109,114,153,161,179,254,259,266,299,305,311,316,321,326,330,336,340,345,361,378,405,410,415,419,448,475,511,879,908,935,946,1019,1058,1071,1088,1143,1151,1172,1218,1244,1253,1288,1311,1339,1353,1364,1370,1395,1453,1458,1465,1651,1664,1672,1742,1767,1774,1816,1841,1877,2002,2020,2055,2110,2152,2174,2182,2194,2205,2212,2225,2233,2243,2250,2256,2265,2276 'native-modul':49 'navig':786 'need':365,1300,1405 'never':1568,1620,1988 'new':1433,1537 'noemit':1695 'note':594 'npm':290,293,301,349,372,400,444,1249,1346 'npx':264,1016,1455,1661,1669,1693,2169 'nscamerausagedescript':526 'nsmicrophoneusagedescript':537 'nsphotolibraryaddusagedescript':556 'nsphotolibraryusagedescript':548 'nsprivacyaccessedapicategorydiskspac':748 'nsprivacyaccessedapicategoryfiletimestamp':676,709 'nsprivacyaccessedapicategorysystemboottim':684,724 'nsprivacyaccessedapicategoryuserdefault':680,717 'nsprivacyaccessedapityp':674,675,679,683,819 'nsprivacyaccessedapitypereason':677,681,685 'nsprivacycollecteddatatyp':687 'nsprivacytrack':688 'objc':488 'obvious':1614 'offici':275 'often':1114,1861 'old':1526 'older':268 'one':1239,1925 'open':520,772,849,1699,1712 'option':386,732,1240,1335,1545,1564 'p':1505 'package.json':138,148 'panel':2016 'path':918 'pattern':5,7,105,181,214,2184,2202,2227,2235 'peer':46,297 'peer-depend':45 'per':1215,1961,1966 'per-screen':1960 'permiss':18,63,68,519,566,584,623,848,865,1928,1942 'permission-str':565 'phase':1317 'photo':532,550,555,559 'pick':1238,1431,1562,1791 'pin':975 'pkill':1448 'placement':115,2021,2213 'plugin':1366,1402,1415,1549 'pod':14,53,435,440,459,505,514,829,837,1257,1778,1810,2035,2040,2278 'port':1479 'post':1297 'post-setup':1296 'practic':569 'prebuild':209,2171 'prebuilt':187 'prerequisit':230 'preset':1360 'previous':1438 'privaci':20,79,238,640,1897,2084,2285 'privacyinfo':438,832 'privacyinfo.xcprivacy':642,793,810,1914 'probabl':2137 'product':1570,1636,1652,2003,2106,2266 'project':13,40,129,169,182,943,993,1263,2175 'prompt':577 'proof':1578 'proof-of-concept':1577 'prop':2208 'provid':93,1046,1129 'punycod':343,352 'purpos':27 'put':1621 'q':2027,2045,2071,2098,2126,2155 'question':2026 'quick':1573 'r':1757 're':1745,1964,2011,2136 're-run':1744 're-wrap':1963 'react':10,37,152,253,258,265,304,310,315,320,325,329,335,339,360,404,409,414,418,878,907,934,945,1018,1057,1070,1087,1101,1135,1137,1142,1150,1171,1243,1252,1287,1310,1338,1352,1363,1369,1394,1452,1457,1464,1663,1671,1840,1851,1876,2054,2109 'react-nat':359,1069,1362,1451,1456,1463,1662,1670 'react-native-asset':1017 'react-native-async-storag':303,877,906,933,944,1875,2053 'react-native-background-tim':408 'react-native-c':252 'react-native-callstat':413 'react-native-clipboard':309 'react-native-commun':257,314,403 'react-native-config':1170,1242,1251,1286,1309 'react-native-conversation.mdx':120 'react-native-dotenv':1337,1351,1368,1393 'react-native-gesture-handl':319,1056,1086,1141,1839,2108 'react-native-loc':324 'react-native-one-to-one-chat.mdx':121 'react-native-safe-area-context':328,1149 'react-native-svg':334 'react-native-tab-based-chat.mdx':122 'react-native-video':338 'react-native-webrtc':417 'react-native.config.js':1002 'read':95,1175,1280,1416 'readm':1322 'real':608,1618 'reason':609,691,703 'rebuild':803,2044 'refer':2187,2209 'refresh':1754 'region':1194,1196,1272,1387,1603 'reject':663,1911,2074,2287 'relaunch':1492 'releas':1117,1864 'relev':1031 'reload':1428,1761 'remov':1763,1772 'render':2134,2138,2143 'replac':617,823,859,1935 'repo':76,845,875,923,954,1872,2067 'repositori':928 'requir':83,235,296,348,643,764,876,931,1024,1868,1900 'reset':1409,1461 'reset-cach':1460 'resolv':2129 'rest':1622,1629,1984 'restart':1769 'restor':1477 'return':1184,1331 'reus':1221 'revers':1471,1483,1521 'right':779 'right-click':778 'rn':143,156,354,715,729,1229,1536,1539,2239 'rn-exist':1538 'rn-new':1535 'rnasyncstorag':499,2029 'rncasyncstorag':490 'rngesturehandl':483 'root':137,1264,1957 'rout':2186,2191 'rule':1808,2023 'run':207,455,1015,1469,1474,1655,1658,1666,1674,1682,1688,1746,1783,1788,1797,1805,2037 'run-android':1473,1673,1796,1804 'run-io':1665,1782,1787 'runtim':496,1830 'safe':331,1152 'safeareaprovid':1147 'sampl':754 'save':558,1349 'save-dev':1348 'say':151 'schedul':728 'screen':1702,1962,1967 'script':1318,1518 'sdk':243,287,388,650 'second':1978 'see':508,1648,1739,1882,1999,2017,2061,2149 'select':792 'send':531,542,554,1727 'server':1634,2268 'server-on':1633 'server-sid':2267 'set':48 'setup':1298 'sever':1679 'sheet':1111,1720,2221 'shell':1496,1503 'ship':700,757,884 'show':573,1514 'side':2269 'sign':479 'silent':1112,1510,1859 'simpler':1552 'simul':1705 'sinc':648 'skill':127,167,228,2185,2188,2237 'skill-cometchat-native-bare-patterns' 'skip':425,1905 'slide':1722 'smooth':1713 'sourc':1179 'source-cometchat' 'space':742 'specif':71,970 'src/config/cometchat.ts':1594,1611 'src/providers/cometchatprovider.tsx':1214 'stack':2217 'start':1454,1459,1466 'state':2148 'stay':210,2178 'step':281,363,432,840,1039,1224,1653,1893 'stop':1491,1500 'storag':74,307,873,881,910,913,937,948,951,978,1879,2057,2060 'store':86,646,661,1903,2073 'string':567,572,624 'studio':241 'style':1186 'submiss':647,1904 'subsequ':1681 'succeed':494 'support':276,2159 'sure':795 'svg':337 'swipe':1104,1857,2100 'symbol':487 'system':576,1237 'tab':2218 'take':1678 'tap':1707,1715 'target':798 'tcp':1484,1486 'teach':28 'text':2258 'theme':2251,2252 'thread':2015 'time':1401,1421 'timer':412 'timestamp':714 'token':1640,1997,2271 'topic-agent-skills' 'topic-ai-agent' 'topic-chat' 'topic-claude-code' 'topic-cometchat' 'topic-cursor' 'topic-messaging' 'topic-nextjs' 'topic-react' 'topic-react-native' 'topic-ui-kit' 'troubleshoot':512,1743,2277 'truth':117 'ts':1381,1593,1751 'tsc':1694 'tsx':1132,1282 'turbomoduleregistri':1832 'turbomoduleregistry.getenforcing':498,2028 'twice':1532 'type':815,1921,2094 'typescript':1696 'ui':279,288,967,1027 'uid':1201,1204,2128 'unabl':1515 'undefin':486,1332 'unless':2009 'upload':604,665,746 'uptim':726 'uri':942 'url':941 'us':1273,1604 'usabl':262 'usag':571 'use':125,165,176,355,994,1308,1992,2088,2167 'user':150,199,392,428,582,589,611,619,806,862,1011,1034,1559,1637,1939,2272 'user-fac':588 'userdefault':720 'v3':883,939,979,1881 'valid':1410 'valu':1424,1434,1441,1585 'var':1227,1236 've':217 'verifi':1656,1691 'version':269 'via':263,1281,1378 'video':341,397,535,598,730 'view':2262 'voic':396,543 'want':430,2157 'warn':478 'way':196,377 'webrtc':420,421 'websocket':1973 'whole':825,959 'wipe':635,1936 'wire':88,383,1041,2012 'without':462,896,955,1102,1328,1766,1884 'won':380 'work':271,2104 'workflow':201,1443,2230 'would':612 'wrap':1965 'wrapper':1130,1951,2198 'write':585 'x':1836 'xcconfig':1326 'xcode':231,464,652,776,1299,1314,1790 'xcworkspac':774 'xml':525,673,855","prices":[{"id":"11686220-c775-48ea-a86d-fe2c83e7924f","listingId":"9a9f8241-1270-4641-884e-e0f4bec953e3","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"cometchat","category":"cometchat-skills","install_from":"skills.sh"},"createdAt":"2026-05-07T13:05:14.044Z"}],"sources":[{"listingId":"9a9f8241-1270-4641-884e-e0f4bec953e3","source":"github","sourceId":"cometchat/cometchat-skills/cometchat-native-bare-patterns","sourceUrl":"https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-native-bare-patterns","isPrimary":false,"firstSeenAt":"2026-05-07T13:05:14.044Z","lastSeenAt":"2026-05-18T19:04:53.911Z"}],"details":{"listingId":"9a9f8241-1270-4641-884e-e0f4bec953e3","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"cometchat","slug":"cometchat-native-bare-patterns","github":{"repo":"cometchat/cometchat-skills","stars":27,"topics":["agent-skills","ai-agent","chat","claude-code","cometchat","cursor","messaging","nextjs","react","react-native","ui-kit"],"license":null,"html_url":"https://github.com/cometchat/cometchat-skills","pushed_at":"2026-05-18T05:04:24Z","description":"Add CometChat chat to any React, Next.js, React Native, Angular, Android, iOS, or Flutter project through your AI coding agent. Works with Claude Code, Cursor, Codex, VS Code Copilot, Windsurf, Cline, Kiro, and 50+ more agents.","skill_md_sha":"81b4006f53d57d4ca22fc032885190498c09a5b4","skill_md_path":"skills/cometchat-native-bare-patterns/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-native-bare-patterns"},"layout":"multi","source":"github","category":"cometchat-skills","frontmatter":{"name":"cometchat-native-bare-patterns","license":"MIT","description":"Integration patterns for bare React Native CLI projects — pod install, Info.plist + AndroidManifest permissions, Apple privacy manifest, native module linking, Metro config.","compatibility":"Node.js >=18; React Native >=0.77; @cometchat/chat-uikit-react-native ^5"},"skills_sh_url":"https://skills.sh/cometchat/cometchat-skills/cometchat-native-bare-patterns"},"updatedAt":"2026-05-18T19:04:53.911Z"}}