Files
soulseek-rs-modded/soulseek-rs
Michel de Graaf d6d870b39f feat(tui): account settings — stats, password change, and logout
The settings popup opens with an Account block: who the session is logged in
as, how much it shares, the port peers reach it on, and the daemon it borrows
when the window is attached to one. Two rows follow, both confirmed before
they act. A password is typed twice, because the server sends no verdict on a
change and a typo entered once would leave the account with a password nobody
knows. Logging out closes the window and comes back to the login screen with
the stored password deleted, so the next start asks rather than walking
straight back in. A window attached to a daemon offers no logout: the login is
the daemon's.

"Change it on the server, then store it where the login lives" is one function
over the session and the secret store, so the window, the command and the
daemon share the rule rather than each spelling out its own idea of which
process owns the password.

Headless the same two acts are `account password` and `account logout`, and
the daemon answers `account.password` so a routed run is not a dead end —
`whoami` already reported who is logged in and what they share.
2026-09-10 11:10:58 +02:00
..

soulseek-rs

A Soulseek client for the terminal: a full-screen TUI, and a one-shot command surface built for scripts and agents.

Website: https://re-invention.nl/soulseek-rs/

Installation

brew install michel/tap/soulseek-rs   # macOS and Linux, prebuilt
cargo install soulseek-rs             # anywhere with a Rust toolchain

Usage

Run it with no subcommand for the interactive TUI:

soulseek-rs

Anything else is a one-shot command that runs headless. stdout carries records only, stderr carries progress, and the exit code carries the verdict:

soulseek-rs search <QUERY>                # print matching files
soulseek-rs get <QUERY>                   # search, pick the best, download
soulseek-rs download <USER> <PATH>        # fetch one known file
soulseek-rs download --stdin              # fetch files listed on stdin
soulseek-rs browse <USER>                 # list a user's shared files
soulseek-rs serve [--follow]              # stay online sharing, stream uploads
soulseek-rs whoami                        # confirm credentials and connection
soulseek-rs user <NAME>                   # a peer's status and share counts
soulseek-rs room list|say|users|listen
soulseek-rs message send|read
soulseek-rs shares list|add|remove|status|reindex
soulseek-rs config path|list|get|set
soulseek-rs portmap                       # test automatic port mapping
soulseek-rs completions install           # tab completion for bash/zsh/fish

Add --json for newline-delimited JSON instead of tab-separated text, so commands compose:

soulseek-rs search "rjd2" --json \
  | jq -c 'select(.size > 5000000 and .free_slot)' \
  | soulseek-rs download --stdin

Exit codes: 0 success, 2 usage or config, 3 connect or login, 4 nothing found, 5 timed out, 6 transfer failed, 7 session lost mid-command, 1 unexpected error.

The full README documents every command, record shape, flag, environment variable and config.toml key.

Building from Source

git clone https://github.com/michel/soulseek-rs.git
cd soulseek-rs
cargo build --release

Library

To build your own Soulseek client, use the soulseek-rs-lib crate: the protocol implementation this client is built on.