import { Button } from '@/components/ui/button' import { ExtLink } from '@/components/ui/ext-link' import { FeatureCard } from '@/components/ui/feature-card' import { Code } from '@/components/ui/inline-code' import { Cols, Eyebrow, PageHead, Prose, Section, SectionHead } from '@/components/ui/layout' import { Callout } from '@/components/ui/panel' import { Terminal } from '@/components/ui/terminal' import { LINKS } from '@/lib/links' interface Alternative { question: string answer: React.ReactNode links: readonly { label: string; href: string }[] } const ALTERNATIVES: readonly Alternative[] = [ { question: 'Want a window and a mouse?', answer: <>SoulseekQt or Nicotine+. Both are good., links: [ { label: 'SoulseekQt', href: LINKS.slsknet }, { label: 'Nicotine+', href: LINKS.nicotine }, ], }, { question: 'Want feature completeness?', answer: ( <> Nicotine+ has more: wishlists, user lists, transfer rules, plugins, translations. It’s mature and well run. ), links: [{ label: 'Nicotine+', href: LINKS.nicotine }], }, { question: 'Want a queue that outlives the command?', answer: ( <> Every command runs one-shot and exits: JSON on stdout, an exit code, nothing left running. No resident queue to pause, resume, or drive remotely. slskd has that. ), links: [{ label: 'slskd', href: LINKS.slskd }], }, ] const CITIZENSHIP = [ { glyph: '↑', color: 'var(--status-success)', title: 'Share, and share real files', body: ( <> Point shares add at the collection you listen to. Full albums, honest bitrates, nothing transcoded up from a lossy source and relabelled. ), }, { glyph: '≡', color: 'var(--status-info)', title: 'Organize so others can find it', body: ( <> Artist and album folders, tagged files, readable names. Someone else’s search only reaches you if your filenames say what the music is. ), }, { glyph: '∞', color: 'var(--accent-text)', title: 'Stay online', body: ( <> Leave serve --follow running in a tmux session on the box that is already on. A share that appears for an hour a week is close to no share at all. ), }, { glyph: '↔', color: 'var(--status-warning)', title: 'Let people reach you', body: ( <> Forward your listen port or let portmap try UPnP, and leave a free upload slot. Two firewalled peers cannot trade with each other. ), }, { glyph: '@', color: 'var(--status-info)', title: 'Answer people', body: ( <> Rooms and private messages are part of the client for a reason. Someone asking where the rest of a discography went is worth a reply. ), }, { glyph: '⋯', color: 'var(--text-secondary)', title: 'Wait your turn', body: ( <> Queues are one person’s upload bandwidth being divided up. Queue it, leave it, come back later. Do not requeue the same file to jump the line. ), }, ] as const export const Community = () => { return ( <> It’s mostly one person who’s been on Soulseek since the early 2000s. Issues and pull requests are welcome, and if another client fits you better, use it.
File an issue, open a pull request, or just say what’s missing. No contributor agreement, no template gymnastics.

The project is a Cargo workspace: soulseek-rs-lib (the protocol) and soulseek-rs (the client). The library stays lean on dependencies; the client takes them freely.

Format and Clippy run clean on every push, and unit tests plus an end-to-end suite against{' '} soulfind{' '} run in CI, so a green checkmark means it built and talked to a server.

soulfind is an open-source Soulseek server. Run it locally and you develop against a real protocol implementation without touching the public network.

Decades of records, live sets, and pressings that never made it anywhere else, kept online by people who care about them. None of this is enforced. It is just how the network stays worth using.
{CITIZENSHIP.map((item) => ( {item.body} ))}
soulseek-rs has no graphical interface. If one of these fits you better, use it.
{ALTERNATIVES.map((alt) => (
{alt.question}
{alt.answer}
{alt.links.map((link) => ( ))}
))}
license & promises

MIT, and no strings.

Free to use, copy, modify, and distribute. Copyright © 2026 Michel de Graaf.

No telemetry. Ever.

Not affiliated with or endorsed by the Soulseek project.

) }