Mobile app¶
chatwire has a native iOS and Android app built with React Native and Expo. It connects directly to your chatwire server — no cloud relay, no account required.
Download¶
- Android APK — grab the latest
.apkfrom GitHub Releases and side-load it (enable "Install from unknown sources" in Android Settings → Security) - iOS — TestFlight link coming soon. Build from source in the meantime (see below)
Connect the app to your server¶
- Open the app. On first launch you'll see the Server Setup screen.
- Enter your chatwire server URL:
- LAN:
http://192.168.1.x:8723(replace with your Mac's IP) - Tailscale:
http://your-mac-hostname.tailnet:8723 - Use
http://—https://requires a reverse proxy with a valid cert - Enter your web UI password if you set one in Settings
- Tap Connect
The app runs /healthz and saves the URL on success. To change the server URL later: Settings tab → Disconnect → re-enter on next launch.
Finding your Mac's IP¶
Or check System Settings → Network for the IP address.
Features¶
Conversation list¶
- All conversations from
chat.db - Pull-to-refresh for the latest messages
- Unread badge on conversations with new messages
- Live updates via SSE stream
Message list¶
- Inverted scroll (newest at bottom)
- Load-older pagination — scroll to the top to fetch earlier messages
- Sender names in group chats
- iMessage and SMS bubble differentiation
Compose¶
- Multiline text input
- Haptic feedback on send
- Camera and gallery picker (image upload coming in a future release)
Media viewing¶
- Images — full-screen pinch-to-zoom via expo-image
- Videos — inline thumbnail; tap to play via expo-video
Push notifications¶
Register your Expo push token with the server to get push notifications when messages arrive. Requires chatwire server 1.7.0+ (not yet released — watch the changelog).
Dark / light theme¶
The app follows the server's active theme setting. Default palette is Dracula. Toggle dark/light from the app's Settings tab.
PWA alternative¶
If you don't want to install the native app, the chatwire web UI is a Progressive Web App:
iOS / Safari:
1. Open http://<your-mac-ip>:8723 in Safari
2. Tap the Share button → "Add to Home Screen"
3. Tap Add
Android / Chrome: 1. Open the URL in Chrome 2. Three-dot menu → "Add to Home screen"
The PWA gives you a near-native experience without the native app. For most users on a LAN or Tailscale, the PWA is good enough.
Build from source¶
Requirements: Node 22, Expo CLI
git clone https://github.com/allenbina/chatwire.git
cd chatwire/packages/mobile
# Install dependencies
npm install
# Start the Expo dev server
npx expo start
# iOS simulator (macOS only)
npx expo start --ios
# Android emulator or device
npx expo start --android
Repo layout¶
packages/
shared/ @chatwire/shared — TypeScript types + ChaiwireClient
mobile/
App.tsx Root: NavigationContainer + AppStateProvider
app.json Expo config (name, icons, bundle IDs)
eas.json EAS Build profiles
src/
navigation/ RootNavigator, MainTabNavigator (bottom tabs)
screens/ ConversationListScreen, MessageListScreen,
ServerConfigScreen, SettingsScreen
components/ ComposeBox, MessageBubble, ImageViewer, VideoPlayer
hooks/ useServerEvents (SSE), usePushNotifications
state/ AppStateContext (ChaiwireClient, serverUrl)
theme/ colors.ts (Dracula tokens)
src/__tests__/ Jest smoke tests
For production builds, see the release process guide.
Troubleshooting¶
"Cannot connect to server":
- Verify the Mac's IP address hasn't changed (use a Tailscale hostname or local DNS for stability)
- Check that the chatwire web agent is running: curl <mac-ip>:8723/healthz from your phone's browser
- Ensure the Mac and phone are on the same Wi-Fi network (or both on Tailscale)
App shows old messages:
- Pull-to-refresh in the conversation list
- Check that the bridge agent is running: chatwire doctor
Push notifications not arriving: - Push notification support requires server 1.7.0+, which is not yet released - Use ntfy as an alternative: see Notifications