16 KiB
16 KiB
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
19.1.0 - 2026-09-21
Added
- (cli) print completion scripts and the man page to stdout
- (cli) let a build name its own version
- (tui) say so in the status bar when the listener took another port
- (lib) let another thread cancel a client's connect and login
- (lib) cap the combined download speed
Fixed
- (tui) cancel a replaced login attempt and wait for it to let go
- (tui) keep the login screen responsive while connecting
- (rooms) start a room's roster from the member list, not the join echo
- (lib) give the listener port back before a dropped client returns
- (client) record a watch before the server can answer it
Other
- declare Rust 1.91 as the minimum version
- Merge pull request #97 from michel/test/event-synced-e2e
- (e2e) give a soulfind that dies on startup a fresh port
- (portmap) find the unmap among resent maps
- (cli) wait for the listener to be in the room, and keep an early PM
- (cli) hand a config command's session flags to the daemon
- (e2e) fence on the server where a test slept for another client
- (e2e) start a mock uploader once the client has registered it
- (e2e) wait for the join and the password change, not a sleep
- (resume) bound what a paused transfer may still take, not when
19.0.0 - 2026-09-10
Added
- browse your own shares as a peer receives them
- (tui) account settings — stats, password change, and logout
- (tui) clear the whole queue from the transfers pane
- folders in the browse tree carry their download's mark too
- mark browsed files with their download status
- browse the highlighted transfer's user with b
- (distributed) serve children in the search tree
- (rooms) private room membership, operators and refusals
- (tui) resize panes by dragging pane borders
- (tui) run the highlighted search again with S
- (tui) search a room's log and members, and a conversation
- (tui) folder jumps, open-all and a path filter in the browse popup
- (tui) W puts the pane layout back
- (tui) show the clear-all key in the searches pane's shortcuts
- (tui) show a result's file name and folder in columns of their own
- (peer) ask a peer what it says about itself
- (distributed) learn our own upload speed by watching ourselves
- (interests) keep our own list and send it again each login
- (protocol) folder requests, and heuristics matched to other clients
- (protocol) away status, excluded phrases, queue-place requests
- (protocol) interests, tickers, global room and cant-connect
- (download) resume interrupted transfers
Fixed
- (uploads) finish a transfer when the file lands, not when the peer closes
- review findings on the protocol work
- (distributed) a server with no parent figures leaves our cap alone
- (messages) acknowledge stored private messages, and disconnect cleanly
Other
- back-merge master to pick up the v14.2.0-v18.0.0 releases
- split the files that had grown past reading size
- trim the folder mark's allocations and indirection
- drop the per-row String behind the browse marker's gap
- (tests) share one soulfind fixture across the e2e suites
- (tui) one page window and one filter editor for every list
- (tui) wrap a chat log as it arrives instead of on every frame
- (tui) flatten a browsed share once and draw one page of it
- (tui) build only the visible page of result rows
- (tui) trim the folder column change to what it needs
- stop pinning a library version the instructions cannot keep current
- give the hung-up child's reap a wall-clock budget
- spell two Durations in their optimal units
- lead with the protocol coverage, and drop a stale upload assertion
- (e2e) the operator roster of a private room
- (e2e) resigning a private room, disbanding it, gifting privileges
- (e2e) a room announces members arriving and leaving
- (e2e) drive the new protocol messages against soulfind
18.0.0 - 2026-09-08
Added
- (lib) carry audio attributes in browse and folder listings
- (lib) read audio attributes from shared files at scan time
- (lib) join the distributed search network as a leaf
- (lib) decode distributed frames and announce a parentless stance
Fixed
- (lib) free a silent parent's slot and pace the moves we report
- (lib) harden the distributed leaf against hostile and slow parents
- (lib) count the ID3 tag once and honour CRC frames when probing an MP3
- (lib) parse what a peer sent before acting on its close
- (lib) retire a dialling actor at once and drain the socket while retired
- (stress) serve a browse that lands while an offer awaits its answer
- (lib) keep a replaced peer connection open for the reply in flight
- (lib) let an unanswered upload offer expire
Other
- Merge branch 'develop'
- (lib) keep the actors inside the crate and mark the growing enums
- (lib) export the ConnectionType parse error and document what hosts can still match
- (lib) move the peer actor's tests to their own file
- gate pull requests on the stress benchmark losing no work
17.0.0 - 2026-09-07
Added
- (lib) report each finished upload's rate to the server
- (lib) surface server announcements as messages from "server"
- (lib) answer UserInfoRequest with our slots and queue
- (lib) answer FolderContentsRequest with the folder's listing
Fixed
- (lib) keep the log level in an atomic and let hosts change it
- (lib) compress peer listings and reject a bad zlib checksum
- (lib) report a download's rate from the bytes actually read
- (lib) keep the server connection alive with TCP keepalive
- (lib) advertise real slot, speed and queue figures in search replies
- (lib) route on the full four-byte message code
- (lib) give each search its own token
- (lib) cap a search reply at 150 files
Other
- (lib) split the server actor's value types and tests out
- (lib) lowercase each shared path once at scan time
- (lib) read downloads in 64 KiB slices
- Merge pull request #69 from michel/lib/user-info
16.0.0 - 2026-09-07
Added
- (tui) scroll long names in every list and page through popups and chat
- (tui) results across the top, with panes you can hide, zoom and Tab through
Other
- Merge remote-tracking branch 'origin/develop'
- (tui) fold the keys overlay onto LogView and dedupe the pane lookups
15.0.0 - 2026-09-06
Added
- (tui) scroll long result names and page through results
- cancel a download from the TUI, the CLI, and the daemon
Other
- Merge branch 'develop'
- Merge branch 'develop' into feat/tui-results-navigation
- (tui) bound the name scroll walk by the column width
14.2.1 - 2026-09-03
Fixed
- (daemon) reconnect after the server session drops
Other
- Merge branch 'develop'
14.2.0 - 2026-09-01
Added
- (daemon) publish room member statistics over RPC and the CLI
- (tui) dismiss a finished download with d
- (lib) watch and unwatch users (WatchUser 5 / UnwatchUser 6)
Fixed
- (cli) keep
room userstext output a bare roster - slotsfull is occupancy, not free slots, and cover it end to end
Other
- release v14.1.2
- Merge remote-tracking branch 'origin/develop' into feat/room-member-stats
- (e2e) cover watching against soulfind, and read the reply as written
14.1.2 - 2026-08-18
Other
- drop bot wording in favor of client
14.1.1 - 2026-08-17
Fixed
- (peer) survive download token races on the listener path
- (peer) wait for the transfer token before the download lookup
Other
- Merge pull request #44 from michel/issue-42-download-token-races
14.1.0 - 2026-08-14
Added
- (tui) wrap long chat messages instead of clipping them
- (tui) navigate and confirm while filtering search results
Other
- rustfmt in chat wrap test
- (client) dedupe peer registration and order eviction by id
14.0.1 - 2026-08-13
Fixed
- (client) survive the review findings on the thread-flood fix
- (client) bound the threads a peer flood can create
- (peer) handle UploadDenied so refused downloads fail fast
- (peer) forward UploadFailed to the download store
- (actor) leave Disconnected state behind after every disconnect
Other
- Merge branch 'develop': peer failure forwarding and thread-flood fixes
14.0.0 - 2026-08-10
Fixed
- survive busy sessions without exhausting file descriptors
- (lib) cap what a search collects
Other
- Merge branch 'develop': fd-exhaustion fixes
- (daemon) answer search polls with counts instead of copies
13.0.0 - 2026-07-29
Added
- (daemon) make the download folder a live setting in both modes
- (daemon) make every window a view of one shared session
- (daemon) say what to do next on startup, and prove multiple clients agree
- (config) remember which daemon to use, and document the download box
- (daemon) route commands and the TUI through a running daemon
- (daemon) resident session, auth-gated control socket, and event fan-out
- (daemon) wire protocol with a type-safe method vocabulary and a generated OpenRPC contract
Fixed
- (daemon) version the contract by its protocol, not by the crate
- (daemon) ask the OS for enough open files, and stop spinning when it says no
- (daemon) a thread the OS refuses must not take the listener with it
- (shares) let add and remove reach a running daemon
- (daemon) correct the published contract and harden the control socket
Other
- (daemon) match a reply by its id instead of taking the next line
- cut what a whole-repo audit proved dead, padded, or hand-rolled
- (skill) choose the track yourself; narrow the results instead of skipping them
- (skill) make the cheap path the default and stop moving paths by hand
- (skill) stream picks into transfers instead of batching them
- (skill) raise the batch limits to what the client is actually built for
- (skill) add the search ladder, and one budget both batch routes obey
- (skill) teach the agent to fetch a list without getting the user banned
- (skill) make the daemon the default way an agent works
- (daemon) route the suite at its chokepoint and cover the protocol directly
- (daemon) drive the whole CLI suite against a daemon, and fix what it caught
- publish the daemon protocol and describe daemon mode in the README
- (api) put a SessionApi seam between the commands, the TUI, and the client
12.0.0 - 2026-07-26
Added
- lift the client's concurrency ceiling from ~15 peers to 1024
Fixed
- (serve) report a queued upload even when it is served between two polls
Other
- raise transfer defaults and stop uploads sleeping on their slot
- add a code quality baseline
- (lib) move the client tests into their own file
11.0.0 - 2026-07-26
Fixed
- [breaking] make concurrent invocations work instead of silently seeing nothing (#22)
10.0.0 - 2026-07-26
Added
- [breaking] wishlist, upload-queue privilege recognition, and search filters (#20)
9.1.0 - 2026-07-26
Added
- resume an interrupted download instead of refetching it (#18)
9.0.0 - 2026-07-26
Added
- install tab completion for bash, zsh, and fish (#16)
8.0.0 - 2026-07-26
Added
- log in with soulseek-rs's own client major version (176) (#13)
7.1.0 - 2026-07-25
Added
- (tui) give the panes the colour the demo promised
Fixed
- (lib) give the login verdict the wait the caller already allows
7.0.0 - 2026-07-25
Added
- (cli) ship the agent skill inside the binary
- (cli) expose sharing, peer lookup and settings as one-shot commands
- (cli) [breaking] replace the one-shot commands with a scriptable surface
- (ui) theme the TUI with the soulseek-rs design system
Fixed
- (peer) serve full browse listings + harden the listener; TUI transfer/UX work
- (persist) use XDG paths on macOS
- (peer) log disconnect cause; bind e2e browse listener on all interfaces
Other
- link the website from the crates and the READMEs
- clear the quality-scan findings
- document the skills command and the scriptable surface
- pin soulseek-rs-lib install snippets to 6
6.0.0 - 2026-07-24
Breaking changes
Library only. If you install the soulseek-rs binary there is nothing to do —
these affect crates depending on soulseek-rs-lib 5.x. Sharing moved from a
single optional directory to a list, which changed three public items.
ClientSettings::shared_directory: Option<String>is nowshared_directories: Vec<String>.Nonebecomesvec![],Some(dir)becomesvec![dir].Client::shared_directory() -> Option<&str>is replaced byClient::shared_directories() -> Vec<String>. The newClient::set_shared_directories(Vec<String>)updates the set at runtime.peer::upload_peer::serve_filetakes two more parameters,bytes_sent: &AtomicU64andcancel: &AtomicBool, which drive upload progress and cancellation. Pass freshly constructed values to keep the old behaviour.
Added
- settings popup and uploads in the transfers pane
- update shared directories at runtime
- multiple shared directories
- conventional default download and share folders
- set aside unusable state files as .bak instead of overwriting
- persist and restore TUI state across restarts
- versioned JSON state stores for downloads, searches, rooms
- in-TUI login/registration screen
- password resolution via OS keychain and password_cmd
- config.toml settings layer (CLI > env > file > defaults)
- track uploads with progress and cancellation
Fixed
- drop libdbus dependency from keyring Linux backend
- clippy cleanups in upload tracking and share plumbing
Other
- persistence e2e and registration-relogin e2e; lint clean