Settings

{#if !settings}

Loading…

{:else}

Account

Soulseek account
{settings.username ? `Signed in as ${settings.username}` : "Not signed in"} {#if settings.connected} · online{/if}
{#if app.connection !== "online"} {/if} {#if settings.has_password} {/if}

Your password is stored in the Windows Credential Manager, not in a plain file.

Playback

Audio output
System default follows Windows when headphones or speakers change.
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.

Streaming

Keep streamed tracks
Streamed songs stay in a private cache for instant replay — not in your library. Choose Forever to add everything you stream to the library instead.
Cache size limit
Oldest streamed tracks are removed first once the cache passes this size. Saved and downloaded music is never touched.

Retention counts from the last time a track was played. Tracks you save stay in your library regardless.

Library & downloads

Library folder
{settings.download_dir}

This is your downloaded-music library and is 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.
e.key === "Enter" && e.currentTarget.blur()} onchange={(e) => setLibraryLayout(e.currentTarget.value)} />

New downloads are organized into this format; existing files are not moved.

Sharing

Sharing keeps you a good citizen — leechers get banned. Your download folder is always shared ({settings.share_files} files indexed). Add extra folders below.

{#if settings.shared_folders.length > 0}
{#each settings.shared_folders as folder (folder)}
{folder}
{/each}
{/if}

Album artwork

Covers are resolved from Deezer, Apple, and the Cover Art Archive; the artwork shown in the catalog wins, at the highest resolution any source serves. One canonical image is used for the library, the embedded tags, and the album folder.

Art inside downloaded files
Replace whatever picture the uploader embedded with the canonical cover, or keep theirs when present.
Embedded cover size
Longest edge of the copy written into each audio file. The full-resolution original is always kept in the album folder and art cache.
Album folder cover
Write the canonical cover as cover.jpg and folder.jpg so Explorer and other players show the same artwork.
Re-fetch all album covers
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

Hero renderer
Live GPU creates one native-4K master, then mip-filters it cleanly for every window size.

Live GPU applies crop ? EASU ? RCAS ? color/fade/grain once at 3840?2160. Resizing only re-samples that fixed master, preserving grain scale and avoiding baked-file latency.

Refresh artist portraits
Fetch portraits for artists already in your library.
{#if artistRefreshResult}

{artistRefreshResult}

{/if}

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.

{#each [ { key: "stream", label: "Streaming" }, { key: "download", label: "Downloads" }, ] as mode (mode.key)}
{mode.label} — maximum
Skip files above this ceiling (lossy-only avoids huge lossless transfers).
{mode.label} — minimum
Reject files below this floor. Lossy files must report a bitrate to qualify.
{mode.label} — priority
Fastest transfer estimates arrival time from file size ÷ peer speed (plus queue wait) and picks whatever lands soonest — a large FLAC from a fast peer can win. Only files inside your min/max window compete.
{/each}

Uploads

Upload slots
How many peers can download from you at once.
{settings.upload_slots}
{#if saving}

Saving…

{:else if savedFlash}

✓ Saved

{:else if saveError}

{saveError}

{/if} {/if}