Soulseek account {#if settings.connected || online}online{:else if settings.username}offline{/if}
{settings.username ? `Signed in as ${settings.username}.` : "Not signed in."} Your password is stored in the Windows Credential Manager, not in a plain file.
{#if me}Signed in as {me} · {fmtCount(network.shareFiles)} files shared.{:else}Not signed in.{/if}
{#if !key}
Create a SoulStream identity on Community → You to link this account to it.
{:else if !me}
Sign in to Soulseek to link this account to your identity.
{:else if ownLinkCurrent}
Linked to your SoulStream identity — proof verified {new Date(ownLink.verified_at * 1000).toLocaleString()} through a message to yourself. Other SoulStream users who ask get a signed answer.
{:else}
Not linked to your identity. Linking sends one message to yourself over Soulseek and verifies the signed answer — nothing is published.
{/if}
{#if freenetOn}
Local node on 127.0.0.1:{community.freenet?.ws_port ?? 7509} · {status.text}
{:else}
Off. Carries your identity, profile, playlists, friend links, Spaces and holdings. Turning it on publishes nothing; turning it off is instant and touches nothing else in the app.
{/if}
{#if community.nodeInfo?.binary}
runs the installed peer{#if community.nodeInfo.version} ({community.nodeInfo.version}){/if} in the background · telemetry pinned off · data in the app folder
{:else}
No Freenet peer found on this machine — install it (cargo install freenet) and check again.
{/if}
{:else if freenetOn && community.nodeInfo?.started_by_app}
started by SoulStream · keeps running when the app closes; this button stops it
{/if}
Before you rely on it — seven things that are true
A desktop background peer must run; it uses network, disk, memory and CPU.
The network is alpha. Things you publish are replicated and cannot be guaranteed erased.
Freenet is not an anonymity service.
The node's own diagnostics are a node setting SoulStream pins off; verify after upgrades.
Nothing is published when you enable this. Publishing is always a button.
Nothing here ever says "online" — a successful fetch is not presence.
{#if community.inbox?.published}Friend requests and shares arrive sealed to a key kept on this device{#if community.inbox.last_check} · checked {fmtWhen(community.inbox.last_check * 1000)}{/if}.{:else}Lets other SoulStream users send you friend requests and shares sealed, without Soulseek in between.{/if}
{#if community.inbox?.published}
{:else}
{/if}
{/if}
{/if}
{#if community.error}
{community.error}
{/if}
Updates
New releases from the project, on the channel you pick. Installing is always a button.
SoulStream {up?.version ?? "…"} {#if up?.dev_build}dev build{/if}{#if avail}{avail.version} available{:else if up?.last_check && !up?.last_error}up to date{/if}
{#if up?.checking}Checking {up.channel}…
{:else if up?.last_error}Last check failed: {up.last_error}
{:else if up?.last_check}Checked {fmtWhen(up.last_check * 1000)} on the {up.channel} channel.
{:else}Not checked yet on the {up?.channel ?? "stable"} channel.{/if}
{#if updater.error} {updater.error}{/if}
{#if avail}
{avail.version} is ready {#if avail.date}{new Date(avail.date * 1000).toLocaleDateString()}{/if}
{#if avail.notes}
{avail.notes}
{/if}
{#if up?.installing}
{pct != null ? `Downloading · ${pct}%` : "Downloading…"} — the app closes into the installer and comes back on its own.
{:else if up?.dev_build}
This is a dev build run from the target folder; the installer would set up the packaged app beside it.
{/if}
{/if}
Channel
Stable follows the releases. Nightly is built from main every day and can break; switching back to Stable offers the next stable build even when its number is lower.
Access token {#if up?.has_token}set{:else if up?.source_kind === "github"}needed for a private repository{/if}
The project's repository is private while the alpha runs: releases are read with a token that can only read them. Paste the one you were given — it goes to the Windows Credential Manager, not a plain file, and leaves with Clear.
The manifest each channel reads (latest.json, Tauri's updater format, signed with the project's key). Leave empty for the project's GitHub releases; point it at a mirror or your own Gitea to update from there.
Appearance
How the window is drawn.
Dark glass
Lets whatever is behind the window glow through the app's dark surfaces with a live blur (Windows acrylic). Cards, rows and highlights thin out with it; menus and dialogs stay solid so nothing gets hard to read.
System default follows Windows when headphones or speakers change.
setAudioOutput(v)} disabled={saving} />
Normalize volume
Plays every track at roughly the same loudness (−14 LUFS, like Spotify), so quiet and loud masters stop needing the volume knob. A track is measured while it first streams and matched exactly from then on; until that finishes SoulStream will turn it down but never up, so a quiet intro can't make the chorus too loud.
Changes apply immediately and keep the current track near the same position.
Lyrics
Line sync is always on; word fill is the experiment.
Word-by-word fill experimental
Fills each word as it is sung, karaoke-style. Still experimental: timing can drift on dense or echo-heavy songs. Off keeps the reliable line-by-line sync everywhere and pauses the background word analysis.
Downloads an alignment model (MMS, ~1.26 GB, from Hugging Face) that listens to each lyric line and times every word against the actual singing, in most languages. Runs entirely on this computer, in the background, never against the playing track. Without it, word timing stays a lighter estimate. Already-timed songs re-prepare automatically the next time you open their lyrics.
Downloads a small separation model (UVR MDX-Net Voc FT, ~64 MB, from the Ultimate Vocal Remover project) that lifts the singing away from the band before words are timed — noticeably steadier timing on dense mixes. Same rules as above: runs on this computer, in the background, never against the playing track.
{#if sepError}
Download failed: {sepError}
{/if}
{#if sepModel?.present}
Downloaded
{:else}
{/if}
{/if}
{/if}
Streaming
What happens to a track after you streamed it.
Keep streamed tracks
Streamed songs stay in a private cache for instant replay — not in your library. Forever adds everything you stream to the library instead.
setStreamRetention(v)} disabled={saving} />
Cache size limit
Oldest streamed tracks are removed first once the cache passes this size. Saved and downloaded music is never touched.
setStreamCacheMax(v)} disabled={saving} />
Retention counts from the last time a track was played. Tracks you save stay in your library regardless.
Library & downloads
Where music lands and how it is filed.
Library folder
{settings.download_dir}
Your downloaded-music library, always shared. Folder changes apply after reconnecting.
Album folder format
Use {"{artist}"}, {"{album}"}, {"{date}"} or {"{year}"}; "\" starts a subfolder. Full dates display as DD-MM-YYYY. New downloads are organized into this format; existing files are not moved.
Sharing keeps you a good citizen — leechers get banned.
Shared folders
Your library folder is always shared ({fmtCount(settings.share_files)} files indexed). Add extra folders here.
{#if settings.shared_folders.length > 0}
{#each settings.shared_folders as folder (folder)}
{folder}
{/each}
{/if}
Upload slots
How many peers can download from you at once.
{settings.upload_slots}
Source quality
Independent preferences for streaming and downloading.
The ceiling and floor bound which peer files qualify; priority decides whether the resolver picks the best format or the fastest transfer among them. Fastest estimates arrival from file size ÷ peer speed plus queue wait — a large FLAC from a fast peer can win.
Upgrade every library album to the canonical high-resolution cover — cache, embedded tags and folder files. Roughly one album per second.
{#if albumRefreshResult}
{albumRefreshResult}
{/if}
Artist artwork
Portraits and the hero renderer.
Hero renderer
Live GPU creates one native-4K master (crop → EASU → RCAS → color/fade/grain once at 3840×2160), then mip-filters it cleanly for every window size, preserving grain scale.