Skip to content

slskd

v0.26.0 Breaking

This release includes 1 breaking change for platform teams planning a safe upgrade.

Published 7d File Storage & Sync
✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →

✓ No known CVEs patched in this version

Topics

soulseek soulseek-network soulseek-web

Affected surfaces

breaking_upgrade

ReleasePort's take

Moderate signal
editorial:auto 7d

The configuration schema changes move `permissions.file.mode` to `transfers.download.destination.permissions.mode`. New features include automatic download retries with exponential backoff, expression support for completed download destination directories, a Dashboard default landing page, and a redesigned Browse UI.

Why it matters: Configuration updates require refactoring any code referencing the old permission path; retry logic improves reliability of flaky downloads. Severity score 70 signals high impact on deployment configurations.

Summary

AI summary

Updates feat, again, and fix across a mixed release.

Changes in this release

Breaking High

Moves `permissions.file.mode` to `transfers.download.destination.permissions.mode`.

Moves `permissions.file.mode` to `transfers.download.destination.permissions.mode`.

Source: llm_adapter@2026-07-19

Confidence: high

Feature Medium

Adds automatic retry for failed downloads with exponential backoff.

Adds automatic retry for failed downloads with exponential backoff.

Source: llm_adapter@2026-07-19

Confidence: high

Feature Medium

Allows specifying expression for completed download destination directory.

Allows specifying expression for completed download destination directory.

Source: llm_adapter@2026-07-19

Confidence: high

Feature Medium

Introduces a Dashboard view as the default landing page.

Introduces a Dashboard view as the default landing page.

Source: llm_adapter@2026-07-19

Confidence: high

Feature Medium

Redesigns Browse screen with virtualized directory tree and new interactions.

Redesigns Browse screen with virtualized directory tree and new interactions.

Source: llm_adapter@2026-07-19

Confidence: high

Dependency Low

Bumps Soulseek.NET dependency to version 10.0.2.

Bumps Soulseek.NET dependency to version 10.0.2.

Source: llm_adapter@2026-07-19

Confidence: high

Bugfix Medium

Fixes bug preventing users from initiating a chat.

Fixes bug preventing users from initiating a chat.

Source: llm_adapter@2026-07-19

Confidence: high

Bugfix Medium

Fixes bug handling incomplete filenames during download.

Fixes bug handling incomplete filenames during download.

Source: llm_adapter@2026-07-19

Confidence: high

Bugfix Medium

Fixes digesting share aliases when path contains closing square bracket (]).

Fixes digesting share aliases when path contains closing square bracket (]).

Source: llm_adapter@2026-07-19

Confidence: high

Bugfix Low

Sets Cache-Control: no-cache on index.html responses.

Sets Cache-Control: no-cache on index.html responses.

Source: llm_adapter@2026-07-19

Confidence: high

Full changelog

🎉 Another Big Release!

This release contains improvements to the user interface, failed download retries, and gives users the ability to control where completed downloads go on disk.

There's also one breaking change in the configuration for file permissions.

Dashboard Screen and Footer

The default landing page is now a dashboard that displays various statistics:

Users can select the time range and can click the legend under the chart to show or hide common data series. The Users tab shows users with the highest transfer count, size or speed, depending on how sorting is applied, and the Content tab shows the most commonly downloaded directories. The Errors tab displays detailed error information.

Also shown in the screenshot above is a new footer that appears on every screen and that displays real-time upload and download speeds, number of active transfers, and the size of each queue.

Browse Screen Improvements

The Browse screen has been redesigned to improve the functionality and performance:

The directory tree now uses virtualization to improve the performance, enabling larger shares to be displayed and interacted with than before. Directories can now be expanded and collapsed by clicking the folder icon to the left of directory names, and the number of files and subdirectories contained in each directory are now shown. The directory tree can now also be resized vertically by clicking and dragging the three-dot button at the bottom.

The filter above the directory tree can be used to show matching directories (regardless of how deeply nested). The buttons to the right can be used to expand or contract all directories, and the rightmost button expands the tree to reveal the currently selected directory and scrolls it into view.

The file selector now shows subdirectories in addition to files, and subdirectories can be expanded one level to show the files within. Subdirectories can be selected to include all of the files (regardless of subdirectory depth) in the file selection, effectively allowing recursive downloading of directories. Clicking the arrow icon to the far right of the directory name navigates the directory tree to that directory, allowing further review of the contents.

As the screenshot shows, this has been tested and is working well with 1,000,000 files and 100,000 directories. I'm not sure what the practical limit is, but the issues described in issue #317 are still mostly accurate; there are still users which can't be browsed, but limitations exist for all Soulseek clients at various levels.

