Setup checklist
☐ Package + chat peers installed; npm ls react-native shows one copy
☐ No Lexical / DOMPurify / Zustand added to the app (bundled or pre-built)
☐ pod install run; Podfile.lock contains RealtimexLiveChat
☐ react-native-worklets/plugin last in babel.config.js
☐ src/configs/chat.config.ts with apiUrl (ending /api/v1), socketUrl, clientId, accessToken, callUri
☐ ChatProvider + ChatNavigator rendered (withContainer={false} inside your navigator)
☐ Host JWT has email, or bootstrapChatSession({ email, name, hostAccessToken }) is called
☐ withToast={false} → host <Toast /> with a notification entry
☐ Floating tab bar → fabBottomInset
☐ logoutChatSession() on host logout, before the token is dropped
☐ Calls: VideoSDK peers, register() in index.js, callUri, supportsPictureInPicture (Android), usage strings + audio / voip / picture-in-picture (iOS)
☐ App-wide calls: ActiveCallScreen in the root stack, exactly one CallProvider mounted
☐ Screen share (iOS): Broadcast extension target, same App Group everywhere, RTCScreenSharingExtension = extension bundle id
☐ Push: Firebase files from the dashboard's project, Google Services plugin (Android), FirebaseApp.configure() + Push capability + remote-notification (iOS), APNs key in Firebase, index.js handlers, host listeners skip RealtimeX pushes
☐ iOS calls when killed / locked: CallKeep + VoIP push installed, voip mode, Apple VoIP card on the dashboard, camera / mic granted once
☐ Local install: Metro watchFolders, nodeModulesPaths, extraNodeModules, blockList