How it works, and where it can't.
StreamRift is built on top of Twitch's public and semi-public APIs. Some things we can do brilliantly. Some things Twitch reserves for its own clients. Here's the honest breakdown.
00 General
What is StreamRift?
StreamRift is a free, open-source desktop client for watching Twitch. It is built with Tauri 2 and Rust, ships as a native macOS or Windows app, and specializes in watching up to four streams at once with ad-free playback and full live chat.
Is this made by Twitch?
No. StreamRift is an independent project and is not affiliated with or endorsed by Twitch Interactive, Inc. We use Twitch's public APIs the same way any third-party client does.
Is it free?
Yes. Free to download, free to use, MIT licensed. No accounts, no payments, no telemetry. Bring your own Twitch developer app and you're running.
Which platforms are supported?
macOS (universal — Apple silicon and Intel) and Windows (x64). A Linux build is possible down the line but not shipped today.
01 Auth & privacy
How does login work?
OAuth 2.0 with PKCE. We open your system browser to id.twitch.tv, Twitch redirects back via a custom URL scheme, and Rust exchanges the code for a token. No password ever touches StreamRift.
Where is my token stored?
In your OS keychain. macOS uses Keychain Access; Windows uses the Credential Manager. The token never hits disk in plaintext.
Can I use StreamRift without logging in?
You can watch any public channel without signing in. Login is required only for your followed channels, live chat as you, and sub/badge display.
What scopes do you request?
user:read:follows for your follow list, chat:read + chat:edit for chat, and optionally user:read:subscriptions for sub badges. Nothing else.
02 Playback & ads
How is playback ad-free?
We never load the Twitch JS player. Rust fetches a playback access token via GQL, calls usher for the master M3U8, parses it, and hands a URL to a standard <video> element backed by hls.js. Ad insertion happens inside the Twitch player JS — we simply do not run it.
Will this break if Twitch changes things?
Sometimes, yes. Twitch periodically rotates their GQL schema and CDN token shape. Our queries live in an external config file that can be patched without a full app rebuild, and the updater pushes fixes quickly.
Does VOD / clip playback work?
Not in v1.0. The resolver is built around live playback. VODs and clips are on the post-v1 list.
What about hardware acceleration?
On by default. The <video> element uses the WebView's GPU decoder for H.264/AAC. You can disable it in Settings if your GPU is acting up.
03 Chat & emotes
What chat features are supported?
Send and receive messages, badges (broadcaster/mod/sub/bits), colored usernames, timestamps, mod actions (bans/timeouts show as system events), and emote rendering for Twitch, BTTV, and 7TV.
Can I moderate from StreamRift?
You can use chat commands the same way you would on twitch.tv — /ban, /timeout, /mod, etc. We do not ship a dedicated moderation dashboard in v1.
What about FFZ emotes?
Not in v1.0 — BTTV and 7TV only. FrankerFaceZ is on the shortlist.
Why is chat sometimes slow to connect?
Twitch's TMI servers occasionally throttle new connections. We retry with backoff. If chat stays offline for more than ~30 seconds, try rejoining the channel.
04 Twitch API limitations
Third-party Twitch clients work around a moving target. These are the things we can't do cleanly, or at all, because of what Twitch's public APIs and Terms allow.
Ads that must play before the stream startsAPI-limited
Pre-roll ads served inside the HLS manifest as SSAI (server-side ad insertion) are the one category we cannot fully avoid, because they are injected at the CDN layer for some channels. StreamRift detects the ad break markers and skips the segments — but there may be a brief black-frame stall on first join for certain streams.
Subscription status and emote-only chatsAPI-limited
Twitch only exposes your subscription list if you grant user:read:subscriptions. Even then, some sub-only channel modes depend on flags that are not in the public Helix surface — we ship best-effort badges and defer to chat errors from the server.
Predictions, channel points, bits, giftingNot shipped
These run on private GQL endpoints that Twitch reserves for their own clients and extensions. We deliberately do not implement them — it is a ToS grey area and maintenance nightmare.
Squad Stream / official multi-viewNot shipped
Twitch's native multi-view is served through a separate, authenticated GQL endpoint and product surface. Our multi-stream is implemented entirely client-side — it works for any combination of channels without Squad Stream needing to exist.
Stream latencyAPI-limited
Direct HLS is typically 8–15 seconds behind the broadcast. Twitch's own low-latency mode uses a custom transport (LHLS / LL-HLS variants) that is not fully documented. We default to standard HLS — reliable beats bleeding-edge.
Stream thumbnails refresh cadenceAPI-limited
Helix returns thumbnail URLs that the Twitch CDN updates on its own schedule — usually every 2–5 minutes. Refresh faster than that and you'll see the same image.
Raids, hosting, Watch PartiesNot shipped
Raids come through TMI as system messages and we show them in chat. Initiating raids is a broadcaster tool; it is not on our roadmap. Watch Parties depend on Amazon Prime Video DRM — out of scope.
Clip creationPartial
Helix has POST /clips which returns a clip ID, but authoring the 30-second window client-side requires rights we do not have. We expose a "Clip" button that deep-links to twitch.tv's clip editor.
Chat replay on VODsNot shipped
VOD chat is served through a different endpoint (rechat) and is rate-limited. Since v1.0 does not do VOD playback, chat replay is also out.
Rate limitsAPI-limited
Helix allows ~800 points per minute per client ID. Chat (TMI) allows 20 messages per 30 seconds as a regular user. StreamRift respects both and queues when you approach the cap.
05 Missing & planned
VOD & clip playback
Planned for v1.1. The resolver architecture already supports it — we just have not shipped the UI.
FFZ emotes
On the shortlist. BTTV and 7TV shipped first because their REST APIs are simpler.
Linux build
Tauri supports Linux cleanly, but the test matrix is a lot for a volunteer team. Contributions welcome.
Mobile
Not planned. StreamRift is desktop-first by design — the whole value proposition is a big screen with four panes.
Stream uploading / going live
Out of scope. StreamRift is a viewer. Use OBS or Streamlabs for broadcasting.
06 Build & install
What do I need to build from source?
Rust 1.77+, Node 18+, pnpm, and a Twitch Developer app set to Public type with the redirect URL http://localhost:19284/auth/callback.
Where do I get a Twitch Client ID?
Create an app at dev.twitch.tv/console/apps. Copy the Client ID into your .env file as TWITCH_CLIENT_ID. No client secret is needed — PKCE handles it.
How do auto-updates work?
Tauri's updater plugin checks a manifest on launch. Every bundle is signed with an Ed25519 keypair — if the signature does not verify against the pubkey baked into the app at build time, the update is rejected.
Why does macOS warn me on first launch?
Our public builds are Apple-notarized. If you built it yourself without signing, Gatekeeper will warn. Right-click the .app and choose Open once to bypass.