From 509c4c5ee4b7f3775210e1aa29a8990ec3d5fa66 Mon Sep 17 00:00:00 2001 From: InstaZDLL Date: Mon, 2 Nov 2026 06:02:39 +0100 Subject: [PATCH 1/4] chore(release): prepare 2.1.0-rc.1 The release workflow refuses a tag that disagrees with Cargo.toml, so a release candidate needs its own version and its own line in RELEASED_SCHEMAS. It is the first tag to run the archives and their signing for real, which is why it comes before the stable one. The notes of 2.1.0 are written now so they can be read against what the candidate does. The changelog stays under Unreleased, and the README and the compose files stay on 2.0.1, until the stable bump: no 2.1.0 image exists yet to point them at. Signed-off-by: InstaZDLL --- Cargo.lock | 2 +- Cargo.toml | 2 +- docs/README.md | 5 +++-- docs/releases/v2.1.0.md | 47 ++++++++++++++++++++++++++++++++++++++++ tests/migrations/main.rs | 3 ++- 5 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 docs/releases/v2.1.0.md diff --git a/Cargo.lock b/Cargo.lock index 2c8f2002..068a39f5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3735,7 +3735,7 @@ dependencies = [ [[package]] name = "waveflow-server" -version = "2.0.1" +version = "2.1.0-rc.1" dependencies = [ "anyhow", "argon2", diff --git a/Cargo.toml b/Cargo.toml index 909b1547..e8780201 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "waveflow-server" -version = "2.0.1" +version = "2.1.0-rc.1" description = "Self-hosted music server with WaveFlow and Subsonic compatibility." authors = ["InstaZDLL "] edition = "2021" diff --git a/docs/README.md b/docs/README.md index aaba9cd0..d1d0f3bd 100644 --- a/docs/README.md +++ b/docs/README.md @@ -72,8 +72,9 @@ revision of its survey, and a status line saying what has happened since. The notes published with each stable release, one per tag, in [`releases/`](releases/): [2.0.0](releases/v2.0.0.md) and -[2.0.1](releases/v2.0.1.md). The release workflow refuses a stable tag that has -none. Every change, release by release, is in the [CHANGELOG](../CHANGELOG.md). +[2.0.1](releases/v2.0.1.md), and those of [2.1.0](releases/v2.1.0.md), written +ahead of its tag. The release workflow refuses a stable tag that has none. Every +change, release by release, is in the [CHANGELOG](../CHANGELOG.md). The screenshots the README shows are in [`screenshots/`](screenshots/). ## History diff --git a/docs/releases/v2.1.0.md b/docs/releases/v2.1.0.md new file mode 100644 index 00000000..b6eacc59 --- /dev/null +++ b/docs/releases/v2.1.0.md @@ -0,0 +1,47 @@ +# WaveFlow Server 2.1.0 + +The server now runs on one computer without Docker: extract an archive and start it. An account can say once what an app that does not ask should get. The web client comes in seven more languages. The image moves to Debian 13, and **its first boot measures every lossless file again**, so read [Upgrading](#upgrading-from-201) before you pull. + +## New + +- **An archive for each system, with nothing to install.** Each release now carries one for Windows, for macOS (Apple silicon and Intel) and for Linux (x86_64 and arm64). It holds the server, its own FFmpeg, a `laptop.env` of settings, the licences and a `README.txt` to read first. On a first start the browser opens by itself on the sign-in screen; on Windows and macOS, unless the server listens on a wildcard address, the setup token is already filled in. `SHA256SUMS` covers every archive. + + The Windows executables carry a self-signed certificate and the macOS ones an ad-hoc signature. A file changed after signing no longer matches its signature, but neither system trusts these signatures, so both still warn on the first launch. The `README.txt` says what to click past. +- **Transcoding profiles.** In Settings › Playback, or through `/api/v2/transcoding-profiles`, an account sets a format and a bit rate for apps that do not ask, as a default and per Subsonic client name. A request naming a format or a bit rate is answered as before, and so is every request of an account with no profile. The web player, downloads and public shares keep the original. + + Two limits come with it. A transcode past the server's limits is refused with `429` rather than falling back to the original: 2 per account and 4 in all by default, set by `WAVEFLOW_TRANSCODE_PER_USER_LIMIT` and `WAVEFLOW_TRANSCODE_GLOBAL_LIMIT`. And an app that seeks by byte range may fail to seek in a transcode still being encoded; a row of Original for that app puts it right. +- **Seven more languages in the web client**: German, Spanish, Italian, Japanese, Korean, and Simplified and Traditional Chinese, beside English and French. Settings › Language offers each, and a browser set to one opens in it. None of the seven has had a native speaker's review yet. +- **An open tab follows the library.** What a scan, an upload from another device or a tag correction changed appears without a reload. +- **The transcoding state in the administration**: whether the server can transcode, the transcodes running against the limits, and the output formats. +- **`waveflow-server health`** asks `/ready` at `WAVEFLOW_BIND` and exits 0 on its readiness answer, or prints one line and exits 1. + +## Changed + +- **The image runs on Debian 13 (trixie)** instead of Debian 12, and its FFmpeg goes from 5.1 to 7.1. +- **curl has left the image.** Its `HEALTHCHECK` now runs `waveflow-server health`. + +## For client authors + +The native API only gains: `/api/v2/transcoding-profiles`, and `events_cursor` on each library in `GET /api/v2/libraries`, the point a client that has just read the catalogue starts following the change feed from. The Subsonic façade answers as it did for an account with no profile. Under a profile, a `stream` or a native stream that names neither a format nor a bit rate may now be transcoded, a source at or under the bit rate excepted. + +## Install + +```bash +docker run -d --name waveflow \ + -p 4533:4533 \ + -v waveflow-data:/data \ + -v /path/to/music:/music:ro \ + ghcr.io/instazdll/waveflow-server:2.1.0 +``` + +The image runs on `linux/amd64` and `linux/arm64`, and is the same, digest for digest, on Docker Hub as `instazdll/waveflow-server:2.1.0`. `latest` now follows this release. + +## Upgrading from 2.0.1 + +Pull `2.1.0` and start it on the same data volume. Three things differ from the last upgrade. + +- **The first boot of the image measures every lossless file again.** A quality measurement is current only for the FFmpeg that took it, so the boot deletes them all and the background analysis takes each file anew, one at a time by default and never during a scan. On a large library that is hours of one core, and each file reads `pending` until its turn comes. `WAVEFLOW_QUALITY_PARALLELISM` paces it: raise it to finish sooner, or set it to `0` to hold the analysis off until a quieter moment. +- **The database schema changes, so going back takes a restore.** `2.0.1` refuses to start on a database `2.1.0` has opened. The boot first copies the database and its key into `pre-migration-/` in the data directory, and [`waveflow-server database restore`](https://github.com/InstaZDLL/waveflow-server/blob/v2.1.0/docs/guides/operations.md#a-copy-before-every-upgrade) takes that copy back, without anything that changed since. +- **A healthcheck of your own that calls curl now fails**, because curl is no longer in the image. Remove it to use the image's own, or call `waveflow-server health`. + +**Full changelog**: [CHANGELOG.md](https://github.com/InstaZDLL/waveflow-server/blob/v2.1.0/CHANGELOG.md) · https://github.com/InstaZDLL/waveflow-server/compare/v2.0.1...v2.1.0 diff --git a/tests/migrations/main.rs b/tests/migrations/main.rs index 5e14f0be..3f39f27b 100644 --- a/tests/migrations/main.rs +++ b/tests/migrations/main.rs @@ -45,11 +45,12 @@ use waveflow_server::Config; /// `the_version_being_shipped_has_its_schema_recorded` now holds it: the PR /// that bumps `version` in `Cargo.toml` for a release fails until it adds that /// tag here, with the newest migration of that moment as its baseline. -const RELEASED_SCHEMAS: [(&str, i64); 4] = [ +const RELEASED_SCHEMAS: [(&str, i64); 5] = [ ("v2.0.0-beta.0", 20_260_823_020_000), ("v2.0.0-beta.1", 20_260_914_030_000), ("v2.0.0", 20_261_028_000_000), ("v2.0.1", 20_261_028_000_000), + ("v2.1.0-rc.1", 20_261_102_000_000), ]; /// The identifiers the fixture below writes and the assertions read back. From 4ca5f969b8d537f4154ad33dd0b5bba947c36339 Mon Sep 17 00:00:00 2001 From: InstaZDLL Date: Mon, 2 Nov 2026 06:08:50 +0100 Subject: [PATCH 2/4] docs(release): say which boot measures again and what a way back requires Signed-off-by: InstaZDLL --- docs/releases/v2.1.0.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/releases/v2.1.0.md b/docs/releases/v2.1.0.md index b6eacc59..cc81d705 100644 --- a/docs/releases/v2.1.0.md +++ b/docs/releases/v2.1.0.md @@ -1,6 +1,6 @@ # WaveFlow Server 2.1.0 -The server now runs on one computer without Docker: extract an archive and start it. An account can say once what an app that does not ask should get. The web client comes in seven more languages. The image moves to Debian 13, and **its first boot measures every lossless file again**, so read [Upgrading](#upgrading-from-201) before you pull. +The server now runs on one computer without Docker: extract an archive and start it. An account can say once what an app that does not ask should get. The web client comes in seven more languages. The image moves to Debian 13, and **its first boot after upgrading measures every lossless file again**, so read [Upgrading](#upgrading-from-201) before you pull. ## New @@ -41,7 +41,7 @@ The image runs on `linux/amd64` and `linux/arm64`, and is the same, digest for d Pull `2.1.0` and start it on the same data volume. Three things differ from the last upgrade. - **The first boot of the image measures every lossless file again.** A quality measurement is current only for the FFmpeg that took it, so the boot deletes them all and the background analysis takes each file anew, one at a time by default and never during a scan. On a large library that is hours of one core, and each file reads `pending` until its turn comes. `WAVEFLOW_QUALITY_PARALLELISM` paces it: raise it to finish sooner, or set it to `0` to hold the analysis off until a quieter moment. -- **The database schema changes, so going back takes a restore.** `2.0.1` refuses to start on a database `2.1.0` has opened. The boot first copies the database and its key into `pre-migration-/` in the data directory, and [`waveflow-server database restore`](https://github.com/InstaZDLL/waveflow-server/blob/v2.1.0/docs/guides/operations.md#a-copy-before-every-upgrade) takes that copy back, without anything that changed since. +- **The database schema changes, so going back requires a restore.** `2.0.1` refuses to start on a database `2.1.0` has migrated. The boot first copies the database and its key into `pre-migration-/` in the data directory, and [`waveflow-server database restore`](https://github.com/InstaZDLL/waveflow-server/blob/v2.1.0/docs/guides/operations.md#a-copy-before-every-upgrade) takes that copy back, without anything that changed since. - **A healthcheck of your own that calls curl now fails**, because curl is no longer in the image. Remove it to use the image's own, or call `waveflow-server health`. **Full changelog**: [CHANGELOG.md](https://github.com/InstaZDLL/waveflow-server/blob/v2.1.0/CHANGELOG.md) · https://github.com/InstaZDLL/waveflow-server/compare/v2.0.1...v2.1.0 From 3df0907d53364961520267c2ddccba53eaf8e425 Mon Sep 17 00:00:00 2001 From: InstaZDLL Date: Mon, 2 Nov 2026 06:19:31 +0100 Subject: [PATCH 3/4] docs(release): say the way back when the boot takes no copy Signed-off-by: InstaZDLL --- docs/releases/v2.1.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releases/v2.1.0.md b/docs/releases/v2.1.0.md index cc81d705..d3a84dfe 100644 --- a/docs/releases/v2.1.0.md +++ b/docs/releases/v2.1.0.md @@ -41,7 +41,7 @@ The image runs on `linux/amd64` and `linux/arm64`, and is the same, digest for d Pull `2.1.0` and start it on the same data volume. Three things differ from the last upgrade. - **The first boot of the image measures every lossless file again.** A quality measurement is current only for the FFmpeg that took it, so the boot deletes them all and the background analysis takes each file anew, one at a time by default and never during a scan. On a large library that is hours of one core, and each file reads `pending` until its turn comes. `WAVEFLOW_QUALITY_PARALLELISM` paces it: raise it to finish sooner, or set it to `0` to hold the analysis off until a quieter moment. -- **The database schema changes, so going back requires a restore.** `2.0.1` refuses to start on a database `2.1.0` has migrated. The boot first copies the database and its key into `pre-migration-/` in the data directory, and [`waveflow-server database restore`](https://github.com/InstaZDLL/waveflow-server/blob/v2.1.0/docs/guides/operations.md#a-copy-before-every-upgrade) takes that copy back, without anything that changed since. +- **The database schema changes, so going back requires a restore.** `2.0.1` refuses to start on a database `2.1.0` has migrated. The boot first copies the database and its key into `pre-migration-/` in the data directory, and [`waveflow-server database restore`](https://github.com/InstaZDLL/waveflow-server/blob/v2.1.0/docs/guides/operations.md#a-copy-before-every-upgrade) takes that copy back, without anything that changed since. With `WAVEFLOW_MIGRATION_BACKUPS=0` the boot takes no copy, and the way back is a backup of your own. - **A healthcheck of your own that calls curl now fails**, because curl is no longer in the image. Remove it to use the image's own, or call `waveflow-server health`. **Full changelog**: [CHANGELOG.md](https://github.com/InstaZDLL/waveflow-server/blob/v2.1.0/CHANGELOG.md) · https://github.com/InstaZDLL/waveflow-server/compare/v2.0.1...v2.1.0 From 3c66e2c41a0150c6ba8d09dd1bc2b688d34e805f Mon Sep 17 00:00:00 2001 From: InstaZDLL Date: Mon, 2 Nov 2026 06:27:34 +0100 Subject: [PATCH 4/4] docs(release): say what a restore puts back and what it leaves Signed-off-by: InstaZDLL --- docs/releases/v2.1.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releases/v2.1.0.md b/docs/releases/v2.1.0.md index d3a84dfe..48acade4 100644 --- a/docs/releases/v2.1.0.md +++ b/docs/releases/v2.1.0.md @@ -41,7 +41,7 @@ The image runs on `linux/amd64` and `linux/arm64`, and is the same, digest for d Pull `2.1.0` and start it on the same data volume. Three things differ from the last upgrade. - **The first boot of the image measures every lossless file again.** A quality measurement is current only for the FFmpeg that took it, so the boot deletes them all and the background analysis takes each file anew, one at a time by default and never during a scan. On a large library that is hours of one core, and each file reads `pending` until its turn comes. `WAVEFLOW_QUALITY_PARALLELISM` paces it: raise it to finish sooner, or set it to `0` to hold the analysis off until a quieter moment. -- **The database schema changes, so going back requires a restore.** `2.0.1` refuses to start on a database `2.1.0` has migrated. The boot first copies the database and its key into `pre-migration-/` in the data directory, and [`waveflow-server database restore`](https://github.com/InstaZDLL/waveflow-server/blob/v2.1.0/docs/guides/operations.md#a-copy-before-every-upgrade) takes that copy back, without anything that changed since. With `WAVEFLOW_MIGRATION_BACKUPS=0` the boot takes no copy, and the way back is a backup of your own. +- **The database schema changes, so going back requires a restore.** `2.0.1` refuses to start on a database `2.1.0` has migrated. The boot first copies the database and its key into `pre-migration-/` in the data directory, and [`waveflow-server database restore`](https://github.com/InstaZDLL/waveflow-server/blob/v2.1.0/docs/guides/operations.md#a-copy-before-every-upgrade) puts that copy back, without anything the database gained since, and leaves the rest of the data directory as it is. With `WAVEFLOW_MIGRATION_BACKUPS=0` the boot takes no copy, and the way back is a backup of your own. - **A healthcheck of your own that calls curl now fails**, because curl is no longer in the image. Remove it to use the image's own, or call `waveflow-server health`. **Full changelog**: [CHANGELOG.md](https://github.com/InstaZDLL/waveflow-server/blob/v2.1.0/CHANGELOG.md) · https://github.com/InstaZDLL/waveflow-server/compare/v2.0.1...v2.1.0