[package] name = "peerspeak" version = "0.6.2" edition = "2024" description = "Decentralized peer-to-peer voice chat (Rust/iroh/PipeWire/Opus/iced)" license = "MIT" # Application crate, not published to crates.io — refuse `cargo publish`. publish = false # Debian/Ubuntu packaging (cargo-deb). Mirrors packaging/PKGBUILD: only the main # `peerspeak` binary ships (not test_net/specview), plus the desktop entry and the # hicolor icon set. Runtime shared-lib deps (libpipewire, libopus, libc, …) are # resolved by dpkg-shlibdeps via `depends = "$auto"`. Build inside a Debian/Ubuntu # distrobox so the binary links that distro's glibc, then `cargo deb --no-build`. [package.metadata.deb] maintainer = "mollusk " copyright = "2026, mollusk. MIT License." section = "net" priority = "optional" depends = "$auto" # pixelpass = in-room screen sharing; mpv = the screen-share viewer (vlc fallback). recommends = "pixelpass, mpv" extended-description = "Decentralized peer-to-peer voice chat over iroh (QUIC) with PipeWire audio, the Opus codec, and an iced GUI. Full-mesh, no central server." assets = [ ["target/release/peerspeak", "usr/bin/", "755"], ["packaging/peerspeak.desktop", "usr/share/applications/", "644"], ["assets/icons/peerspeak.svg", "usr/share/icons/hicolor/scalable/apps/peerspeak.svg", "644"], ["assets/icons/peerspeak-16.png", "usr/share/icons/hicolor/16x16/apps/peerspeak.png", "644"], ["assets/icons/peerspeak-24.png", "usr/share/icons/hicolor/24x24/apps/peerspeak.png", "644"], ["assets/icons/peerspeak-32.png", "usr/share/icons/hicolor/32x32/apps/peerspeak.png", "644"], ["assets/icons/peerspeak-48.png", "usr/share/icons/hicolor/48x48/apps/peerspeak.png", "644"], ["assets/icons/peerspeak-64.png", "usr/share/icons/hicolor/64x64/apps/peerspeak.png", "644"], ["assets/icons/peerspeak-128.png", "usr/share/icons/hicolor/128x128/apps/peerspeak.png", "644"], ["assets/icons/peerspeak-256.png", "usr/share/icons/hicolor/256x256/apps/peerspeak.png", "644"], ["assets/icons/peerspeak-512.png", "usr/share/icons/hicolor/512x512/apps/peerspeak.png", "644"], ["LICENSE", "usr/share/doc/peerspeak/", "644"], ["THIRD_PARTY_LICENSES", "usr/share/doc/peerspeak/", "644"], ] [lib] name = "peerspeak" path = "src/lib.rs" [[bin]] name = "peerspeak" path = "src/main.rs" [[bin]] name = "test_net" path = "src/bin/test_net.rs" [[bin]] name = "specview" path = "src/bin/specview.rs" [dependencies] anyhow = "1.0.102" async-trait = "0.1.89" base64 = "0.22.1" bytes = "1.11.1" dirs = "6.0.0" iced = { version = "0.14.0", features = ["advanced", "canvas", "image", "tokio"] } # W4 custom avatars: decode/resize an arbitrary user image (png/jpeg only to keep # the codec surface small). The matching native file picker (`rfd`) is platform- # gated below — its backend differs per OS (xdg-portal on Linux, Win32 on Windows). image = { version = "0.25", default-features = false, features = ["png", "jpeg"] } iroh = "1.0.0-rc.0" iroh-gossip = "0.99.0" opus = "0.3.1" rand = "0.10.1" ringbuf = "0.5.0" rodio = "0.22.2" serde = { version = "1.0.228", features = ["derive"] } serde_json = "1.0.150" thiserror = "2.0.18" tokio = { version = "1.52.3", features = ["full"] } tokio-stream = "0.1.18" # --- Platform-specific dependencies ----------------------------------------- # Audio and the native file-picker backends differ per OS. Everything else in the # app talks to the `AudioBackend` trait and the `PlatformAudioBackend` alias (see # `src/audio/mod.rs`), so platform selection is confined to these few lines. [target.'cfg(target_os = "linux")'.dependencies] # Linux audio backend. v0_3_49 exposes `Buffer::requested()` (the graph's per-cycle # quantum), used by the playback RT callback to fill exactly what the device asks # for instead of a hard-coded 1024-frame quantum (crackle on non-1024 hardware). # The field has existed in libpipewire since 0.3.49 (2022). pipewire = { version = "0.9", features = ["v0_3_49"] } # Native file picker via the XDG desktop portal (no GTK) on Linux. rfd = { version = "0.17", default-features = false, features = ["xdg-portal"] } [target.'cfg(windows)'.dependencies] # Native file picker using the built-in Win32 dialog backend on Windows. rfd = { version = "0.17", default-features = false } # Windows audio backend: cpal drives WASAPI for capture/playback behind the # AudioBackend trait (src/audio/cpal_impl.rs). The Linux counterpart is pipewire. cpal = "0.15" # Win32 FFI for game detection (no new crate: windows-sys is already pulled in # transitively by cpal/rfd). Registry reads the Steam RunningAppID + install path; # Toolhelp enumerates running processes for the non-Steam process-scan fallback. windows-sys = { version = "0.61", features = [ "Win32_Foundation", "Win32_System_Registry", "Win32_System_Diagnostics_ToolHelp", "Win32_System_Threading", ] }