Currently most programs available to add subtitles to your own broadcasts require sending your audio to a third-party service. This is a basic attempt at a fully local, livestream-native subtitling program.
- Initialize submodules. Run
git submodule update --init --recursiveunless you cloned with--recurse-submodules. - Check dependencies. Run
./utils/scripts/install_deps.sh(macOS/Linux) or./utils/scripts/install_deps.ps1(Windows) to verify every tool the build needs; missing tools are printed with install hints. Pass--ci/-CIto install them automatically. - Build & run.
pnpm install && pnpm tauri dev.
With GNU Make and toke available on PATH, these optional shortcuts cover common workflows:
| Command | Description |
|---|---|
make dev |
Run the desktop app in development mode. |
make dev-internal |
Run with the internal frontend and Rust checkout enabled. |
make build |
Build the production desktop application. |
make build-internal |
Build with the internal frontend and Rust checkout enabled. |
make install |
Build and install the production desktop application. |
make install-internal |
Build and install with the internal checkout enabled. |
make check |
Run frontend and Rust checks. |
make test |
Run packaging, Node, and Rust test suites. |
make test-packaging |
Run packaging integration and installer tests. |
make validate-transcription |
Validate transcription against the configured local model. |
make validate-hallucinations |
Validate hallucination filtering with configured models. |
Builds produce an NSIS installer on Windows, a DEB on Debian-family Linux, and an x86_64 pacman package on Arch-family Linux. Other platforms retain Tauri's normal bundle behavior. Install targets currently support Windows, Debian-family Linux, and x86_64 Arch-family Linux; macOS, RPM, and AppImage installation are not supported.
Installation builds first and selects exactly one fresh artifact. Linux installation
uses sudo with noninteractive apt-get or pacman; Windows displays the installer's
normal UI and waits for it to finish. Standard and internal builds use the same
application identity, installation, and settings; installing either replaces the other.
To install an existing artifact without rebuilding or requiring an internal checkout:
make install-internal TAURI_PACKAGING_INSTALL_ARTIFACT=/path/to/scrybe-0.2.16-1-x86_64.pkg.tar.zstUse a .deb artifact on Debian-family hosts or an NSIS .exe on Windows. Tauri
bundles are under target/release/bundle/; Arch packages are under package/.
Scrybe requires PulseAudio or PipeWire with its PulseAudio compatibility service
(pipewire-pulse). Settings lists Microphones & Inputs and Computer Audio;
computer audio captures sound playing through the selected output. Choose one
source at a time. Each group has a system default that resolves when you press
Start and stays on that device until you stop. Available devices refresh while
Settings is visible. If a source disconnects, capture stops and explains the error.
Saved ALSA selections from older versions require choosing a source again. The empty/default selection continues to use the system input. macOS retains its existing device menu and capture backend.
Linux development needs the libpulse headers (libpulse-dev on Debian/Ubuntu,
libpulse on Arch). Packaged builds declare the client-library dependency; the
desktop's audio service must already be running.
Run sh scripts/verify-audio-devices.sh --backend pipewire or
sh scripts/verify-audio-devices.sh --backend pulseaudio for repeatable checks.
These require the named server binaries, pactl, pacat, and dbus-daemon.
They start private servers and use synthetic audio without changing desktop
routing. Evidence, including source-specific recordings, is saved under /tmp.
The tests cover routing, defaults, device removal, server shutdown, startup
cancellation, and resource cleanup.
For a desktop acceptance check, build cargo build -p scrybe_core --bin audio_probe,
then run target/debug/audio_probe list and compare the names with sound settings.
python3 scripts/audio-devices.integration.py --desktop compares the catalog with
the running audio server automatically.
With a known signal playing or a microphone in use, run
target/debug/audio_probe capture --id '<device ID>' --seconds 3 to check capture
statistics. Audio is only saved if you supply --output /path/to/recording.wav.
Scrybe automatically applies its NVIDIA explicit-sync workaround on Linux Wayland
at startup, including development and installed builds. No launch prefix is needed.
Existing __NV_DISABLE_EXPLICIT_SYNC values are preserved; setting it to 0 opts
out. The shared helper's detection and safety contract are documented in
synth-tauri-runtime.
Run bash scripts/verify-linux-startup.sh for automated checks. On an NVIDIA Wayland
desktop, use bash scripts/verify-linux-startup.sh --dev or --installed to launch
with the override unset, then confirm a responsive window and the workaround log.
Use --desktop to launch the installed desktop entry with the override unset.
Also verify a normal launch from the desktop menu after installing the new build.
Local packaging requires an x86_64 host with GNU Make, Cargo, Node.js, Docker or
Podman, and sudo/pacman for installation. Initialize the utils submodule first.
Build dependencies and the pinned pnpm version are installed inside an Arch Linux
container; the host dependency script's apt-based Linux installer is not needed for
this workflow. Docker is selected when available, otherwise Podman. To select Podman
explicitly:
make build TAURI_PACKAGING_CONTAINER_RUNTIME=podman
make install-internal TAURI_PACKAGING_CONTAINER_RUNTIME=podmanInternal builds also require the internal frontend and Rust checkout. The build validates the package, installs it inside the container, and checks that it launches before host installation. These packages currently use CPU transcription; GPU packaging is a follow-up.
To update, update your source checkout and submodules, then rerun make install or
make install-internal with the same container-runtime override if needed. The Arch
app's Update via package manager action opens these instructions. Other builds
retain in-app updates. AUR publishing is planned separately.
Run bash scripts/verify-packaging.sh for app and packaging checks, or
bash scripts/verify-packaging.sh --arch to build and verify both package variants
through Podman. The latter installs only inside the container and leaves the internal
package in package/; both commands verify that dependency lockfiles stay unchanged.
This is still in very early development so it's not really usable as-is. If you're really interested before I finish updating this, you can send me an email and I can help you set it up.
Some features planned:
- Multiple audio streams. Meaning you can create independent subtitles for desktop audio and your microphone at the same time.
- Support for Twitch native closed captioning
- OBS plugin to support muting subtitles when you mute your microphone in OBS
- Support subtitle translation

