# 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`.
