# Changelog ## 0.9.1-beta.5 – in progress - **Windows client download in the web app:** on a Windows PC the profile menu offers "Download Windows client" – the installer of exactly the server's version from the GitHub release. A one-time hint points to it. - Windows client: "New version – download" now downloads the installer directly instead of opening the release page. - **Amberwave Windows Server (first test build):** the server runs natively on Windows without Docker – a program in the notification area (like Plex) starts the bundled MariaDB, PHP, nginx, ffmpeg and cloudflared. Choose your music folder on the first start, set up in the browser, done. Every build is tested on a Windows machine (setup, scan, streaming, clean shutdown, restart). - Windows server: installer in the Amberwave style (per user, no admin rights, entry under Settings › Apps; uninstall keeps or deletes library data), effects for devices in the home network (`aw-render.exe`), and updates from the notification area: once a day it looks for a newer server installer on GitHub and installs it on request. - **Move to another server** – in any direction between Docker stack, all-in-one and Windows: Settings › Backup › “Create migration package” packs library, accounts, playlists, history, settings, your own reverb files, profile pictures and optionally covers into one file, encrypted with a password you choose. On the new server choose “Take over from another installation” during setup. Stored credentials (mail, API keys) are re-encrypted with the new server's key. - Server code is now platform-neutral (starting programs, background jobs, paths) – Linux behaves exactly as before. - **Android app (first test build):** the Amberwave interface as an app for Android 10 and newer. Saved music lives as files in the app's own storage (Android doesn't clear it, unlike the browser's storage), downloads continue in the background even with the app closed – optionally on Wi-Fi only – and without a network the app starts straight into "On this device". Playback keeps running in the background with notification, lock screen, headphone/Bluetooth buttons, and pauses for calls or when headphones are unplugged. Updates come from GitHub on request. "Download file" in the track menu saves the actual file to Music/Amberwave (only where downloads are allowed). Every build is tested in an Android emulator (connect, sign in, save offline, play, start without network). - **Offline quality per device:** the admin sets the highest quality devices may save (Settings › Offline on devices: off, Opus 128/160/256 or original); each device picks its own quality up to that limit under Settings › Playback. Original (lossless) is available in the Android app; tracks already saved can be re-downloaded in the new quality. - "Allow file downloads for all accounts" is now a switch in the same place (before only `DOWNLOADS_ERLAUBT` in `.env`, which still works as the default). - In a browser on Android the profile menu offers the Android app matching the server's version. ## 0.9.1-beta.4 – all-in-one image - **All-in-one image** `ghcr.io/lfrank95/amberwave-aio`: Amberwave, MariaDB 11.8 LTS and cloudflared in one container – for the Unraid store and everybody who doesn't want a Compose stack. One `/appdata` folder for database, covers and backups. The database runs as your PUID/PGID (files are not owned by root), listens only inside the container, and shuts down cleanly when the container stops. Optionally the admin account comes from the template (`ADMIN_BENUTZER`, `ADMIN_PASSWORT`), otherwise the setup page asks as before. The remote access tunnel starts by itself once set up in the app. Every release builds and tests both images; the all-in-one image is rebuilt monthly for security updates. - **Setup assistant after the first login** when the admin account came from the template: region, folder check (including whether Amberwave may write to your music), server name and the first scan – skippable with "Later". It can be opened again any time under Settings › Region. - Unraid template and Community Applications profile in the repository (`templates/`, `ca_profile.xml`). - The Compose variant is unchanged. - Setup: fixed a session mix-up between the setup page and the login that could make the last setup step fail with "Security check failed" (found by the new automated test). - Windows client: only the version number changed (no update notice for a release without a new installer). ## 0.9.1-beta.3 – effects - **Saturation focus** for AmberGlow, AmberIron and AmberSilk: a small button next to HQ and Δ opens a curve with five points (low shelf, three bells, high shelf) over the live spectrum. Raise a point and the effect saturates more there – an EQ in front of the effect, the exact opposite behind it, so the tone stays neutral and only the distortion moves. "De-emphasis" 0–100 % sets how much of the boost is taken back (less = part of the boost stays, like an enhancer). - **Drive up to 150 %** on all three effects, to overdo it on purpose (automatic level compensation stays on). - **AmberSilk: no more aliasing at high frequencies.** The tape curve now always runs at 8× oversampling (4× from 88.2 kHz, 192 kHz included). Worst case (7.5 ips, high drive, loud treble) improved from −46 dB to −71 dB, typical settings are below −90 dB; at 192 kHz the audible-band aliasing went from −48 dB to −101 dB. Frequency response unchanged (±0.05 dB). Costs about 4 % more CPU of one core at 44.1 kHz. - AmberSilk: the slow-signal path of the tape curve uses the exact function (a tiny −70 dB step at heavy saturation is gone). - **Browser effects now run as WebAssembly** – the same C code as the Windows client instead of a separate JavaScript copy (tested sample by sample: −170 dB difference). Silk 2× and Iron 1.6× faster in the browser. Browsers without WebAssembly fall back to the old JavaScript version (without the new features). Security test (two independent testers attacking the app: anonymous from the internet, and as a normal family member): no way in, no admin rights for normal users, no access to other users' data. Fixed what they found: - **Password reset and all notification mails were broken** (registration notice, approval, extension, expiry): a missing helper made them crash – and that crash revealed which email addresses have an account. Mails now go out in the recipient's language, and the reset page answers equally fast for known and unknown addresses. - **Login lockout of real users:** many failed logins against one name used to block everybody with that name for 5 minutes, including the real owner. Now the owner keeps logging in from addresses that logged in successfully before. - The login no longer reveals through its response time whether a user name exists. - Internal folders (`bin`, `klang`, `i18n`) are no longer downloadable. - Device settings have a size limit per device. - **Reverse proxy confirmation:** if requests arrive from a private address with a forwarded client address, the admin overview asks once whether that is your reverse proxy. "Yes" trusts only that proxy, "No" ignores forwarded addresses from private senders – nobody can fake their address to get around the login lockout any more. - **Setup from the home network without a code again:** the setup page recognises the home network more reliably (private addresses and IPv6 addresses from the server's own network) and asks for the code only via a proxy, tunnel, the Docker bridge or the internet – and says why. `EINRICHTUNG_CODE_IMMER=1` brings back "always ask". - **Own reverb files (impulse responses):** a normal user can no longer overwrite someone else's file with the same name (the new one gets "(2)"); admins can still replace. Uploads must be real WAV files (format and data sections). Downloads with Tidarr (and other SABnzbd look-alikes) – tested end to end against an emulated Tidarr, checked by two independent reviewers: - **Albums are no longer named after the Tidal ID:** a download folder called like the job ID gets the album title instead. - **Files still being written are not copied half-finished:** import waits until nothing changed for 30 seconds (Tidarr writes ReplayGain tags after reporting "completed"); files with timestamps in the future don't block it. - **Imports are atomic:** files are copied into a hidden folder first and moved into place in one step – a restart in the middle leaves no half album in the library (leftovers are cleaned up after 6 hours). - **Jobs waiting behind others are no longer cancelled** after 30 minutes as long as the queue moves (Tidarr reports no speed) – at most 24 hours. - Lower-case status, missing storage path, "completed" still in the queue, and jobs that vanish after a Tidarr restart while the files are there are all handled; a folder is never taken over by two jobs, and an old kept folder with the same name is not imported again. - Search: the four quality variants of an album are all listed (hi-res first), AAC/M4A is recognised, `.lrc` lyrics are copied along; "320k" is detected as 320 kbit/s and "Live '96" is no longer read as a bitrate. ## 0.9.1-beta.2 – large libraries Load test with a synthetic library (20,000 real files scanned, database multiplied to 100,000 tracks) on a real MariaDB 11.4, plus independent reviews of the code and the migration system. Result: with MariaDB, Amberwave was already fast at 100,000 tracks – lists, album pages and search answer in 10–200 ms. This release fixes the weak spots that showed up anyway and makes updates of big databases safe. - **Typo search** (only used when the normal search finds nothing) has a time budget: 2.1 s → 1.2 s at 100,000 tracks. - **Artist pages** of artists with many albums: 0.18 s → 0.07 s (roles and collaborators are looked up from the artist). - Album and artist lists, album pages: queries rewritten without per-row subqueries (same results, verified row by row) – this matters for databases that optimise less well than MariaDB. - Going back to a list where you clicked "Load more" several times reloads it in **one request** instead of page by page. - **Fewer background database writes:** technical updates (loudness, genres, popularity, artwork lookups) no longer mark albums as changed, genre families are only recalculated when something changed, the sound-analysis index is rebuilt far less often, and the scanner skips clean-up passes when nothing changed. - Remote control: devices are woken by a small signal file instead of polling the database several times a second. - Streaming closes its database connection before sending audio; the session lock is released early on read requests. - PHP OPcache enabled in the Docker image; the schema check runs once per start instead of on every request. - Player: the queue is saved less often and in a bounded window (very long queues no longer write megabytes on every track change). - New indexes for large libraries (best file per track, play counts). - Fixed: removing a track from a playlist could also remove it from a playlist you had opened earlier. - Fixed: hidden admin panels kept refreshing at full speed in the background. - `DB_PUFFER` (optional) sets the MariaDB buffer pool size in the compose files (default 512M). Updates on big databases (from an independent review of the migration system): - **Database updates run at container start**, before the web server – no longer inside the first page request, where time and memory limits could kill the pre-update backup on large libraries. - **No parallel migrations:** if another process is still updating, others wait instead of starting the same changes a second time; the page shows "Update in progress" and reloads by itself. - **The clean pre-update backup is kept:** exactly one backup per old schema version. A failed update no longer retries on every request (2-minute pause, clear message) and can't rotate that backup away. - The backup streams rows instead of loading whole tables into memory (test with 100,000 tracks: about 1 MB of PHP memory). - Schema changes give up after 20 s if a table is busy (e.g. a running scan) instead of blocking everything. - Redundant indexes removed (less work for every scan); the scanner reads only the columns it needs. - New manual GitHub workflow "Load test": real MariaDB, synthetic library, scan, 100,000 tracks, API timings. Windows client: - **Large tracks no longer fill the RAM:** a track bigger than 48 MB (hi-res, long classical works) is buffered in a temporary file instead of memory; the file is deleted automatically. Playback stays gapless and bit-perfect. ## 0.9.1-beta.1 – first public beta - **Fresh installs without `APP_SECRET_KEY` work fully:** the key Amberwave generates and keeps in the app-data folder is now treated as permanent – saving mail passwords and API keys is no longer blocked, and the red warning on the admin overview only appears if that folder isn't writable. - **Automatic database backup before updates** done by pulling a new image (shown as "Before update" under Backup & update, last three kept). Tested: upgrade from 0.2.100 to this version keeps all data; backup and restore round-trip, including restoring the pre-update backup and migrating again. - **No installation ID any more:** requests to MusicBrainz & co. only carry name, version and the project address. - VST3 support in the Windows client is marked **experimental**. - Player bar: on screens 1024–1700 px wide the stop button and the quality chip no longer overlap. - Security log shows readable event names; remaining German strings (album "No album", log details) translated. - Settings → System hides the downloads folder while Usenet downloads are off. - README: screenshots (demo library), Synology guide, FAQ, known limitations, roadmap. - **New custom-designed Windows installer** in the Amberwave look: frameless dark window with its own title bar, Space Grotesk/Manrope type, animated logo on the welcome page, the waveform doubles as the progress bar, in-window confirmations instead of Windows message boxes. Follows the Windows display language (German/English) and scales with the display (per-monitor DPI). - **License page in German and English:** the full AGPL-3.0 text plus an unofficial German translation (clearly marked; the English original stays legally binding), switchable on the page. - `LICENSE` now contains the complete AGPL-3.0 text. ## 0.9.0-beta.3 - **Windows installer is now a real setup wizard** with the Amberwave icon and artwork: Welcome → License (AGPL-3.0 and third-party notices, must be accepted) → Location and options (folder can be changed, Start menu entry, optional desktop shortcut, required space) → Install → Finish ("Start Amberwave now"). Detects an existing installation and updates it in place; refuses to replace a non-empty folder that isn't Amberwave. `/portabel` uses the same wizard and only unpacks. - Program icon stored with classic bitmaps for small sizes, so Explorer and the taskbar show it everywhere. - The uninstaller also removes the desktop shortcut. ## 0.9.0-beta.2 Security review before the public beta (an independent review of all internet-facing parts; no critical issues): - **Login lockout can no longer be triggered by strangers.** Failed logins lock per account *and* client IP; a name-wide limit (20 per hour) only applies to browsers that have never signed in to that account. - **Client IP behind proxies:** `X-Forwarded-For` is read from the right (the entry your proxy added), `CF-Connecting-IP` is only trusted from the stack's cloudflared or `PROXY_IPS`. - **Direct-access tokens split:** the token in media URLs (`?st=`) only opens music, images and exports; the API token is header-only and never opens administration (admin calls always use the normal address and session). - **Password-reset links** never use a foreign `Host` header (without `APP_URL` the address the admin last signed in with is used). A password reset signs out all devices and revokes app keys; so does an admin setting a new password. - **Update upload and restore need the admin password.** - **Setup always asks for the setup code** (the link in the log contains it) – `EINRICHTUNG_CODE_IMMER=0` restores the old behaviour on the home network. - Logs mask API keys, tokens and passwords. MusicBrainz & Co. now see the project URL as contact instead of a personal address. Windows client: - **Installer:** installs for the current user without admin rights (`%LOCALAPPDATA%\Programs\Amberwave`), Start menu entry, uninstall via Settings → Apps (settings can be kept). `/portabel` unpacks next to the package as before. - **Update notice** in the tray menu when GitHub has a newer release, **compatibility check** with the server (`client_protokoll` in `/api/v1/ping`), **About** dialog with licenses. Also: Cloudflare terms notice in the tunnel setup, Unraid guide (Docker Compose Manager), genre families were recalculated every minute because of a missing setting (fixed). ## 0.9.0-beta.1 (first public beta) Server and Windows client now share one version number. - **Music folder is read-only by default.** New installations only read your collection. Writing (tags, tidy-up, download import, “take track from another album”, trash) must be allowed in the setup assistant or under Settings → Library & automation → Music folder (`MUSIK_SCHREIBEN=1`). Every write path checks this, including a second check in the low-level file writers. Existing installations keep writing allowed. - **Usenet downloads are off by default.** Switch on under Settings → Downloads (`USENET_AKTIV=1`). When off there is no downloads area, no search and nothing is fetched. Existing installations with Prowlarr/SABnzbd set up keep it on. - **Ready-made Docker image** (`ghcr.io//amberwave`, built by GitHub Actions on every release tag) with a short `docker-compose.yml` and a `.env.example` of five lines. The previous self-build setup is `docker-compose.build.yml`; every option is documented in `.env.reference`. - **Update notice:** the admin overview shows when a newer release exists on GitHub (twice a day, nothing is downloaded; switch off under Settings → Backup & update). Image installations update with `docker compose pull`. - **Licensing:** AGPL-3.0 for the core, third-party notices, contribution guide with CLA, security policy, issue templates. - English README; German guide in `README.de.md`. ## Before the beta (0.1 – 0.2.178) The development history before the beta (it used to be part of the README). ### What v0.1 can do - **Accounts** as in the book archive: registration with activation (1–24 months), renewal, blocking, expiry reminder, login lockout after failed attempts, “Remember device”, device limit, forgot password, email via web.de. - **One folder = one album** as long as the album title is the same – even if the album artist is missing on individual files (previously they were split off as an invisible second edition). Files with no counterpart in a matched edition (bonus tracks, demos) appear as additional tracks. Under Administration → Library → Anomalies you will find files that only exist in editions that are not displayed. - **Scanning** without prompts: FLAC, MP3, M4A/ALAC, Opus, OGG, WAV, AIFF, WavPack and more; CD1/CD2 subfolders, compilations, multiple artists from the tags (ARTISTS), cover from the folder or the file, ReplayGain, incremental. - **MusicBrainz matching**: all editions of an album (not just the first hits), filter by country/format/track count, “your file ↔ MusicBrainz” comparison line by line, import of album, edition, tracks, artist credits, label, genres, producers, musicians with instruments, songwriters (via compositions), technical details; band members. Locked fields remain untouched. - **Editing directly in the library** (admin only): “Edit” button on the album page (on mobile in the ⋯ menu) for album, track list (title, disc and track numbers; a new disc number = a new disc, duplicate assignments are rejected), contributors, edition, cover and album artists; “Edit track …” in the ⋯ menu of each track (name, disc and number, separate artists such as “feat.” – the guest then also appears on their artist page); “Edit” on every artist page. Anything changed by hand is automatically protected from scans and MusicBrainz. - **Albums grouped “By artist”** (toggle at the top right, with A–Z bar) and **sortable artists** (name A–Z/Z–A, most albums, recently added, most listened to by you, random; filter people/bands). - **Family sees one edition per album** (the one with the most tracks, the newest in case of a tie; changeable by you). - **Interface** in a glass design with an amber accent: Home (Continue listening, New, Frequently played, Discover), albums with filters, album page with contributors, artist and person pages (As producer / musician / songwriter, frequent partners, lineup), search, playlists (also shared with the family), Bookmarked, History, Profile. Fixed layouts for desktop, tablet and mobile (tab bar at the bottom). - **Player** without interruption while navigating. “Now playing” in the “Stage” layout: on desktop, cover in the center of the screen, contributors on the left, Up next on the right, at the bottom signal path | controls (centered) | quality + volume – all without scrolling. On mobile only the player, Up next / contributors / technical details in a sheet from below, lock screen controls. Volume leveling according to EBU R128 (see below). Streaming as original or converted live (Opus 256/160/128, AAC as fallback). - **API-first**: The interface uses `/api/v1` exclusively. The future Windows player logs in with a device key and receives the files bit-perfect (see `docs/API.md`). - **Artist images from fanart.tv**: Enter the key under Settings, and the app fetches the images in the background (every `FANART_ALLE_MINUTEN`, default 10) or immediately via Administration → Library → “Fetch now”. Artists without a MusicBrainz ID are looked up unambiguously beforehand; images you upload yourself are kept. - **Names always “First name Last name”**: “Jackson, Michael” from the tags becomes “Michael Jackson” – duplicate artists are merged in the process. Band names such as “Earth, Wind & Fire” stay as they are. Sorting is also by first name last name (“Michael Jackson” under M); a leading article does not count (“The Beatles” under B, can be disabled with `SORTIERUNG_OHNE_ARTIKEL=0`). - **Quality at home / on the go, remembered per device**: On the home network (directly on the LAN or through the tunnel with your own public address), “Automatic” plays the original file, provided the browser can handle it. On the go: phone/tablet (by browser identification) Opus 160, on mobile data or with data saving Opus 128, otherwise Opus 256. Both settings are stored per device on the server; a network change takes effect from the next track. - **Robust scanner**: Folders/files without read permission are reported (Administration → Library) instead of being silently skipped, and whatever of them had already been scanned is kept. If the music folder is empty (array stopped, mount missing), nothing is deleted. The app runs as `PUID`/`PGID` (Unraid: 99/100 like Lidarr) and can therefore read everything Lidarr creates. - **Artist page: genres and most popular tracks**: Genre badges from MusicBrainz (the top five by votes, otherwise the most frequent genres of their albums in the collection; clicking shows all albums of the genre). Below that, the **top 10 worldwide** by listeners on ListenBrainz (open statistics from MetaBrainz, no key required, refetched every `BELIEBT_TAGE`) – matched via the MusicBrainz recording, otherwise via the title without suffixes such as “Remaster”; the version from the studio album is played. **Missing tracks stay in the list**, dimmed, with the album they appeared on, and a summary (“6 of the top 10 are missing from your collection – found on: Bad (2), …”). **Ours** toggle: the most-listened tracks of all family members. “Play available” plays only what is there. - **Clean up files** (Administration → Library or album menu “Clean up files …”, matched albums only): writes the data from Amberwave into the files – FLAC (Vorbis comment), MP3 (ID3v2.4) and M4A (iTunes fields) with the field names of MusicBrainz Picard: title, artists individually and as display text, multiple album artists, edition (label, catalog number, barcode, country, medium, date/original release, version name), genres, composer, lyricist, producer, mix, engineer, musicians with instrument, work, all MusicBrainz IDs and ReplayGain from the app's own loudness measurement – plus the cover. Old and foreign tags are cleaned up in the process (`AUFRAEUMEN_TAGS=sauber`); only `AUFRAEUMEN_BEHALTEN` (lyrics, ISRC) and technical data for gapless playback (iTunSMPB) remain. The preview shows for each field previous → new or “will be removed”. Nothing ever happens on its own: first the preview, then your approval (per album or all at once). Renaming and tagging happens in place in the library's root folder, e.g. `Bruno Mars/2012 - Unorthodox Jukebox/01 - …` (old files go to the recycle bin). The audio is never touched: if everything fits into the existing header (padding block), only that is overwritten, otherwise the file is reassembled alongside; before and after, a checksum is computed over the decoded audio data – if they differ, the file stays as it was. Also: naming folders and files by pattern (`AUFRAEUMEN_ORDNER`, `AUFRAEUMEN_DATEI`, default `Albumartist/Year of the edition - Album (Edition)/01 - Title`, with multiple discs `…/CD 2/01 - Title` (`AUFRAEUMEN_CD_IMMER=1`: disc folder even with only one disc); disc numbers from MusicBrainz, even with only one disc; names are Windows/SMB-safe, `AUFRAEUMEN_ZEICHEN=ascii` strict ASCII; booklets & co. move along) and removing junk (.nfo, .sfv, .m3u, .log, .cue, Thumbs.db …). **Always preview first** (per album: new names, tag changes field by field, notes such as missing write permissions or folders that also contain other albums), only approved items are executed, in the background and never at the same time as scanning. Deleted items and the old tags (as JSON per file) end up in the folder `.amberwave-papierkorb` in the music folder and are deleted after `AUFRAEUMEN_PAPIERKORB_TAGE` (30). The database is updated right away (paths, sizes, tags) – no rescan needed, playback continues. - **Recognize albums by sound** (Administration → Library): Each track gets an acoustic fingerprint (Chromaprint via the existing ffmpeg, the first 120 s, low priority), and AcoustID names the MusicBrainz recording for it. For each album folder, the releases that contain (almost) all tracks are loaded and compared track by track – recording, order, count, durations → confidence in %. Unambiguous results are applied automatically (like “Apply this edition”, an existing cover is kept). If the same track list exists on several editions, the MusicBrainz ID or barcode from the tags decides, then the durations, otherwise rules: official, format matching the files (CD or, for hi-res, Digital), country (DE, Europe, worldwide …), earliest date – these albums are listed for review, with all checked editions for comparing and switching. Only albums not yet matched are touched; the files are not changed in any way. Requires a free AcoustID key (Settings or `ACOUSTID_API_KEY`); `ERKENNUNG_AUTO=regeln|eindeutig|aus`, `ERKENNUNG_SCHWELLE` (90 %), `ERKENNUNG_PARALLEL`. Runs in the background (AcoustID ≤ 3, MusicBrainz 1 request per second). - **Editions as separate albums**: Configurable per album under ⋯ → “Show editions …” – then, e.g., the original and the remaster appear side by side in all lists (with a small version label), without switching. - **Interface**: custom select fields in the app style (on mobile with the system picker), back button between logo and navigation, play button at the bottom right on the cover, artist page grouped by type (albums, EPs, singles, live, compilations …). - **Gapless playback** for live and concept albums, sample-accurate: At home every track is transmitted as FLAC (FLAC files bit-perfect, other formats decoded losslessly) and joined seamlessly; on the go, consecutive tracks of an album are encoded as one continuous Opus stream. The files remain unchanged. Can be disabled under Profile & Playback; browsers without Media Source Extensions automatically use the classic path. If a browser cannot handle FLAC as a stream (e.g. Chrome on Android) or the FLAC path causes problems, “Original” continues there gaplessly as Opus 256 instead of with pauses (switchable under Profile & Playback, with diagnostics of the device's capabilities). If the format changes between two tracks (sample rate, channels or bit depth, e.g. 44.1 kHz/16 bit → 48 kHz/24 bit), a fresh buffer begins – at that point there is a tiny gap, but no noise from a format change in the middle of the Media Source buffer. - **Spatial audio (upmix stereo → 5.1/quad)**, only on a multichannel output (e.g. PC via HDMI to an AV receiver, set to 5.1 in Windows; on the receiver, play multichannel PCM directly). L/R stay bit-perfect and unchanged at the front; per frequency band, only what is uncorrelated between L and R (reverb, room, audience) goes to the rear – vocals and panned instruments stay at the front. Rear: no bass (high-pass), fewer low mids, somewhat darker, attacks damped with look-ahead, ducking by the front, early reflections with different delays and a dark room reverb that the direct sound (without bass) also excites slightly – this gives even dry recordings space. Presets **Subtle, Room, Hall, Live** under Profile & Playback or in the ⋯ menu of “Now playing”; **key U** toggles between Off and the preset while listening (A/B). For auditioning in the DAW: ⋯ → “Export track as 5.1 WAV” (all four presets, 24 bit, L R C LFE Ls Rs). **Real rooms for the reverb:** Under Administration → System, the server downloads the free “IM Reverbs” package from Voxengo at the push of a button (Musikverein, La Scala Milan, Salon …; © Aleksey Vaneev, not shipped with Amberwave, address via `RAUMKLANG_IR_URL`), and your own WAV impulse responses can be uploaded. The presets choose a suitable room automatically; in the profile, a specific one can be chosen per device. On pause/stop, the surrounds and reverb fade out immediately as well. **Intensity** (room/reverb: reverb ±12 dB, early reflections ±6 dB) and **surround level** (Ls/Rs ±12 dB) can be fine-tuned per device – the center is always the preset (Profile or Surround menu). **Center and bass management** (from 0.1.118): The front is decoded to L/C/R via M/S (center share 0–100 %, middle = classic matrix: the center gets M at 0 dB, the front keeps M at −3 dB). Bass below the crossover frequency (80/100/120 Hz, Linkwitz-Riley 24 dB/oct.) goes from L/C/R into the LFE (lowered by −10 dB because the receiver boosts the LFE by 10 dB; or 0 dB). Defaults `RAUMKLANG_CENTER_ANTEIL`, `RAUMKLANG_LFE_TRENNUNG`, `RAUMKLANG_LFE_PEGEL`. The spatial audio module restarts fresh on every track selection, every skip and every play (`RAUMKLANG_NEUSTART=0` turns this off); the “Fine-tune spatial audio” dialog shows which version is running. - **Level meter** in the player bar and in “Now playing”: small peak level meters in dBFS (before the volume), 2 channels, with active spatial audio 5.1 (L R | C LFE | Ls Rs) or quad; fall-back 20 dB/s, peak hold 1.5 s, red from 0 dBFS. Runs via Web Audio (the volume then sits behind the measurement) – on at the desktop, off on mobile/tablet, can be disabled under Profile & Playback. Gapless remains sample-accurate via this path as well. - **Equalizer** (remembered per device): low and high shelf and two bells, all fully parametric (frequency continuously variable, level ±15 dB, Q – for the shelves the slope), plus a gain control (−24 … +12 dB) or “Auto” (lowers as much as the curve boosts – cannot overload). The curve shows the result including gain; points can be dragged (mouse wheel = Q, double-click = 0 dB). Filters: “matched” biquads (approach after Vicanek) instead of the RBJ cookbook – they follow the analog prototype up to near Nyquist, without the usual cramping above 10 kHz; computed in a dedicated worklet in double precision, changes are crossfaded without clicks. With spatial audio it acts on all channels and sits before the level meter. - **Navigation remembers the path**: If you get to an album via “Artists”, you stay in the “Artists” tab (also on back/forward and after reloading). The back button sits between logo and navigation. - **Album page**: Name of the edition after the title (e.g. “Thriller Deluxe Edition”), for the label only the publisher. - **Scroll position and settings per device**: After “Back” and after editing (OK), lists stay in place – even if “Load more” has already been pressed several times (albums, artists, Administration → Library). Each device remembers sorting and filters itself: albums (sorting, view), artists (sorting, type, “Contributors without their own album”), Administration (account and library filters). On mobile, the A–Z bar and the contributors without their own album are omitted for the artists. - **Genres from MusicBrainz**: Come together from release group and release (votes added); if they are missing there, the release group is queried specifically. Albums already matched get them on the next “Match again”. The album page header no longer shows “This edition: date (country)”. - **Cover art during MusicBrainz matching**: In the hit list, each edition is preceded by its cover from MusicBrainz (Cover Art Archive); in the comparison, “Your cover” and “Cover at MusicBrainz” lie side by side. The images go through the server and are cached (`COVERART_URL` only needed for your own mirror). - **EQ and spatial audio in the player bar** (PC): dedicated buttons as a group next to the quality, same height; active = filled, the spatial audio button names the preset. When the bar is narrow, only the icons remain (Play/Pause stays centered). The spatial audio button opens a menu with switch, presets (with icons), room (impulse response), sliders for intensity, surround level, effects/width to the rear and center share, bass management (bass → LFE, LFE level), solo, monitoring and reset (double-click a slider to reset it; Esc closes, key U toggles). On a stereo output the menu shows a notice; the sliders can still be prepared. - **Theme radios** (0.1.108): Under “My radio” on the home page, buttons for decades (70s, 80s, 90s …) and the most frequent genres – only themes with enough songs (`RADIO_THEMA_MIN`, default 25). Only what fits the theme is played (decade of first release; genre of album, track or artist), selected as in the learning radio: your favorites from the theme as seed, sound similarity, variety, every 4th track new to you. - **Daily data backup** (0.1.109): Every night (default 2 a.m., i.e. before the nightly run) the database is backed up to `/datenbank`. The last 7 daily backups are kept, plus the last one of each week for another 4 weeks (`SICHERUNG_STUNDE`, `SICHERUNG_TAGE`, `SICHERUNG_WOCHEN`, also changeable under Administration → System). There you will also find: “Back up now” (stays until you delete it), download and **restore**: The backup is first fully verified, then the current state is automatically backed up (“Before restore”, the last 3 are kept), running jobs pause, and if the restore fails, the previous state is immediately restored. An older backup is then automatically brought up to the current version. Confirmation is done by typing WIEDERHERSTELLEN. The backup from before the last update can be restored this way as well. Music and covers are not part of the backup. - **Spatial audio without ringing** (0.1.110): The upmixer's room layer previously decided per frequency bin (1025 bins, 30 ms) what may go to the rear. Such a fragmented, flickering mask produces pre-echoes and “musical noise” (watery ringing, metallic trails) in the 46 ms window. Now the cross-spectra are smoothed across frequency before the decision (±1/12 octave), the mask opens slowly (80 ms) and closes immediately (coherent attacks stay at the front), and the transient intervention is gentler (3 ms, 4 ms look-ahead). Measured: temporal instability of the mask from 25 % to 1 %, differences between neighboring bins from 47 % to 2 %, level and processing load as before. The older methods “soft” and “spectral” get the same smoothing. Worklet version: 0.1.110 (under “Fine-tune spatial audio”). - **Solo per speaker** (0.1.111): In the spatial audio menu, a speaker layout as in the room (front L C R, rear Ls LFE Rs; for quad L R Ls Rs) with a level meter per channel. Clicking solos a speaker, several are possible (e.g. Ls + Rs), Alt-click takes only this one, “All” cancels solo. Works with every method and can be combined with “Monitoring” (layers). Is not saved and is cleared when the menu is closed. LFE is grayed out because Amberwave leaves it empty (the receiver does the bass management). - **Sound analysis version 3** (0.1.112): The built-in method (“simple3”) gets 15 new features that separate the score of dance-pop, pads from beats and vocals from instrumentals: rhythm character (percussiveness, kick share, onset density, bar regularity from the low bands), vocal tendency (modulation of the midrange band at syllable rate), harmonic progression (chord change rate, chroma entropy) and the progression across the whole piece (differences between the excerpts, tempo stability, dynamic range, crest, arc of tension, position of the climax – for this, every track is read once in full at 8 kHz). All tracks are re-analyzed in the background (the old vectors are kept), after which the index is rebuilt. In addition, radio and sound similarity now know “worlds”: soundtracks (MusicBrainz secondary type) and spoken word are a world of their own. The sound radio stays in the world of the starting track as soon as it has enough tracks; otherwise the other world only counts at 15 %. In the metadata distance, a foreign world carries a 65 % penalty. - **Adjust the MusicBrainz comparison by hand** (0.1.113): In the comparison, files can be assigned to a different MusicBrainz track by drag & drop (or click and then click the target); if the slot is occupied, both swap. The file is never deleted, rows without a file remain as “missing”. Files whose title/number are locked by hand show a 🔒 and keep their values – optionally, a checkbox lifts the lock for moved files. Collapsible sections (recognition, clean-up, sound) stay open during automatic redraws. The “Applied” dialog now has only an OK button, which closes the window. - **Track assignment via select field** (0.1.114/0.1.115): In the MusicBrainz comparison, the order of the release stays fixed and your files adapt: in the row of each MusicBrainz track you choose which file it is (for folders without or with wrong track numbers; files already assigned swap). Files without a counterpart have their own select field for the track. “Clear assignment” sets all files to “not assigned”. The assignment is passed on to the MusicBrainz matching on import, and each file gets the title, number and data of its track. - **Assignment by name** (0.1.116): The automatic MusicBrainz comparison now assigns by name first, not by track number. Tag titles and file names are compared with the MusicBrainz titles, taking Usenet spellings into account: leading numbers (“05 -”, “1-05”), underscores and dots, artist prefix, scene names with group abbreviation (“…-WEB-2012-GRP”), bracketed additions such as (Remaster) or [Live], “feat.” additions, typos and missing punctuation (“PYT” = “P.Y.T.”). Uncertain name matches only count if the length fits as well. If a name is found for at least half of the files, “Assignment by name” applies; files without a name match keep their number only if the slot is free and the length fits, otherwise they appear as “without counterpart” and can be assigned by hand. - **Spatial audio: LCR center and bass management, one method** (0.1.117/0.1.118): The front of the “Two layers” method is decoded to L/C/R via M/S (M = (L+R)/2, S = (L−R)/2, L' = S + M·cos θ, R' = −S + M·cos θ, C = √2·M·sin θ; center share 0–100 %, at 50 % the classic matrix: center M at 0 dB, front M at −3 dB, power of a phantom center stays the same; the center from the frequency analysis is dropped). Bass management for the LFE: 4th-order Linkwitz-Riley (24 dB/oct., computed exactly for the sample rate) at 80, 100 or 120 Hz – below that the bass goes from L/C/R into the LFE (low-pass of L+R of the front), above it everything stays at the front; high-pass and low-pass are complementary. LFE level −10 dB (default, because the receiver boosts the LFE by 10 dB) or 0 dB; “off” keeps the bass at the front. Room and effects to the rear as before. The older methods “Soft” and “Spectral” (envelope) have been removed, as have the method toggle and `RAUMKLANG_VERFAHREN`. Defaults via `.env`: `RAUMKLANG_LFE_TRENNUNG`, `RAUMKLANG_LFE_PEGEL`, `RAUMKLANG_CENTER_ANTEIL`. - **Artist page: image is always at the top left** (0.1.119): The artist image was vertically centered next to the text and therefore shifted up or down depending on the amount of text (bio, genres, life dates). Now it is flush with the top edge of the text block; on mobile it stays centered above the name. - **Genre families, style recognition and more precise radio** (0.1.120): Clicking “Pop” or “Electronic” now finds the whole family (synth-pop, dance-pop, indie pop …) – and only albums that really fit. For this, Amberwave stores the votes of the MusicBrainz genres (a single outlier is no longer enough; individual genres count from 15 % of the votes) and calculates family shares per album (`GENRE_FAMILIE_SCHWELLE`, default 25 %). Older albums fetch the votes in the background (a few per minute). Under Genres and in the album filter there is “Genre families”. With the extended sound model, Amberwave additionally recognizes the Discogs styles per track (head `genre_discogs400`, via the button “Install style recognition” under Administration → Sound analysis; one-time re-analysis of the collection); at track level the model counts most, at album level MusicBrainz. The radio uses the families: theme radios for pop, electronic, rock … take only songs that really fit; artist genres now count only weakly. - **Spatial audio: strength Subtle/Wide/Intense** (0.1.121–0.1.123): In the spatial audio menu, a switch sets reverb, surround level, effects and width at once. “Wide” (the middle level) is defined by you in the `.env` (`RAUMKLANG_MITTEL_INTENSITAET/PEGEL/EFFEKTE/BREITE`), “Subtle” and “Intense” are derived from it (`RAUMKLANG_STAERKE_SCHRITT`). Center, bass management and LFE remain unchanged because they belong to the system. The individual sliders are behind “Advanced”; if they match no strength, it says “custom setting”. - **Spatial audio: rooms sorted, upload your own** (0.1.124): The room selection (impulse response) is now behind “Advanced”. Amberwave measures the reverb time of every impulse response itself and sorts it by type (chamber, room, hall, church, plate/spring, other – from name and reverb) and size (small to very large); the list is then grouped and sorted by reverb. Every user uploads their own WAV impulse responses directly in the menu (type optionally selectable, `RAUMKLANG_UPLOAD_ALLE=0` = admins only); deleting remains with the admin under Administration. - **Back after matching** (0.1.125): If you go from a page (Administration, album, artist …) to the MusicBrainz matching and apply an edition (or remove the link), you land back on the previous page afterwards – with the old scroll position. - **Protection against older app versions** (0.1.126): If the database belongs to a newer Amberwave version than the running code (higher schema number), the older app does not start: web and API respond with 503 and a clear message, the schedule and `migrate.php` abort – nothing is written. Backups from a newer version also cannot be restored into an older app. The way back: install the newer app version (replace the `app/` folder) – or deliberately restore a backup of the older version. Updates continue to run automatically (older backups are migrated to the new state when restored). - **Clean-up does not disturb playback** (0.1.127): Albums from which a track was played in the last `AUFRAEUMEN_SCHONZEIT_MIN` minutes (default 10) are only cleaned up by Amberwave on the next run – they stay approved, the rest continues, nothing is copied or stored twice. If a stream falls exactly into the moment of moving, it finds the new location itself (re-read the database, then the clean-up log) instead of aborting with “not found”. Running streams read their already opened file to the end anyway. - **Clean-up always live, only with a button** (0.1.128): The test mode (copies under `neu/`, `AUFRAEUMEN_MODUS`, `AUFRAEUMEN_ZIEL`) is gone. Cleaning up happens in place in the library's root folder (`Bruno Mars/2012 - Unorthodox Jukebox/…`), but only after preview and your approval. The music folder is now mounted writable by default (`MUSIK_MOUNT_MODUS=ro` remains as a safety switch). An old `neu/` folder with test copies is still never scanned – you can delete it. Old previews are regenerated automatically. - **Names never too long** (0.1.129): During clean-up, the whole path below the music folder stays within `AUFRAEUMEN_PFAD_MAX` characters (default 200; Windows programs manage about 260 in total) and each individual name within `AUFRAEUMEN_NAME_MAX` bytes (default 180; encrypted NAS folders: 140). Shortening is done sensibly: first appended bracketed additions such as “(Remastered 2011)”, then at the word boundary – track number and extension remain, the full title stays in the tags. The preview reports how many names were shortened. - **Warmth – tube saturation** (0.1.130): New “Warmth” button next to EQ and spatial audio. A triode preamp in the audio thread (its own worklet), sitting directly behind the source – before spatial audio and EQ: asymmetric characteristic with operating point (even harmonics, almost only k2 on quiet passages, soft compression on peaks), tone control for silkier highs, parallel share. Computed with 4x oversampling (polyphase FIR up and down, alias residues below −70 dB), the dry path is delayed equally (no comb filter). Auto-gain: pure negative feedback to the drive (+3 dB in → −3 dB afterwards, relative to the small-signal gain), no regulation – the saturation of the peaks stays audible. Three levels **Hint**, **Warm**, **Glow**, behind them “Advanced” (drive, character, highs, mix, auto-gain). Remembered per device; default for new devices via `WAERME_VORGABE`. Processing load about 2–3 % of one core. - **Auto-gain without regulation** (0.1.131): The auto-gain of Warmth now only compensates the drive (+3 dB at the front → −3 dB at the back) – no more RMS matching, hence no pumping; what the tube squeezes together at the peaks can be heard. - **Tube coupled to loudness** (0.1.132): The drive of Warmth follows the measured loudness of the track or album (EBU R128): quiet tracks are driven harder, loud ones softer, relative to `WAERME_BEZUG_LUFS` (default −18 LUFS, ±12 dB). This way “Hint” works the same on a quiet chamber music recording as on a loud pop master; the auto-gain keeps the level. If the loudness leveling is already in the stream (Opus/AAC), this is taken into account. Can be disabled under Advanced (“Adapt to loudness”), where the correction for the current track is also shown. - **Tube coupling even without loudness leveling** (0.1.133): If loudness leveling in the player is off, Warmth still uses the measured loudness – the track then arrives at the tube with its original loudness, and exactly that is compensated. - **Warmth: distribution in the stereo image** (0.1.134): The tube now computes stereo in mid/side – each layer has its own tube and its own auto-gain, so the compression of the loud mid no longer squeezes the sides together (the image stays equally wide). New “Distribution” slider under Advanced: left only the mid (vocals, bass), middle = both equal, right only the sides – there the usually quieter side is driven up to +9 dB harder, so that space and width audibly get overtones while vocals and kick stay clean. The slider does not belong to the level and is kept when the level changes. - **Warmth HQ** (0.1.135): “HQ” switch under Advanced for a simulation closer to the circuit, the normal tube remains unchanged: breathing operating point (grid current charges the coupling capacitor, attack ~4 ms, return ~160 ms – after loud hits the stage blooms briefly), frequency-dependent saturation (bass and mids go 3 dB harder into the characteristic and are then exactly equalized – the body of the music saturates, the highs stay clearer) and an output transformer that saturates the bass below ~140 Hz softly on its own. About 3 % of one core instead of 2.5 %; remembered per device. - **Tape – tape machine** (0.1.136): New “Tape” button next to Warmth. Sits behind the tube, before spatial audio and EQ (studio chain: preamp → tape machine), computes like the tube in mid/side with distribution, auto-gain and loudness coupling. Signal path: record equalization (highs go into saturation first – sibilants and cymbals become velvety) → tape saturation with 4x oversampling → exact playback equalization → level-dependent high-frequency loss (self-erasure) → head bump (bass boost per speed, can be disabled). **Standard**: anhysteretic magnetization curve (Langevin), ~2.5 % of one core. **HQ**: true hysteresis after Jiles-Atherton (magnetization with memory – the soft, dense tape compression), plus wow and flutter (wow 0.55 Hz, flutter 5–13 Hz) and optional tape noise, ~8 % of one core. Three levels **Fresh** (15 ips, new tape), **Worn In** (7.5 ips, broken in), **Old** (old tape, alive); under Advanced speed 7.5/15/30 ips, drive, bias, wow and flutter, mix, distribution. Remembered per device; `BAND_VORGABE`, `BAND_BEZUG_LUFS`. - **Perfectly imperfect (HQ)** (0.1.137): In HQ mode, tube and tape get what distinguishes real devices from mathematics. Both: component tolerances per layer (operating point ±3 %, drive ±0.3 dB, tone control/high-frequency limit ±3–4 %) that drift slowly over minutes (warm-up). Tube: power supply sag – during loud passages the supply sags with ~30 ms attack and ~250 ms recovery time, the stage compresses more softly and breathes afterwards. Tape: scrape flutter (fine, fast irregularity at the head), modulation noise (follows the signal, the shimmer around loud tones, ~46 dB below), head contour (dip below the head bump) and azimuth (right offset ~7 µs against left – highs minimally wider). The standard mode remains exact and predictable. - **Tape less dull** (0.1.138): The tape's high-frequency loss was too static – a calibrated machine is practically linear at 15 and 30 ips. Now: base cutoff frequency almost open (15 ips ≈ 20 kHz, 7.5 ips ≈ 16 kHz, bias makes it somewhat darker), the loss from self-erasure only begins near saturation and then grows up to −50 % cutoff frequency. “Fresh” takes only ~0.7 dB at 10 kHz at normal level, more on peaks; “Old” remains deliberately darker (driven somewhat more gently than before). - **Version jump to 0.2.5**: With Warmth (tube) and Tape as new sound tools, Amberwave moves from 0.1.x to 0.2.5. Identical in content to 0.1.138; database and settings remain unchanged. - **Amber sound family** (0.2.6): The sound tools are now called **AmberGlow** (tube saturation · Tube – harmonic warmth, silky presence and more fullness), **AmberSilk** (tape saturation · Tape – creamy textures, velvety highs and soft transients) and **AmberSpace** (spatial playback · upmixer – larger soundstage, spatial depth and enveloping atmosphere), each with its own icon (tube with filament, reels with silk ribbon, listener with sound waves). Player bar in the order of the chain: Glow, Silk, Space, EQ; menus with amber tile and names in a gradient. In “Now playing” the right column now has the tabs “Up next” and “Sound” with three cards (switch, levels, Advanced), on mobile as a “Sound” tab in the sheet. The upmixer has disappeared from the quality menu (click on FLAC), the 5.1 WAV export is now in the AmberSpace menu. Escape in a sound menu only closes the menu, no longer “Now playing”. - **Sound family polish** (0.2.7): AmberSpace "Wide" is now intensity −3.8 dB, surround level +6.0 dB, effects 26 %, width 22 % (`RAUMKLANG_MITTEL_*`); "Subtle" and "Intense" are Wide scaled by ∓/±20 % (`RAUMKLANG_STAERKE_PROZENT`, intensity and level as amplitude: −5.8/+4.1 dB and −2.2/+7.7 dB respectively, effects 21/31 %, width 18/26 %). Solo and monitoring have disappeared from the AmberSpace menu, bass management now sits under Advanced. AmberGlow and AmberSilk: auto-gain and loudness adjustment are always on (no more switches). HQ has a prominent switch in the menu and an HQ pill on the cards. Motion: menus grow out of the button and the content follows in a staggered way, "Advanced" folds open and closed smoothly (the arrow rotates with it), switches, steps and glow slide when toggled (the menus are no longer rebuilt for this, only adjusted), context menus and hints fade in and out smoothly, the cards under "Sound" appear one after another. With "Reduce Motion" set in the system, everything stays calm. - **Tidier buttons** (0.2.8): In "Now Playing", Play always sits exactly in the middle (both side groups are the same width, no matter how many icons are on the left and right). In the player bar, Glow, Silk, Space and EQ are now just round icons (active in amber with a slight glow, name and level in the tooltip) – the group is now 142 pixels wide instead of several hundred. - **EQ before or after the effects, rebuild analysis** (0.2.9): In the equalizer, "before effects / after effects" switches where the EQ sits – at the front it shapes what goes into AmberGlow and AmberSilk (more bass = more saturation in the bass), at the back it corrects the finished result (default as before). Remembered per device, the signal path shows the order. Under Administration → Library → Tools → Sound analysis, "Re-analyze …" rebuilds the analysis for updates and repairs: only the style detection or everything (sound vectors, styles, similarities). Only derived data is deleted; library, tags, playlists and listening history remain. The concept now contains the section "Ideas for later" (warmth EQ, transient/sustain). - **Downloads with Prowlarr and SABnzbd** (0.2.10): New "Downloads" tab in Administration → Library. Deliberately without automatic search: type in a search term, Prowlarr delivers the hits (Usenet only; title, indexer, size, age, how often downloaded), click "Get" on a hit – Amberwave downloads the NZB via Prowlarr and hands it to SABnzbd in the music category (SABnzbd does not need to reach Prowlarr for this). Below that are the jobs with progress. When SABnzbd is finished, Amberwave copies music and extras (cover, booklet, cue, log – no Par2/NFO/SFV) from the download folder to /Downloads/ and scans them in; sorting them into place is then done with "Tidy up files". Reconciliation happens every minute on schedule and when the page is opened. Setup is under Settings → Downloads (addresses, API keys, categories, SABnzbd category, target folder, keep/delete original) with "Test connection"; the download folder goes into the .env via `DOWNLOAD_PFAD` (mounted read-only, `DOWNLOAD_MOUNT_MODUS=rw` only for deleting after the import). Afterwards restart the stack once (Compose Down/Up) so that the folder gets mounted. - **Better similarity** (0.1.107): Built-in method version 2 – timbre as the shape of the spectrum, independent of how loudly it was mastered (the collection is re-analyzed once). **Genres per track** from MusicBrainz (one query per album, in "Complete metadata"). **Sound radio mixes sound and metadata**: the 100 acoustically most similar tracks are re-sorted by genres (track > album > artist), era, contributors and artists – 55/45 with the built-in method, 80/20 with the extended model. **Quality** under Tools → Sound analysis: same artist among the 5 most similar compared with chance, skip rate of sound suggestions compared with other radio tracks (90 days), a sample to listen to with a sound radio button. - **Sound analysis and sound radio** (0.1.106, **rebuild image** – needs Python 3 + numpy): Every song is analyzed once in the background (timbre, energy, rhythm, tonality; three excerpts, low priority), and from this Amberwave calculates the most similar songs. In the track menu: **"Sound radio (sounds similar)"** – starting track first, then similar ones with variety rules. In the normal radio, sound similarity counts as an additional signal ("sounds like …"). Under Tools → Sound analysis: progress and optionally the **extended model** (Discogs-EffNet from the MTG, CC BY-NC-SA 4.0 – non-commercial only): it is not shipped with the app but, after you confirm the license, downloaded directly from the vendor at the press of a button (Python package from PyPI, model from essentia.upf.edu); if anything fails or it is removed, the built-in method applies again. `.env`: `KLANG_AKTIV`, `KLANG_PYTHON`, `KLANG_PIP_PAKET`, `KLANG_MODELL_URL`, `KLANG_LIZENZ_URL`. - **Complete metadata** (0.1.105): Albums, artists and artist images in one job, in a fixed order – 1. Albums (MusicBrainz gaps, "explicit" from Deezer), 2. Artists (MusicBrainz data for linked, never-matched artists including guests, producers, members; unsuccessful ones only retried after 30 days), 3. Artist images (fanart.tv). One panel and one status tile under Tools. Runs after scanning (automation chain), directly after each album match for the artists of that album, and at night. The separate 10-minute cycle for artist images is dropped (`FANART_ALLE_MINUTEN` is no longer needed). - **Automation chain and further server jobs** (0.1.104): After every scan with changes, the following runs in sequence: detection by sound (if set up; the chain waits until it is finished, at most 3 hours) → match metadata → tidy-up preview (only what you approve is still executed). The same chain once per night (default 3 a.m.). Switches under Settings → Library or in the `.env`: `AUTO_METADATEN`, `AUTO_AUFRAEUM_VORSCHAU`, `NACHTLAUF_STUNDE` (−1 = off). Jobs stopped by hand are not overridden. "Create preview" (tidy-up) and "Fetch now" (artist images) now also continue as a job on the server, even with the app closed. - **Match metadata runs on the server** (0.1.103): "Match metadata" (Tools) and "Fill gaps from MusicBrainz" (selection in the library) are background jobs. They keep running when you switch pages or close the app; the schedule resumes them every minute (even after a container restart). If MusicBrainz is briefly unreachable, it continues by itself after 2 minutes. Progress, pause, resume and "Start over" in the panel; the status tile shows "Running …". - **"Explicit" marking (E badge)** (0.1.102): on tracks (lists, search, queue, player), album tiles and in the album header; cleaned-up editions show "Clean". Sources in this order: by hand (edit track → marking), file tag (`ITUNESADVISORY`/`rtng`, when scanning), Deezer (public, no key: barcode → whole album, otherwise ISRC, otherwise search with a length check). Runs silently along with the MusicBrainz match and with "Match metadata"/"Fill gaps"; tracks without a hit are asked about again after `DEEZER_WIEDERHOLEN_TAGE`. ISRCs now come from MusicBrainz and the tags. `ITUNESADVISORY` is always preserved when tidying up. `.env`: `DEEZER_AKTIV`, `DEEZER_URL`, `DEEZER_WIEDERHOLEN_TAGE`. - **Reverb for effects and width** (0.1.100, Two Layers): What is moved to the back gets its own reverb (same impulse response, left and right convolved separately – out-of-phase effects do not cancel each other out), without bass, −12 dB below the dry portion (from 0.1.101), follows the Intensity control. Intensity fully to the left = reverb off (room reverb and effect reverb; the early reflections stay quiet). Smooths the onsets and makes the portions at the back more diffuse. "Monitor → Effects" includes this reverb. - **Two Layers calmer** (0.1.99): Effects/width smoothed across adjacent third-octave bands plus a broadband portion (no single frequencies that stick out at the back or are missing at the front), tracked more slowly (width in 350 ms, out 2.5 s; foreground threshold −18…−8 dB), ducking of the room layer at most −3 dB and slower, all-pass diffusion of the effects removed (caused cancellations at the listening position). - **Width to the back** (0.1.98, Two Layers): What is in the foreground, similarly loud on both sides but barely correlated – wide vocal doubles, Leslie organ, wide synths – is moved in a dosed, dry and bright way to the back on the same side (own control, default 40 %). Quiet reverb tails and vocals with reverb remain untouched (comparison with the long-term level per third-octave band). - **Two Layers without chirping** (0.1.97): Effects and center are decided per third-octave band instead of per frequency bin, tracked more slowly (in ~120 ms, out ~500 ms) and spread softly across frequency; the effects at the back are slightly diffuse (all-passes). Less reverb slips into the effects layer. - **Spatial audio method "Two Layers"** (the only method since 0.1.118): Frequency analysis with 2048 points. **Room** (uncorrelated content) is copied to the back – decorrelated (all-pass chains, left/right different), delayed by 12/17 ms (stage stays in front), attenuated at the top and bottom, plus the reverb tail. **Effects** (out-of-phase and very hard-panned portions) are moved to the back – power-preserving, dry, without delay, full highs; hard-panned content moves at most toward the side. "Effects to the back" control (preset is weighted in). In the "Monitor" menu: All / Front / Room / Effects (only applies while the menu is open). - **"No match – leave as is"**: Albums that do not exist on MusicBrainz can be marked individually (detail panel) or in bulk. They stay with their file tags, disappear from "Without MusicBrainz" and appear under "Own, left as is"; from there, "Treat as open again" takes them back. If an album is matched after all later, the marking disappears by itself. - **Switching the edition on MusicBrainz**: Tracks without a file that do not appear in the newly chosen edition (remnants of the old track list) are removed when applying – the album then no longer wrongly counts as incomplete. Tracks with a file are always kept. - **New library administration**: status tiles at the top (scanning, artist images, metadata), below them three areas – *Albums*, *Tools*, *Anomalies*. Albums: on the left views with counts (All, Without MusicBrainz, Without cover, Multiple editions, Incomplete) and narrowing by format/decade, in the middle the table with selection boxes, letter groups and "Load more", on the right a detail panel with quick actions. Select several albums → "Fill gaps from MusicBrainz" (linked albums only, empty fields only). "Match metadata" is now under Tools. - **Smooth fade-in and fade-out animations** for all dialogs (including EQ) and the spatial audio menu. - **Small fades** on start, pause and resume (approx. 150–220 ms). With automatic track changes and gapless playback everything stays untouched; with a locked screen they are skipped. - **Match metadata** (Administration → Settings): fetches everything that is missing from MusicBrainz – release date, country, barcode, format, status, label with catalog number, cover, first release and genres –, but only for editions with a MusicBrainz link. In batches with progress, can be paused and resumed. Only what is missing is added: existing data, anything entered by hand and protected fields stay untouched. - **Edit and delete editions**: On the album page, each edition in the "Editions" box has a ⋯ menu (edit, track list, contributors, cover, match with MusicBrainz, "Show this edition", delete). "Edit edition" now also knows version name, format, barcode and multiple labels with catalog number. **Deleting** moves the files to the trash in the music folder (`.amberwave-papierkorb//geloescht/…`, kept for `AUFRAEUMEN_PAPIERKORB_TAGE`) and removes the edition from the library; if no music is left in the folder afterwards, cover and extras go with it. If it is the last edition, the album disappears. Editions without files (from MusicBrainz only) are removed without the trash. - **Phone feels like an app**: Height follows the visible area (without the address bar), no rubber-band pulling, no more sideways shifting caused by the A–Z bar. - **Direct access on the home network (like Plex)**: At home, the music comes directly from the server instead of via Cloudflare – for this, Amberwave obtains a Let's Encrypt certificate itself (DNS challenge via the Cloudflare API, no open port, works behind CGNAT) and is additionally reachable on the home network at, for example, `https://lokal.musik.example.de:8443`. At start-up and on every network change, the app checks whether this address responds and then fetches streams directly (with a short-lived stream key); if it drops out (leaving the house), playback continues without interruption via the normal route. Counts as "at home" for quality. The signal path shows "direct on the home network" or "over the internet". The certificate is renewed automatically 30 days before expiry. At home, almost everything then runs directly: music, downloads, WAV exports, covers and artist images, impulse responses and all API data (pages, search, favorites, saving …). Only the first load of the page, login/logout and fetching the direct key (every 4 hours) still go over the internet. The key is bound to the user and device; if the direct address drops out, the app immediately repeats the request via the normal route, and images are then reloaded normally as well. Under "Direct access on the home network" the automatic renewal can be switched off (`DIREKT_AUTO_ERNEUERN=0`) and "Renew now" is available at any time; if the Let's Encrypt account is no longer valid, a new one is created automatically. - **Activity (Administration → Activity)**: who is listening to what right now – live every 5 seconds: track with cover and progress, user, device (browser/app, phone/desktop, IP), quality (original bit-perfect/lossless or Opus/AAC from which source), gapless, EQ, spatial audio, approximate data rate and the route: **direct on the home network**, **at home via Cloudflare** or **on the go**. At the top the totals, including running conversions (ffmpeg) and data rate over the internet. A device only appears once something is really being played there (a merely loaded queue does not count). Closed tabs disappear immediately or at the latest after 90 seconds without a sign of life, paused playback after `AKTIVITAET_PAUSE_MINUTEN` (default 10). - **Volume matching according to EBU R128**: The server measures every track in the background with ffmpeg (integrated loudness, loudness range LRA, sample and true peak) and stores the loudness of all 400 ms blocks as a histogram. From this, each album is calculated **exactly as a whole** (gating across all blocks of all tracks, not the average of the tracks). During playback: tracks that follow each other directly in the album all get the same **album gain** – including two consecutive album tracks in a playlist –, everything else gets the **track gain**. Target value per device (default −16 LUFS, `LAUTHEIT_ZIEL`), gain is applied only up to −1 dBTP true peak (`LAUTHEIT_DECKE`), no limiter, no compression. With Opus/AAC the server factors the gain in before encoding (in gapless chains sample-accurately per track), with original via Web Audio (planned ahead at the track boundary) or, without Web Audio, via the volume (then only attenuation). "Off" in the profile = bit-perfect. The signal path shows e.g. "Album gain −6.2 dB: −9.8 LUFS → target −16 LUFS". Tracks not yet measured temporarily use existing ReplayGain tags. The album page shows LUFS, LRA, PLR (dynamics), true peak and the loudness per track (chart with a fixed scale, linked to the track list, which additionally shows LUFS per track); in the player footer a chip shows the gain ("A +2.6" = album, "T −4.1" = track) with a quick menu for Off/target value. These statistics exist only on the PC, on the phone the interface stays plain. Administration → System shows the progress of the analysis (`LAUTHEIT_PARALLEL` measurements at the same time). Changed files are automatically re-measured when scanning. - **Quality dot** (player bar, "Now Playing"): green as long as playback is no worse than the file – loudness, EQ, spatial audio, volume and Web Audio do not count. Orange only for Opus/AAC or sample rate conversion in the browser. At the bottom left of "Now Playing" a line ("Original · gapless · Album +2.6 dB"), a click opens the analysis. - **Transition bar ⇄ "Now Playing" (PC)**: The view grows out of the player bar upward; its controls move to their new place in the process, Play gets bigger, the sound icons appear staggered from the inside out, on the left the track changes to the signal path. Closing runs backward. On the phone the view slides in from below. - **"Now Playing" (large cover)**: On the PC, to the left and right of the button row are the sound icons EQ, Surround (preset menu), Loudness (quick menu for Off/target value) and Analysis – off with just the name, active orange with a value ("EQ on", "Room 5.1", "+2.6 dB"). The menus (Quality, ⋯) now also open in this view – before, they lay invisibly behind it. In the ⋯ menu (also on the phone) there is additionally "Match volume …". - **Analysis (PC only)**: Button with the curve in the player footer or key **A** (also N). Slides out like a drawer under the player bar and pushes bar and page upward (nothing is covered; also in "Now Playing"). At the top the signal path as a chain File → Transmission → Loudness → Sound → Output (green = unchanged, blue = intentionally adjusted such as loudness/EQ/spatial audio, orange = quality loss: Opus/AAC or the browser converts the sample rate) with quality selection, below it: Loudness curve of the current track (momentary 400 ms, short-term 3 s, true peak per 0.2 s, integrated loudness, target value, −1 dBTP limit) – switchable "as mastered" / "after matching", with playback position, values under the mouse and click to seek; plus a "Now" display for M/S/true peak at the current position, a **spectrum like in a DAW analyzer** (Web Audio after EQ/spatial audio, FFT 16384, logarithmic axis, 1/24-octave smoothing, switchable Stereo / L+R separate / Mid+Side, peak hold, tilt 4.5 dB/oct; mouse shows frequency, note with cents and level, click freezes a frequency, mouse wheel zooms, double-click shows everything again), **meters** to switch between – *Digital* (peak/RMS per channel with hold value and maximum value, click resets; loudness M/S/I with target; correlation L/R) or *VU vintage* (illuminated scales, sluggish analog needle, ~0.5 s with slight overshoot, peak LED from −2 dBFS). Default scale **Loudness**: the needle shows the K-weighted loudness per channel (400 ms, like EBU R128 momentary, measured live) relative to the target value – 0 VU = target (e.g. −16 LUFS), +2 = 2 LU louder. By clicking the line below it, classic is also available (rectified value, unweighted): Auto (0 VU 3 dB above the track loudness) or fixed −14/−18/−20 dBFS. Momentary and short-term in the digital meter are likewise measured live (same K-weighting), integrated comes from the track measurement. Measuring point of all meters and of the spectrum: after EQ, spatial audio and loudness matching, before the volume – the same for every format (the matching gain sits in the browser before the measuring point or, with Opus/AAC, is already in the stream). With quadro and 5.1 the meters show all channels (Digital: L/R wider; VU: all as instruments, with 5.1 all six, scale with +6 dB headroom). Meter type and spectrum settings are remembered by the device. Also all values: track/album (LUFS, LRA, true/sample peak, PLR), matching, file (name, format, bitrate, size, ReplayGain tags) and playback (stream, engine, route, buffer, Web Audio rate and latency, EQ, spatial audio). The curve is saved along with the loudness measurement; tracks that were measured before are briefly re-measured by the view when first opened (or "Re-measure everything" under Administration → System). - **My Radio (learns along, without thumbs)**: Home → "My Radio", or "Radio" on tracks, albums and artists. Picks from the whole collection: your favorites, what goes with them (same artist, shared contributors from MusicBrainz, genre, era, what the family often listens to directly in sequence) and every fourth track is new to you. Learns only from listening: heard completely (+), half (+ a little), skipped early (−−), skipped late (− a little), repeated in quick succession (+ extra), heard on many days (+), favorites; everything fades over time (half-life 45 days). Variety: not the same artist in quick succession, no album twice, tracks just heard are blocked for 6 hours, versions of the same recording count as one song. "Now Playing" shows why a track is playing ("because you like Toto", "New for you · Jazz" …). Refills by itself. Everything stays on your server. - **Playlist as one long WAV (e.g. for the mixing console)**: Playlist → ⋯ → "Export as WAV" (or in "Now Playing" → ⋯ → "Export queue as WAV"). Result: WAV 16-bit stereo, 44.1 or 48 kHz, with a plain 44-byte header – exactly what the USB player on the X32 plays, without the gaps between individual files. Options: match volume (albums as a whole / per track / unchanged, target value), transition (seamless, pause 1–3 s, crossfade 2–6 s with equal power), remove silence at the start/end (below −60 dBFS). Tracks that follow each other directly in the album always remain seamless. Sample rate conversion with SoX (if available in ffmpeg), at the end TPDF dither once to 16 bit. Above 4 GB (approx. 6 hours) it is split into several files at track boundaries (FAT32 limit). Plus a track list with start times as a .txt. Runs in the background (approx. 100× real time), the files are afterwards located under Profile → WAV exports and are deleted after `EXPORT_AUFHEBEN_STUNDEN` (default 48). Only if downloads are allowed (`DOWNLOADS_ERLAUBT=1`) or for admins. #### Setting up direct access 1. In the compose file, under the `app` service in `ports:`, add a second line: `- "${APP_BIND:-0.0.0.0}:${LOKAL_HTTPS_PORT:-8443}:8443"` (a separate port next to the app port, e.g. 9950 for the app and 8443 for direct access) (home network only – nothing is forwarded in the router). `APP_URL` must be set in the .env. Apply the update and restart the stack once (the start script switches on HTTPS in the container). 2. At Cloudflare under My Profile → API Tokens, create a token with the template "Edit zone DNS" for your domain. 3. Administration → System → "Direct access on the home network": enter the token, check the name (suggestion `lokal.`) and the IP of the Unraid on the home network, "Set up". Afterwards reload the page once. 4. The first time, Chrome may ask whether the site may access devices on the local network – allow it. If the router has DNS rebind protection, add the name there as an exception. If it does not work, "Check from this device" shows the cause: page not yet reloaded, network/DNS/port/certificate, `APP_URL` does not match the address being accessed, or Chrome is blocking access to the local network. The direct address also works if the app is opened on the home network via the server IP (e.g. `http://192.168.1.10:9950`). If you prefer to use your own reverse proxy: `DIREKT_URL=https://…` in the .env fixes the direct address (without the automatic certificate handling). ### Not yet included (v0.2) Sound profile in the interface (moods, Discogs styles, tempo for album and track, tinted background in "Now Playing", mood radios), Windows player (with VST), German Wikipedia texts with AI translation, Lidarr requests, writing tags back into files, offline listening. The fields for these are already prepared in the settings. - Quality in the download search: format, bit/kHz, bitrate, source and channels from release name or category, filters Hi-Res/Lossless/Lossy (0.2.11) - More precise download search: only hits with all search words (whole words, accents ignored, AC/DC = ACDC), "exact phrase" and exclude, video/audiobook/non-music removed, duplicates across indexers merged, sorted by relevance; irrelevant items removed with one click, with reason (0.2.12) - Pause fade-out without brief ringing: volume stays down after the pause until playback resumes (remainder in tube/tape/spatial audio stays silent) (0.2.13) - Downloads with artist search via MusicBrainz: choose artist → discography with covers, filters (albums, EPs, singles, live, compilations), "In the library" marking → click searches "artist album" on Usenet; "Search everything by …" (0.2.14) - Download hits sortable by relevance, age, size and popularity (a second click reverses the direction, the choice is remembered in the browser); on the phone size and age in the subline (0.2.15) - The download folder is never scanned, even if it lies inside the music folder (recognized by device + inode, independent of the path in the container) – no more duplicate albums; duplicates already scanned disappear on the next scan (0.2.16) - Tidying up the download folder: after a verified copy the original is deleted (new default, download folder now mounted writable); originals of already imported downloads are deleted retroactively as soon as every music file is in the library with the same size (0.2.17) - "Edition already linked" fixed: if the other edition has no files left (e.g. the earlier duplicate from the download folder), the new one takes over the MusicBrainz link; listening history, playlists, favorites and resume listening move along. Real duplicates (both with files) remain reported (0.2.18) - Protection against a wrongly mounted download folder: if DOWNLOAD_PFAD is the same folder as the music folder or the import target (e.g. Music/Downloads), nothing is skipped, nothing imported and nothing deleted; clear notice in the downloads (0.2.19) - Scanning and tidying up never run at the same time anymore (the scan waits until the current album has finished moving); playback follows moved files across several moves and records the new location immediately (0.2.20) - Safer tidying up: before every move the plan is recalculated – if the album has changed since approval, nothing runs and it must be approved again; approvals expire after AUFRAEUMEN_FREIGABE_STUNDEN (12); existing approvals were reset during the update (0.2.21) - Smooth download flow: imported albums are sorted into place by themselves according to the scheme after the MusicBrainz match (DOWNLOAD_EINSORTIEREN=1; unrecognized stays in the download target); tidying up marks albums "without MusicBrainz" and leaves them out on "Approve all"; self-check of the download setup (folder, separation, write permissions, SABnzbd path) with concrete .env hints; "You already have this" before fetching with "Get anyway"; "Search for another release" for failed jobs (0.2.22) - Take over missing tracks from another album (track menu → "Take over from another album …"): suggestions with the same recording or the same title by the same artist, free search across title/artist/album; the file is copied into the album folder, named according to the scheme and given the tags of the target album, with notices for worse quality or deviating length (0.2.23) - Taking over tracks also from WAV, AIFF, WavPack and APE: losslessly converted to FLAC while copying (bit-perfect, verified by MD5 over the samples) and then tagged (0.2.24) - Download import converts WAV and AIFF losslessly to FLAC (tags are carried over, samples checked by checksum); can be switched off under Settings → Downloads or DOWNLOAD_WAV_ZU_FLAC=0 (0.2.25) - AmberIron – transformer emulation between Glow and Silk: saturation in the magnetic flux (acts almost only in the bass, odd harmonics), cores nickel/steel/iron, levels Hint/Full/Heavy, sheen and amount; HQ with Rayleigh hysteresis (reversal-point memory, fine distortion on quiet signals) and 2× oversampling; auto-gain and loudness reference like Glow/Silk; TRAFO_VORGABE, TRAFO_KERN, TRAFO_BEZUG_LUFS (0.2.26) - Glow and Silk without treble loss through oversampling: Kaiser filter (161 taps) instead of Blackman (57) – previously −7.7 dB at 20 kHz, now linear up to 21 kHz (48 kHz) or −0.2 dB at 20 kHz (44.1 kHz); Glow tone 0 is now really neutral (0.2.27) - Silk HQ: hysteresis with inner 2× oversampling (8× in total, half-band filter 25 taps) – alias products on loud high tones from −55 to −80 dB; wow-and-flutter delay integer-valued and cubically interpolated (at 44.1 kHz previously −8.5 dB at 20 kHz, now −0.95 dB); hysteresis calculation with tables and without closures (0.2.28) - Artist, album and track radio stay with the style of the seed: seed profile from genres, genre families, era and contributors, candidates need a minimum similarity (relaxed in small collections), distant decades dampened, own preferences only as fine sorting; reason "in the style of …" (0.2.29) - Artist radio rethought: two thirds from the artist themselves (your favorites first, never the same album twice in a row), in between fitting tracks by others as a mix; share via RADIO_KUENSTLER_ANTEIL (30–100 %) (0.2.30) - Artist radio plays only the artist by default (RADIO_KUENSTLER_ANTEIL=100); when their tracks are used up, it starts again from the beginning, reshuffled, instead of filling up with tracks by others (0.2.31) - Genre radios stricter: family radio only with songs whose strongest family it is (from 40 %) or that reach 55 %; single genre only via track genre or an album genre among the two strongest from 35 %; pure representatives play first, borderline cases less often; too few songs → automatically the relaxed rule; RADIO_FAMILIE_MIN, RADIO_FAMILIE_SICHER, RADIO_GENRE_MIN (0.2.32) - Sound family recalculated physically (High-Quality): AmberGlow HQ is now a true 12AX7 stage (Koren model, solved as a circuit per sample: plate resistor, cathode bypass capacitor, coupling capacitor, grid current with operating-point drift, power-supply filtering; character = operating point hot → cold) with 8× oversampling, standard mode with antiderivative antialiasing; AmberIron as a core model with source resistance (source: auto/low-impedance/studio/tube, HQ with play hysteresis and tolerances); AmberSilk according to the datasheet with tape type (SM 900, 456, SM 468) and equalization standard (NAB/CCIR) – BAND_SORTE, BAND_NORM; all three: frequency response 40 Hz–20 kHz within ±0.3 dB (Glow) or flat to the edge, alias products at 15 kHz −3 dBFS below −75 dB, verified with testtools/effekte_pruefen.js (0.2.33) - Oversampling of the sound family follows the sample rate of the device: target internal rate ~192 kHz (default) or ~384 kHz (HQ) – 4× at 48 kHz, 2× at 96 kHz, none anymore at 192 kHz (Iron: 2× up to 75 kHz); Silk's residual treble loss is now sample-rate-independent (a pole above Nyquist was swallowed at 48 kHz), Silk standard with ADAA treble compensation; test suite passes at 44.1/48/96/192 kHz (0.2.34) - Import unsorted music (Administration → Library → Unsorted): put files into the intake folder (SORTIEREN_ORDNER, default `_unsortiert`, never scanned normally), each file is recognized individually by fingerprint (AcoustID with release groups and track positions), then assembled step by step into albums (share of the release, studio album before EP/single/compilation, own artist before Various Artists, existing albums are preferably completed); preview with album cards, "also fits …", duplicates (best quality stays, the rest goes to the trash), "already in the library" (a better version can replace the existing one), unrecognized with manual search on MusicBrainz; only after "Apply": staging area (SORTIEREN_ZWISCHEN), tags with MusicBrainz IDs, scanning, linking with fixed track assignment (also for Ogg/WMA without tags), tidying up to the final place; SORTIEREN_SCHWELLE, SORTIEREN_DUBLETTEN (0.2.35) - Sorting assistant, duplicates: the better version is always kept – first complete (truncated files, more than 3 s shorter than the longest, lose in every format), then better format/bitrate, then longer, then larger; "replace with better version" in the library only if the new one is not shorter (or the existing one is truncated); duplicate list shows length and "truncated" (0.2.36) - Phone like an app: no zooming by two-finger gesture or double tap (also Safari/iOS), no sideways shifting; phablet/unfolded foldable phone with smaller tiles: 4 columns from 600 px, 3 from 481 px, 2 only on normal phones (0.2.37) - Effects rack: all sound devices in one view – on the PC as a flyout on the player bar and as a large 19″ rack in full screen, on phone/tablet as expandable cards; Glow, Iron, Silk and EQ movable by handle (the order is the signal path, re-patching with a short crossfade), input/Space/output fixed; on/off per device, own presets per device and for the whole rack in the account (on all devices, `PRESETS_MAX`), A/B comparison and "bypass all"; analog coloration meters per channel from real measurement in the worklets (distortion like THD+N), input/output digital with live loudness; EQ with analyzer before/after, draggable points and bell/shelf for lows and highs, gain always automatic; AmberSpace with a list of impulse responses and LFE crossover 60–250 Hz in 10 Hz steps (0.2.38) - Effects rack: A/B as a preset comparison – B starts as a copy of A, choose a different preset in B and switch; a comparison line shows what is in A and what is in B (e.g. "Glow Warm" against "Glow Ember", also order and off/on), tapping switches over, ✕ ends the comparison (0.2.39) - Effects rack: the sound buttons of the player bar each open a flyout with only that device (on the phone as a sheet from below), new "Rack" button opens the whole rack in full screen; digital meters show the peak level −60 … 0 dBFS with scale and red clip lamp, loudness values in fixed width; coloration meters with analog inertia (spring-mass, ~300 ms, slight overshoot); EQ analyzer as real-time analysis in 1/24 octave, each frame new and smoothed; in the large rack again tube (glows with the coloration), transformer core and tape reels (turn with the tape speed) (0.2.40) - Effects rack: every device has its own A/B button (compare two presets of one device, independent of the rack A/B); AmberSpace up front with buttons for room (Subtle, Room, Hall, Live) and strength (Subtle, Wide, Intense), the impulse responses in their own selection menu; input meter shows the level after the loudness compensation; EQ preset in the large rack directly below the name (0.2.41) - Player bar: “Effects rack” button more prominent: its own pill with a label next to the sound buttons, amber border with a slight glow (0.2.42) - AmberIron: “Distribution” control as with Glow and Silk (transformer only in the center … equal … only on the sides, mixed in center/side); coloration meter with “THD” on the scale (0.2.43) - Effects rack: percentage values under the coloration meters removed – the needle shows it (0.2.44) - Switch effects without a gap: when switching on/off, changing the order and bypass, the new chain starts up in parallel and is crossfaded over the old one in 60 ms at constant power (previously briefly silent) (0.2.45) - AmberSpace in the rack: impulse responses in submenus by type (chamber, room, hall …), its own “Custom” submenu (if any exist) and “Upload custom impulse response …” directly in the menu; the “Impulse response” label no longer overlaps the field; selection menus with submenus stay at the anchor (0.2.46) - Equalizer with a second “Passive” mode (switch in the EQ, Precise | Passive): the same four bands, but calculated like a passive mastering EQ – bands in parallel in the network (adding up as voltage: two overlapping +6 dB ≈ +7.6 dB instead of +12), cuts reciprocal, bells wider at the bottom and with a swing depending on the bandwidth (broad only ≈ 65 % of the dB value, narrow full), shelves with a Pultec edge (small bump before and dip after the corner frequency, Q = “Edge”); solved exactly as an analog network (zeros numerically, up to 8 biquads, bilinear with prewarped frequencies), EQ worklet now 8 sections; the mode is stored in presets and rack presets (0.2.47) - EQ modes are now called “Digital” and “Analog” (0.2.48) - EQ: bands that were individually switched off in the old EQ dialog work again – the rack has no switch per band, so they stayed invisibly muted there (bass/treble reacted to nothing) (0.2.49) - EQ Analog: Proportional Q – bells get wider at low gain and as narrow as set at high gain (Q 0.7: 1 dB ≈ 2.8 octaves, 15 dB ≈ 2.1 octaves), shelf edges get steeper with gain and their bump more pronounced; boost and cut remain mirror images (0.2.50) - Player bar: “Effects rack” button toggles – if the rack is open, it closes it (lit while it is open) (0.2.51) - AmberSpace: “Rear delay” control 0–20 ms in 1 ms steps as the last stage in the upmixer (Ls/Rs only, adjustable smoothly) – moves the stage forward via the precedence effect, also for shifted effects/width; default for new devices `RAUMKLANG_REAR_DELAY` (default 0); `RAUMKLANG_LFE_TRENNUNG` now allows 60–250 Hz in 10 Hz steps (0.2.52) - Effects rack: delta button “Δ” on Glow, Iron and Silk – you hear only what the device changes (wet minus dry at the same level, fades over in 20 ms, calculated in the worklet); only one device at a time, marked blue in the signal chain, ends when the rack is closed and when the device is switched off (0.2.53) - Effects rack: delta now cancels cleanly – instead of “wet minus dry”, only the nonlinear portion is played (the characteristic curve against its straight line, downsampled the same way, at input level and through the same post-filters); linear tonal coloration (tone control, equalization, head bump, treble loss, shelving) and delay offset drop out, quiet passages are almost silent in the delta (0.2.54) - Windows client (phase 2, first stage): its own folder `windows/` (today `windows-client/`) – Electron shell around the web app plus audio engine in C (WASAPI exclusive, bit-perfect, gapless, sample rate follows the file, volume/leveling with dither only when necessary); finds the server on its own in the home network (search on the Amberwave port, new IP is recognized again), address by hand as an emergency exit; output device and exclusive mode under Profile & Playback; server: `/ping` returns name and public address (`CLIENT_SERVERNAME`), `/stream/{id}?art=flac` delivers every format as FLAC (0.2.55) - Windows client 0.1.1: playback mode “Shared” (default, other programs remain audible) or “Exclusive” (bit-perfect) as a choice under Profile & Playback and as a quick switch in the player’s quality menu; switching reopens the device immediately (0.2.56) - Renamed to “Amberwave Windows Client” (an Amberwave Windows Server of its own will follow later): project folder `windows-client/`, program “Amberwave Client.exe”, package `Amberwave-Windows-Client-.zip`, settings under %APPDATA%\amberwave-client (0.2.57) - DSP in C (folder `dsp/`): Glow, Iron, Silk and EQ sections as a platform-independent C library – same calculation as the worklets incl. HQ, mid/side, coloration measurement and delta; automatically checked against the JS originals (36 cases, 44.1–192 kHz, mono/stereo/5.1, deviation ≤ −168 dB, Iron and EQ bit-identical), 2–3× faster than JavaScript; not yet built into the Windows client (0.2.58) - Default port 9950 everywhere (docker-compose, .env.example, client search and setup). Windows client 0.1.3: exclusive mode is tried directly, even if the driver answers the advance query in the negative (some USB interfaces); if exclusive mode is blocked in Windows, the notice says so, including the way to the setting, otherwise with an error code (0.2.59) - Quality indicator in three levels: green dot with ring = bit-perfect (file unchanged to the interface, Windows client exclusive only), green = sonically unchanged (only level at 24/32 bit, shared without conversion), yellow = changed (lossy, conversion, effects, downmixing, level at 16 bit). Windows client 0.2.0: Glow, Iron, Silk and EQ run in the engine (C library dsp/), effects rack, meters and analysis page work in the client; loudness leveling per track sample-accurate at the track boundary; Space follows (0.2.60) - Silk (HQ), wow and flutter: the treble no longer “breathed” with the wow – the modulated delay is now interpolated band-limited (Kaiser sinc, 32 points; previously cubic, up to −7 dB at 16–20 kHz depending on the fraction of the sample). With mix below 100 %, the dry path runs through the same modulated delay, otherwise the mix combed like a flanger (up to 15 dB fluctuation). Same in browser and Windows client (client 0.2.1) (0.2.61) - Windows client 0.3.0: AmberSpace now runs in the client too – the web app builds the Space graph as in the browser, the engine recalculates it (upmix, convolution, filters, bass management; checked against Chromium) and opens the device with 5.1 or quad. In the administration (activity, devices) the client appears as “Computer name · Windows Client” instead of “Chrome on Windows”; the device name is also updated for existing logins (0.2.62) - Windows client 0.4.0: ASIO – drivers appear as “ASIO · …” in the device list, playback bypasses Windows, bit-perfect at the sample rate of the file, 5.1 on outputs 1–6 (L, R, C, LFE, Ls, Rs); driver window from the profile and quality menu. In the client, the header is the title bar (app color, Windows buttons on the right). Quality indicator: duplicate “bit-perfect” in the notice removed (0.2.63) - Windows client 0.5.0: on a rate change, ASIO only switches over instead of reloading the driver. New setting “Sample rate at device”: follows the file (bit-perfect) or fixed 44.1 … 192 kHz – then Amberwave converts cleanly (residual below −145 dB), the interface never switches and rate changes stay gapless; indicator then yellow. Large player view and effects rack match the title bar (dragging, room for the window buttons, matching color – also in the installed PWA) (0.2.64) - Windows client 0.6.0: pause and resume fade out and in sample-accurately in the engine (also reversible in the middle of the fade), then playback continues exactly at the same spot. After a rate change (exclusive/ASIO) the engine waits until the device demonstrably runs evenly at the new rate (3 s at most), plus an adjustable pause (default 250 ms, 0–2 s); the startup time is shown in the analysis. Progress bar no longer jumps to the start when seeking. Narrow scrollbars in the color scheme, the side bar only in the area between header and player (in the client only clearly visible when scrolling); album page no longer drawn twice after the fullscreen player. Downloads: watchdog for hanging jobs (DOWNLOAD_HAENGT_MIN, DOWNLOAD_WEG_MIN – at 100 % or in post-processing, existing files are adopted) and, on request, a menu item of its own, “Downloads” (DOWNLOAD_REITER) (0.2.65) - Windows client 0.6.1: seeking in converted tracks (AIFF, WAV, MP3 … – they arrive as FLAC without a seek table) now lands at the right spot instead of at the start, also when resuming from a position. ASIO no longer crackles: driver buffers are cleared before every start (some drivers otherwise played a remnant from the last time), on track change, seeking and stop the running music fades out over 10 ms instead of cutting off, and a new spot in the middle of a track is faded in over 5 ms (0.2.66) - Windows client 0.7.0: with ASIO the interface now keeps running – track change, seeking and pause without stopping and restarting the driver (no more ghost samples from its internal buffers, faster seeking); it only stops on a rate change, beforehand silence of the length of the reported driver latency (shown in the nerd panel). Effects start fresh on track change and seeking. The engine plays WAV/AIFF directly as the original. Download as a self-extracting exe (LZMA, unpacks next to itself) with the Amberwave icon everywhere. Library: convert lossless tracks (WAV, AIFF, ALAC) to FLAC via the album menu or under Tools – same bit depth and rate, audio verified before replacing, originals go to the trash (0.2.67) - Dialogs: Enter now confirms everywhere – always triggers the main button (Save, Yes, Delete …), even if the focus is on “Cancel” or the X; previously Enter in an input field could hit the first button, “Cancel”. Exceptions are multi-line text fields and controls in the dialog that use Enter themselves (0.2.68) - Settings reorganized: one page for everything (top right in the user menu or under “More”). Personal: Account (profile picture, name and password via a small window, naming and signing out devices), Playback, Windows output (client only). Server, admins only: Library & Automation, Services & Keys, Downloads, Email, Access & Network, Rooms, Backup & Update. One row per setting with its origin (“in the app”, “default”, “from the .env” – locked until it is set in the app); server values collect in a “Discard · Save” bar, even across several sections. Search across all settings jumps straight to the row. New user menu with picture, device name, connection and output path. The administration keeps the security log (old addresses redirect). Surround and effects are set in the player. Surround is active immediately after the Windows client starts (waits for the device’s channel count, switches on as soon as the device reports surround). FLAC conversion in the album menu starts without a window in the background; the result arrives as a green or red message – also on other pages and after reloading (0.2.69) - Windows client 0.7.1: rate change with ASIO significantly faster – if the driver demands a restart after switching (e.g. Focusrite), Amberwave only recreates the buffers instead of reloading the driver completely (sound and position are kept). The device is ready as soon as the driver’s sample position runs at the new clock; at the latest 1.5 s after the start it begins (previously 3 s). “Pause after switching” up to 5 s and remembered per output device, next to it the most recently measured startup time; the nerd panel shows what the driver did when during the last switch. Effects rack: selection lists show name and description on two lines (0.2.70) - Windows output redesigned (Windows client 0.7.2): at the top the signal path as a stage – file → engine → driver → device, live with sample rate, format at the device, latency and dropouts; with ASIO and exclusive, “Windows Audio” hangs below struck through as bypassed, with shared the Windows mixer stands in the middle of the path. Devices grouped (ASIO first, then Windows), rename and hide per device (remembered in the client, hidden ones collected at the bottom). Pause after switching with a bar from measured startup time and pause; default for ASIO devices now 2 s (0.2.71) - ASIO outputs (Windows client 0.8.0): any number of outputs per ASIO driver – stereo, quad (L R Ls Rs) or 5.1 (L R C LFE Ls Rs) on freely selectable channels of the interface, with name and icon; without setup “Stereo · channel 1/2”. “Outputs & Speakers” window on the driver card: layout cards with top view, channel assignment with the real names of the driver outputs (collapsed from 11), test tone per speaker (pink noise, −20 dBFS, 2 s), room sketch with output numbers; “Separate subwoofer” (2.1/4.1) prepared, comes with bass management. Every output is a device of its own, quick selection in the player’s quality menu and in the account menu; switching between outputs of the same driver without reloading and without a pause (briefly faded out and in, also at a fixed sample rate), volume remembered per output. Stereo plays on a 5.1 output bit-perfect on L/R, Space distributes to all speakers (0.2.72) - Windows output: signal path diagram airier – smaller fonts in the stations, more even columns, names no longer wrap in the middle of a word (0.2.73) - Settings at 1200 px width (fits 1280 screens); in the signal path the texts sit at the top left in the stations, stations wider, the self-assigned name of the ASIO device appears in the diagram (0.2.74) - Signal path of the Windows output new (version B): four equally sized boxes file → engine → driver → output with the most important value in monospace, output with icon, name and channels; glowing connections with a light pulse during playback, format on the line to the driver station; below it a bar with “Windows Audio bypassed” and sample rate, format, latency, dropouts. Fixed dimensions, nothing jumps when switching. Adapts to the available space: from 900 px of content in one row, below that 2 × 2, on the phone stacked with vertical arrows (0.2.75) - Player bar (and tabs/nerd bar) reach to the right edge of the window: the scrollbar gutter continues painting the edge and surface of header and player, no more stripe on the right (0.2.76) - Windows output on the phone (under 560 px of content) reduced to the essentials: path and status, below that file · driver · output with one value each; engine, arrows, explanatory texts and values bar are omitted, dropouts appear only if there were any. Driver card wraps, “Outputs & Speakers” as a row of its own (0.2.77) - Foldable phones and phablets in two columns: if the browser reports a fold (Chrome on Android foldables) or it is a touch device with 600–1023 px and nearly square, the layout is split at the middle – header: logo and back on the left, on the right where you are and the account (search via the tab); player as a fixed bar, on the left the track, on the right Back · Play · Next centered with timeline; tabs centered per half (Home · Albums · Artists | Search · More); tiles in an even number of columns, the gap lies on the fold; settings: the sections on the left, the section on the right. Can be forced for trying out with localStorage aw_haelften = on/off (0.2.78) - Foldables: wordmark next to the logo omitted (as on the phone), settings with a wider right column (2 : 3) (0.2.79) - Player: heart (remember track) and new stop (halt, to the beginning) sit in the controls – bar and “Now playing” identical: Heart · Shuffle · Back · Play · Next · Repeat · Stop. “Now playing” at the top: Playing from album, below it album · year and the album artist, cleanly centered. Sound and Technology new for phone, tablet and foldables: Sound as a list with level and switch per device (tapping opens the effects rack), loudness with bar; Technology with path file → transmission → device and six values, signal path expandable in detail. On foldables the player on the left, on the right Up next · Contributors · Sound · Technology permanently open. On narrow PCs (up to 1399 px) loudness/analysis in the button row are omitted, signal path and volume sit level with the timeline (0.2.80) - Updates arrive completely: all JS modules now run through an import map with their own version parameter (allowed via CSP hash). Previously, lazily loaded modules could stay old via browser or Cloudflare caches while CSS and app.js were already new – e.g. heart/stop were missing and the right half on the foldable stayed empty. Folding the foldable open/closed with “Now playing” open fills the right half immediately (0.2.81) - Foldable: the right half of “Now playing” has a darker background from top to bottom. Narrow displays (phone up to 480 px, left half on the fold): controls in two rows – large Back · Play · Next on top, below Heart · Shuffle · Repeat · Stop (0.2.82) - “Now playing”: quality chip plain (format · bit-perfect/unchanged/changed, the whole path in the tooltip), on the foldable at the bottom center of the left half. Tabs in the sheet: Up next and Contributors with text, Sound and Technology as an icon. “Playing from …” at the top exactly centered on PC – also in the Windows client with the window buttons on the right (0.2.83) - **Record crate in “Now playing”**: Instead of a single cover, the queue lies there as a row of covers to flip through – in the middle the track you are looking at, on the left played ones (darkened), on the right upcoming ones. Covers with thickness, edges and a slightly blurred reflection; the playing track is slightly raised. Swiping, mouse wheel, ←/→ and tapping only flip, the title line then shows “Up next” / “In n tracks”; only a double tap on the cover (on PC also Enter) switches the track. After 6 s without touch (or Esc) the crate jumps back. Foldables: a button in the header slides the right half out – then the crate is as large as on the tablet (remembered). (0.2.84) - **Foldable devices**: detection in a module of its own (falz.js) – now also listens for posture changes without a size change (Viewport Segments, Device Posture, return to the app), “Now playing” follows immediately. Set up like a laptop (fold horizontal) turns the two columns off. New under Settings › Account › **This device**: Two halves Automatic/Always/Never and a live report of what the browser and device report about fold and posture. (0.2.85) - Record crate: played tracks keep their depth (darkening and fading act on the parts, not on the 3D body); Next/Back lets the covers glide to their new place instead of rebuilding; reflection cleanly blurred once per cover via canvas and faded out completely within the visible area; neighbors fade toward the edge instead of being cut off hard; the cover in the middle loads the large image afterwards. Settings: left section list scrolls on its own (stays put on foldables). Foldable devices: set up like a laptop no two columns, even with “Always”. (0.2.86) - **Table mode (foldable devices)**: When the Fold is set up like a laptop (fold horizontal), “Now playing” opens by itself – at the top (up to the reported fold) header, record crate and title in one row, at the bottom timeline, large buttons, quality and volume; nothing lies across the fold. Opening flat or closing shuts the view again if it was opened automatically. Closed by hand stays closed until the next time it is set up. (0.2.87) - Foldable devices: “Two halves: Always” applies only if the window is at least 600 px wide – closed, on the outer display, settings and “Now playing” are single-column again and fill the screen. (0.2.88) - “Now playing” is now a true fullscreen page instead of an overlay: reaches under the scroll gutter (no more stripe of the page on the right), the page underneath is hidden and does not scroll, on the phone the view fades over instead of sliding up like a sheet. History entry of its own: Back (Android gesture, mouse button, Alt+←) closes the player and leaves the page underneath as it was. (0.2.89) - **Record crate revised**: one cover per album – consecutive tracks of the same album lie on one cover (“3 tracks”), below them the tracks as a bar (tapping selects, double tapping plays), flipping goes album by album; the “Up next” list gets matching album separator rows. From the sleeve of the playing album a CD glides out on the right and rotates slowly (on pause it stands still and slides back a bit), with room light, a fixed highlight and its own reflection. Crate flatter (40° instead of 62°, thinner sleeves) with a slightly glassy edge; reflections opaque so that they cover each other in the right order. PC: footer of “Now playing” like the library’s player bar (same height and buttons, sound icons without labels, signal path text omitted). (0.2.90) - Record crate: CD brighter (stronger silver tone, less shadow); sleeve edges slightly blurred and now also visible in the reflection. (0.2.91) - Record crate: sleeve edges with a blurred fill (from the already computed mirror image), the border itself stays sharp. (0.2.92) - Record crate: sleeve edges as Aero glass – bright gloss at the top with the typical gloss edge in the middle, light lines on both borders, cover color softly shining through. (0.2.93) - **Zoom locked** (can be turned off with `ZOOM_SPERREN=0` in the .env): Ctrl/⌘ + mouse wheel or touchpad pinch, Ctrl +/−/0, two-finger and double-tap zoom are intercepted – the interface always fits the window. Windows client 0.8.1: zoom locked there too, a previously remembered zoom is reset at startup. (0.2.94) - Record crate: title bar under the cover and “n tracks” hint in the cover corner removed; for the playing album the title line shows the playing track, when flipping to another album its name. Album detection more robust (ID, otherwise edition, otherwise title + cover). (0.2.95) - **Subwoofer / bass management** (Windows client, ASIO): In the “Outputs & Speakers” window the separate subwoofer can be switched on (stereo → 2.1, quad → 4.1, with 5.1 as bass management onto the LFE). Crossover frequency 50–200 Hz in 10 Hz steps, delay of the sub with −/+ in 0.1 steps in ms, m or inch as desired (+ = sub later, − = main speakers later; holding down repeats). The engine splits with Linkwitz-Riley 24 dB/oct: main speakers high-pass, the sub gets the low-pass of all channels (+ LFE of the source). Client 0.8.2. (0.2.96) - Subwoofer: phase switchable (0° / 180° inverted) in the “Outputs & Speakers” window. Client 0.8.3. (0.2.97) - Space and subwoofer connected: if the selected output has a sub or bass management, only the engine does the splitting – the upmixer outputs full range, and the Space menu shows the output’s crossover frequency instead of “Bass → LFE”/“LFE level” (“Bass → Sub”, −/+ in 10 Hz steps). Changes there apply immediately and are saved with the output (same setting as under Outputs & Speakers). Without bass management on the output, the upmixer splits itself only for 5.1 (with quad the bass was cut off until now). Changing only sub values no longer reopens the driver. Client 0.8.4. (0.2.98) - **Remote control** and **speaker manager** (0.2.99): Every device controls every other device of the same account, admins all devices. For this there is the “Playback on …” button in the player bar and “Now playing”, a device list with volume per device and “Bring here”. If music is playing here when choosing, it moves along to the chosen device. If the target chooses us, it takes over (no ping-pong). The controlled device shows “controlled by …”. In remote mode the display is dimmed until the target confirms. Under Account › This device you can allow remote control and set a volume limit, in the Windows client also “keep running in the notification area” and “start with Windows”. The return channel runs via SSE (`/fern/strom`), with 2 s polling as a fallback; limits via `FERN_*` in the .env. Speaker manager new: overview plus wizard (output, connection, distance & level, subwoofer) and headphones (balance, crossfeed, level, A/B). The engine now calculates delay and level per channel and crossfeed; neutral, it remains bit-perfect. Bug fixed: when the sub was switched on, the device was not reopened. - **Devices in the home network** (0.2.100): AV receivers, TVs and streamers with DLNA appear under “Playback on” (group “In the home network”), all accounts may play there. Settings › Devices in the home network: scan the home network (unicast SSDP to every address, also works from your own Docker network), add by IP, per device power on, input, sound mode, start and maximum volume, maximum format, power off after silence. Amberwave controls on, input, volume and sound mode on Denon/Marantz (HTTP), Yamaha MusicCast (YXC) and Onkyo/Pioneer (eISCP), all others via UPnP. Playback bit-perfect as the original if the device can handle the format, otherwise the server converts to a suitable format (e.g. WAV 16/48 for TVs). Gapless via SetNext. Admins can choose “With effects” per device: Glow, Iron, Silk and EQ from the own effects rack are calculated by the server with `bin/aw-render` (the same sound chain as the engine, 24 bit with dither, loudness leveling). Space follows. Amberwave detects the server address for the devices itself (request in the home network, otherwise direct access + APP_PORT), overridable with `HEIMNETZ_URL`. New in the .env: `HEIMNETZ_*`, `AW_RENDER_PFAD`. - **Library updates itself** (0.2.101): When an album is imported, matched or edited, all open apps adopt the new details without reloading – the visible page (Albums, Album, Artists, Genres, Search, Playlists, Saved, History) is quietly redrawn, without a loading spinner and without a jump, and title, artist, album and cover in the player and queue are refreshed, playback continues. A merged album leads to the new one. For this the server reports a state of the library via the return channel (event `bib`), calculated at most every 2 s. While a dialog, menu or input field is open, the page waits; “Shuffle” sort orders and “Discover” are not re-rolled. - **Listen offline** (0.2.102): Albums, playlists and individual tracks can be “saved offline” in the app (button on album and playlist, entry in the menus; saved tracks carry a small green arrow). Storage is in the app’s storage, not as a file, in Opus 256 kbit/s (`OFFLINE_QUALITAET`, 0 = off). Without a network the app still starts and shows “On this device” with everything saved; playback gapless as online, loudness leveling in the browser. On the go it always plays saved tracks from the device (saves data), if the server drops away, it continues with the saved copy. Saved albums and playlists follow the library (new tracks are added, removed ones go), things listened to offline are reported afterwards. “On this device” page under More or in the account menu with storage space. Not in the Windows client. - **Google Cast** (0.2.103): Android TV/Google TV, Nest Hub and Nest Audio, Chromecast (also Audio and Cast groups) as well as TVs, soundbars and receivers with Chromecast built-in appear under “Playback on”. “Scan home network” queries every address directly via mDNS for this (also works from your own Docker network), by IP works too. Playback uses Google’s default receiver: original FLAC up to 24/96, otherwise the server converts; if a device rejects a format, Amberwave remembers that and sends WAV in future. The next track is preloaded in the device’s queue (gapless), volume, pause, seeking and “With effects” as with DLNA. If another app takes over on the device, Amberwave yields. Devices with DLNA and Cast appear twice in the list – one can be hidden. New: migration 039. - **Amberwave screen for Google Cast** (0.2.104): own Cast receiver (`cast/empfaenger.html`) instead of the plain default receiver – large cover with softly blurred background, title, artist, album, format (e.g. FLAC · 24 bit · 96 kHz, bit-perfect/converted/effects), progress, “Up next”, clock when idle, gentle crossfades and slow drifting against burn-in; on the Nest Hub, tapping pauses. Register once in the Google Cast SDK Developer Console as a “Custom Receiver” (instructions and address under Settings › Devices in the home network) and enter the app ID there or as `CAST_APP_ID`. If the own receiver does not start on a device, Amberwave uses the default receiver. Covers now go to Cast devices over HTTPS (direct access or APP_URL) – the default receiver then shows them too. Preview: /cast/empfaenger.html?demo=1. - **Cast screen like “Now playing”** (0.2.105): The Amberwave receiver now shows the same record crate as the app – cover flow from the queue with a rotating CD, reflection and raised playing album, above it “Playing from album”, below it title, artist, timeline, format and “Up next”. Amberwave sends the queue over a channel of its own (`urn:x-cast:de.amberwave`); on the Nest Hub swiping flips through the crate, a double tap on a cover jumps there, a tap on the title pauses. - **Identifier and counter for third-party services** (0.2.106): All outgoing requests (MusicBrainz, AcoustID, Cover Art Archive, Deezer, fanart.tv, ListenBrainz, Cloudflare, Let's Encrypt …) carry the same identifier `Amberwave/ (; Installation ; )` – this way the operators see how much comes from Amberwave, from how many installations and how much of that from the Pro version. Amberwave also counts itself: per service and day requests and errors, separated by edition, under Settings › Services & Keys. `AMBERWAVE_EDITION`, `DIENSTE_KONTAKT`, `AMBERWAVE_INSTALLATION_ID` in the .env. - **Developer contact in the identifier** (0.2.107): The identifier for third-party services now permanently names the developer contact (since 0.9.0-beta.2 the project address on GitHub) (`DIENSTE_KONTAKT` in the .env overrides it) – admin addresses and server URLs of the installations thus no longer go to the services. - **Space from the server for devices in the home network** (0.2.108): In a device’s sound sheet (With effects) there is now Space with Subtle/Room/Hall/Live. For this the app builds the same graph as for the Windows client (upmix, reverb with impulse response, rear delay) for 44.1 and 48 kHz, the server calculates it with `bin/aw-render` and sends 5.1 as WAV (WAVE_FORMAT_EXTENSIBLE with speaker mask, 24 bit; with DLNA with `nrAudioChannels`). If a device cannot do 5.1 – error on loading (DLNA/Cast) or playback ends right after the start or does not get going –, Amberwave remembers that per device, immediately keeps playing in stereo and greys out Space for this device (with the reason and “Try again”). If 5.1 runs for ten seconds, it counts as confirmed. Under Settings › Devices in the home network each device shows “Space (5.1)”: works / rejected / not tried yet. - **Security and bug review** (0.2.109): Covers for receivers, TVs and Cast carry an image key (`?bt=`) that opens only this one image – previously the user’s direct-access key stood there, which every device in the home network gives away; the server builds the cover address from the database, not from what a client sends along. Without `APP_SECRET_KEY` Amberwave generates a fallback key in `PFAD_CACHE/.app_secret_key` instead of signing with an empty key. Amberwave learns the home network address only from admins; proxy headers (`X-Forwarded-For`) apply without `PROXY_IPS` only with a public address. The home network stream respects the limit of simultaneous conversions, Space graphs are no longer copied into every chain file, `cache/heimnetz` is cleaned up, range responses are byte-exact. Space: a timeout of the device or a failed seek no longer counts as a rejection, the device limit of 44.1 kHz is respected, missing Space data is reported, the channel count comes from the graph. Offline: interrupted downloads continue after reloading, deleting while loading leaves nothing behind, covers are stored without direct address and key (so they exist offline too), the remembered account no longer contains keys or email and is discarded on sign-out or account switch, plays reported late are not counted twice. Service worker: only app routes as shell, no login page as a script in the cache, old file versions are thrown out. Also: no more memory leak from the album page, no double click on “Apply”, the Cast receiver plays only Amberwave jobs. - **Login lockout also per sender address** (0.2.110): Login attempts additionally remember the real sender address (`REMOTE_ADDR`, migration 041). The lockout applies as soon as the visitor IP *or* sender are conspicuous – forged proxy headers from the home network no longer circumvent it. Behind the tunnel (all visitors one sender) only the failure chain of the same name counts per sender, not the hourly limit. - **Cloudflare Tunnel from within Amberwave** (0.2.111): New service `tunnel` (cloudflared) in the stack. Under Settings › Access & Network Amberwave creates the tunnel via the Cloudflare API (`cfd_tunnel`, remotely managed), sets the forwarding to `TUNNEL_ZIEL` (default `http://app:80`), the proxied CNAME and writes the tunnel token to `PFAD_CACHE/tunnel/token` (`--token-file`). Status with connections, cloudflared version and whether the current page came through the tunnel; “Remove tunnel” cleans up at Cloudflare. Without `APP_URL` the tunnel address counts as the public address of the app. The tunnel container in the stack automatically counts as a trusted proxy (visitor IP from `CF-Connecting-IP`), `PROXY_IPS` is now only needed for your own cloudflared. Notice line “Connection via Cloudflare Tunnel” with links to terms of use and privacy on the login pages when the request came through the tunnel; license and trademark notices in the interface. New in the .env: `TUNNEL_HOST`, `TUNNEL_ZIEL`, `TUNNEL_CONTAINER`, `TUNNEL_IMAGE_TAG`. - **Switch: own tunnel container or existing cloudflared** (0.2.112): `TUNNEL_IM_STACK=1` (default) creates the `tunnel` container and Amberwave manages its own tunnel; `TUNNEL_IM_STACK=0` omits the container (`deploy.replicas`), the interface lists the account's existing tunnels, and Amberwave only merges its rule (`host → target`) into the configuration of the selected, remotely managed tunnel – other rules and the catch-all rule are preserved; “Remove rule” takes it out again. Tunnels configured locally via config.yml are detected and greyed out with a note. For a third-party cloudflared, its proxy address can be entered in the interface (`tunnel_proxy_ip`) if `PROXY_IPS` is missing. New in the .env: `TUNNEL_IM_STACK`. - **Setup wizard instead of factory password** (0.2.113): On first start there is no longer a user “admin” with the password “Admin” and no passwords in the `.env`. The page `/einrichtung.php` creates the admin account and generates the database, user and a random database password (name and user can be changed under “Advanced”; MariaDB starts only with the root access, which afterwards gets a random password – `geheimnisse/db_root_passwort`). Protection modelled on Portainer: the window is open for 30 minutes after the container starts (`EINRICHTUNG_FENSTER_MINUTEN`), then locked until restart; directly from the home network without a code, via proxy/tunnel/internet only with the setup code from the log (`EINRICHTUNGSCODE`, `EINRICHTUNG_CODE_IMMER`). The `APP_SECRET_KEY` is generated automatically, shown at the end and copied next to the backups. Settings › Services & Keys shows credentials (after password confirmation) and changes the database password. Credentials from the `.env` still take precedence, existing installations notice nothing. **Bug fixed:** Without `APP_SECRET_KEY` in the .env, Amberwave has aborted since 0.2.109 with “Call to undefined function konfig_notschluessel()” – the automatic fallback key was never reached. - **New setup wizard** (0.2.114): Start page with a large logo, then a **folder check** (music collection with a sample test for readability, app data and backups are actually written to, tools ffmpeg/Python/database; shows which user Amberwave accesses as and where that comes from, with a command to fix it and “Wrong user?” → `PUID`/`PGID` lines to copy; warnings for database on `/mnt/user` and backup on the same drive), then the account with **time zone** (detected from the browser) and **server name** (stored in `geheimnisse/server.json`; `APP_ZEITZONE` and `CLIENT_SERVERNAME` in the .env take precedence), the setup with an animated “Done” window and **automatic sign-in** (no second login). After that “Scan library now”: live counter, cover wall, spectrum, “Browse already” or “Keep scanning in the background” (in the program a floating indicator remains with “← Back to scanning” or “View summary”) and finally a summary of the collection (tracks, albums, artists, playing time, oldest/newest album, artists with the most tracks, files with problems). Pages slide into one another; on tablets and desktops the layout uses the full width and all steps have the same height. The note about the key now states clearly: if it is lost, only stored credentials are affected, not music or accounts. **Existing installations:** no change to paths, database or user – just restart the container (the program code is provided as a volume; no rebuild necessary). - **AmberGlow with four tubes and push-pull** (0.2.115): Choice of **12AX7** (hot, lots of H2), **12AT7** (punch), **12AU7** (smooth, late edge) and **6SN7** (wide, cleanest), each with its own Koren curve and level matching. New **topology**: single-ended or **push-pull** with a **Symmetry** control (100% = even harmonics almost cancel out, less = residual H2 as with real tube pairs); in HQ mode double the computing load. The standard curve (without HQ) is matched to the HQ stage, both now sound equally directed (H2 up front). The treble control is called “velvety”. New .env values `WAERME_ROEHRE`, `WAERME_SCHALTUNG`. The Windows client remains unchanged (an older library ignores the new values). - **Folders and users tidied up** (0.2.116): **One folder instead of three:** `APPDATA_PFAD` in the .env stores the database (`db/`), app data (`cache/`) and backups (`backups/`) beneath it; the backups can go to another drive with `SICHERUNG_PFAD`. The old individual variables (`DB_DATA_PFAD`, `CACHE_PFAD`, `BACKUP_PFAD`) work unchanged and take precedence – existing installations keep running without changes. **User automatic:** without `PUID`/`PGID` the startup detects the owner of the app data or music folder (otherwise 99:100) and remembers it (`cache/.laufbenutzer`); Amberwave never runs as root (`PUID=0` is ignored); the setup wizard says where the user comes from. **Settings › System & Folders** shows what Amberwave has determined – user, folders (server path → container path, owner, source), database, time zone, server name, key – each with its origin. **Migrating an existing instance:** `bash app/scripts/pfade-migrieren.sh` on the server (first a dry run, then `--ausfuehren`; stops the containers, moves or copies and verifies, backs up the .env, writes `APPDATA_PFAD`, deletes nothing – old folders are afterwards named `*.migriert-`); then “Compose Down” and “Compose Up” in Unraid. **Important when updating:** `docker-compose.yml` has changed (new folder variables) – replace it in the stack. - **Minor tweak** (0.2.117): “System & Folders” now calls the database “MariaDB” instead of showing the internal path `/var/lib/mysql`. - **Recognition via tags first** (0.2.118): Albums are now matched first by their tags (MusicBrainz ID, otherwise artist + title including track comparison). AcoustID automatically only queries albums with no clues at all; uncertain ones wait for the “Recognize by sound” button (individually or for all). Setting “Recognition” (`ERKENNUNG_MODUS`: anhalt / gruendlich / aus). This spares AcoustID considerably. - **Bug fix** (0.2.119): Pages such as Settings, Downloads and Recognition have returned a 500 error since 0.2.116 (“Cannot redeclare einr_host_pfad”) because `config.php` is loaded twice in one place. The function is now protected against this. - **Back to the home network** (0.2.120/0.2.121): Whether the direct address responds again is checked by the app at every track change (applies from the next track), when returning to the window, and otherwise every minute while the window is visible (previously every 5 minutes). Time limit for the check 2.5 instead of 1.5 seconds. - **Footer bar in the large player** (0.2.122): The bar at the bottom right of the full-screen player now looks like the one in the library (same spacing, quality chip of the same height, volume control of the same width). The device button “Play on …” sits there in the same place as in the bar (before Mute); on the phone it stays at the top in the header. - **Record crate with momentum** (0.2.123): The covers now hang from a shared position with inertia: swiping and the mouse wheel push them, they glide out and gently snap onto a cover (at the end it only yields reluctantly). If you pick a track further back in the list, the covers travel there with a spring instead of jumping; several requests in a row carry the speed over. The CD only glides out once the cover has arrived, and an old CD glides back into its sleeve instead of disappearing. Shadow: it no longer rotates with the disc, and only the part to the right of the sleeve edge is drawn (previously a strip of the CD lay in front of the cover, and the edge jumped before the CD arrived). With “Reduce motion” everything jumps without travel. - **Record crate: door arrangement and “CDs only”** (0.2.124): The covers now fold away backwards like doors on their inner edge (55°), the album that is playing stands at the front – slightly lower in the middle, slightly higher than the others beside it. Angles and spacing are calculated so that two covers never penetrate each other while browsing (previously they intersected); the CD also only glides out when the cover is almost in the center, follows the position continuously and sticks out further (45%, when paused 32%). New: toggle at the top right of the crate between “Sleeve” and “CDs only” (remembered in the browser). In the CD view, bare discs are shown with the cover as print (hub darker, rim silver, slight thickness, delicate lacquer, reflection). The disc that is playing rotates slowly, when paused it stands still, on stop and album change it gently spins down and stops at 0°. Lacquer strengths are at the top of the CSS (`--lk-nabe`, `--lk-licht`, `--lk-regen`). - **Record crate refined** (0.2.125): Spacing between the center and neighbors slightly larger (0.10), the covers at the edge are no longer faded out early (they are fully visible and disappear only at the very outside), and in the “CDs only” view the reflection of the disc rotates along. - **CD in the sleeve printed** (0.2.126): The CD gliding out of the cover now also carries the cover as print (hub darker, silver rim), as in the “CDs only” view; its reflection too. - **Transformation sleeve ↔ CDs only** (0.2.127): When switching, the covers fold away and the discs fold in (and vice versa), staggered from the center outward, the print rotates once in the process; with “Reduce motion” without animation. The CD from the sleeve now rotates as slowly as the single disc (one revolution in 18 s). - **New transformation** (0.2.128): When switching between sleeve and “CDs only”, the CD that is playing is pulled out of the sleeve (far to the right so nothing clips) and glides to the center, the sleeves step back and fade out, the remaining discs fade in from behind; going back works in reverse. The rotation of the CD runs via a shared angle and is never interrupted (the CD in the sleeve now also rotates with this angle and stands still when paused). Speed and paths via `--w-dauer`, `--w-staffel`, `--w-aus`, `--w-zurueck`, `--w-skala` in the CSS. - **VST3 plug-ins in the Windows Client, stage 1** (0.2.129; Client 0.9.0): Settings → Windows output has a “VST3 plug-ins” card with search, rescan (Shift-click: reload everything), folder list, “Test” (trial run with noise: level, latency, parameter count, processing time per block), “Interface” (plug-in window for trying out), log folder and “Create diagnostic file” (desktop). The plug-ins do not yet run in the sound chain (comes in stage 2); details in `windows-client/README.md`. - **VST3 interface smoother** (0.2.130; Client 0.9.1): The plug-in host is now DPI-aware (Per-Monitor v2, scale factor passed to the plug-in), uses a 1 ms timer for the plug-ins' animations and draws the window without background flicker. - **Plug-in window resizable by dragging** (0.2.131; Client 0.9.2): Plug-ins with a resizable interface (e.g. Pro-Q) can be stretched at the window edge; the plug-in's limits (minimum size, aspect ratio) are respected, the new size is passed to the plug-in via `onSize`. - **VST3 plug-ins in the effects rack** (0.2.132; Client 0.10.0, Windows Client only): Plug-ins from the plug-in browser can be placed in the rack (“Add VST3 plug-in”, with search) in up to 8 slots and, like Glow, Iron, Silk and EQ, can be freely moved in the signal path – from the EQ bus to the tape simulation, stereo, effects only. Each plug-in is a 1U module with digital level meters for input and output (dBFS, clip lamp), “Open interface” (own, resizable window), on/off, presets (save, load, delete the current state) and remove. The settings of each plug-in are remembered automatically and restored at the next start. If a plug-in process fails or does not respond, the signal continues unchanged at this point, the module shows the reason and “↻” to restart. Technical details and logs: `windows-client/README.md`. - **VST3 modules like input/output** (0.2.133; Client 0.10.1): The level meter of each plug-in module is now in the style of input and output – stereo L/R for IN and OUT, bars −60…0 dBFS, clip lamp, scale, plus peak values and difference. The actual level at exactly this point of the chain is measured (peak per channel directly before and after the plug-in, 40 reports/s). Plug-in windows always stay in the foreground. - **Signal path order native** (0.2.134; Client 0.10.2): Track → loudness matching → input meter → plug-ins/effects in the displayed order → Space → output meter. The plug-ins (and their meters) therefore see the same level as the input meter, no longer the raw file level. The plug-in modules are more compact: IN on the left, OUT on the right (each L/R), without loudness values. - **Plug-in module more compact** (0.2.135, interface only): Title, level meters and controls (open interface, preset, remove) sit next to each other in the wide rack, without empty space below the meters. - **Remove plug-in** (0.2.136, interface only): The ✕ now sits small below the on/off switch of the plug-in module. - **Crackling on sample rate/bit depth change, plug-in windows** (0.2.137; Client 0.10.3, Windows Client only): With a fixed output rate (e.g. 96 kHz), the conversion filter was recalculated in the audio path when the source rate changed (e.g. 44.1 → 96 kHz, around 70,000 coefficients) – this took longer than the buffer lasted and could briefly crackle. Finished filters now stay in the cache and are calculated in advance in the background (when opening the device for common rates, when reading in a track for its rate). New in the log (`client.log`): lines “Engine: …” for format changes (with duration in ms), startup, dropouts and errors. Plug-in windows: appear only once the interface is built, with a dark background and dark title bar – no more white flash. - **Equalizer per speaker** (0.2.138; Client 0.10.4, Windows Client only): In the speaker wizard (“Outputs & Speakers”) each channel has a small EQ button. The window offers 8 fully parametric bands (bell, low/high shelf, high-pass, low-pass; slopes 6–48 dB/oct. for high/low-pass), a frequency response graph to drag (frequency/gain, mouse wheel = Q, double-click = new band), bypass per channel, the coupling Left ⇄ Right (and Ls ⇄ Rs): coupled channels show the same values from both sides and match immediately. At the bottom: save/load/delete presets (shared for all outputs) and “Send to other channel”. The engine computes in 64 bit (RBJ biquads, Butterworth), changes are smoothly crossfaded over 20 ms and can be heard live. The highest boost is automatically subtracted from all channels as headroom (no overload, balance is preserved); with active EQ playback is no longer bit-perfect. REW import and FIR filters follow later. - **English interface** (0.2.139; Client 0.10.5): Amberwave is now available in German and English – web app, administration, server messages, e-mails, sign-in and setup pages as well as the Windows Client (tray, dialogs, setup, unpacker). The language is chosen under Settings → Account (“Sprache / Language”: Automatic by browser, Deutsch, English); on the sign-in pages there is a switch. Order: account → cookie `aw_sprache` → browser language → `AW_SPRACHE` in the .env (default `de`). Technical: the German text is the key (`t('…')` in PHP and JS, `tn()` for singular/plural); the English dictionary is built from `app/i18n/quelle/*.json` with `python3 scripts/i18n_bauen.py` (description and glossary in `app/i18n/ANLEITUNG.md`, check with `scripts/i18n_pruefen.py`). Data and stored messages remain in the language in which they were created. Plug-in host: the audio thread now runs with MMCSS “Pro Audio” (less crackling under background load). - **Region in the setup** (0.2.140, server only): The setup always starts in English. The first page after that (“Region”) asks for country, language, time zone, currency, date and time format, and units; the country sets sensible defaults (Germany: German, Europe/Berlin, euro, DD.MM.YYYY, 24 hours, metric – USA: dollar, MM/DD/YYYY, 12 hours, imperial, New York). If the language changes, the page reloads in the new language and continues there. The choice is stored in `geheimnisse/server.json` (language of the server, new accounts and e-mails; the first account receives it as its account language) and can be changed later under Settings → System & Folders. The region values are deliberately available only in the menu, not in the .env (0.2.142; so far only `APP_ZEITZONE` remains valid). Date and time in the interface and in server texts follow the region (`meta aw-region`, `region()` in PHP, `region`/`preis()` in `js/i18n.js`). - **Units follow the region** (0.2.141, server only): In the speaker wizard (distance & level, room sketch), depending on the server's region, only meters (metric) or only feet and inches (imperial, e.g. USA) appear; the delay unit then also offers only ms and m or ms and in. Step size 5 cm or 1 inch; storage is still in meters. Adjustable under Settings → System & Folders. - **Region only in the menu** (0.2.142, server only): `AW_SPRACHE`, `APP_LAND`, `APP_WAEHRUNG`, `APP_ZEITFORMAT`, `APP_DATUMSFORMAT` and `APP_EINHEITEN` are no longer read from the .env; language, country, currency, formats and units are set under Settings → System & Folders. - **Phone: smoother and lighter** (0.2.143, server only): The record crate on phone/tablet (narrow screen or touch) loads smaller covers (400 instead of 600 px, the middle CD 600 instead of 1200 px), draws the reflection smaller, has fewer edge layers, no blurs and a faster switch sleeve ↔ CD. When switching, the CD now only slides out as far as the screen shows it (previously it was cut off at the edge). New cover size 400 px; missing sizes are generated automatically from the larger one on first request and stored (also for existing libraries, `COVER_GROESSEN` is now `300,400,600,1200`). - **Covers load faster, especially on mobile networks** (0.2.144, server only): Covers up to 600 px are delivered as WebP to browsers that support it (significantly smaller than JPEG; generated once from the JPEG and stored next to it, no new scan needed). The service worker remembers covers once loaded permanently (cache `aw-bilder-v1`, at most approx. 1,500 items) – the next time you open it they come straight from disk instead of the network. - **Better search** (0.2.145, server only): Results are sorted by quality: exactly the search text, starts with it, every word starts a word, lastly “anywhere in the middle”. “bru” thus returns Bruno Mars first, not titles with “…bru…” inside a word. If there are matches at word beginnings, pure in-the-middle matches are dropped; if there are none, they remain as a safety net. Artists with more albums rank higher at equal rank. - **Search: tracks and artists first** (0.2.146, server only): The order in search and in the suggestion window is now artists → tracks → albums (albums last and fewer: 6 instead of 8, 3 in the suggestions). It shows more tracks (30, 6 in the suggestions). Artists with their own albums rank ahead of artists who only appear as contributors at the same match level. - **Search: popularity, typos, Best match** (0.2.147, server only): (1) At the same match level, artists and tracks that the family often listens to come first. (2) If the search finds nothing, it tries typos (1–2 letters) and names written together (“acdc”, “quincyjones”) and says so. (3) Multiple words may be spread across track and artist (“thriller jackson”). (4) New “Best match” card at the top of the search page: for artists with their most-played tracks, otherwise track or album. New API fields `top` and `aehnlich` in `/suche`. - **Faster startup and album lists on mobile networks** (0.2.148, server only; rebuild Docker image): (1) Apache now compresses text (HTML, CSS, JS, JSON; Brotli or gzip) – needs the new image (`a2enmod deflate brotli`). (2) CSS and JS with `?v=` come straight from the device for a year, without a request per file (the version changes with every change). (3) All modules needed at startup are loaded in parallel via `` instead of level by level. (4) Album tiles immediately show the average color of the cover (calculated once, `.farbe` next to the image) until the image arrives. (5) New cover size 200 px; on slow networks (3G/2G) or in data-saver mode, lists automatically load this smallest size. - **Record crate: new sleeve ↔ CD switch (“Pull out”)** (0.2.149, server only): The CD that is playing is pulled out of the sleeve and glides to the center (on the phone only as far as the screen shows it); all other sleeves fade into discs in place, without travelling through the depth. The sleeves now really stay visible until they fade out (previously they disappeared immediately). Sleeves fade out with edges and reflection, discs fade in with their own, round, co-rotating reflection (two reflections per album instead of one whose shape jumped); the reflection of the disc that is playing travels along its path; the sleeve keeps its thickness until the end. Adjustable via CSS variables on the frame `.pk`: `--w-dauer` (750ms), `--w-staffel` (50ms), `--w-aus-s`/`--w-aus-d` (start/length of the fade-out, fraction of the duration), `--w-ein-s`/`--w-ein-d`, `--w-skal` (.97), `--w-aus-k`, `--w-kurve`. - **Record crate: sleeve ↔ CD switch improved** (0.2.150, server only): The edges of the mirrored sleeves (thickness) now appear immediately instead of only after the switch (the opacity animation on the carrier flattened the 3D edges, now the edges fade individually). The reflection of the discs now also has thickness (mirrored disc rims, off on the phone in light mode). In the sleeve view the protruding CD has a reflection again (the cropping cut it off). The CD that is playing is no longer cut in half at the sleeve edge when pushed in/out. - **Back to the 0.2.150 state** (0.2.154, server only): The WebGL record crate (0.2.151/0.2.152) has been removed again; the record crate runs exclusively with CSS again as in 0.2.150 (sleeve ↔ CD, reflections, thickness). - **Record crate: smoother album change** (0.2.155, server only): When browsing on, the CD first moves into its sleeve (approx. 0.4 s), only then does the crate glide on; at the destination (the album that is playing) it comes out gently again after a short pause (approx. 0.75 s, time-controlled rather than coupled to the position). The glass edge of the sleeves is half as thick (thickness .016 instead of .032 of the cover size). In the “CDs only” view, the discs now straighten up in half a second to one second after playing (previously 3–12 s). - **Record crate: cover glides only once the CD is inside** (0.2.156, server only): On “Next track” into another album, the crate jumped to the new cover immediately because a second call (queue updated) set the position while the CD was still moving in. Now the crate waits approx. 0.5 s until the CD is in the sleeve and then glides; the new CD moves out only after arrival. - **Record crate: “Next track” switches only after moving in** (0.2.157, server only): Until the CD is in the sleeve, the old album continues to count as the one that is playing (no immediate lifting, darkening or CD swap); the CD moves in along the same gentle curve, then the crate glides and the new album becomes the one that is playing. - **Record crate: CD moves in more slowly, crate waits longer** (0.2.158, server only): Moving the CD in takes 0.65 s (previously 0.42 s), the crate glides only after approx. 0.8 s – the CD is then fully in the sleeve. - **Record crate: album change independent of the order of calls** (0.2.159, server only): If the queue (rather than the track change) reported the new track first, the crate switched immediately and the CD swapped frantically. Now the crate notices the album change at any point, first moves the CD in and then switches and glides. - **Record crate: faster CD, calmer animation** (0.2.160, server only): CD moves in in 0.4 s (crate switches after 0.5 s), comes out again in 0.6 s. Fewer style writes per frame (only changed values), CD layer gets its own compositing layer. - **Record crate: no dance on opening, no flicker on change** (0.2.161, server only): When opening the full-screen player, the CD sits in the sleeve and simply moves out (previously first half out, back in, then out). On album change, the CSS transition is switched off before the markers are switched, so the old cover no longer briefly jumps. - **Record crate: lift glides instead of jumping** (0.2.162, server only): When changing to the next album, the new cover jumped up by the lift height and the old one down (flicker, jerky travel). The lift now crossfades smoothly. - **Record crate: height correction only in position** (0.2.163, server only): While the crate travels to the next album, the height of all covers remains unchanged. Only when the cover stands still does the album that is playing rise gently (approx. 0.4 s) and the previous one lower. The height is now constant (previously it grew with the distance from the center). - **Record crate: old album lowers before travel** (0.2.164, server only): After the CD has moved in, the old album first glides downward, then the crate travels on (waiting time 0.7 s). - **Record crate: motion core rebuilt, significantly smoother** (0.2.165, server only): A single timer drives travel, CD, lift, rotation and the change timeline (CD in 0.38 s, album lowers from 0.22 s, travel from 0.52 s); no more CSS transitions on transforms (they lagged behind and jumped). Even CD rotation as a Web Animation on the compositor instead of in the script. “Played” no longer via filter but with shading layers (opacity only). Reflection only as the visible quarter, no invisible back side, disc parts only in the “CDs only” view (half as many nodes per cover). Angles and blend values sit on the parts instead of on the crate (style calculation per frame from up to 15 ms down to 2 ms). The large cover fades over the small one instead of swapping (no flicker), blurring and neighbor build-up run in idle time. On track change the queue list is only updated rather than rebuilt, player bar and “Now playing” are updated once in a batch instead of twice. - **Record crate: switch to disc view without covers popping up at the edge, sharper covers on 3x phones** (0.2.166, server only): Prebuilt covers outside the viewport stay invisible during the view switch (the switching rules had briefly made their sleeve visible). The large cover is chosen by real device pixels (1200 px as soon as cover × pixel density exceeds 620 px – previously always 600 px on the phone). - **Record crate: edge covers fade fully in or out** (0.2.167, server only): Neighbors that no longer fit entirely into the frame previously stood half transparent at the edge (opacity by position). Now they fade out or in gently in 0.36 s – when browsing as well as when narrowing or widening the window. - **Record crate: disc moves fully out on view switch, narrow screens relieved** (0.2.168, server only): When switching sleeve ↔ CDs only, the disc that was playing moved only to the edge on the phone (brief jerk); now it always moves fully out, even beyond the edge. On phone/Fold only the cover in the middle gets the 1200 px image, the neighbors 600 px (0.2.166 had loaded 1200 px for all neighbors – noticeable on the narrow Fold screen). - **Fold: switching half ↔ full view smoothly** (0.2.169, server only): No more transition on grid-template-columns (it recalculated layout and record crate on every frame); the layout jumps once, the crate zooms by transformation from the old to the new position, titles and buttons fade in softly, the sheet glides on its own layer and keeps its size when faded out. The invisible measure of the crate still had a width transition (repeated recalculation), measure() now only recalculates on a real size change. The “now playing” bars scale instead of changing their height (forced layout and repaint of the list on every frame). :has() selectors of the half view replaced. Fixed: the full view could be shifted sideways after a track change (scrollIntoView in the hidden list). - **Record crate: reflections fade out softly, no gap to the cover** (0.2.170, server only): The center cover stands closer and its reflection protruded beyond the frame – it was cut off hard at the bottom; now there is more room at the bottom (without shifting the layout) and a soft gradient that fades out completely beforehand (cover, edges, CD, discs). Reflections start directly at the edge (previously 2 px or 2% gap), barely darkened at the seam. The blurred mirror image is congruent with the cover (previously slightly enlarged, so the edge did not match). - **First start of the PWA significantly faster** (0.2.171, server only): The interface comes bundled and minified (`js/_b`, built with `app/scripts/buendeln.sh` via bun): 13 instead of 39 files at startup, 254 instead of 420 KB (gzip); administration, settings, effects rack, analysis, outputs window and home network sheet load only when opened. The user data (/ich) is already in the page, the start page data is preloaded in parallel with the script (two server round trips fewer), the Google fonts no longer block the first render. If the bundle does not match the sources, the individual modules run automatically (note in Administration → Overview). The start page takes a radio catalog up to 6 h old (previously a full rebuild every 10 minutes on first access). - **Fonts from your own server** (0.2.172, server only): Space Grotesk and Manrope (SIL Open Font License, license texts under `app/fonts/`) are now shipped with Amberwave as variable WOFF2 fonts (Latin and Latin Extended, together approx. 80 KB, the extended one only when needed). No more connection to Google, fonts are available offline (service worker) and are preloaded. `SCHRIFTEN_VON_GOOGLE` is dropped (removed from `.env.example`; a set value is ignored). - **Cast receiver without Google fonts** (0.2.173, server only): The receiver page for Chromecast now also uses the fonts from your own server. - **MusicBrainz search finds deluxe, remaster and anniversary editions** (0.2.174, server only): Edition suffixes in the album title (“(Super Deluxe Edition)”, “[2003 Remaster]”, “– 25th Anniversary Edition”, “: Expanded Edition” …) are split off and searched as well – MusicBrainz usually lists them as a disambiguation next to the plain title. Guest artists (“feat. …”) are dropped from the artist search. If the exact search yields little, a fuzzy word search follows (other punctuation, “&”/“and”). The scoring prefers the edition whose suffix matches the tag (deluxe tag → deluxe edition). Applies to manual matching and automatic recognition by tags. “(Taylor's Version)” and similar remains part of the title. - **Newznab indexers and multiple download clients** (0.2.175, server only): Besides Prowlarr, any number of Newznab indexers (t=caps, t=search, t=music) and further Prowlarr instances can be set up as search providers, plus several SABnzbd-compatible clients with their own API path (e.g. /api/sabnzbd), own category and own import folder (subfolder of DOWNLOAD_PFAD). Each search provider downloads with the client assigned to it; the NZB goes only there, queue, history, watchdog and import run per client. All are searched simultaneously, identical releases are merged via GUID and title. Setup under Settings → Downloads (with “Test connection” per entry); existing Prowlarr/SABnzbd values and jobs continue unchanged as “Default”. New in the .env (optional): SABNZBD_API_PFAD, SABNZBD_IMPORT_ORDNER. Details: docs/usenet-newznab.md. - **SABnzbd-compatible clients with partial API** (0.2.176, server only): The connection test queries categories first with get_cats and, if the client does not know the command, from get_config (config.categories); complete_dir and category folders also come from get_config. Missing optional commands are only a note, not a connection error; what is now checked is whether queue and history are readable. Error messages distinguish network, API key, wrong API path, unsupported command and unusable response. Errors without a status field ({"error": …}) are recognized instead of being read as success, and an unusable queue response no longer makes running downloads fail. - **Gear icon and Scan button** (0.2.177): At the top right next to the profile, a gear icon leads directly to the settings. In Administration → Library, “Scan” now permanently sits next to the heading – reads in new and changed files and shows the progress meanwhile (“Scanning … 42%”). - **Filter download search by source** (0.2.178): If several indexers return results, the line “Source” appears below the results header with each indexer and its result count – one click shows only its releases (click again or “All” removes the filter). Merged releases count for every indexer where they are listed. Can be combined with the quality filter. - **Windows Client 0.8.6:** The first track after startup begins immediately. If the ASIO driver is already running at the matching rate (e.g. fixed 96 kHz), the startup check and “pause after rate change” are skipped. Both now apply only when the driver is actually switched.