Changelog
All notable changes to QR Send are documented here. The format follows Keep a Changelog, and this project uses Semantic Versioning.
Coding agents: add your entry under ## [Unreleased] in the same change that lands the work — npm run content:review fails the build if an entry is missing for a release cut. Anything in here that is interesting to a reader can be turned into a technical article with npm run content:article -- --from-changelog.
[Unreleased]
Added
- Blog content pages redesigned with improved typography, refined post cards with gradient accent, dark code blocks, better table readability with alternating rows, enhanced navigation with hover states, and semantic HTML (
<article>,post-header,post-bodyclasses).
- Per-stream completion: a stream's own descriptor (
segmented) decides whether its completion ends a receive session, so a file's stream ends the session while media fragments do not. The receiver mode is no longer consulted for this.
Fixed
- Network send is repeatable: a completed transfer no longer retires the sender's peer, each new connection resets the per-connection send state, and a new peer is served the same file (the office kiosk case: one screen, many receivers).
- Optical receive no longer tears a transfer down when a frame names a stream the decoder took no packets for, and a stream reporting a duplicate no longer abandons the other streams in that frame.
- The physical back button from the transmit page reaches the landing page in one step and disposes the transfer; entering the send view twice no longer stacks history entries.
- Leaving the transmit view ends whatever it was beaming: a file transfer no longer keeps drawing frames beside a media stream started afterwards.
- The receive overlay reports one shared line ("Receiving over optical and network") with one received-of-total counter and one bandwidth figure; stream ids are debug-only.
Changed
- Receiver status copy is answer-first and free of protocol ids; the peer-metadata progress bar only appears in debug builds.
Tooling
- e2e: the
playingwait no longer misses an event that already fired, which was failing the HLS video and optical scenarios intermittently (5/6 vs 6/6). - e2e: offline-receiver and transmit-reset scenarios added;
content:reviewgates the deploy on the content audit.
[1.3.3] — 2026-09-17
Added
- Media streaming: beam a live camera/mic or a local media file as a QRTP stream and play it back on the receive page.
- Device picker before a live stream: camera and microphone are chosen in one dialog (with "None" per input, so audio-only is a choice rather than a mode).
- Safe Send and multi-file/folder transfers continue to work through the shared descriptor pipeline.
Fixed
- Regular file transfers: a file's data stream is addressed as a stream, not as the transfer id, across the network handshake, the acknowledgement and the decoded-frame path.
[Unreleased]: https://github.com/qr-send/qr-send/compare/v1.3.3...HEAD [1.3.3]: https://github.com/qr-send/qr-send/releases/tag/v1.3.3