Failed Download Retries

Failed downloads can be retried automatically up to the configured number of attempts. If an attempt fails initially, the application delays the second attempt by the configured delay, and an exponential backoff is used to compute the delay for all subsequent events, up to the configured maximum delay.

By default, partial downloads are resumed based on the size of the incomplete file. Users can choose to always overwrite files if they wish.

YAML

transfers:
  download:
    retry:
      incomplete: resume # 'overwrite' or 'resume'
      attempts: 3
      delay: 5000 # initial time between retries, in milliseconds
      max_delay: 60000 # maximum time between retries, in milliseconds

Completed Download Location

Users can now specify an expression that slskd will evaluate to determine the destination directory:

transfers:
  download:
    destination:
      subdirectory: ${SOURCE_DIRECTORY} # options: SOURCE_USERNAME, SOURCE_PATH, SOURCE_DIRECTORY, BATCH_ID, BATCH_EXTERNAL_ID, SEARCH_ID, SEARCH_TEXT
      exists: rename # 'overwrite' or 'rename'

The new subdirectory option allows users to specify an expression containing special, fixed values that are replaced at run-time when slskd determines where to place a newly downloaded file.

The syntax is simply:

<any string, or nothing>${<token>}<any other string, or nothing>

For example:

music/${SOURCE_USERNAME}/directories/${SOURCE_PATH}

Will expand to the following for a download of @@abcde/foo/bar/baz/qux.ext from user Bob:

music/Bob/directories/@@abcde/foo/bar/baz

The value for token is some value related to the transfer, including:

  • SOURCE_USERNAME: The username of the user the file was downloaded from
  • SOURCE_PATH: The complete path to the directory on the source user's system
  • SOURCE_DIRECTORY: The directory on the source user's system that contains the file; the immediate parent directory
  • BATCH_ID: The ID pf the associated batch, if the file is part of a batch
  • BATCH_EXTERNAL_ID: The external ID included in the associated batches options when created
  • SEARCH_ID: The ID of the search associated with the batch, if one was supplied when the batch was created
  • SEARCH_TEXT: The text/query of the search

This option defaults to ${SOURCE_DIRECTORY}, which matches the current behavior. Users that choose not to set this option shouldn't notice any change.

The new exists option allows users to choose what slskd does when it downloads a file that already exists on disk, either overwrite which overwrites the old file with the new one, or rename, which appends a number to the end of the new file. The current behavior is rename.

Breaking Change

Users who have previously set the permissions.file.mode configuration property, were using the --file-permission-mode command line argument, or had set the SLSKD_FILE_PERMISSION_MODE environment variable will find that this option has been moved, and slskd should refuse to start informing them of this.

To fix this, update the YAML configuration file to set the new transfers.download.destination.permissions.mode key as shown below.

Old:

permissions:
  file:
    mode: 644 # not for Windows, chmod syntax, e.g. 644, 777. can't escalate beyond umask

New:

transfers:
  download:
    destination:
      permissions:
        mode: 644 # chmod syntax, e.g. 644, 777.  has no effect on Windows

