Architecture
High level, for bug reports and contributions. Not public API — it can change between versions.
code
src/├── index.ts Public export surface — everything in this guide is re-exported here├── config/ configureChat runtime (runtime.config.ts), UI defaults/merge (ui.config.ts), env (chat.config.ts)├── components/ ChatProvider, chat UI (bubbles, composer, header, sheets, RichMessageText, MentionRow)├── screen/ Chat screens (list, room, info, groups, search, mentions, notification settings)├── navigation/ ChatNavigator (+ demo RootNavigator), route param types├── store/ Zustand stores (auth, chat, socket, theme) — internal├── services/ REST client + query params, Socket.IO service, chat session, session end, error codes├── hooks/ Public hooks (useChat*, useConversations, useMessages, gates, theme)├── domain/ Pure logic (permissions, group roles, settings, composer, mentions, rich messages)├── richEditor/ WebView rich-text editor (RN side) + generated editor HTML├── calling/ Call store, signaling, VideoSDK screens, PiP, screen share, ring feedback├── canvas/ Canvas list / editor├── notifications/ Push registration, handlers, router, banner, iOS VoIP├── theme/ Colors / accents, appearance, spacing, typography└── types/ Public types (chats, customization, settings) rich-editor/ Lexical editor source → yarn build:rich-editor → src/richEditor/editorHtml.generated.tsandroid-screenshare/ Autolinked Android library (permissions, FGS, CallPipModule, RtxNotifications, RtxCallPushReceiver)RealtimexLiveChat.podspec Autolinked iOS pod (CallPipModule, VideosdkRPK, RealtimexVoip) from ios/RealTimeXChat/RealtimexLiveChatBroadcast.podspec Screen-share extension pod from ios/RealtimexBroadcast/host-setup/ Native checklist, snippets, patchesreact-native.config.js Autolinking for the pod and the Android libraryNon-negotiable invariants, if you're contributing:
- Every slot falls back. An omitted
ui.componentsslot or render prop must render the built-in — see Default component fallback. - Optional peers stay optional. Notifee, CallKeep and VoIP push are
required insidetry; never import them statically. - No secrets in the app. Calls and recordings only use short-lived, backend-signed tokens.