Stream GUI RS is a native desktop application for browsing Twitch and watching Twitch, exact Kick live channels or exact YouTube live streams through Streamlink. It uses a compact Tauri interface and launches video in a separately installed player. Kick and YouTube 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.
- Twitch Device Code sign-in with credentials stored in Keychain, Credential Manager, or Secret Service
- Following, popular live streams, categories, search, channel details, and Twitch Teams
- Local channel/category bookmarks and hidden discovery lists
- Home, Back/Forward restoration, configurable local shortcuts, and safe navigation links
- Server-side language filtering for Live/category streams and exact Twitch-login lookup
- Streamlink 8.0+ discovery and external playback
- Exact Kick channel playback and explicit browser chat, including while signed out of Twitch; no Kick developer credentials required
- Best-effort exact YouTube live playback by video ID, @handle or channel ID, and browser chat for video IDs; no Google account or API key required
- Streamlink default player, mpv, VLC, and custom executable modes
- Source, High, Medium, Low, and Audio quality policies
- Multiple simultaneous streams with Stop, Restart, Watching, and bounded diagnostics
- Persistent global playback settings and per-channel overrides, including opt-in low latency
- Twitch chat in the system browser or independently authenticated Chatterino
- Up to 16 reusable named player profiles, with optional quality and low-latency preferences
- Manual stable-release awareness from the official GitHub repository (no automatic updater)
- Default and eight bundled color themes, conditional Custom Theme, System/Light/Dark modes, 100/125/150% text size, and focused application shortcuts
- English, German, Spanish, and French interface languages, with a System setting and English fallback
- Opt-in followed-stream monitoring, desktop notifications, and per-channel notification preferences
- Tray/menu-bar controls, Pause/Resume, and optional close-to-background behavior
- About on every desktop platform and a previewable support report
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:
- Streamlink 8.0 or newer, either on the desktop application's
PATHor selected by absolute path in Settings - a player supported by Streamlink; mpv and VLC have built-in discovery, or you can select another executable
- network access to the selected service; a Twitch account for Twitch browsing and new Twitch playback launches
- for Kick browser challenges, a Chromium-compatible browser discoverable by Streamlink (separate from the app's webview)
Platform requirements:
- Windows: Windows 11 x86_64 and the Microsoft Edge WebView2 Runtime. Windows 11 normally includes WebView2. Streamlink must be a native
streamlink.exe; batch wrappers are rejected. - macOS: macOS 11.0 or newer on Apple Silicon or Intel, with the system WebKit view and Keychain available. GUI applications can have a smaller
PATHthan Terminal, so select Streamlink/player paths in Settings when discovery does not find them. - Linux: an x86_64 desktop, a user D-Bus session, and an unlocked Secret Service provider such as GNOME Keyring or KWallet. The Debian and RPM packages declare their native WebKitGTK and GTK dependencies. The AppImage bundles its application-side GTK/WebKit libraries but intentionally uses the host GLib, Wayland/Mesa, D-Bus, and Secret Service integration.
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 streamlinkpipx 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.
- Download the artifact for your platform and its checksum file from GitHub Releases.
- Verify the SHA-256 checksum, then install or open the package.
- Install Streamlink and a player if they are not already present.
- Launch Stream GUI RS and select Connect to Twitch.
- Open the Twitch verification page, enter the displayed code, and approve
user:read:follows. - Open Settings → Streamlink to test discovery, then choose and test the player settings.
- Browse a live channel and select Watch. Use Watching to stop or restart sessions.
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 wingetTo update an existing installation when a newer version is available in WinGet:
winget upgrade --id ChrisLauinger77.Stream-GUI-RS --exact --source wingetThe 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-rsHomebrew users can install the universal macOS build from the author's tap:
brew tap ChrisLauinger77/cask
brew install --cask stream-gui-rsThe 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, hidden entries, 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.
Choose Open channel → Service → YouTube, enter a locator and select Play YouTube stream. It works while signed out of Twitch. Accepted locators are an 11-character video ID (for example the part after watch?v=), an @handle, or a 24-character UC… channel ID; enter the locator, not a URL. A handle or channel ID plays that channel's current live stream. The app does not check live status or retrieve titles, viewer counts or categories.
YouTube uses the same global settings, selected player profile and quality policy as Kick, without channel overrides. Streamlink has no YouTube low-latency option, so that preference does not apply. YouTube rendition names differ from Twitch, so High, Medium and Low pick the best stream within the policy limit. Audio fails when no audio-only stream is offered, which is common for YouTube live streams.
Open YouTube browser chat opens the fixed live-chat popout in the default browser and needs a video ID; a handle or channel ID cannot identify the chat without an API lookup. Automatic chat and Chatterino are not used for YouTube.
YouTube playback is best-effort and depends on the installed Streamlink version. YouTube may show consent pages or bot checks that Streamlink cannot pass, and the app never imports browser cookies to work around them. Members-only and age-restricted streams are not supported. Failure does not prove that a stream is offline; Streamlink output remains visible in the session diagnostics. The support report contains only the service enum, never the locator or URL. YouTube browsing, Following, monitoring/notifications, hidden entries, channel overrides, Google sign-in and VOD playback UI are not supported; see the roadmap decision.
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 and YouTube use the separate playback actions 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. YouTube has no such flag and ignores the preference. 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.
Twitch 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 Twitch 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.
Open channel → Kick / YouTube also offers a bookmark toggle. These bookmarks store the canonical locator as the label, with no rename or live-status lookup. Bookmarks stays available while signed out of Twitch, in the Open channel panel and through its shortcut; Twitch entries remain visible and require sign-in to open. Kick/YouTube rows offer explicit Play, browser chat (YouTube video IDs only), and Remove. A launch failure does not mean offline. A YouTube video-ID bookmark stops working when that stream ends; @handles and UC… channel IDs continue to target current live streams but offer no chat. There are no Kick/YouTube hidden entries.
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. Settings version 10 adds locator bookmarks with a no-op migration from version 9; older binaries refuse the new file without overwriting it.
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.
- Linux: notification delivery and click actions depend on the desktop notification server. The UI reports OS-managed delivery, not a permission grant. A StatusNotifier host and an Ayatana/AppIndicator library are needed for the tray; GNOME may need an indicator extension. A missing library/host falls back to minimize. Losing the host restores a hidden window.
- Windows: native toast notifications use the application's installed identity. After a banner times out, its Notification Center entry remains actionable for up to 15 minutes while the app and original monitoring/sign-in session remain active. Pause, logout and Quit retire those entries; notification clicks cannot reopen the app after Quit. Use the installer and its Start-menu shortcut for notification testing; an unregistered portable executable may not support delivery/activation. When this behavior changes, use the native notification acceptance procedure and real followed-stream checks.
- macOS: allow notifications explicitly in Settings, then manage denial in macOS System Settings. Notifications require an installed, correctly signed app bundle; a bare development executable reports unavailable. Authorization failures remain visible and can be retried after correcting the installation. See the notification acceptance guide if no permission prompt appears.
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:
- stable Rust 1.90 or newer
- Node.js 22.22.2+, 24.15.0+, or 26+ with npm; CI uses Node 24
- Tauri 2 prerequisites for the target platform
- on Debian/Ubuntu,
libayatana-appindicator3-devfor tray support alongside the existing native prerequisites
Install locked frontend dependencies and start development with your own registered public Twitch client ID:
npm ci
TWITCH_CLIENT_ID=yourPublicClientId npm run tauri devBuild a native release binary with an embedded public ID:
TWITCH_CLIENT_ID_BUILD=yourPublicClientId npm run tauri build -- --no-bundle --features custom-protocolNo 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 --checkThe 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.
