import { Link } from 'react-router' import { Button } from '@/components/ui/button' import { Code } from '@/components/ui/inline-code' import { Cols, Eyebrow, PageHead, Prose, Section, SectionHead, } from '@/components/ui/layout' import { Callout, Panel } from '@/components/ui/panel' import { Terminal } from '@/components/ui/terminal' import { LINKS } from '@/lib/links' const GLOBAL_KEYS: readonly (readonly [string, string])[] = [ ['Space', 'select a result'], ['Enter', 'download / send'], ['b', "browse the owner's files"], ['c', 'chat rooms'], ['m', 'compose a private message'], ['i', 'inbox (unread counter)'], ['/', 'filter the current list'], ['a / A', 'select all / none'], ['1–3', 'focus a pane'], ['q', 'quit'], ] const ROOM_KEYS: readonly (readonly [string, string])[] = [ ['Enter', 'join room / send message'], ['Tab · ⇧Tab', 'switch between open rooms'], ['x', 'leave the active room'], ['l', 'back to the room list'], ['↑ ↓', 'select a member'], ['b', "browse the member's files"], ['m', 'message the member'], ] const PANES: readonly { num?: number; title: string; body: string }[] = [ { num: 1, title: 'Searches', body: 'Your queries and how many results each returned. Type / to search the network; each search keeps its own result set.', }, { num: 2, title: 'Results', body: 'Files from the network: size, user, bitrate, speed, free slots. Space selects, Enter queues a download.', }, { num: 3, title: 'Downloads / Uploads', body: 'Live transfers in both directions with progress and speed: queued, active, complete, failed.', }, { title: 'Info', body: 'Everything about the selected file: user, size, path, bitrate, length, queue position, free slots.', }, ] /* * The keycap's heavier bottom edge is a shadow, not a thicker bottom border. * * A 2px border on one side of a rounded box thins out as it turns the corner, * so the edge tapers exactly where a real keycap looks solid. An unblurred * 1px shadow sits under the full curve instead, which is the look the design * system's `.key` rule is after. */ const KeyRow = ({ combo, description }: { combo: string; description: string }) => (
cargo install, the binary is on your
PATH.
On first run soulseek-rs shows a login screen: sign in with an existing Soulseek account or register a new one, right in the TUI. Your password is stored in the OS keychain, not in plain text.
Downloads land in a conventional folder by default, and your TUI state (searches, downloads, rooms) is saved and restored across restarts.
1–3 to focus
one; the focused pane’s legend turns green.
{pane.body}
The subcommands mirror the TUI: search, message,{' '}
browse, rooms, chat, and{' '}
portmap. Pass a room and a message to chat to say
one thing and exit.
portmap tests whether your router will let peers connect back,
worth running once.{' '}
More on being reachable
If both you and a peer are behind routers with no forwarded port, browsing that peer can’t work, that’s a fundamental Soulseek/peer-to-peer limitation, not a bug.
Deeper docs live where they stay current: the full README on GitHub, and the generated API reference for the library on docs.rs.