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{' '}
pc-windows-msvc zip from the{' '}
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 cargo binstall soulseek-rs fetches the release binary and compiles nothing.
>
),
},
]
export const InstallCards = () => (
{route.alt}
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.
{route.note}