Stream GUI RS ChrisLauinger77
winget install --id=ChrisLauinger77.Stream-GUI-RS -e A modern Rust/Tauri desktop frontend for watching Twitch streams via Streamlink.
winget install --id=ChrisLauinger77.Stream-GUI-RS -e A modern Rust/Tauri desktop frontend for watching Twitch streams via Streamlink.
Stream GUI RS is a native desktop application for browsing Twitch and watching Twitch or exact Kick live channels through Streamlink. It uses a compact Tauri interface and launches video in a separately installed player. Kick support is playback-only.
Project website · Latest release
This is an independent rewrite inspired by Streamlink Twitch GUI. It is not affiliated with Twitch or the original project.

See the latest release notes for changes and upgrade guidance. Notes for previous versions are available on GitHub Releases. Candidate builds are not published releases.
Stream GUI RS does not bundle Streamlink or a media player. It does not contain an embedded player or chat client. Background features are available in 0.2.0 and later; v0.1.0 packages retain their original close-to-exit behavior.
Published releases provide these native artifacts:
| Platform | Architecture | Artifact | Status |
|---|---|---|---|
| Windows 11 | x86_64 | NSIS installer and portable/Scoop ZIP | Installer and portable package published |
| Linux | x86_64 | AppImage, Debian amd64 package, and RPM x86_64 package | AppImage and Debian package natively tested; RPM installation remains a release check |
| macOS | Universal (arm64 and x86_64) | Disk image (.dmg) containing the universal app | Natively tested on Apple Silicon; native Intel execution remains a release check |
ARM Linux/Windows packages are not currently published. The macOS disk image contains both Apple Silicon and Intel executable slices, but each architecture still requires native exact-artifact validation; cross-compilation alone is not treated as runtime proof.
The Windows installer is not code-signed, so Windows may show a SmartScreen warning. The macOS app bundle is ad-hoc signed but has no Developer ID signature or notarization, and Gatekeeper may block its first launch. Verify every downloaded file against the accompanying SHA-256 checksum.
All platforms need:
PATH or selected by absolute path in SettingsPlatform requirements:
streamlink.exe; batch wrappers are rejected.PATH than Terminal, so select Streamlink/player paths in Settings when discovery does not find them.Secure credential storage is mandatory for Twitch authentication. There is no plaintext fallback. A locked or unavailable native credential store produces an explicit error. Kick playback does not use this store or require Twitch sign-in.
Pick one method for your platform. Packages outside the Streamlink project are maintained by third parties and can lag behind; check streamlink --version reports 8.0 or newer. The official install guide is authoritative.
Windows
| Method | Command |
|---|---|
| Windows Package Manager | winget install streamlink |
| Scoop | scoop bucket add extras then scoop install streamlink |
| Chocolatey | choco install streamlink |
| Installer / portable | Download from streamlink/windows-builds; the installer adds Streamlink to PATH and bundles FFmpeg |
macOS
| Method | Command |
|---|---|
| Homebrew (recommended) | brew install streamlink |
Linux
| Distribution | Command |
|---|---|
| Arch Linux | sudo pacman -S streamlink |
| Debian testing/unstable | sudo apt install streamlink |
| Debian stable | Enable trixie-backports, then sudo apt -t trixie-backports install streamlink |
| Fedora | sudo dnf install streamlink |
| openSUSE | sudo zypper install streamlink |
| Gentoo | sudo emerge net-misc/streamlink |
| NixOS | nix-env -iA nixos.streamlink |
| Alpine | sudo apk add streamlink |
| Void | sudo xbps-install streamlink |
| Solus | sudo eopkg install streamlink |
| AppImage | Download from streamlink/streamlink-appimage (glibc 2.28+), chmod +x it, and select it by path in Settings |
Ubuntu's package is inherited from Debian without updates and is usually too old; use the AppImage or pip instead.
Any platform (Python 3.10+)
pip install --user -U streamlink
pipx install streamlink or uv tool install streamlink keep Streamlink in an isolated environment. If the resulting executable is not on the desktop application's PATH, select it in Settings → Streamlink.
user:read:follows.WinGet users can install the Windows build from the community winget source instead of downloading the installer manually:
winget install --id ChrisLauinger77.Stream-GUI-RS --exact --source winget
To update an existing installation when a newer version is available in WinGet:
winget upgrade --id ChrisLauinger77.Stream-GUI-RS --exact --source winget
The WinGet package manifests may lag behind GitHub Releases. Streamlink and a player are still separate requirements; after installation, continue with step 3 above.
Scoop users can install the portable Windows build from the author's bucket:
scoop bucket add ChrisLauinger77 https://github.com/ChrisLauinger77/scoop-bucket
scoop install ChrisLauinger77/stream-gui-rs
Homebrew users can install the universal macOS build from the author's tap:
brew tap ChrisLauinger77/cask
brew install --cask stream-gui-rs
The Windows release also includes stream-gui-rs.json for direct Scoop installation. The bucket and cask definitions update from published GitHub Release assets.
Official installed builds contain the project's public Twitch application ID. Users do not set environment variables, register an application, or provide a client secret.
Rust owns Twitch credentials, settings, native processes, and session state. OAuth tokens stay outside the web interface, settings, diagnostics, and Streamlink arguments. Twitch browsing uses a bounded cache and explicit pagination. Streamlink configuration files and sideloaded plugins are disabled for launches from this app.
Navigation, interface reload, and Twitch logout leave existing streams running so they remain controllable from Watching. By default, closing the main window stops owned Streamlink/player process trees. With background close enabled, closing keeps monitoring and playback running; explicit Quit always cleans up owned processes. A custom player that deliberately detaches itself is outside that cleanup boundary.
The High, Medium, and Low selections prefer 720p30, 540p30, and 360p30 respectively, with source fallback when the service does not offer a matching rendition. They are preferences rather than guaranteed resolution caps. Audio requests only audio,audio_only: if unavailable, playback fails without falling back to video.
Choose Open channel → Service → Kick, enter the channel name and select Play Kick channel. Open channel is also available beside Watching while signed out of Twitch. Names accept 1–100 ASCII letters, digits, underscores or hyphens and are normalized to lowercase; enter a name, not a URL. This is a playback locator, not a verified account identity: the app does not check live status or retrieve viewer counts, titles or categories.
Kick uses the existing global settings, selected player profile, quality policy and low-latency preference. Twitch channel overrides do not apply. Watching labels each service; Twitch and Kick sessions share the eight-session limit and have independent Stop/Restart controls. Restart keeps the locator and applies current global/profile settings; saving preferences never changes a running process.
Open Kick browser chat opens the fixed Kick popout in the default browser, independently of playback. The browser uses its own login. Automatic chat is disabled for Kick, including when Twitch chat is set to Chatterino. No Kick OAuth, client ID, client secret, callback server or hosted backend is used.
Streamlink may open a temporary Chromium browser for a Kick challenge and may reuse its own cached challenge state on subsequent launches. The app uses Streamlink's default browser discovery; it does not read/import browser profiles, cookies or challenge state. A missing compatible browser or failed challenge can prevent playback. Failure does not prove that a channel is offline. Kick child stdout/stderr are drained but omitted from local diagnostics to protect challenge data; fixed supervisor messages and process status remain available. The support report contains only the service enum in anonymous process summaries, never the channel locator or URL.
Kick low latency uses --kick-low-latency. Availability and stability depend on the broadcaster, network, player and Streamlink; no measured latency improvement is promised. Native playback and browser-descendant cleanup require platform acceptance as described in testing; a running process alone is not proof of video/audio.
Kick login, Following, browsing/categories/search, monitoring/notifications, persistent Kick channel overrides, bookmarks/hides, Chatterino integration, public deep links and VOD/clip UI are not supported.
Official Kick discovery remains deferred: the documented API tokens require a confidential client secret, with no documented safe access path for a distributed desktop app. See the Stage 2 decision and revisit conditions revalidated on 2026-10-03. Existing playback and browser chat require no Kick developer-app scopes.
Live and category streams offer Stream language: Any language, a curated language list, or Other. Twitch applies the filter on the server. Changing it starts that view from its first page and saves the default for later discovery visits. Back restores the language used by that earlier visit. Following, Search, and the background monitor keep their existing scope.
Open channel → Twitch accepts an exact Twitch login (letters, numbers, underscores, up to 25 characters; case-insensitive). It opens the existing channel details, including offline channels. Enter a login, not a URL; Twitch lookup never starts playback. Search remains the Twitch discovery tool for partial names and categories. Kick uses the separate playback action described above.
Settings → Playback → Prefer low latency defaults off. Twitch channel preferences can inherit, enable, or disable it; Kick uses global/profile preferences only. This adds exactly one service-specific Streamlink flag: --twitch-low-latency or --kick-low-latency. Actual delay depends on the stream, connection, buffering and player. Saving leaves current processes unchanged. Restart applies current preferences to that session.
Settings → Appearance → Language offers System, English, Deutsch, Español, and Français. System follows the operating system language for the supported languages and uses English otherwise; an OS language change is picked up on the next app launch. The selection saves immediately and persists across restarts. The separate Stream language filter controls Twitch discovery results, not interface text. UI translations ship in the app and require no download.
Settings → Appearance → Text size supports 100%, 125%, and 150%. Save applies the Rust-persisted value; it combines with desktop/webview scaling. Closing Settings or Watching returns focus to its opener when still appropriate. Playback announcements describe the Streamlink process, not verified video rendering.
Settings → Appearance → Theme offers Default, Catppuccin, Dracula, Everforest, Gruvbox, Nord, Rosé Pine, Solarized, and Tokyo Night. Default keeps the existing Stream GUI RS colors. Color mode retains System, Light, and Dark; System follows the desktop color preference. Dracula uses Dark only while selected and restores the previous mode when another theme is chosen. Save applies the choice and preserves it across restarts.
To add Custom Theme, copy the example palette to custom-theme.json beside the app's settings.json in its configuration directory. A complete dark object with the example's twelve color keys is required, each using a six-digit hex value; an optional complete light object supplies separate light colors. Without light, the dark colors serve both modes. The option appears only while the file is valid. Changes to a selected custom palette apply within about a second, including while Settings is open. If the file becomes unavailable or invalid, Default is shown while the saved Custom selection remains; restoring a valid file restores Custom automatically. Use Use Default in Appearance to replace an unavailable Custom selection. The file supplies colors only, never CSS or executable content. Custom colors are accepted without automatic contrast correction; the app adjusts its generated live color to fit the supplied surfaces. Check text and focus visibility on the chosen backgrounds.
About Stream GUI RS is available from the tray/status menu and the main interface. macOS keeps its native AppKit panel; Linux and Windows use one small main-window dialog. About restores a hidden main window, shows the icon, compiled version/commit, and a fixed GitHub repository link. Close/Escape closes the dialog; explicit application Quit still cleans up playback and monitoring.
Settings → Prepare support report shows selectable text for manual copying. Rust includes only build/platform metadata, a previously validated numeric Streamlink version (or “not checked”), player mode, and up to sixteen anonymous process phases/failure codes/exit codes. It excludes account/channel identities, credentials, paths, arguments, environment, raw logs and arbitrary error messages. Opening it performs no probe, credential access, upload, clipboard write, or Twitch request. Review the preview before sharing; the full local Developer tools diagnostics are a different, more detailed surface.
Search → Teams opens an exact Twitch team name (the final name in its Twitch team address). Team metadata is displayed as text; members are sorted by login with duplicate IDs removed. Up to 300 members are shown, with an explicit limit notice for larger teams. Open a member to see current channel details and Watch. Team membership alone does not establish live/offline status.
Channel and category details offer Bookmark and Hide from discovery. Bookmarks is a local list, independent of Twitch follows and shared across this app's signed-in accounts. Each bookmark stores its stable Twitch ID, kind and a small saved label; labels can become outdated. Opening uses the normal channel/category view, with retained results labeled and an explicit Refresh action. Remove stale bookmarks from the list without resolving them first.
Hidden channels are excluded from Live and category stream listings. Hidden categories are excluded from Categories and their streams from Live. Following, Search, Teams, bookmarks, exact lookup and direct links remain reachable, including items that are both hidden and bookmarked. Opening a hidden category directly shows it, while still filtering hidden channels within it. Settings → Hidden items reviews and restores entries. Bookmarks and hidden items each allow 200 entries; all preferences still share the 256-KiB settings-file bound. These controls do not affect monitoring, notifications or running playback.
Home selects Following. Back and Forward retain up to twelve history entries, including search query/type, category language, scroll and meaningful focus. Retained results are labeled and do not trigger a request just for navigation; an evicted snapshot loads through Rust again. A new destination or edited search clears Forward history. Refresh remains explicit.
Settings → Shortcuts customizes Home, Following, Live, Categories, Search, Watching, Open channel, Bookmarks, Settings, Back, Forward and Refresh. The numbered defaults are Primary+1 through Primary+6 for Following, Live, Categories, Watching, Open channel and Bookmarks; Primary means Command on macOS and Ctrl elsewhere. Select Change, press the desired combination, and Save shortcuts. Escape cancels capture; Tab exits normally. Unassign disables an action; Reset restores a draft of the platform defaults. Conflicts (including Control/Command equivalence across platforms) and reserved/unsupported keys are shown before save. Shortcuts remain local to the focused app and pause during typing and modal dialogs. The OS may intercept its own shortcuts before the app receives them.
Installed packages associate the stream-gui-rs scheme with these navigation-only forms:
stream-gui-rs://show
stream-gui-rs://channel/example_login
stream-gui-rs://category/509658
stream-gui-rs://team/example-team
Channel logins allow 1–25 ASCII letters, digits or underscores. Category IDs are positive decimal IDs, at most 32 digits, with no leading zero. Team names allow 1–100 ASCII letters, digits, underscores or hyphens. Login/team case is normalized. Links are limited to 256 bytes. Query strings, fragments, percent encoding, Unicode identifiers, credentials, ports, extra segments and other actions are rejected. Links never start playback, change settings or execute commands.
An existing instance is shown and activated. On a cold start, the latest valid intent waits in Rust until settings and authentication restoration are ready; a browsing link received while signed out waits for sign-in. Repeated links replace the pending intent, and old acknowledgements cannot erase a newer one. Navigation already started under an old account is discarded on logout. Nothing is persisted as link history.
Protocol registration comes from installed packages. Bare development binaries and unintegrated AppImages/portable Windows copies do not automatically claim OS associations; Linux/Windows developers can pass one literal link as the executable's sole argument. macOS uses native LaunchServices activation of an installed app bundle; launching multiple bare binaries directly is outside that contract. Linux forwarding uses the user session bus. A separate CLI is deferred: the protocol handler provides navigation forwarding, not a scripting/result API.
In Settings → Player → Profiles, choose a configuration and press Use profile. Add, edit/rename or delete profiles there; names are unique and limited to 64 characters / 128 UTF-8 bytes, with at most 16 profiles. The separate Default configuration remains available. A profile contains the existing player mode, optional executable override and literal argument rows, plus optional quality and low latency. Select a profile in the management list to repair or delete it even if its executable has disappeared.
Effective playback uses global defaults → selected profile → channel overrides → explicit launch quality. A profile replaces the player configuration; omitted profile quality/low latency inherit global values. Channels keep their independent overrides, but do not select profiles. Editing, selecting or deleting a profile leaves running sessions unchanged; Restart resolves current preferences. Deleting the active profile selects Default configuration for future launches/restarts. Upgrading keeps existing player settings and starts with no profiles.
In Settings → Playback → Chat application, choose Browser (the default) or Chatterino. Chatterino must be installed separately and signed in independently; Stream GUI RS never transfers its Twitch credentials. Discovery checks PATH and common native installation locations, with an absolute executable override. macOS overrides point to the executable inside the app bundle. On Linux, automatic discovery also supports the official Chatterino Flatpak (com.chatterino.chatterino), checking the user installation before the default system installation when no native executable is found. Explicit executable overrides retain priority. Other Flatpak IDs, Snap wrappers and custom arguments are not supported.
The integration requests a channel-only Chatterino window. Upstream disables settings saving for this mode, so configure/sign in through Chatterino's normal launcher first. Each invocation may create another independent process/window; reuse is not guaranteed. These windows survive Stop and Quit and must be closed in Chatterino. At most 16 still-running direct Chatterino launches are retained by this app. A missing/failed Chatterino launch produces a clear error without stopping playback or silently opening another provider. Channel details always offer Open chat in browser. Automatic chat and per-channel inheritance continue to use the selected provider.
Settings → Updates → Check for updates contacts only this project's public GitHub latest-release endpoint. Checks are manual on every installation; there is no startup check, background polling, notification or stored update preference. Rust keeps results and failures for 24 hours during the current application run; Refresh update check bypasses that cache at most once per minute. A newer stable semantic version offers View release, opening the fixed official repository's release page. A newer development version is never offered an older stable version as an upgrade. Update failure cannot block authentication, browsing or playback. No installer is downloaded or executed automatically.
In Settings → Background, enable Monitor followed live streams, choose a 1, 2, or 5 minute interval, and enable notifications. Background preferences default off for new installations; upgrades from 0.2.0 preserve existing monitoring, notification and close behavior. Channel preferences can inherit, enable, or disable the global notification default. Monitoring still requires sign-in; notification permission is independent.
The first scan is quiet. Later newly observed Twitch stream IDs can notify with channel, title, and category. Pause stops polling until Resume or application restart. Resume, waking from sleep, and recovering from an outage establish a quiet baseline, without replaying missed transitions. Incomplete scans retain a marked previous count and retry with bounded backoff. Very large or slow scans can report incomplete monitoring; they never silently report a partial list as complete. At most ten eligible notifications are sent per scan; excess transitions are suppressed rather than queued into a later burst.
Notification clicks restore the app and select the channel while the original sign-in session remains valid; they do not start playback. Watching and Quit are available from the tray menu, and Quit is also in the main interface. Quit's label indicates active streams that it will stop.
Keep Stream GUI RS running in the background when the window is closed is opt-in. Normal minimize remains the OS minimize action. Background close hides the window when a tray is available, or minimizes it when there is no usable tray. Playback continues in both cases; restore the app to use Stop/Restart.
See the testing policy for native acceptance and exact-package smoke requirements.
Stream GUI RS does not provide embedded video/chat, arbitrary chat applications, advanced Streamlink transports, an automatic updater, or legacy configuration import. Monitoring stops when the application is fully quit. Active sessions and logs are not persisted. See architecture for the detailed contracts.
Build requirements are separate from the runtime requirements above:
libayatana-appindicator3-dev for tray support alongside the existing native prerequisitesInstall locked frontend dependencies and start development with your own registered public Twitch client ID:
npm ci
TWITCH_CLIENT_ID=yourPublicClientId npm run tauri dev
Build a native release binary with an embedded public ID:
TWITCH_CLIENT_ID_BUILD=yourPublicClientId npm run tauri build -- --no-bundle --features custom-protocol
No client secret is used. The build fails if a distribution build has no valid embedded public ID. See authentication for configuration precedence and PowerShell examples.
Builds embed a seven-character lowercase Git commit in About, backend diagnostics, and the safe support report. CI/release jobs set STREAM_GUI_RS_COMMIT to GitHub's exact checkout SHA (including the merge commit for pull-request checks). Local builds use Git HEAD at build time when available; source archives or invalid metadata show unknown. An explicit variable takes precedence over local Git and accepts 7–64 hexadecimal characters. No Git installation or source checkout is needed at runtime. Local uncommitted changes are not reflected by a dirty suffix; the identifier describes HEAD. Normal users need no configuration, and application versioning still uses the existing release metadata.
Run the project checks from the repository root:
npm run build
npm test
cargo fmt --manifest-path src-tauri/Cargo.toml --all -- --check
cargo test --locked --manifest-path src-tauri/Cargo.toml --no-default-features --features test-support
cargo check --locked --manifest-path src-tauri/Cargo.toml --all-targets --features test-support
cargo clippy --locked --manifest-path src-tauri/Cargo.toml --all-targets --features test-support -- -D warnings
TWITCH_CLIENT_ID_BUILD=ciCompileOnlyPublicClient123 npm run tauri build -- --debug --no-bundle --features custom-protocol --ci
git diff --check
The synthetic ID in the final command is only for local compilation checks and cannot authenticate. Official release artifacts use the registered public ID from GitHub Actions. Tests use synthetic credentials, a native fake Streamlink executable, and loopback HTTP fixtures; they do not access real Twitch credentials.
For native notification acceptance without a Twitch live transition, build with the opt-in notification-acceptance feature and open Settings → Developer tools → Send test notification. It is restricted to debug/test builds; normal builds omit the command and permission. See notification acceptance setup and platform steps, including installed debug packages for Windows and macOS.
Open a GitHub issue with reproduction steps and the previewed Settings → Prepare support report text. Add OS/player version details manually if useful; the report intentionally excludes identifying data and logs. Do not paste OAuth tokens, refresh tokens, device codes, credential-store exports, or other secrets.
Release maintainers should use the release process and testing policy. Earlier accepted feature behavior need not be retested in full for a metadata-only version bump; fresh CI and exact-package checks remain required.
Stream GUI RS is licensed under GNU GPL version 3 only. It relies on open-source Rust and npm dependencies under their respective licenses. Playback is provided by the separately installed Streamlink project. No assets from Streamlink Twitch GUI are distributed here.
The bundled theme palette data and custom-theme example are adapted from Sidra under the Blue Oak Model License 1.0.0. The palette colors trace to their upstream theme projects as noted in src/styles/palettes.ts.
Released milestones and deferred ideas are summarized in the road to 1.0.