In-app support chat for React Native and Expo
Most support chats for React Native are native SDKs: a config plugin, keys in your app config, a new development build, and push set up on both platforms before the first message. Apparent's chat is plain JavaScript on top of the analytics SDK. Add one screen, and it works in Expo Go, in a dev build and in an over-the-air update.
14 days free. No card, no password.
Today
The camera stays black when I tap Scan
Sorry! Turn on Camera in Settings, and the next update will ask for it properly.
That worked, thanks 🙏
GermanyiPhone · 2.1.3New today
Right before writing
- Home
- Scan
- Camera blocked
- Help
The camera stays black when I tap Scan
Add it in three steps
- Install the SDK. Run npx expo install apparent-expo @react-native-async-storage/async-storage, and call Apparent.init once with your app id and key.
- Add the screen. Make a route, for example app/help.tsx, that shows ApparentChatScreen with your colour and font.
- Link to it. Add a "Chat with us" row to your settings or menu. Optionally show a badge with useChatUnread().
The screen
Everything it needs is in its props: theme, words (any language), onClose, and pickImage if you want photos.
import { ApparentChatScreen } from "apparent-expo/chat-screen";
export default function Help() {
return (
<ApparentChatScreen
theme={{ accent: "#C67139", font: "Inter", radius: 14 }}
onClose={() => router.back()}
/>
);
}Why no native code matters
- It ships in an over-the-air update. People get the chat without a store review.
- It works in Expo Go while you build, and in any dev build.
- No config plugin, no Info.plist or AndroidManifest edits, no pod install.
- Nothing to upgrade on its own: it comes with the analytics SDK.
Your app's look, the same tried layout
The chat looks the same in every app, so it's solid from the start, and you change only what makes it yours: accent colour, font, corner roundness (0 to 24), dark or light, background, and every word. Pass rtl for Arabic or another right-to-left language.
What you see when someone writes
- Who wrote: their country, phone, app version and language.
- What they did in the app right before writing, from Apparent's own events: the screens, the taps, the error they hit.
- Whether they started using the app today.
- A test phone is marked, so your own tries don't look like real people.
If you'd rather draw your own
Use Apparent.chat directly: subscribe(fn) for messages, send(text, image), markRead() and unread() for a badge. The docs list every call.

Questions
Does it work in Expo Go?
Yes. The SDK and the chat screen have no native code of their own.
Do I need a config plugin or prebuild?
No. Install the package, add the screen, and it runs.
Can I ship it in an OTA update?
Yes. It's JavaScript only, so an EAS Update or any other over-the-air update carries it.
Which React Native versions work?
Any Expo or bare React Native app that runs the apparent-expo SDK, which needs AsyncStorage.
Can people send photos?
Yes. Pass pickImage, for example with expo-image-picker and base64: true, and a photo button shows up.
Where are the docs?
apparent.fyi/docs/chat has the theme table, the words, photos, the badge and the calls for your own screen.
Also read
- App analytics for solo developers
- Analytics for apps you built with AI
- Add analytics to your app with an AI coding agent
- The best analytics tool for apps built with Cursor
- How to export Apple Ads data to Sheets, Looker Studio or Tableau
- How to connect App Store Connect to Google Sheets
- An MCP server for your app's analytics
- The best analytics for your first app
- Expo analytics, without a native build
- Ionic analytics, without Firebase
- App analytics without the ATT prompt
- Privacy-first analytics for mobile apps
- In-app chat for your mobile app
- An Intercom alternative for mobile apps
- SDKs for iOS, Android, React Native, Flutter and Capacitor
- Apparent compared with Mixpanel, PostHog, Amplitude and Firebase
Your app already has a story. Start reading it.
14 days free. No card, no password.