import { ExtLink } from '@/components/ui/ext-link' import { Code } from '@/components/ui/inline-code' import { OsIcon, type OsName } from '@/components/ui/os-icon' import { Terminal, type TermLine } from '@/components/ui/terminal' import { LINKS, NIGHTLY_DOWNLOAD, STABLE_DOWNLOAD } from '@/lib/links' interface InstallRoute { id: string os: OsName best: string lines: readonly TermLine[] alt: React.ReactNode } // aislop-ignore-file code-quality/duplicate-block -- data tables: the INSTALLS and LINUX_ROUTES records repeat the field names their interfaces require. The rule matches punctuation, not logic. const INSTALLS: readonly InstallRoute[] = [ { id: 'macos', os: 'macOS', best: 'Homebrew', lines: [ { t: 'cmd', text: 'brew install michel/tap/soulseek-rs' }, { t: 'cmd', text: 'soulseek-rs' }, ], alt: ( <> A prebuilt binary for Apple silicon and Intel, no Rust toolchain needed. With a toolchain, cargo install --locked soulseek-rs builds from crates.io instead. ), }, { id: 'linux', os: 'Linux', best: 'your package manager', lines: [ { t: 'cm', text: '# Debian and Ubuntu; the others are below' }, { t: 'cmd', text: `curl -fsSLO ${STABLE_DOWNLOAD}/soulseek-rs-amd64.deb` }, { t: 'cmd', text: 'sudo apt install ./soulseek-rs-amd64.deb' }, { t: 'cmd', text: 'soulseek-rs' }, ], alt: ( <> Fedora, Nix, Homebrew and cargo are{' '} listed below , each with a nightly. Without any of them, the{' '} releases page has static musl archives for x86-64 and arm64 that run on any distribution. ), }, { id: 'windows', os: 'Windows', best: 'cargo or a prebuilt .exe', lines: [ { t: 'cmd', text: 'cargo install --locked soulseek-rs' }, { t: 'cmd', text: 'soulseek-rs.exe' }, ], alt: ( <> Cargo needs the MSVC build tools. To skip both, take the{' '} pc-windows-msvc zip from the{' '} releases page, unpack it, and put{' '} soulseek-rs.exe on your PATH. ), }, ] interface LinuxRoute { id: string name: string stable: readonly TermLine[] nightly: readonly TermLine[] note: React.ReactNode } const LINUX_ROUTES: readonly LinuxRoute[] = [ { id: 'deb', name: 'Debian, Ubuntu, Mint', stable: [ { t: 'cmd', text: `curl -fsSLO ${STABLE_DOWNLOAD}/soulseek-rs-amd64.deb` }, { t: 'cmd', text: 'sudo apt install ./soulseek-rs-amd64.deb' }, ], nightly: [ { t: 'cmd', text: `curl -fsSLO ${NIGHTLY_DOWNLOAD}/soulseek-rs-nightly-amd64.deb` }, { t: 'cmd', text: 'sudo apt install ./soulseek-rs-nightly-amd64.deb' }, ], note: ( <> On ARM, arm64 takes the place of amd64. There is no apt repository behind this, so an update means installing the newer file over the old one. A nightly sorts above the release it follows, so going back to stable is a downgrade, and apt asks before doing it. ), }, { id: 'rpm', name: 'Fedora, RHEL', stable: [{ t: 'cmd', text: `sudo dnf install ${STABLE_DOWNLOAD}/soulseek-rs-x86_64.rpm` }], nightly: [ { t: 'cmd', text: `sudo dnf install ${NIGHTLY_DOWNLOAD}/soulseek-rs-nightly-x86_64.rpm` }, ], note: ( <> On ARM, aarch64 takes the place of x86_64. Run the same command again to update. dnf fetches the file each time, so a newer nightly at the same address is picked up. An older file downgrades without asking. ), }, { id: 'nix', name: 'Nix', stable: [{ t: 'cmd', text: 'nix run github:michel/soulseek-rs/master' }], nightly: [{ t: 'cmd', text: 'nix run github:michel/soulseek-rs/develop' }], note: ( <> Both build from source. With no branch at all, Nix takes the repository’s default one, and here that is develop. ), }, { id: 'brew', name: 'Homebrew', stable: [{ t: 'cmd', text: 'brew install michel/tap/soulseek-rs' }], nightly: [{ t: 'cmd', text: 'brew install --HEAD michel/tap/soulseek-rs' }], note: ( <> Homebrew installs under /home/linuxbrew, outside the image that a system update replaces on Bazzite and Silverblue. --HEAD compiles{' '} develop with Homebrew’s own Rust. ), }, { id: 'cargo', name: 'cargo', stable: [{ t: 'cmd', text: 'cargo install --locked soulseek-rs' }], nightly: [ { t: 'cmd', text: 'cargo install --locked --git https://github.com/michel/soulseek-rs --branch develop soulseek-rs', }, ], note: ( <> Needs Rust 1.91 or newer. Debian 13 and Ubuntu 24.04 default to an older one, so take the toolchain from rustup.rs.{' '} cargo binstall soulseek-rs fetches the release binary and compiles nothing. ), }, ] export const InstallCards = () => (
{INSTALLS.map((route) => (

{route.os}

{route.best}

{route.alt}

))}
) export const LinuxRoutes = () => (

Linux, by distribution

Stable is the latest release, or for Nix the master branch it was cut from. Nightly is the tip of develop, rebuilt every day. A release download prints the plain number, 19.0.0. Any Nix build, and a nightly download, reads 19.0.0+git202609141144.deb846b: the last release, the commit’s time in UTC, and the commit. A Homebrew --HEAD build reports HEAD-deb846b, and a cargo install from git sets no version, so it prints 19.0.0 too. The .deb and .rpm carry the man page and completions for bash, zsh and fish.

{LINUX_ROUTES.map((route) => (
{route.name}

{route.note}

))}
)