# PeerSpeak on Windows Current status: PeerSpeak cross-compiles to `x86_64-pc-windows-gnu` from Linux. PeerSpeak v0.6.7 at commit `7217015d` passed a fresh Windows 10 22H2/build 19045 VM smoke test on 2026-08-22 for install/upgrade, launch, GUI/settings render, device selection and persistence, microphone capture startup, WASAPI playback pacing, room create/leave, and the missing-PixelPass guard. The v0.6.8 candidate at commit `437c9538` passed its installer/helper/UI smoke on the same VM and adds the matching viewer-only PixelPass helper: Windows can watch Linux-hosted shares, while Windows capture/hosting remains intentionally unavailable. The build environment is **not** the Windows VM; current Windows binaries are built from Linux with the GNU target environment. The Windows runtime still trails Linux in a few important areas. See the Claude handoff file `windows-parity-audit.md` for the full audit and task breakdown. ## What works today | Area | Status | |---|---| | GUI | Iced/wgpu renders on Windows 10; the current build's landing and settings screens were smoke-tested. | | Networking | Iroh QUIC transport and gossip compile on Windows; the current build creates/leaves a room, and an older VM build completed a two-peer call. | | Audio backend | `cpal` drives WASAPI capture/playback behind `AudioBackend`. | | Device selection | cpal enumerates input/output devices; see caveat below about stable IDs. | | Resampling/remap | WASAPI devices can run non-48 kHz formats; PeerSpeak converts at the backend boundary. | | Codec | Opus remains 48 kHz mono, 20 ms frames. | | Identity/config | Stored through `dirs` under the Windows profile. | | Chimes | Windows uses PowerShell `System.Media.SoundPlayer` for WAV playback. | | Game detection | Steam registry `RunningAppID` plus Toolhelp process-scan fallback compile on Windows. | | File dialogs | `rfd` uses the native Win32 dialog backend. | | Screen-share viewing | The installer bundles the matching PixelPass viewer; VLC or mpv renders Linux-hosted shares. | Windows paths are resolved through `dirs`: - Config: `%APPDATA%\peerspeak\config.json` - Identity: `%APPDATA%\peerspeak\identity.key` - Log: `%LOCALAPPDATA%\peerspeak\peerspeak.log` ## Building ### Cross-compile from Linux Preferred local path: ```sh distrobox enter peerspeak-win -- bash -lc ' cd ~/git/butter/peerspeak && RUSTC_BOOTSTRAP=1 ./win-cross-build.sh -Z build-std=std,panic_abort ' ``` Equivalent direct command when the host has the GNU target, MinGW, `rust-src`, and CMake available: ```sh CMAKE_POLICY_VERSION_MINIMUM=3.5 RUSTC_BOOTSTRAP=1 \ cargo build --release --target x86_64-pc-windows-gnu --bin peerspeak \ -Z build-std=std,panic_abort ``` `CMAKE_POLICY_VERSION_MINIMUM=3.5` is required with host CMake 4.x because the vendored Opus build used by `audiopus_sys` still declares an old minimum CMake version. Without that env var, the Windows build/check fails during Opus configure. ### Native Windows A native MSVC build is not the active development path. If used, install MSVC Build Tools and CMake, then build normally: ```powershell $env:CMAKE_POLICY_VERSION_MINIMUM = "3.5" cargo build --release ``` ## First run and networking Expect a Windows Firewall prompt the first time the app opens network sockets, or use the Inno installer option that pre-adds idempotent PeerSpeak and PixelPass firewall allow rules. Both use UDP/QUIC plus relay traffic when direct NAT traversal is unavailable. The default network mode keeps the n0 relay available for NAT traversal without publishing presence to n0 DNS. Relayed connections are expected and valid. ## Fresh Windows 10 smoke — 2026-08-22 Validated on Windows 10 Enterprise Evaluation 22H2/build 19045 in the `peerspeak-windows10` libvirt VM. The installed title screen reported `PeerSpeak v0.6.7 (7217015d)`. Definitive artifacts built from committed `main`: - `peerspeak.exe`: 80,601,595 bytes, SHA-256 `a9225ca8878acdbc54a424427a591b3f55774a9fc4d20decd40993274b9336ff` - `peerspeak-0.6.7-setup.exe`: 18,578,658 bytes, SHA-256 `5ac551709814918f9c75a49aabed929d3f6618cdbeaf3cb4b22add8dfcbb68d9` Proven in this run: - The final installer transferred with a matching Windows-side hash, installed under `C:\Program Files\PeerSpeak`, and upgraded in place without losing config. - Upgrade testing exposed duplicate firewall rules. Commit `7217015d` made the installer replace its owned rule; a final upgrade left exactly one enabled inbound `PeerSpeak` rule and logged exit code 0 for delete/add. - The landing screen and all Settings categories rendered. Input `Line In (High Definition Audio Device)` and output `Speakers (High Definition Audio Device)` were selectable and restored after a clean app restart. - Test Mic opened the real cpal/WASAPI capture path. The VM endpoint negotiated 44.1 kHz stereo and PeerSpeak resampled it to 48 kHz as designed. - `audio_probe.exe 440 30` exited 0. After one startup-fill event, every steady-state health line reported `underrun +0` and `dropped +0`; the expected drain after tone generation stopped registered at shutdown. No human audible tone assessment was available during this automated run. - A one-participant room connected and left cleanly. With no `pixelpass.exe`, Share Screen opened the dependency instructions rather than crashing. - The app log ended with the correct version/hash and Windows Event Viewer had no PeerSpeak application errors. Still manual or two-party: current-build Linux↔Windows audio in both directions, chimes, chat/files/music/recording, friends/presence, game detection, audible probe quality, and uninstall/firewall cleanup. ## v0.6.8 viewer/installer smoke — 2026-08-22 Built from committed PeerSpeak source `437c9538` and committed PixelPass source `ca3122b`: - `peerspeak.exe`: 80,997,180 bytes, SHA-256 `952e77a0693d0e12390c8f39c5fbc3233b19eb069a31f49a922954692b2705e8` - `pixelpass.exe`: 13,165,056 bytes, SHA-256 `3eabd9f0dcd8565136a5c87a79470eceedd426cea5708904d7492a6fa37b3c49` - `peerspeak-0.6.8-setup.exe`: 22,273,495 bytes, SHA-256 `8e23f26d758bd803748dee6d8316f617e0a7b8e31fa1b21ca754eeae846d819f` Proven in this run: - The installer transferred to Windows with an exact matching hash, upgraded the existing install in place, and installed both payload binaries with hashes matching the staged build artifacts. - The title screen reported `PeerSpeak v0.6.8 (437c9538)`. A solo room created and left cleanly, and the log recorded the matching version/hash. - Windows displayed **Sharing unavailable** instead of attempting capture. Its explainer accurately said the bundled helper can watch Linux-hosted shares and that Windows hosting is not available yet. - The installer left exactly one enabled inbound `PeerSpeak` rule and one enabled inbound `PeerSpeak PixelPass` rule, each pointing at its installed binary. The rules cover Domain, Private, and Public profiles, matching the existing installer policy. - The installed helper reported the viewer-only capability envelope, completed `--doctor` with exit 0, and refused `--host` with exit 1. - The exact PixelPass payload hash above had already consumed a fresh ticket from a live Linux PixelPass host and rendered the Linux desktop in VLC. Closing VLC reaped the viewer and notified the host. This proves the helper/wire/player path; the final in-room PeerSpeak **Watch** click and a human audio check remain separate manual gates. ## Known gaps | Item | Status | |---|---| | Echo cancellation | Linux-only today. The Windows UI shows it disabled as unavailable. | | Screen share | Viewing Linux-hosted shares is implemented with the bundled PixelPass helper. Windows capture/hosting remains pending. | | Device persistence | Uses cpal friendly names as keys. These can duplicate or change across Windows driver/profile changes; stable WASAPI endpoint IDs are still needed. | | Release hygiene | Keep `.iss` and installer output in sync with `Cargo.toml`; rebuild Windows artifacts during each release. | | Runtime coverage | The 0.6.8 candidate passed the bounded installer/helper/UI smoke above; the remaining two-party and feature-specific rows still need coverage. | ## Current smoke checklist Before calling Windows feature parity complete, finish these checks on the Windows VM or real Windows hardware. The original checks below passed for v0.6.7 at `7217015d`; screen-share rows track the v0.6.8 candidate separately: - [x] Launch current `peerspeak.exe`; GUI renders and settings open. - [ ] Run `audio_probe.exe 440 30`; automated `playout-health` passed, but listen for glitches on physical hardware. - [ ] Create/join a Linux <-> Windows room; confirm mic and playback both directions. - [x] Select input/output devices, restart, and confirm selections persist or fall back clearly. - [ ] Play chimes and custom chime paths. - [ ] Send chat, image/file attachments, and save an attachment through the native dialog. - [ ] Import/play/share/listen to music from Windows file paths. - [ ] Record mixed/stems/both and inspect the WAV output path. - [ ] Exercise friends/presence/recents and the clock-skew banner. - [ ] Test Steam and non-Steam game detection on a real Windows Steam install. - [x] Run the Windows PixelPass viewer against a live Linux PixelPass host; video rendered and the viewer exited when VLC closed. - [ ] Watch a Linux-hosted share through the installed PeerSpeak UI; confirm video and audio on real Windows hardware. - [x] Confirm Windows clearly refuses screen-share hosting without treating the bundled helper as missing. - [ ] Install/upgrade/uninstall through the Inno installer, including firewall rule cleanup. Clean install and idempotent 0.6.8 upgrade passed; uninstall remains.