CI / check (push) Failing after 5m35s
The live-edge catch-up (8c4f4a0,b4a4c00) landed after the v0.6.5 tag, so the 0.6.5 artifacts do not contain it — the same gap that left the fix out of v0.6.4. Cut 0.6.6 so the published build actually carries it. Local-only changes (no wire change; PROTO planes unchanged), so this is a PATCH bump per VERSIONING.md. 601 lib tests green, clippy clean. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
164 lines
12 KiB
Markdown
164 lines
12 KiB
Markdown
# Changelog
|
||
|
||
All notable changes to PeerSpeak are documented here.
|
||
|
||
## [Unreleased]
|
||
|
||
## [0.6.6] — 2026-07-19
|
||
|
||
### Fixed
|
||
- **A screen share that falls behind now catches back up.** On a lossy
|
||
connection (satellite links are the worst case) the share could settle several
|
||
seconds behind the host and simply stay there for the rest of the call. The
|
||
viewer now notices a deep buffer and plays imperceptibly fast until it is back
|
||
at the live edge — the audio stays in tune and in sync while it does. This
|
||
replaces the previous attempt at the problem, which measurement showed did not
|
||
help. Applies to the Low latency setting; Smooth intentionally keeps its
|
||
larger buffer.
|
||
|
||
### Changed
|
||
- **Low latency now keeps a tighter viewer buffer.** The screen-share cache
|
||
setting is a size in megabytes, which at a given bitrate quietly decides how
|
||
many *seconds* behind a viewer can drift — a 2 MB buffer turned out to hold
|
||
about six seconds of a typical share. Low latency now caps that buffer at 1 MB
|
||
regardless of the setting, which halved how far behind a share fell on a bad
|
||
connection before anything else kicked in. Smooth still honors the value you
|
||
choose, since a deep buffer is the point of that mode.
|
||
|
||
## [0.6.5] — 2026-07-19
|
||
|
||
### Added
|
||
- **Chat message sounds.** Successful outgoing messages and admitted incoming
|
||
messages now have distinct notification chimes, each with its own enable
|
||
toggle and optional custom WAV path in Notifications settings.
|
||
- **Contact presence sounds.** The home-screen contacts list now announces a
|
||
contact becoming online or offline. Initial online contacts are announced;
|
||
initial offline results stay silent. Both events have independent toggles and
|
||
optional custom WAV paths.
|
||
- **Notification sound browser.** Every notification event now has a native
|
||
Browse button for choosing a custom WAV instead of typing its path manually.
|
||
|
||
### Changed
|
||
- **Tidier per-participant audio controls.** The equalizer bands and noise gate
|
||
for each participant now live behind an **"Advanced audio"** foldout instead
|
||
of being expanded all the time, so a call with several people no longer fills
|
||
the panel with sliders. The controls themselves are unchanged.
|
||
|
||
### Fixed
|
||
- **Low-latency screen sharing stays near the live edge again.** mpv's
|
||
timestamp pacing could let stale frames accumulate across the reliable
|
||
PixelPass transport until a share was 7–10 seconds behind. Low-latency mode
|
||
now presents decoded frames immediately; Smooth mode retains timestamp pacing
|
||
when keeping shared-video audio and video synchronized matters more.
|
||
|
||
## [0.6.4] — 2026-07-18
|
||
|
||
### Added
|
||
- **Chat now tells you when a message didn't send.** A message that couldn't go
|
||
out — because you weren't in a room, or the broadcast failed — is marked
|
||
**"⚠ Not sent"** with a **Retry** button, instead of sitting in the transcript
|
||
looking delivered. A successful send shows nothing (PeerSpeak has no
|
||
delivery/read receipts, so anything else would be a false promise).
|
||
- **Fast typing no longer loses messages.** When you fire off a quick burst,
|
||
messages past the first few are held as **"queued…"** and sent a moment apart,
|
||
matching the rate other people's clients accept. Previously a fast burst could
|
||
look sent on your end while some messages silently never reached the room.
|
||
|
||
### Changed
|
||
- **Tidier music playlist drawer.** The slide-out playlist no longer repeats the
|
||
play/skip controls already on the player bar, and the track list now grows to
|
||
fill the drawer instead of being boxed into a short scroll area, so you can see
|
||
more of your playlist at once.
|
||
- **Safer chat under the hood.** A round of chat hardening tightened how incoming
|
||
messages, display names, links, and file/image attachments are validated and
|
||
bounded, so a malformed or hostile message from a peer can't spoof a name,
|
||
replay, flood, or run the app out of memory. No change to how normal chat looks
|
||
or works.
|
||
|
||
### Fixed
|
||
- **Burst packet loss no longer splices the wrong audio into the gap.** Loss
|
||
concealment used Opus in-band FEC even when the next packet to arrive wasn't
|
||
the one immediately after the gap, so losing several packets in a row could
|
||
briefly play a later frame's audio in the wrong position. FEC now only
|
||
reconstructs a gap from its immediate successor packet; larger gaps are
|
||
concealed normally.
|
||
- **A failed network restart no longer silently kills the app.** Changing the
|
||
network mode (or regenerating your identity) rebuilds the connection stack;
|
||
if that rebuild failed — rare, but possible when the local socket can't
|
||
bind — PeerSpeak kept its window open but silently stopped responding to
|
||
every command. It now falls back to your previous network settings and says
|
||
so, and only gives up (with a clear error telling you to restart) if even
|
||
the fallback fails.
|
||
|
||
[0.6.4]: https://gitbutter.xyz/mollusk/peerspeak/releases/tag/v0.6.4
|
||
|
||
## [0.6.3] — 2026-07-06
|
||
|
||
### Added
|
||
- **In-app screen-sharing controls.** A new **Screen sharing** section in Settings, plus a per-call **quality picker** on the Share control, put the whole share pipeline under your control without editing config files. Encode side: quality preset, bitrate, framerate, maximum resolution, maximum viewers, a force-software-encode switch, and an escape hatch for extra pixelpass arguments. Playback side: choose **mpv or VLC**, toggle **hardware decoding**, pick a buffering posture (low-latency vs. smooth), set the demuxer cache, and pass extra mpv arguments. Everything is stored locally in your config and defaults are unchanged, so existing setups keep working as-is.
|
||
|
||
### Fixed
|
||
- **Shared video no longer freezes on the first frame while audio keeps playing.** Hardware decoding now defaults **off**; forcing `--hwdec=auto` stalled some viewers' hardware decoder on frame 1. You can re-enable hardware decoding from the new Screen sharing settings if your machine handles it well.
|
||
- **The per-call quality picker is now honored.** The inline quality dropdown next to the Share button was being reset to the saved default before a share started, so every share silently used the default quality regardless of what you picked.
|
||
- **VLC now respects your playback settings.** VLC hardware-decodes by default, so a VLC viewer previously ignored the hardware-decode toggle (and could hit the same frame-1 freeze) and the buffering posture. VLC viewers now map both settings onto VLC's own options.
|
||
|
||
[0.6.3]: https://gitbutter.xyz/mollusk/peerspeak/releases/tag/v0.6.3
|
||
|
||
## [0.6.2] — 2026-07-03
|
||
|
||
### Fixed
|
||
- **Friends list now reflects status changes without a restart.** A presence probe that fails now actively marks the friend **offline**, so a friend who goes offline, leaves a room, or turns invisible no longer lingers showing a stale "online" / "in a room" status until PeerSpeak is relaunched. Previously only successful probes updated the list, so it could ratchet a friend's status up but never down. The auto-refresh interval was also shortened from 60s to **15s** so the list tracks changes more closely.
|
||
|
||
### Added
|
||
- **Manual "⟳ Rescan" button** on the Friends panel that refreshes everyone's presence immediately, instead of waiting for the next auto-refresh.
|
||
|
||
### Licensing
|
||
- **PeerSpeak is now released under the MIT License** (previously an unlicensed private build). Added a `LICENSE` file and a `THIRD_PARTY_LICENSES` file enumerating the full dependency manifest plus the canonical text of every referenced license, with notices for the statically bundled Opus codec and the embedded fonts (Iced-Icons, Cantarell/OFL-1.1). Both files ship in the Arch and Debian packages.
|
||
|
||
[0.6.2]: https://gitbutter.xyz/mollusk/peerspeak/releases/tag/v0.6.2
|
||
|
||
## [0.6.0] — 2026-06-28
|
||
|
||
### Added
|
||
- **Shared music listening (W22).** A new **Playlist** panel lets you build a personal queue of local audio files and play them on a dedicated music player — Browse to add tracks, play/pause, previous/next, seek, per-track reorder, remove, and a local volume slider, all persisted across sessions. `.pls` and `.m3u` playlists can be imported (remote and non-audio entries are skipped).
|
||
- **Tune in to a friend's music.** Flip **"Let others tune in"** and peers see your current track under the **Public** tab; one click on **Listen** streams it to them. Playback is **timeline-synced** — play, pause, skip, and seek mirror across everyone with no drift — and the next track is **prefetched for gapless** transitions. Each listener gets an independent **per-source volume**, so music sits under voice at whatever level they like; voice chat stays fully audible throughout.
|
||
- **Standalone Playlist card in the 3-Column layout.** The playlist now lives in its own card stacked under the chat, with a draggable divider to resize it and its own scrollbar when space is tight. The other layouts keep the playlist in the Controls panel.
|
||
|
||
### Security
|
||
- Shared-music metadata is treated as untrusted: the broadcast track name is sanitized and its size is cap-checked at gossip ingest, fetched bytes are confirmed to be audio before decoding, and only a small descriptor ever rides gossip — track bytes move point-to-point over the existing files plane, one fetch in flight at a time.
|
||
|
||
### Changed
|
||
- **Wire protocol bump (gossip v5).** Shared listening adds presence fields, so **0.6.0 peers cannot share a swarm with 0.5.x peers** — everyone in a room must update together.
|
||
|
||
[0.6.0]: https://gitbutter.xyz/mollusk/peerspeak/releases/tag/v0.6.0
|
||
|
||
## [0.5.1] — 2026-06-27
|
||
|
||
### Added
|
||
- **Volume control for inline chat audio clips.** A master volume slider plus a **Universal volume** toggle now sit in the Chat panel header, and every audio attachment gets its own 🔊 slider on its play row. With Universal volume on (the default), one level applies to all clips and persists across sessions; turn it off to give each clip its own independent level.
|
||
|
||
## [0.5.0] — 2026-06-27
|
||
|
||
### Added
|
||
- **Right-click context menu** (Cut / Copy / Paste / Select All) on every text-entry field. (A9)
|
||
- **Selectable, copyable text** for values that used to be read-only: your full node ID and the room ticket can now be click-selected and copied, and **chat messages are drag-selectable** (highlight + Ctrl+C / Ctrl+A) while clickable links keep working. (W21 Phase 1 + 2)
|
||
- **Clock-skew warning**: when a peer can't be seen because the two systems' clocks differ by more than the replay-protection window, PeerSpeak now shows a "your clocks are out of sync" banner instead of failing silently. (A25)
|
||
- **Per-application audio capture for screen-share**, removing the call-audio loopback echo when sharing a window, plus surfacing of pixelpass startup errors. (A23)
|
||
|
||
### Changed / Fixed
|
||
- **Critical commands are now delivered reliably under load** — muting, releasing push-to-talk, and leaving a room can no longer be silently dropped while a slider is being dragged (prevents a hot-mic state mismatch). (A15)
|
||
- Screen-share now passes `--strict-audio` and surfaces app-audio drop warnings; the source picker state machine and pactl handling were hardened. (A23)
|
||
- Per-peer volume control path verified and covered by regression tests. (A24)
|
||
|
||
### Security
|
||
- Hardened against insider resource-exhaustion: bounded + author-keyed chat attachment cache, capped recovery-identity state, and other Tier-C caps (F-01 / F-02 / F-03 / F-12).
|
||
|
||
### Packaging
|
||
- Added Debian/Ubuntu `.deb` packaging (cargo-deb metadata); the official `.deb` is now built on **Debian 12 (bookworm)** for wide compatibility.
|
||
- Arch `PKGBUILD` clones over anonymous HTTPS.
|
||
|
||
[0.5.1]: https://gitbutter.xyz/mollusk/peerspeak/releases/tag/v0.5.1
|
||
[0.5.0]: https://gitbutter.xyz/mollusk/peerspeak/releases/tag/v0.5.0
|
||
|
||
Earlier releases: see git tags `v0.4.0`, `v0.3.0`, `v0.2.0`.
|