Changelog
v7.3.0.138 — 2026-10-26
Section titled “v7.3.0.138 — 2026-10-26”A big release: SoundMachine background music, auto level per player, audio-device alerts with optional automatic recovery, and one-click AI app connection.
New
- SoundMachine background music: MZAP can play your SoundMachine stations, mixes and weekly schedules as a player, routed to any of your zones. Add your SoundMachine account under Settings → SoundMachine, then choose Players → Create → SoundMachine…. One account drives up to 10 players. Announcements and ads scheduled on the SoundMachine website play automatically, Next skips a song (SoundMachine allows 6 skips per hour), and Like and Dislike shape what the account plays. Playback carries on through short network outages, waits in Standby when a schedule has a gap, and restarts by itself after an unexpected stop. The SoundMachine feature is included in the free MZAP trial.
- Auto level per player: Players can even out loudness between songs and streams, so nobody has to ride the volume when a quiet song follows a loud one. Set the target loudness, max boost and reaction speed in the player's Auto level card; a built-in limiter keeps boosted peaks clean, and the card header shows the gain being applied live. Off by default. See EQ & Compressor — Auto level.
- Audio device alerts: MZAP now tells you when Windows or an ASIO driver reports a problem with an output device that has zones: the device stopped working, was disconnected, is available again, or the ASIO driver asked to be restarted or changed its sample rate. Each device shows one notification with its latest state, and it stays until you close it. See Audio Devices — Device Alerts.
- Automatic recovery of audio devices (optional): Turn on Settings → Audio → Automatically recover audio devices and MZAP re-opens a WASAPI device that stopped working or was unplugged and plugged back in, and an ASIO device whose driver asked to be restarted, so its zones play again without restarting MZAP. Off by default. See Audio Devices — Automatic Recovery.
- Connect AI apps in one click: Settings → MCP server → Connect AI apps creates an AI Assistant account for AI apps, and Install in Claude Desktop installs the MZAP extension. No Node.js or hand-edited config files are needed. Ready-made setup for Claude Code, Gemini CLI, VS Code and Cursor is under Other AI apps (advanced). To limit what AI apps can do, change the AI Assistant's role or assignments in Users. See Connecting AI apps.
- SoundMachine and auto level for AI assistants: New MCP tools find SoundMachine stations, mixes and schedules, switch a player's source, like or dislike the current song, and (for Admins) list accounts and create SoundMachine players.
set_auto_levelcontrols auto level. See MCP Tools Reference. - Player alerts: A notification appears when a player can't download its tracks, when it can again, and when a SoundMachine player was restarted after an unexpected stop. Operators and Viewers only see alerts for their assigned players. See Zones and Players — Player alerts.
- MZAP Remote: SoundMachine players: The phone app controls SoundMachine players — Like, Play/Pause, Stop and Next on the card, Dislike on the player screen — and shows the source, song, cover and a Message tag during announcements. Play here takes the account back after another device took it over. See MZAP Remote — SoundMachine players.
- MZAP Remote: dark theme: The app follows the phone's light/dark setting, or choose under More → Appearance. The light theme's text and buttons are slightly darker for readability. See MZAP Remote — Appearance.
- MZAP Remote: favorites from the phone: A star on the player and zone screens adds or removes favorites, shared with the desktop and every other phone. See MZAP Remote — Favorites.
Improved
- Trial status is always visible: During a trial or license grace period the status bar shows the days remaining with an Activate link that opens Help → About with the license key field ready. The Activate Now text in the last-7-days banner opens the same dialog. See License Activation — Trial Mode.
- Compact filter dropdowns: The filter-button rows on the Players, Zones, Matrix, Devices and Jingles pages are now a single dropdown showing the active filter and its count, which frees space in narrow split panels. The Matrix and Jingles player filters now offer every player type, including Capture, AirPlay and SoundMachine. See Zones and Players — Ordering zones and players.
- Add Zone lists only usable devices: Devices that are turned off, failed to open, or are unplugged are left out of the Device list, with a hint pointing to the Devices tab. See Audio Devices — Turning off an ASIO device.
- MZAP Remote: matching, equal-height cards: Every player card has the same name, title and source lines, every player type has Play/Pause and Stop, and routing fits on one line ("Lobby, Terrace +3"), so the list reads as an even column. See MZAP Remote — Player and zone cards.
Changed
- Operators can mark favorites: Operators can add and remove favorites for the players and zones assigned to them; before, only an Admin could. See Roles and Permissions.
- New computer ID on PCs without a motherboard serial number: PCs that report a placeholder such as "To Be Filled By O.E.M." instead of a real motherboard serial now get a computer ID based on their Windows installation. Before, all such PCs with the same processor shared one ID. Action required on those PCs: after updating, enter your license key once more; an active trial may restart. Other PCs are not affected. See License Activation — PCs without a motherboard serial number.
- No more usage-data question: The one-time "Help improve MZAP" question and Settings → Privacy are gone. MZAP has never collected usage data and does not now. See Privacy & Data Collection.
Fixed
- Players no longer go silent when the next track can't be downloaded: A download failure during a crossfade could leave a player stopped until someone pressed Play. MZAP now downloads the next track about 25 seconds early and retries, and if it still fails the player moves on instead of sitting silent. See Playlists — Crossfade.
- Pausing during a crossfade stays paused: Pausing in the last seconds of a track used to be undone about 12 seconds later, when the zone started playing again on its own.
- Stream failover keeps moving through backup tracks: While a stream server stayed down, a failover player repeated its first backup track forever. It now continues with the next one. See Playlists — Stream-outage failover.
- Turning off an ASIO device now fully closes its driver: MZAP used to open every ASIO driver on startup regardless of the switch, which could stop an interface used through WASAPI at the same time. See Audio Devices — Turning off an ASIO device.
v7.2.0.125 — 2026-09-25
Section titled “v7.2.0.125 — 2026-09-25”New
- Now Playing shows artist and title from file tags: The player's Now Playing line — on the desktop, over the API and MCP, and in streaming-zone listener metadata — now shows Artist - Title from the file's library tags (ID3, APE, MP4, Vorbis) instead of the file name. The file name is still used when a file has no tags or was loaded outside a playlist. Player responses (
GET /api/players,GET /api/players/{id}) gain optionalcurrentTitleandcurrentArtistfields, omitted for radio streams and untagged files;currentTrackremains the ready-made display string. See Zones and Players — The player detail panel. - Folder column in the Library, and duplicate-safe folder adding: The library list has a new Folder column showing the folder each track sits in (hover for the full path), so copies of the same song kept in several folders — such as the same track in several venue playlists — can be told apart. The column is sortable, and
path:in the search box matches folder names, for examplepath:jazzy. Adding a folder that is already in the library no longer creates a second entry — MZAP shows a notice and rescans the existing one — and adding a folder that sits inside one already included with subfolders shows a notice naming that parent. Different spellings of the same path now count as one folder, removing a folder keeps tracks another library folder still includes, and rescanning an unchanged folder is much faster. Over the API,POST /api/library/foldersreturns409 Conflictwhen nothing new is added (previously500for an exact duplicate), andorderBy=foldersorts search results by path. See Media Library — Adding the same folder twice.
v7.2.0.123 — 2026-09-23
Section titled “v7.2.0.123 — 2026-09-23”- Licensing improvements. Nothing changes in how the app looks or plays.
v7.2.0.121 — 2026-09-23
Section titled “v7.2.0.121 — 2026-09-23”- Fixed: saving the Settings tab could fail with a validation error.
- Fixed: saving Settings with a blank mobile name: Saving the Settings tab failed with "Instance name cannot be empty." when the Name shown in the app field under Pair mobile device was left blank — which it is by default. A blank name is accepted again and means "use the Windows computer name".
v7.2.0.120 — 2026-09-22
Section titled “v7.2.0.120 — 2026-09-22”New
- Muted zones keep a live, dimmed level meter: A muted zone's meter used to go completely dark, so you could not tell whether anything was reaching it. It now behaves like a muted player — the meter keeps moving, drawn desaturated, and shows what would go out if you unmuted. This covers every zone kind, including streaming zones (whose listeners still hear silence while muted). ASIO and streaming zone meters also no longer apply the zone fader twice. API clients reading
GET /api/stream/levelsnow receive the pre-mute level for muted zones and should use the zone'sisMutedflag if they want a dark meter. See Zones and Players — Meter behavior. - Operators can manage scheduled tasks: Operators can now create, edit, enable, disable, duplicate, delete, and manually run scheduler tasks, in line with the rest of their role. Viewers still see the task list, status, and execution log. See Scheduler — Who can manage tasks.
Fixed
- Zone volume, mute, EQ, and compressor now apply when a workspace loads: Loading a workspace — including Restore Last Workspace on Startup — left every zone playing at full volume, unmuted, with no EQ or compressor, while its fader still showed the saved position. Touching the zone applied the saved level, which made the problem look intermittent. Zones now come up at their saved volume, a zone saved muted stays silent until you unmute it, and saved EQ and compressor are active. Players were never affected.
- Deleting a zone no longer resets the other zones on the same device to full volume, unmuted, with no EQ.
- Viewers can no longer run scheduler tasks: Trigger now had no permission check, so a read-only account could run any task — including ones that change zone volume or load a workspace. It now requires the Operator role.
- Saving the first EQ or compressor preset: With no presets saved yet, the save field closed again as soon as it opened.
v7.2.0.118 — 2026-09-18
Section titled “v7.2.0.118 — 2026-09-18”A big release: a reworked role model, per-user sidebar sections, and new API options for integrations.
New
- MZAP Remote — a mobile app for Android: Control MZAP from a phone or tablet on the same network. The app finds MZAP hosts automatically, pairs by scanning a QR code, and controls players, zones, and jingles with live level meters on the desktop's dB scale. Tablets in landscape get a two-pane layout, and the meter rate can be lowered or turned off on slower devices. See MZAP Remote.
- Pair a phone by scanning a QR code: Settings → Pair mobile device shows a code that carries the address and, when authentication is on, the chosen user's API key — no IP address or key to type. You can rename the host as it appears in the app, pick which network address to use, and the panel warns that anyone who scans the code gets that user's level of access. Regenerating the user's API key revokes the phone. See Settings — Pair mobile device.
- Pair straight from the Users tab: Each user row has a QR icon that opens the pairing code for that user. See Managing Users — Pairing a phone or tablet.
- MZAP announces itself on the local network: With Allow control from other devices on this network on, MZAP advertises itself over mDNS/Bonjour and answers a UDP discovery probe on port 5002 for networks where mDNS is blocked. Renaming the host re-advertises it within seconds. Both channels are off while network access is off, share nothing beyond the host's name, version, and port, and fail quietly without affecting playback. See Settings — Mobile discovery.
- Hide sidebar sections from individual users: A new Features tab in a user's assignments lets an admin hide Matrix, Jingles, Playlists, Library, Radio Browser, or Scheduler from that user's sidebar. It is a tidy-up, not a permission — the API still allows whatever the user's role allows. See Managing Users — Hiding sections from a user.
- Slower level-meter rate for API clients:
GET /api/stream/levelsaccepts an optionalintervalMs(100–2000 ms) so a slower client can ask for fewer meter frames. Other clients keep their own rate. See API Keys — Level meters at a lower rate. GET /api/auth/statusreports who a credential belongs to: Send an API key or session token and the response includes that user's role and assignments, so a client can check a stored key still works. Without a credential it still answersloggedIn: false, never401. See API Keys — Checking a key.
Changed
- Viewers are now read-only; Operators can control transport, jingles, and routing: A Viewer could previously start, stop, seek, and skip tracks and fire jingles, while an Operator could not connect a player to a zone. Viewers can now only watch. Operators can run transport, volume, mute, playlist and mode, zone volume, mute, EQ and compressor, play and stop jingles, and route their own players to their own zones — routing needs both ends assigned. The MCP
manage_routingtool moved to the Operator role too. Action required: promote any Viewer account that is expected to run playback to Operator. See Roles and Permissions. - The desktop app matches the new roles: Viewers no longer see transport controls, the seek bar becomes display-only, and the Players page shows a View only badge. Operators can assign zones to their players and toggle routing in the matrix. Refused actions now show "You don't have permission to do that." instead of failing silently.
- Operators and Viewers start on the Players tab, without the Welcome tab (still available from Help → Welcome). An Operator or Viewer rearranging tabs no longer overwrites the layout saved in the workspace.
- Firewall rules now cover discovery: Add Windows Firewall rule creates a third rule, MZAP Discovery (LAN) for UDP 5002, and the installer adds and removes it too. If you added the firewall rules on an earlier version, click the button once more after upgrading so phones can discover the PC.
- Mobile pairing and the View only badge are translated into all 20 non-English interface languages.
Fixed
- The offline grace period works as intended: A PC that lost its internet connection could be asked to reconnect straight away instead of getting the full grace period. See License Troubleshooting — Grace Period.
- Shuffle mode highlights the track that is actually playing: In the player's Queue tab, Shuffle highlighted, scrolled to, and protected a row chosen by shuffle position rather than the real playing track — so the playing track could be deleted while an unrelated one had its delete button disabled. Other playback modes were never affected.
- A track change now also sends
PlaylistChangedEvent: Clients that highlight the playing row from a playlist'scurrentIndexkept the highlight on the previous track. The event stream now sendsPlaylistChangedEventalongsidePlayerStateChangedEventwhenever the playing position actually moves. - Event streams announce themselves immediately: The SSE endpoints now send a
: connectedcomment as soon as the stream opens. On a quiet host, clients that wait for body bytes previously sat on "Connecting…" for up to a minute. Browsers'EventSourceignores the line, so existing integrations are unaffected. - No Welcome flash at startup: The desktop app no longer briefly shows the Welcome tab before the saved layout appears.
- No permission errors when an Operator or Viewer signs in: Two "You don't have permission to do that." toasts appeared at startup because the app requested the admin-only device lists. Restricted accounts no longer request them.
v7.2.0.117 — 2026-08-27
Section titled “v7.2.0.117 — 2026-08-27”New
- Jingle target selections can be saved without playing: Choosing target players or zones only stuck if you pressed Play — the selection was recorded as a side effect of playback, so a jingle configured and left alone lost its targets and reopened showing whatever it had last been played on. The target list now has a Save button next to Play/Stop, which lights up as soon as the selection differs from what the jingle has stored and reads Saved when there is nothing pending. Playing a jingle still records its targets. Saving is admin-only. See Jingles — Saving a target selection.
- Application capture recovers automatically when the app restarts: Closing and reopening a captured application left its player silent until the player was manually stopped and started again — Windows binds a capture to a specific process and does not follow it across a restart. MZAP now notices when the captured application exits, releases the dead capture, and re-attaches by itself within a few seconds of the application coming back. While the app is closed the player shows Attaching and clears its track name instead of appearing to play a track that has stopped; players you stopped yourself are not restarted. See Input Capture — Recovery when the app restarts.
Fixed
- Application capture now attaches reliably to multi-process apps: Capturing apps that run several processes (Spotify, Chrome, Electron-based players) could produce a player that showed the correct track name but played no audio — or, in a shared zone, appeared to play another player's audio because its own capture was silent. MZAP picked the most recently started matching process, which for these apps is a short-lived renderer child, and Windows' process-tree capture never covers a process's parent. Capture now attaches to the top-level process, preferring the instance that owns an audio session, and reads track metadata from that same process. Existing players are repaired automatically on the next attach. See Input Capture — Multi-process apps attach correctly.
Changed
- The "Include child processes" option was removed from the capture dialog. Capture always covers the selected application and its child processes, which is what the checked state did and what every capture setup needs. Unchecking it did not narrow capture to a single process as the label suggested — it selected a Windows mode that captures every application except the selected one, typically producing silence or unrelated audio. Existing players are unaffected, and any player previously saved with the option off now captures the intended application. The API still accepts
includeProcessTreefor backward compatibility but ignores it, and it has been removed from player responses; the MCPcreate_process_loopback_playerparameter is gone. - Jingle target saving and the TTS setup links are translated into all 20 non-English interface languages, instead of falling back to English. This also fills in the text-to-speech setup help strings, which had been English-only in every locale since those links were added.
v7.2.0.116 — 2026-08-26
Section titled “v7.2.0.116 — 2026-08-26”New
- Built-in stream server sends the station name: Listeners connecting to a streaming zone's built-in server now see the station name (from the zone's Station name setting, or the zone name when blank), so players such as VLC show it in place of a bare URL. Applies automatically to every stream zone with the built-in server enabled.
- Help links next to the cloud TTS key buttons: Each cloud provider in Settings → Text-to-speech now has a How to get a key link that opens its setup walkthrough in the documentation. It appears beside the Set up key / Replace key buttons, inside the key dialog, and as Check the setup steps directly under a failed Test connection. See Settings — Finding the setup steps.
Fixed
- TTS previews now match the saved jingle: Previewing and then saving used to call the provider twice, and cloud engines do not generate identical audio twice — the same text, voice, and rate could come back with noticeably different pacing. Saving now reuses the exact audio you previewed, and re-synthesizes only when you change the text, voice, provider, or rate. This also halves the characters billed by your cloud provider per jingle. See Jingles — The preview is what you save.
- The speaking-rate slider shows each provider's real range: The slider offered 0.5×–2.0× for every provider, but ElevenLabs only honours 0.7×–1.2× and silently clamped anything beyond that — a jingle played at 1.2× while the UI still read "2.00×". The slider now shows the true range per provider. Existing jingles keep their audio; re-save one to bring its stored rate in line. See Jingles — Speaking rate.
- Failed cloud TTS connection tests explain themselves: Every failure reported "Connection failed. Check the credentials.", which was misleading whenever the key was fine. The provider's own explanation is now shown, distinguishing a rejected key from a valid key missing a permission scope (ElevenLabs keys need
voices_readandtext_to_speech), a quota or rate limit, a wrong Azure region, and a network or DNS failure. - Switching TTS provider no longer keeps the previous provider's voice selected. Preview and Save are disabled while the new provider's voices load, instead of failing with an "invalid ID" error.
- Daily and Weekly scheduler tasks fire at the second you set: The Start Time picker has always offered a seconds field, but Daily and Weekly tasks silently rounded down to
:00— a task set for 21:32:39 fired at 21:32:00. Seconds are now honoured, and Next Run, Last Run and the Execution Log display them. Existing tasks keep firing at:00until re-saved. See Scheduler — Seconds are honoured. - Non-Latin stream titles and station names survive: Track titles and station names sent to a stream zone's listeners are now encoded as UTF-8. Cyrillic, Greek, and other non-Latin names previously arrived as rows of
?with the original text unrecoverable. MZAP also reads stream metadata correctly now — a player tuned to an internet radio station shows non-Latin station names and track titles properly, trying UTF-8 first and falling back to ISO-8859-1. See Streaming Zones — Station names and track titles. - The Debug log level setting now actually produces debug output: Setting Settings → Log Level to
Debughad no effect — log files continued to contain only Information-level entries and above, so debug diagnostics were silently unavailable when troubleshooting. No configuration change is needed if you already hadDebugselected. See Settings — Logging.
v7.2.0.115 — 2026-08-23
Section titled “v7.2.0.115 — 2026-08-23”A large release: two major new player and zone types, MCP authentication, and licence enforcement across capture and zone limits.
New
- Streaming zones — broadcast a zone as internet radio: A zone can now be created as a streaming zone, encoding its mix (with volume, EQ, and compressor) to MP3 or Opus and broadcasting it instead of playing to a device channel. Two delivery modes, usable together: a built-in HTTP server that listeners open in VLC, a browser, or any radio app, and/or a push to an external Icecast/Shoutcast server. The zone detail gains an On-Air panel with the broadcast state, a listen URL per network interface, live listener counts, and the exact firewall command to run. Requires the Streaming licence feature. See Streaming Zones.
- AirPlay input — play from an iPhone, iPad or Mac into any zone: A new player type turns MZAP into an AirPlay-compatible receiver. While started it appears in the AirPlay picker on Apple devices under a name you choose, and whatever the phone plays flows through that player into its zones with MZAP's volume, EQ, ducking and scheduling. Each endpoint can optionally require a password. Requires the AirPlay licence feature; Personal licences allow 2 endpoints, Business unlimited. See AirPlay Input.
- Microphone auto-ducking: An Input (microphone) player can now automatically lower the volume of other players while it is live and restore them when it stops, so announcements over background music no longer need an operator at the faders. On by default for microphones you add yourself; the input players MZAP creates automatically from your hardware are left off. Other microphones are never ducked. See Jingles — Microphone auto-ducking.
- The MCP server now authenticates and honors user roles: With authentication enabled, MCP clients must send a valid API key, and that user's role decides which tools they can see and call — Viewer gets read-only tools, Operator adds playback and DSP, Admin gets everything. Tools outside a client's role are hidden rather than failing when called, and non-admin clients only see their assigned players and zones. See MCP Overview — Authentication and roles.
- "Stop After This Track" playback mode: A fifth playback mode that finishes the current track and then stops. It is a normal mode, not a one-shot toggle, and keeps the playlist position so Play resumes from the track that just finished. See Playlists — Stop After This Track.
- Capture system audio in stereo with one player: The Channel dropdown in Capture system audio now offers All channels on any multichannel loopback endpoint, capturing the whole endpoint interleaved so one player carries true stereo. Previously capturing both halves meant two mono players routed to opposite sides. See Input Capture — Capturing system audio in stereo.
- Renew support and updates from inside the app: Support determines which versions you can install — a release is available to you if it came out before your support ended. A Renew support & updates button now appears in the About dialog and the update banner from 60 days before support ends. When an update exists that was released after your support ended, the banner names the newest version still available to you instead of offering a download that would not work. See Support & Updates.
- Anonymous usage data is opt-in: MZAP asks once, after first-run setup, whether it may collect anonymous usage data, with the choice changeable under Settings → Privacy. The app behaves identically whichever answer you give, and no usage data is collected yet — the setting records your choice so nothing is ever collected without it. See Privacy & Data Collection.
- Settings gains an MCP server section, showing whether the feature is licensed, the URL to connect to, how many AI clients are connected, and ready-to-copy setup for Claude Code and Claude Desktop. See Settings — MCP server.
Changed
- Licences can cap how many zones you may create: Licences now carry a maximum zone count, applying to trials exactly as to paid keys;
0means unlimited, and most tiers are uncapped. If you already have more zones than the licence allows, nothing is deleted — the first N work normally and the rest are kept but not started, coming back automatically when the limit is raised. See Zones and Players — Zone limits. - Device loopback capture is now a licensed feature: Capturing an output device's audio requires the Device Loopback feature (included in Business, Subscription and Trial licences; not in Personal). Existing loopback players are preserved but refuse to start without it, and loopback players are no longer auto-created for unlicensed users. Microphone and line-in capture is unaffected and remains available on every licence. See Input Capture — Licensing for capture players.
- Per-application capture is enforced when a player starts, not only when it is created, so the licence is honoured however playback was triggered.
- Unlicensed features are shown and explained instead of hidden: Creating a streaming zone, capturing system audio, and capturing a single application used to disappear from their menus entirely, leaving no way to tell whether the feature did not exist or was simply not part of your licence. These entries now stay visible but inactive with a plain statement of why. Activating or upgrading a licence updates them immediately, without reopening the screen.
- Playback stops when the licence is not valid: Audio no longer keeps playing after a trial ends. Zones, players and routing are still restored so the configuration stays intact — players simply do not start, and activating a licence resumes playback without restarting. Valid, trial, grace-period and support-expired licences all play normally. See Activation — Playback and licence state.
- Some MCP tool parameters take words instead of booleans: LLM clients frequently send booleans as quoted strings, which made
set_player_volume,set_zone_volume,set_equalizerandset_compressorfail before the tool ran.mutenow accepts"mute"/"unmute"andenabledaccepts"on"/"off", along with common variants.manage_workspacewas also split so read-only use no longer needs Admin —get_workspace_infois a new tool. Scripted callers passing a real JSON boolean need updating. See MCP Tools Reference. - LAN firewall access is enabled by default in the installer: The "Allow access from other devices on your network (LAN)" option is now ticked by default. It was previously off, which silently broke AirPlay input and "Expose to local network" on a standard install — the endpoint was still announced and still appeared on an iPhone, but every connection was blocked with nothing in the logs to explain it. See Installation — Network access (LAN).
- Logs consolidated into one folder, with far less noise: All logs now live in
%APPDATA%\MZAP\logs\. The desktop shell previously wrote a separatestartup.lognext to the program files or in%APPDATA%\MZAP\, which never rotated and could reach hundreds of megabytes. It is nowlogs\shell.log, capped at 5 MB. Routine playback chatter dropped from Information to Debug. Existingstartup.logfiles are not removed automatically and can be deleted. See Logs. - The jingle Duck slider shows the attenuation in dB: The slider previously showed only a percentage, but that percentage is a linear gain multiplier — "10%" actually means −20 dB, noticeably quieter than the label suggests. It now reads both units, e.g.
10% · -20.0 dB. No change to how ducking sounds. See Jingles — Duck level. - The Ducked marker names its cause: The marker previously appeared only for microphone ducking. It now also appears while a jingle is ducking — which matters most for scheduled adverts, where the music drops with no operator action — and its tooltip names the cause, listing all of them when a microphone and a jingle overlap.
- The uninstall survey offers six better-fitting reasons instead of nine. Added "I couldn't get it working / no sound" and "Too complicated to set up", since most uninstalls happen within minutes of first launch and nothing in the old list described that. "Other", "Temporary" and "I'd rather not say" were removed — they absorbed two-thirds of answers without saying anything actionable.
- Less personal data sent and stored: The desktop app no longer sends your computer's name during activation, trial registration or uninstall — machine names are often personal names, and the hardware ID already identifies the device. The licensing server no longer stores IP addresses; the country is still resolved from the request, but the IP itself is discarded.
- The first-run window is wider, shorter and centred: The default was 1100×1300 — narrow enough that the app could open in its mobile layout, and taller than a 1080p screen so it opened clipped. It is now 1280×860 and centred. Saved window positions are unaffected.
- All interface text is translated in every shipped language: The AirPlay, licence-renewal, privacy and DSP text added by this release is available in all 21 languages, along with older screens that still fell back to English — user-management and authentication errors, settings and firewall errors, prayer-time dropdowns, sign-in failures, radio search and favourites, and the accessibility labels on mobile bottom sheets.
Fixed
- The app opened in the mobile layout on high-DPI displays: On displays using Windows scaling (125%, 150%, 200% — the default on most 4K screens), the desktop app opened in its narrow mobile layout with bottom tabs instead of the full desktop interface. MZAP now declares per-monitor DPI awareness, so window sizes are applied in real pixels and text and icons render sharply rather than being upscaled by the OS.
- Permission errors return 403 instead of a server error: With authentication on, any request a user's role did not permit came back as
500 Internal Server Errorrather than403 Forbidden, across every permission check in the API — so a Viewer or Operator saw a generic server failure and could not distinguish a permission problem from a genuine fault. Licence-gated endpoints had the same fault. No request that previously succeeded is affected. See Roles — API behavior by role. - Streaming zones explain their errors and recover when the licence changes: The Error badge now carries the reason — "Streaming requires a license upgrade", "Port 8600 unavailable", "Encoder start failed" — and the reason survives a page reload, where previously a failure during startup left a red badge with no explanation at all. Listen URLs and listener counts are hidden while a zone is in Error or Offline, since nothing is bound to the port. Activating, re-checking, trialling or deactivating a licence now re-realizes streaming zones immediately, without restarting MZAP.
- Streaming zones no longer trigger a false "Devices Offline" warning on load: A workspace containing a streaming zone showed the zone as offline alongside a device entry with a blank name, even though "Load Anyway" restored it correctly. Stream zones are not bound to an audio device and are now skipped by the pre-load device check.
- Clearer errors when cloud text-to-speech is not licensed: Creating or editing an Azure or ElevenLabs TTS jingle used to fail with a generic "TTS synthesis failed" carrying the raw underlying error, because the licence was only checked once synthesis was under way. Both now return a proper "not permitted" response before attempting to synthesize. Editing an existing streaming zone's settings on a licence that no longer covers streaming likewise explains the situation instead of presenting a form that cannot be saved.
- One consistent warning when authentication is off: Settings showed two differently-worded warnings about the same risk — one under Network Access and one under MCP server — which read as two separate problems. Both now show the same message and styling, each still pointing at the nearest place to fix it.
- Deleting a zone, player, or playlist closes its detail view: Deleting from a detail view used to leave you on an empty "no zone selected" page with the deleted item's tab still open. The view now closes itself — the tab is removed on desktop, and mobile returns to the previous screen. Failed deletes no longer close the view, so the error is visible rather than hidden.
- An expired trial no longer re-contacts the licence server on every launch. The activation screen says the trial has ended rather than reverting to the first-run prompt.
- URL streams can use the BASS decoder plugins.
- Streaming zones keep working across workspace loads and rebuilds, meter correctly, and keep the right name after a rename.
v7.1.0.108 — 2026-08-06
Section titled “v7.1.0.108 — 2026-08-06”New
- Per-device output mode (WASAPI Shared or Exclusive): Each output device card in Audio Devices now has its own Output mode selector instead of one global setting. Exclusive bypasses the Windows mixer for true discrete 5.1/7.1 and lowest latency but locks the device from other apps; Shared (the default) lets the device coexist with Windows and other applications. One PC can now mix cards with opposite needs — one on Exclusive for 7.1, another left on Shared. If MZAP can't get exclusive access at startup it falls back to Shared and the card shows a warning. See Audio Devices — Per-device output mode and Enabling WASAPI exclusive mode.
- Turn individual output devices on or off: Each output device card has an On/Off switch telling MZAP whether to open that device. Devices that are off stay visible (dimmed, with an Off badge) so they can be switched back on. This matters for sound cards that expose two endpoints on one physical card — opening the unused endpoint can collapse the whole card to stereo and silence multichannel output. Changes are saved immediately but take effect after an app restart. See Audio Devices — Turning output devices on and off.
- Stereo input pairs for ASIO devices: Input players on ASIO devices can capture an adjacent channel pair (1-2, 3-4, …) as a single true-stereo player — e.g. a Focusrite Scarlett's Analogue 1-2 or Loopback 1-2 pair. The Add/Edit Input Player dialog gains a Mono/Stereo layout toggle, and channel dropdowns now show the driver's own channel names so virtual channels are identifiable. See Input Capture — Stereo input pairs.
- Stereo level meters: Meters on player and zone cards (and their detail views) now show independent left/right bars for stereo sources — playlist players, stereo input players, and stereo zones — in the same footprint as before, so card sizes are unchanged. Mono sources keep the single full-height bar, and the clip indicator latches when either channel clips. Stereo input players also show a Stereo badge. See Zones and Players — Metering.
- Zone detail shows and edits its assigned players: A new Sources section on zone detail lists which players feed a zone, and each zone card in the Zones list shows its sources on a clickable summary line that opens a picker — so routing can be changed without opening the Matrix. When a zone has two or more sources, MZAP flags it with an amber "N mixing" warning. See Zones and Players — Zone sources.
- Seven new UI languages: Polish, Lithuanian, Vietnamese, Slovak, Czech, Bulgarian, and Japanese join the existing 14, bringing the total to 21. The license activation screen, update banner, per-application capture picker, and the AM/PM time control were also localized. See Settings — UI Settings.
- Stream Stall Timeout is configurable in Settings: The seconds a network stream may stall before falling over to a local backup track is now exposed in Settings → Network Stream Settings, alongside a Fail over to local backup when a stream stalls toggle. Previously this was backend-only. See Settings — Network Stream Settings.
- Set volume in decibels via the API:
PUT /api/zones/{id}/volumeandPUT /api/players/{id}/volumeaccept a new optionalvolumeDbfield, and zone/player responses include a read-onlyvolumeDb. Unlike the 0–1 fader position, a dB value means the same loudness regardless of the Volume Scale setting. See Settings — Setting volume in decibels.
Fixed
- Multichannel cards with multiple endpoints keep full surround: Some cards expose more than one output endpoint on the same physical device (the Creative Sound Blaster Live! 24-bit External has both a 5.1 "Speaker" and a stereo "SPDIF-Out" endpoint). MZAP used to open every endpoint, and opening the unused sibling made the driver collapse the card to stereo, silencing the rear/center channels. Zoneless sibling endpoints are now skipped automatically, preserving discrete 5.1/7.1.
- Changing a zone's channel or layout no longer stops its audio or changes its level: In WASAPI output mode, editing a playing zone's Channel or Mono/Stereo layout used to silence it until the app restarted. It now continues uninterrupted on the new channel. In all output modes, the edited zone's level no longer jumps — the routed player's saved volume and mute are re-applied, so all zones a player feeds stay at matching levels.
- Edit Zone dialog shows the correct channel on first open: Opening Edit Zone for a zone the first time could show the wrong channel with a spurious "This channel is already used by…" warning. The dialog now always seeds from the zone being edited, with the correct channel, layout, and name.
- Stereo input players show their channel range in labels rather than only the first channel.
Changed
- Playback mode is now a per-player setting: Playback mode (Sequential / Repeat One / Repeat All / Shuffle) is set on the player, not the playlist it points at. Previously, changing a player's mode wrote directly to the saved playlist — so two players sharing a playlist would silently change each other's mode and permanently rewrite the library playlist. Changing a mode now moves that player onto its own private working copy; your saved playlist is never modified. Two players can play the same library playlist with different modes at once, and setting the mode from the players list and the detail view now behave identically. See Playlists — Playback mode.
- Deeper default network buffering: Default network stream settings now ride out brief per-connection gaps the way a browser does, instead of cutting to a local backup track. Network buffer 5 s → 30 s, pre-buffer 0% → 75%, network timeout 30 s → 50 s, and stall timeout 3 s → 5 s. Defaults apply to fresh installs only; existing saved settings are unchanged.
- Devices with no zones mapped are no longer opened at all, so MZAP never locks or holds an output endpoint you aren't using.
- Consistent stereo/mono and status badge ordering across zone and player views, and device detail zone rows now show stereo and mixing badges.
- Every player outputs stereo: Documented that a mono source — a single-channel input or a mono file — is duplicated equally to left and right, which is why its level meter shows two identical lanes. Hovering the meter now explains this. See Zones and Players — Mono sources and stereo output.
v7.1.0.102 — 2026-06-12
Section titled “v7.1.0.102 — 2026-06-12”New
- Stream-outage failover with auto-return: A player that plays an internet radio stream can now fall back to local backup tracks when the stream drops, then return to the stream on its own — minimizing dead air. Build the queue as
[stream URL, local file 1, local file 2, …]and turn on the shield toggle on the player's Playlist tab. While on backup, MZAP re-checks connectivity at every local-track boundary and crossfades straight back into the stream. See Playlists — Stream-outage failover. - Set a player's playlist from the Players view: Playlist player cards now show their current playlist on a clickable line beneath the type badges — click it to switch playlists or create a new one without opening the detail panel. Reads Select Playlist when nothing is loaded. See Playlists — Switching a player's playlist.
- Save an unsaved queue from the playlist picker: The Select Playlist dialog now offers Save current queue… whenever the active queue is unsaved and has tracks, so switching playlists no longer silently discards it. See Playlists — The current playlist.
- Auto / Custom ordering for Zones and Players: Both views now default to Auto — zones sort by name with numeric awareness (so
zone2comes beforezone10), and players sort by type then name. Switch to Custom to drag them into any order; the arrangement is saved and restored if you toggle back. See Zones and Players — Ordering. - From Folder now offers three grouping modes: One playlist per subfolder (the original behavior), one playlist with every file underneath the folder, or one playlist with only the files directly in it. The two single-playlist modes let you name the playlist. See Playlists — Bulk-Create from a Folder Tree.
- Playback mode button moved into the player detail, inline with the progress bar.
Fixed
- Stopped players stay stopped after a workspace restore: A player that was stopped when the workspace was saved no longer starts playing when it is loaded — its track is cued in the Now Playing header, but playback stays stopped. Players saved while playing or paused restore as before. Affected both local-file and stream players.
- Partial UI-state updates no longer wipe saved settings: Updating one part of the interface state (for example toggling a sort mode) no longer clears the others. Custom player/zone ordering, recent stream history, active filters, and collapsed sections all survive.
Changed
- Per-player crossfade is now the single source of truth: A player's crossfade of 0 now means no crossfade (hard cut) rather than "inherit the global default", so one player can hard-cut while others crossfade. Default Crossfade Duration in Settings now only seeds newly-created players. Workspaces saved by older versions are migrated once so existing players keep the behavior they had. See Playlists — Crossfade.
- Consistent player detail panels across all source types: Input, loopback, and capture players now show a Now Playing block (source label and channel) like playlist and stream players, and every panel reserves the same height for it — so volume, tabs, and zones line up when panels sit side by side. Capture, input, and loopback players show a Live / Idle status pill in place of the playlist progress bar.
- Zone grid in the player detail adapts to panel width: The Zones tab now picks its column count from the panel's own width rather than the window's, so zone names stay readable when a player is docked into a narrow column.
v7.1.0.100 — 2026-06-09
Section titled “v7.1.0.100 — 2026-06-09”New
- User-defined zones: Zones are no longer created automatically one-per-channel. A zone is now a definition you create — choose its device, channel, and mono/stereo layout — and the same device can host both mono and stereo zones at once. Zone layouts are stored independently of devices, so they're portable across machines (offline zones offer a Reassign action). You can also bulk-create zones for every free channel of a device (Mono or Stereo, optional name prefix) — ideal for high-channel hardware like a 64-channel Dante Virtual Soundcard. See Zones and Players.
- First-run setup choice: On first launch MZAP now asks whether to create a demo workspace or start empty, and an admin can rebuild a fresh demo any time with the Welcome screen's Create Demo Workspace button. Demo radio players are created stopped — MZAP no longer starts playing audio on its own.
- Manual input players: Microphone, line-in, and ASIO input players are now created on demand via the Players view Create dropdown instead of flooding the list at startup; only loopback players are auto-created. Input/loopback players can be re-pointed to a different device/channel with a pencil button, and a unified colored type badge (Playlist / Input / Loopback / Capture) is shown everywhere. See Input Capture.
- Launch on Windows startup: A new Launch on Windows Startup toggle in Settings → Workspace starts MZAP automatically at the next Windows login. Registration is per-user (no admin rights or UAC prompt), takes effect immediately, and self-heals if the install location changes after an update. See Settings — Launch on Windows startup. (Windows desktop app only.)
- Expose MZAP to the local network: An opt-in Network Access setting lets MZAP be controlled from other PCs and phones on the same network, with an authentication/firewall confirmation flow. See Settings — Network access.
- Professional VU meters: Level meters now read like a broadcast console — color thresholds pinned to dBFS (green below −18, amber −18 to −6, red −6 to 0 per EBU R128 / SMPTE alignment), a peak-hold marker that falls slowly like hardware, a latching clip indicator you click to reset, and a −48 dBFS scale floor for more resolution. See Zones and Players — Metering.
- Internet reachability indicator: The status bar now shows a distinct Internet: Online / Offline / Unknown indicator, separate from the API/Live link, so "your streams will fail because this PC is offline" is surfaced directly — including multi-NIC machines where only the internet-bearing adapter goes down.
- Reorganized player queue toolbar: The toolbar groups the add/source actions together and replaces the two old save buttons with a single Save dropdown (Save to File… and Save to Playlists…); Clear Playlist moved to the far-right edge and always asks for confirmation. Each player also shows where its queue came from — 📄 File, 🎵 Library, or ✎ Unsaved. See Playlists.
Fixed
- Editing no longer overwrites saved playlists: Each player now has its own working current playlist. The first edit forks a private working copy (marked Unsaved) and leaves the saved library playlist untouched, and re-loading the same playlist file or playing several radio stations onto a player no longer creates duplicates. Editing a playing playlist is now seamless — the current track carries over with no audible gap or stream reconnect. See Playlists — The current playlist.
- Refresh Devices is now incremental: Refreshing no longer tears down the audio engine. Connected devices and their playback are left untouched (no audio gap); only added/removed devices change, disconnected devices' zones go offline, and their routing survives a reconnect. Player/zone volume & mute are also restored after a device refresh or reconnect.
- Non-Latin device names (Cyrillic, etc.) now display correctly everywhere instead of showing as "?????". See Audio Devices — Non-Latin device names.
- Consistent volume everywhere: Volume now uses a single dB-based model (
linear = 10^(dB/20)) across players, zones, and jingles on both WASAPI and ASIO, so the same fader position produces the same loudness and matches the on-screen dB readout. The fader spans −40 dB to 0 dB. - Idle zones no longer show phantom level activity, and playlists no longer stall on very short tracks during crossfade (a clip shorter than the crossfade now uses a direct transition and keeps advancing).
- Zone EQ bypass state now persists across reload and workspace switch; EQ/Compressor panels remember their collapsed state.
- Correct pluralization and localization: counts next to nouns now use proper per-language pluralization (fixing output like "1 tracks" / "1 треків"), the Devices headers/filters and license trial banner are fully translated, and long activity-bar labels wrap cleanly.
Improved
- Mobile-friendly UI throughout — the Devices, Library, Matrix, Scheduler, and Jingles views, dialogs, and detail panels were rebuilt to be responsive and touch-friendly, plus assorted UI refinements (device drag-and-drop ordering, on/off effect toggles, a tidier player header, shared channels with an optional Strict zone channels setting, faster workspace clearing, and high-channel-count scaling with filters and folding).
- Settings changes propagate to open clients in real time — toggling authentication or LAN exposure updates every open window live, without a manual reload.
- SSE event streams now send heartbeats every 60 s when idle, so dropped connections are detected promptly and clients auto-reconnect.
- Library search now matches partial words (prefix search), and Generate Playlist now uses the entire library, not just the loaded page.
- Lower memory/CPU for VU meters in long sessions — a single shared level stream, throttled repaints, and auto-pause while the window is hidden.
v7.0.2.90 — 2026-05-25
Section titled “v7.0.2.90 — 2026-05-25”New
- Library search rebuilt on SQLite FTS5: The Library search box now runs against a full-text index — whole-word matching with
pink*prefixes, booleanAND/OR/NOT,"phrase"andNEAR(a b, 5)queries, accent folding, and Porter stemming. Range filters (year and duration) moved into a filter bar beneath the search box. See Media Library — Search. - Library row selection and right-click menu: Tracks are now selectable (single, Ctrl/Cmd, Shift-range). Right-click opens a context menu with Play on player…, Add to playlist…, Append to player…, Generate playlist from selection, Show details, Create jingle from track, and Copy path(s). See Media Library — Row Selection and Context Menu.
- Live library scan progress, cancellation, and non-blocking API: Folder scans show a determinate progress bar with a Cancel button and run on a single-flight server-side queue. The scan endpoints now return
202 Acceptedimmediately with ascanId; completion is delivered through SSE. See Media Library — Live scan progress. - Bulk-create playlists from a folder tree: New From Folder button on the Playlists tab creates one playlist per subfolder containing audio, and re-running on the same root syncs in place — appending new files, removing deleted ones, and preserving UI reorderings. See Playlists — Bulk-Create from a Folder Tree.
- Delete playlist action with confirmation on playlist cards.
Fixed
- Scheduler — Daily/Weekly today: Creating a Daily or Weekly task at 15:56 with a
15:56trigger now fires today instead of skipping to tomorrow. Start time is treated as an activation date, not an exact firing instant. The task editor also now shows a live clock and the active timezone. See Scheduler — Daily and Weekly start times. - Log files rotate on size: When the configured size limit is reached, MZAP rotates to
mzap-…-1.log,-2.log, … and keeps logging instead of stopping until the next restart. The folder watcher no longer logs rawFileSystemWatcherevents for non-audio files (.DS_Store,desktop.ini, OneDrive/Drive sync touches). Per-file enqueue/scan traces moved fromInformationtoDebug. See Troubleshooting — Logs.
v7.0.2.89 — 2026-05-21
Section titled “v7.0.2.89 — 2026-05-21”New
- ElevenLabs TTS provider: A third text-to-speech provider for TTS jingles, offering premium multilingual neural voices. Like Azure, it is covered by the Cloud TTS license feature and uses your own API key. See Settings — Text-to-speech.
Fixed
- Clearing a playlist no longer leaves the bound player on an orphaned track. A player finishing a file now stops cleanly once the playlist is emptied and the "Now Playing" panel shows "No audio loaded"; a player on an internet radio stream keeps playing until you stop it manually.
v7.0.1.87 — 2026-05-21
Section titled “v7.0.1.87 — 2026-05-21”New
- Text-to-speech (TTS) jingles: Create jingles by typing text instead of supplying a recorded audio file. Phase 1 ships the offline Windows voice provider and the Azure Speech cloud provider (~140 neural voices, license-gated). A TTS jingle plays through the same ducking pipeline and can be scheduled exactly like a file jingle. See Jingles — Text-to-speech.
v7.0.1.86 — 2026-05-21
Section titled “v7.0.1.86 — 2026-05-21”New
- Per-device stereo zone layout toggle — pair a device's output channels into stereo zones. See Zones and Players.
- Scheduler: duplicate task button to clone an existing scheduled task.
- Licensing security improvements.
Fixed
- Scheduler task editor: corrected default ZoneControl/PlayerControl command and added a Save & close button.
v7.0.1.82 — 2026-05-19
Section titled “v7.0.1.82 — 2026-05-19”New
- Licensing security improvements. Existing licenses keep working without any action.
v7.0.1.81 — 2026-05-17
Section titled “v7.0.1.81 — 2026-05-17”Fixed
- Bug fixes and improvements.
v7.0.1.80 — 2026-05-17
Section titled “v7.0.1.80 — 2026-05-17”Fixed
- Memory usage now stays flat while the PC is in Windows Modern Standby. Streaming buffers are capped and unused memory is released back to the system during standby, replacing an earlier interim fix. This builds on the idle-memory improvements introduced in v7.0.1.78.
v7.0.1.78 — 2026-05-06
Section titled “v7.0.1.78 — 2026-05-06”Improved
- VU meter streaming is now demand-driven: the 100 ms sampling loop starts when the first client subscribes to
/api/stream/levelsand stops when the last subscriber disconnects. No metering work happens while the UI is closed, eliminating background memory growth on Windows Modern Standby and reducing idle CPU. Windows session lock now force-disconnects all level subscribers and blocks new ones until unlock, so reconnecting browser EventSources can't keep the sampling loop alive across a locked session.
v7.0.1.77 — 2026-05-03
Section titled “v7.0.1.77 — 2026-05-03”New
- Prayer-time scheduler triggers: A new
Prayer Timetrigger fires daily at any of the five Islamic prayer times (Fajr, Dhuhr, Asr, Maghrib, Isha) — or at Sunrise — computed from the venue's latitude and longitude. Configure venue location and calculation method in Settings → Prayer-Time Scheduling, then create date-bounded triggers (e.g. Ramadan only) with per-prayer offsets in the scheduler. See Scheduler — Prayer Time triggers and Settings — Prayer-Time Scheduling. - Per-application loopback shows the captured app's window title: ProcessLoopback player tiles now display the captured process's main window title in the Now Playing line. For Spotify, Chrome/YouTube, VLC, foobar2000, and other apps that put the song into their window title, the current track shows up automatically. The top label now shows the process exe name (e.g.
Spotify.exe). See Input Capture. - Players and Zones get explicit Auto / Custom sort buttons: The single-button sort toggle is now two side-by-side buttons (
Auto,Custom) so the current mode is visible at a glance. New workspaces default to Custom so manual reordering sticks unless you opt back into auto sort.
Fixed
- Long player and zone names in detail-panel tab titles and the player card header are now truncated with an ellipsis instead of pushing other tabs off-screen. The full name is shown in the tab tooltip.
Changed
- The unused Volume Scale field has been removed from the Settings UI (it was always fixed to
Logarithmic). The setting still exists in the API for forward compatibility.
v7.0.1.76 — 2026-04-29
Section titled “v7.0.1.76 — 2026-04-29”New
- Per-application audio loopback capture: Capture audio from a specific running application (e.g. Spotify, Chrome) instead of the whole system. The new "Capture app audio…" picker lists currently audible apps; players can also auto-attach when the target launches later. Includes a child-process toggle so multi-process apps like Chrome and Electron are covered. Requires Windows 10 build 19041+ and the
ProcessLoopbacklicense feature. See Input Capture for details.
Fixed
- Stopped players no longer auto-recover when restoring a workspace —
LastStopReasonis preserved so saved-stopped streams stay stopped instead of being pre-attached on restore. - MZAP's own processes (
MZAP.Api.exe,MZAP.Web.exe, host) are excluded from process-loopback capture targets, preventing feedback loops.
v7.0.1.74 — 2026-04-19
Section titled “v7.0.1.74 — 2026-04-19”New
- Stream resilience settings: fast stall skip (skip to the next track when a stream stalls for more than N seconds), short auto-advance timeout (dead streams fail fast during playlist advance), and persistent stream health retry (keep retrying after exponential backoff is exhausted). See Settings for details.
- Per-player and global stream URL hiding with an admin-only toggle. URLs can be hidden individually on each player, globally for all players, or the UI toggle itself can be hidden.
Fixed
- Resolved a dual-playback race between crossfade and end-sync that could cause two tracks to be audible at once.
- Crossfade state now stays in sync with the player state machine.
- Removed a hardcoded server URL from the OpenAPI spec so generated clients use the document origin.
Changed
PlayerManagerandStreamHealthMonitorServicelog messages now share a unifiedPlayerprefix for easier log scanning.
v7.0.1.73 — 2026-04-15
Section titled “v7.0.1.73 — 2026-04-15”New
- Welcome screen now includes Radio Browser and Scheduler cards, filling out the feature grid to 3×2 on wide layouts. All 14 UI languages have translations for the new cards.
- The Help menu → Documentation item and a new Documentation card on the Welcome screen both open docs.multizoneaudioplayer.com in your default browser.
Fixed
- Auto-save no longer overwrites
default.mzapafter using Save As. Auto-save now writes back to the currently loaded workspace file, and only falls back todefault.mzapfor a fresh "Untitled" workspace. - Loading a workspace now refreshes the active session's player and zone assignments, so non-admin users immediately see the assignments from the newly loaded workspace.
- Seek errors during the local-file branch of player restore are no longer fatal — the rest of the workspace restore continues as expected.
- Minor corrections to the OpenAPI spec used by the API reference.
Older releases are not individually documented here. See the MZAP website for general release information.