A React Native companion app for the strims.gg / chat.strims.gg community, built to match the behavior of the existing web ecosystem (chat-gui, strims-live-extension, Rustla2) rather than reinvent it: chat, the live stream list, and AngelThump/Twitch streams playing above chat. Android-first, developed against a physical device; iOS builds in CI on every release but hasn't been tried on an iPhone yet (see docs/gotchas.md). Not published to the App Store or Play Store.
| Chat | Streams | Watching | Settings |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Turn the phone sideways while a stream is playing for fullscreen:
Every release has an Android APK
(app-release.apk) and an unsigned iOS build (StrimsMobile-unsigned.ipa).
- On your phone, open the latest release
and tap
app-release.apkto download it. - Open the download and tap Install. Android asks once to allow installs from your browser or Files app; allow it.
- Tap through the "unknown developer" warning: the APK is debug-signed, not Play Store-signed.
Updates: the app checks for a new release once a day and offers to install it. Installing a new APK over the old one keeps your login and settings.
The .ipa isn't signed, so iOS won't install it as-is. A sideloading tool re-signs it with your
own Apple ID while installing:
| Tool | Runs on | Notes |
|---|---|---|
| AltStore | macOS / Windows (with AltServer) | Re-signs automatically every few days over Wi-Fi |
| Sideloadly | macOS / Windows | One-shot install; re-run it before the signature expires |
With AltStore:
- Install AltServer on your Mac or PC, and AltStore on your iPhone from it.
- Download
StrimsMobile-unsigned.ipafrom the latest release onto the iPhone. - In AltStore, tap +, pick the
.ipa, and sign in with your Apple ID when asked.
Limits Apple puts on this: with a free Apple ID the app stops opening after 7 days unless re-signed (AltStore does it for you while AltServer is reachable), and at most 3 sideloaded apps can be installed at once. A paid Apple Developer account extends the 7 days to a year.
Chat tab — a full chat.strims.gg client:
- Logs in through strims.gg's existing Twitch OAuth flow via an in-app WebView (no app-side
credential handling — same login path as the website), storing the resulting
jwtin the OS keychain. - Catches up on missed messages via REST (
/api/chat/history,/api/chat/me,/api/chat/viewer-states) on open/foreground/reconnect, retrying history until it lands, then opens the chat websocket and applies liveMSGevents on top, with the same reconnect/backoff behavior as chat-gui. Connection status banner (Reconnecting… / Disconnected + Retry) and a connected dot on the Chat tab. - Renders chat-gui's emote set faithfully, including CSS-spritesheet "animated" emotes (e.g.
NODDERS, catJAM), played natively as animated WebP on Android, and a subset of chat-gui's emote modifiers
(
:mirror,:flip,:smol,:wide,:spin,:fast,:slow,:reverse,:pause) — see docs/emotes.md. - URL rewriting matches chat-gui's
UrlFormatter(strims.gg/youtube/twitch/etc links shown in their shortservice/idform, tracking params stripped from Amazon/Twitter/Spotify links). - Per-viewer nick coloring by watched channel (same deterministic scheme as chat-gui's viewer-state
bar), a tap-to-focus mode that dims every other message, and a long-press nick menu: the stream
they're watching (tap to open), mention, whisper (
/wis sent as a real whisper), highlight, custom name color, and ignore (managed in Settings). - Optional message timestamps (Settings: off /
HH:MM/HH:MM:SS). - Mention highlighting, greentext, message combos (repeated single-emote spam collapses into an "xN" row), "more messages" catch-up pill, and keyboard-safe layout on edge-to-edge Android.
Streams tab — a native client for Rustla2's aggregated stream list:
- Live stream list sorted by rustlers (strims-side viewer count), with follow/notify support (local notifications via Notifee when a followed channel goes live, polling on the same cadence as strims-live-extension).
- Channel names are colored with the same deterministic per-channel scheme used in chat, so you can see at a glance what color a streamer's nick will be while they're watching.
- Tap an AngelThump or Twitch stream to watch it above chat; turn the phone sideways for fullscreen. It shows as your viewer state in chat, same as watching on strims.gg. Other services (or a long-press) open the stream on strims.gg. The AngelThump player has a cast button, and its delay behind live and server are in Settings.
- Chromecast support for AngelThump streams (resolves past AngelThump's CORS-blocked master manifest to a castable edge URL; see docs/architecture.md).
Settings — the gear in the title bar: refresh emotes, animate emotes forever, timestamps, stream delay and AngelThump server for the player, ignored users, log out.
npm installRequires the Android SDK and a running emulator or a physical device (USB debugging enabled, or
via usbipd-win if developing from WSL2 against a Windows-attached device).
npm run android # builds, installs, and launches on the connected device/emulator
npm start # Metro bundler, if not started automaticallyRequires Xcode and CocoaPods.
cd ios && bundle install && bundle exec pod install && cd ..
npm run iossrc/config/env.ts holds the API/websocket/login/Rustla URLs, defaulted to the production
strims.gg deployment. Edit that file if pointing the app at a self-hosted instance.
- docs/local-dev.md — day-to-day dev/test loop, including connecting a
physical Android device from WSL2 via
usbipd-win. - docs/architecture.md — module layout and how the major features (chat sync, streams/cast, emotes) fit together.
- docs/emotes.md — the animated-emote crop pipeline and modifier system.
- docs/gotchas.md — RN/Android-specific pitfalls hit during development, and how to avoid re-hitting them.
- docs/releasing.md — versioning, changelog, and how to cut a tagged GitHub Release. See also CHANGELOG.md.




