diff --git a/README.md b/README.md new file mode 100644 index 0000000..a8aec93 --- /dev/null +++ b/README.md @@ -0,0 +1,110 @@ +

+ PeerSpeak icon + PeerSpeak +

+ +Decentralized, peer-to-peer voice chat — full-mesh, NAT-traversing, with **no central server**. Built in Rust on [iroh](https://github.com/n0-computer/iroh) (QUIC), PipeWire audio, the Opus codec, and an [iced](https://github.com/iced-rs/iced) GUI. + +Create a room, share the join ticket, and talk. Everyone connects directly to everyone else; relays are only used to punch through NATs when a direct path isn't available. + +--- + +## Screenshots + +| Launch screen | In a room | +|---|---| +| ![Launch screen](docs/screenshots/launch.jpg) | ![In a room](docs/screenshots/in-room.jpg) | + +| Settings | +|---| +| ![Settings](docs/screenshots/settings.jpg) | + +--- + +## Features + +**Rooms & sessions** +- Create a room → shareable join ticket; join by pasting a ticket. +- Full-mesh multi-peer rooms with live presence. +- Recent-rooms list to hop back into a room someone's still in. +- Remembered nickname and in-call duration timer. + +**Audio** +- PipeWire capture/playback, selectable input and output devices, per-app gain. +- Opus codec (48 kHz mono, 20 ms frames) with an adaptive jitter buffer + packet-loss concealment. +- Noise gate with a draggable threshold on a live mic meter (test your mic off-call too). +- Mix-bus soft limiter and opt-in echo cancellation (PipeWire WebRTC AEC + noise suppression). + +**Voice controls** +- Self-mute, deafen, and rebindable push-to-talk. +- Per-peer volume, local mute, and speaking indicators. + +**Text chat** +- In-room text chat over the gossip plane, with clickable links and inline image/audio attachments. +- Drag-selectable, copyable messages; right-click context menu on all text fields. + +**Shared music listening** +- Build a personal playlist of local audio files with a full transport (play/pause, seek, reorder). +- Let others tune in: peers stream your current track, timeline-synced and gapless, sitting under voice at their own volume. + +**Screen share** (via [pixelpass](https://gitbutter.xyz/mollusk/pixelpass)) +- Share your screen; peers click 👁 Watch to open the stream in mpv (vlc fallback). +- Live badges on sharing peers; per-app audio capture. + +**Recording & notifications** +- Local call recording (mic + incoming mix → WAV in `~/peerspeak-recordings/`). +- Desktop notifications and event chimes with per-event custom sound overrides. + +**UI & networking** +- Selectable room layouts (3-Column, Bottom Dock, Drawer) with draggable, persisted dividers. +- 10 built-in themes (Catppuccin, Dracula, Nord, Tokyo Night, Gruvbox, Solarized…), all WCAG-AA checked. +- Network mode picker (relay-no-discovery default, full n0, or direct-only); retained-address reconnect. +- Config, window size/position, and all preferences persisted to `~/.config/peerspeak/`. + +See [`docs/FEATURES.md`](docs/FEATURES.md) for the full inventory and field-test status, and [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) for internals. + +## Roadmap + +- **Contacts & invites** — friends list with invite-notification one-click join (design in [`docs/contacts-plan.md`](docs/contacts-plan.md)). +- **Spatial audio & per-peer EQ.** +- **Soundboard** — play short clips into the call mix. +- **Room persistence / invite links** beyond the raw ticket. +- **Windows support** — cross-compiles and launches under Wine today; needs a real WASAPI audio pass (see [`docs/WINDOWS.md`](docs/WINDOWS.md)). + +## Building + +PeerSpeak builds with a stable Rust toolchain (edition 2024). Install the system dependencies below, then: + +```sh +cargo build --release +./target/release/peerspeak +``` + +### System dependencies + +**Arch Linux** + +```sh +sudo pacman -S --needed rust pipewire opus pkgconf clang git +``` + +**Debian / Ubuntu** + +```sh +sudo apt install build-essential pkg-config clang libclang-dev \ + libpipewire-0.3-dev libopus-dev libasound2-dev libxcb1-dev +``` + +Plus a Rust toolchain via [rustup](https://rustup.rs/). `clang`/`libclang` are needed for the PipeWire bindings (bindgen). + +At runtime you need a running **PipeWire** server. Screen sharing additionally requires `pixelpass` on your `PATH`, and `mpv` (or `vlc`) to watch a peer's share. + +### Packaging + +- **Arch:** `cd packaging && makepkg -si` (uses [`packaging/PKGBUILD`](packaging/PKGBUILD)). +- **Debian/Ubuntu:** `.deb` is built with [`cargo-deb`](https://github.com/kornelski/cargo-deb) from the `[package.metadata.deb]` block in `Cargo.toml`. Build inside a Debian/Ubuntu environment so the binary links that distro's glibc. +- **Windows:** see [`docs/WINDOWS.md`](docs/WINDOWS.md). + +## License + +Private build — not for redistribution. See `Cargo.toml` for details. diff --git a/docs/screenshots/in-room.jpg b/docs/screenshots/in-room.jpg new file mode 100644 index 0000000..cb6b9c9 Binary files /dev/null and b/docs/screenshots/in-room.jpg differ diff --git a/docs/screenshots/launch.jpg b/docs/screenshots/launch.jpg new file mode 100644 index 0000000..ed9d105 Binary files /dev/null and b/docs/screenshots/launch.jpg differ diff --git a/docs/screenshots/settings.jpg b/docs/screenshots/settings.jpg new file mode 100644 index 0000000..fec3d8b Binary files /dev/null and b/docs/screenshots/settings.jpg differ