Files
soulseek-rs-modded/soulseek-rs
Michel de Graaf 2a906df1b5 feat(config): remember which daemon to use, and document the download box
A remote daemon could only be named with --daemon and --daemon-token on every
invocation, which made the one workflow daemon mode is most useful for — a
headless download box driven from a laptop — a matter of retyping a 64-character
token. Both are now config keys, so it is two 'config set' commands once and
plain commands thereafter.

Fixes a bug that setup exposed: the up-front daemon status probe read the token
from the command line only, so with the token in the config file it failed
silently and every command that names a path or a server fell back to this
machine's defaults — whoami claiming downloads land in the laptop's home
directory when they land on the box. The regression test was checked by
reintroducing the bug.

Documents the download-box workflow in plain terms across the README, the
website and the agent skill, and says plainly that the schema is open: OpenRPC,
served by the daemon itself, so an Android, iOS or web remote is something
anyone can build without asking.
2026-07-27 14:11:51 +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.