Files
soulseek-rs-modded/soulseek-rs
Michel de Graaf 2a343dd4b9 test(e2e): give a soulfind that dies on startup a fresh port
free_port() hands out a port that is free when asked, not when soulfind
binds it, and soulfind exits when the port has gone. The library
harness also gave soulfind only five seconds and did not notice a child
that had died, so either read as "no soulfind server" and failed the
test. It now waits ten seconds like the CLI harness, never takes a
child that has exited as up, and retries on a fresh port; the CLI
harness gets the same retry.

A listener that takes the port first can still answer before soulfind
has got as far as binding, so the two library tests that bind listeners
outside the server gate now take it too: while a soulfind starts, no
other test in that binary binds anything.
2026-09-10 15:17:54 +02:00
..
2026-09-08 02:09:34 +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.