What's Changed

  • Add a Dashboard view, make it the default landing page by @jpdillingham in https://github.com/slskd/slskd/pull/1778
  • Allow selection (and downloading) of subdirectories recursively on the Browse screen by @jpdillingham in https://github.com/slskd/slskd/pull/1788
  • Redesign the browse screen by @jpdillingham in https://github.com/slskd/slskd/pull/1789
  • Collect and broadcast real-time transfer metrics, add a footer to the UI to display them by @jpdillingham in https://github.com/slskd/slskd/pull/1769
  • Add transfer retries and batches by @jpdillingham in https://github.com/slskd/slskd/pull/1664
  • Add Transfer Batches by @jpdillingham in https://github.com/slskd/slskd/pull/1720
  • Add options providing granular control over download location by @jpdillingham in https://github.com/slskd/slskd/pull/1746
  • feat: add username reg pattern matching to blacklist group by @ofernander in https://github.com/slskd/slskd/pull/1699
  • Allow blacklisting of username patterns by @jpdillingham in https://github.com/slskd/slskd/pull/1713
  • Map IPv6-mapped IPv4 addresses to IPv4 before checking against Relay CIDR by @jpdillingham in https://github.com/slskd/slskd/pull/1714
  • Add some tools for dealing with file paths by @jpdillingham in https://github.com/slskd/slskd/pull/1727
  • Guard untrusted file paths against traversal attempts (paranoia, not mitigating) by @jpdillingham in https://github.com/slskd/slskd/pull/1729
  • Add or adjust several new validation classes by @jpdillingham in https://github.com/slskd/slskd/pull/1733
  • Fix bug digesting share aliases when path contains closing square bracket (]) by @jpdillingham in https://github.com/slskd/slskd/pull/1734
  • Fix bug handling incomplete filenames by @jpdillingham in https://github.com/slskd/slskd/pull/1737
  • Fix for Issue #1726: strip trailing slashes from relay controller address by @maskedmaxx in https://github.com/slskd/slskd/pull/1735
  • Change path manipulation logic (again) by @jpdillingham in https://github.com/slskd/slskd/pull/1740
  • Rename retry 'incomplete' setting to 'partial', and default the value to 'resume' (to match docs) by @jpdillingham in https://github.com/slskd/slskd/pull/1743
  • Add comprehensive cross-platform path and filename handling functions by @jpdillingham in https://github.com/slskd/slskd/pull/1749
  • Fix bug in default destination subdirectory expression (add missing '$') by @jpdillingham in https://github.com/slskd/slskd/pull/1757
  • Update x509 generation/validation to resolve warnings, deprecate old permissions objects by @jpdillingham in https://github.com/slskd/slskd/pull/1760
  • Fix a chat/room input issue blocking some users from being able to send messages by @jpdillingham in https://github.com/slskd/slskd/pull/1719
  • Adjust room and chat CSS to account for +40px of bottom padding by @jpdillingham in https://github.com/slskd/slskd/pull/1771
  • Fix bug preventing a user from initiating a chat by @jpdillingham in https://github.com/slskd/slskd/pull/1780
  • fix: Set Cache-Control: no-cache on index.html responses by @apkatsikas in https://github.com/slskd/slskd/pull/1786
  • Remove mouseover color on table rows by @jpdillingham in https://github.com/slskd/slskd/pull/1792
  • Remove Docker volume, create app directory in entrypoint script by @jpdillingham in https://github.com/slskd/slskd/pull/1709
  • Change all the scripts in bin/ to be more OS agnostic. by @breakone9r in https://github.com/slskd/slskd/pull/1758
  • [BREAKING] Move 'permissions' options under 'destination', improve application of directory mode by @jpdillingham in https://github.com/slskd/slskd/pull/1756
  • Bump dependencies, including Soulseek.NET to 10.0.2 by @jpdillingham in https://github.com/slskd/slskd/pull/1781
  • Bump dependencies, change Grafana Loki logging format by @jpdillingham in https://github.com/slskd/slskd/pull/1759
  • Bump launch-editor from 2.6.0 to 2.14.1 in /src/web by @dependabot[bot] in https://github.com/slskd/slskd/pull/1751
  • Bump js-yaml from 3.14.2 to 3.15.0 in /src/web by @dependabot[bot] in https://github.com/slskd/slskd/pull/1776
  • Bump form-data in /src/web by @dependabot[bot] in https://github.com/slskd/slskd/pull/1770
  • Bump websocket-driver from 0.7.4 to 0.7.5 in /src/web by @dependabot[bot] in https://github.com/slskd/slskd/pull/1791
  • Bump ws in /src/web by @dependabot[bot] in https://github.com/slskd/slskd/pull/1790
  • Bump follow-redirects from 1.15.11 to 1.16.0 in /src/web by @dependabot[bot] in https://github.com/slskd/slskd/pull/1716
  • Bump axios from 1.15.0 to 1.15.2 in /src/web by @dependabot[bot] in https://github.com/slskd/slskd/pull/1723
  • Bump fast-uri from 3.1.0 to 3.1.2 in /src/web by @dependabot[bot] in https://github.com/slskd/slskd/pull/1724
  • Bump @babel/plugin-transform-modules-systemjs from 7.22.5 to 7.29.4 in /src/web by @dependabot[bot] in https://github.com/slskd/slskd/pull/1725

New Contributors

  • @ofernander made their first contribution in https://github.com/slskd/slskd/pull/1699
  • @maskedmaxx made their first contribution in https://github.com/slskd/slskd/pull/1735
  • @breakone9r made their first contribution in https://github.com/slskd/slskd/pull/1758
  • @apkatsikas made their first contribution in https://github.com/slskd/slskd/pull/1786

Full Changelog: https://github.com/slskd/slskd/compare/0.25.1...0.26.0

Breaking Changes

  • Moved `permissions.file.mode` to `transfers.download.destination.permissions.mode`; old config keys are rejected.

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track slskd

Get notified when new releases ship.

Sign up free

About slskd

A modern client-server application for the Soulseek file sharing network.

All releases →

Related context

Beta — feedback welcome: [email protected]