Skip to content

What's New

Release notes for Holophonix Remote Control.

0.8.9

Added

  • New channel icons: a real violin and trumpet (and the other Holophonix 3D-model icons) now use clear, recognizable symbols.

Changed

  • Reliability & performance hardening across backup failover, cue GO, multi-touch dragging and the Stream Deck (pre-1.0 audit pass).

Fixed

  • Client mode: the Holophonix status now shows correctly as soon as you connect — no more false "Offline" for a few seconds.
  • Channel icons now stay in sync between the server and connected clients (all icons, both directions).
  • Multi XYZ: resetting a background dimension (double-click) or typing a value now offers to rescale, like dragging the slider already did.
  • Multi XYZ: the line linking grouped sources keeps a constant thickness when you zoom.

0.8.8

Fixed

  • Multi XYZ: the background floor plan now stays correctly aligned with source and control-zone positions. (Previously the plan could appear shifted or mis-scaled after connecting or switching projects.)
  • Backup processor: failover to the backup Holophonix now works reliably — switching no longer fails silently.
  • Continuous recording: when you record a sequence of movements, the timing between them is now preserved on save, so recalling the sequence (via a cue) reproduces it faithfully.

0.8.7

Changed

  • Internal release-pipeline work toward Google Play (Android) distribution. No user-facing change on this version.

0.8.6

Changed

  • Internal release-pipeline work toward Microsoft Store (Windows) distribution. No user-facing change on this version.

0.8.5

Changed

  • iOS is now iPad-only. The app is built for the iPad (and desktop) — its dense, landscape control surface is not suited to the iPhone, which is no longer supported on iOS.

Fixed

  • macOS: the Stream Deck now works out of the box — the required library is bundled with the app, so you no longer need to install anything manually.
  • iPad: the connection screen now validates the IP address correctly — the Connect button enables as soon as a valid IP is entered, and an empty or malformed IP shows the "IP required" hint (matching macOS).
  • iPad: in Show mode, the Control Zone "Patch" button is now hidden (like "Add zone"), keeping the live show locked down.
  • iPad: the Home "Files" section no longer overflows — it now lays out as a 2×2 grid.

0.8.4

Added

  • iOS and iPadOS are now available on TestFlight — install the iPhone / iPad beta. (Internal testers get builds as soon as they finish processing, no review wait.)

0.8.3

Changed

  • Internal release-pipeline work toward iOS / iPadOS TestFlight distribution. No user-facing change on this version.

0.8.2

Changed

  • Internal release-pipeline work toward iOS / iPadOS TestFlight distribution. No user-facing change on this version.

0.8.1

Added

  • iOS and iPadOS builds are now distributed through TestFlight — the beta is installable on iPhone and iPad. (Internal testers get builds as soon as they finish processing, no review wait.)

Changed

  • The macOS app is now signed (Developer ID) and notarized by Apple — it opens without the "unidentified developer" warning. The standard "downloaded from the Internet, open?" confirmation appears once on first launch, like any downloaded app, then never again.

0.8.0

Changed

  • The app has been validated end-to-end on macOS, Windows, Linux and Android (connection, cues, transitions, Show mode). The Web version is no longer targeted for v1.0 — the desktop and mobile apps are the focus.
  • Internal app identifier updated ahead of store distribution. One-time effect on an existing install: app-level preferences (theme, connection defaults, recent IPs…) reset to their defaults — your projects, cues and automations stay safe (they live in .hrc files).
  • Groundwork for App Store / store distribution is now in place (privacy manifests, code signing, store metadata foundations). No visible change yet.

Fixed

  • Fixed a crash that could occur when undoing a Recall Safe change after switching tabs (the undo replayed the change against the wrong category). Recall Safe undo/redo is now reliable, and hardened against a rare crash when the screen had just been closed.

0.7.38

Added

  • When you connect to a Holophonix processor, the app now asks which way to reconcile shared state: Pull (load the processor's control zones, channel colors, venue drawing and source groups into the app), Push (send the app's project state to the processor), or Ignore (keep both as-is). Loading a project while connected also pushes its shared state to the processor — but only when it actually differs, so an identical reload no longer triggers a redundant prompt.

Changed

  • Recall Safe : the expand chevron is now separate from the lock toggle. You can open a group to see its channels without changing its Recall Safe state, and vice-versa.
  • Under the hood : a large wave of regression tests landed around the reconciliation layer, group positions and project switching, plus a fix for an intermittent test. Steadier behaviour overall.

Fixed

  • Source group positions stay correct across pull / undo / cue recall / project switch. Fixed several cases where a group could collapse to the origin (0,0,0) or its members could stack on top of each other after the first connection.
  • Switching projects no longer leaves stale state behind. Control zones, channel colors, venue drawing and source groups from the previous project are now correctly cleared and replaced instead of leaking into the new one — on both the app and the processor.
  • Moving a source group in Multi XYZ now works right after the first connection (the group anchor is correctly picked up from the processor), and the move is properly undoable even if the group was deleted in between.
  • Connecting over WebSocket is more resilient on a partial connection — the zones / venue request now retries within bounds instead of hanging.

0.7.37

Fixed

  • Internal fix : the diagnostics opt-out flag of the analytics SDK was persisted to disk and silently dropped every event for any user who had ever toggled diagnostics OFF and back ON. Even with the in-app toggle showing ON, the SDK stayed opted-out across launches. The init now explicitly re-enables the SDK so the in-app toggle is the single source of truth. No action needed — affected installs recover automatically at this update.

0.7.36

Added

  • Source groups can now be activated / deactivated from the Home brick → group settings, in sync with Holophonix Designer. When you deactivate a group, the group point disappears from Multi XYZ (members stay visible and individually draggable), the bus row is hidden from the Mixer, and parameter links between master and members are cut — just like in Designer. Bidirectional sync : toggle in Designer and HRC reflects the state instantly. The toggle is available as a MIDI and Stream Deck mapping target.

Fixed

  • MIDI feedback on cue recall now respects the control zone bounds of each mapped channel (previously the feedback was normalized against the full stage even when the channel was inside a zone — pots and faders ended up at the wrong physical position on cue recall when working inside narrow zones). Companion fix to the 0.7.35 control-zone MIDI input fix.
  • MIDI feedback now also fires during automation playback. Until now, automations sent OSC but not MIDI : your control surfaces stayed frozen while the automation moved a point. Now the surface follows along in real time. Zone-aware (uses the control zone bounds when the channel has one).
  • MIDI mapping editor : numeric fields are now editable directly from the keyboard on desktop (macOS / Windows / Linux). Previously every numeric input (CC number, NRPN, note number, toggle threshold, calibration curve points, range min / max) forced an on-screen numpad modal even when you had a physical keyboard. Now matches the Custom OSC / Custom MIDI editor pattern. Mobile (iPad / iPhone) keeps the numpad modal for touch ergonomics.
  • MIDI mapping editor : decimal separator , (French / German keyboards) is now accepted in desktop input fields, and the mobile numpad got a , button. Range fields also re-clamp automatically when you switch the message type between CC (max 127) and NRPN (max 16383).
  • Automation preset modal : the preset shapes (sine, ramp, triangle, square, exponential, s-curve) are now generated inside the control zone bounds when the channel has a zone (previously they spanned the full stage and could overflow the zone). Sliders and preview adapt accordingly.
  • Automation preset modal : double-tapping a center slider now snaps to the midpoint of the slider range instead of forcing 0, which crashed when the zone excluded the origin (e.g. a zone from x=5 to x=15).

0.7.35

Changed

  • Performance : cue transitions now capture only the parameter keys present in the transition lanes, instead of cloning the full project snapshot at every GO. On large shows with many cues, this reduces heap allocation per transition.
  • Performance : bulk channel-zone reassign (Zone Patch modal) now records a single composite undo entry and saves the project once instead of N times (one per channel). Cmd+Z restores the whole batch atomically.
  • Under the hood : a thick layer of regression tests landed across the connection layer (Standalone + Server modes), the patch / mixer / control zone surface, the orchestrator T4 dialog branches, and the MIDI mapping path. +201 tests vs 0.7.34. You should see steadier behaviour overall.

Fixed

  • MIDI mapping on a channel position now respects the control zone bounds of that channel, not the global stage. MIDI value 0 (pan left) sends the point to the left edge of the zone (e.g., x=2 for a zone spanning x=2..4), and 127 to the right edge of the zone. Same for Y, Z, and AED zones. The previous behaviour mapped to the stage globally, which made MIDI surfaces almost unusable when working inside narrow zones. Side-effect : the long-standing cross-axis drift (Y position drifting from MIDI X) is also pinned by a regression test.
  • Multi XYZ Control Zones now sync correctly to connected Clients. Two bugs in one wave : (a) the channels patched in a zone on the Server were not showing up Client-side ("No sources patched in this zone" message even though the Server had them) ; (b) the zone geometry itself (center, radius, shape, mode) could appear shifted on the Client. Both fixed — Clients now see the exact same zone layout as the Server, with the patched channels correctly listed.
  • The "MIDI controller disconnected" warning indicator now disappears as soon as you delete all mappings referencing that controller. Previously it persisted indefinitely even after a clean removal. Fixed for both standard MIDI mappings AND Custom MIDI actions.
  • Mixer patch loading hardened : if your SharedPreferences contain a corrupted entry for one mixer patch type (e.g. tracks JSON is malformed), the other 4 types (stereo / d2m / bus / sourcegroup) are now preserved at their saved state instead of being silently reset to defaults. Each type is loaded in isolation with a labelled warning on failure.
  • Project loading hardened against malformed .hrc : a MixerPatch entry with an invalid schema (e.g. root is a list instead of an object, or stripCount has the wrong type) now throws a clear FormatException instead of silently producing a corrupted empty patch.

0.7.34

Fixed

  • Multi XYZ automation in Time-paced mode now plays back at a uniform spatial speed (one position per equal arc-length step over duration), instead of replaying the speed irregularities of the original drawing. If you drew the path slowly here and quickly there, playback will now glide smoothly at a constant pace regardless. The companion Z-vs-time card axis was also reparameterized to match the uniform playback duration. Regression fix — this had been corrected once before and came back via a refactor. Anti-regression : new assertion tests on emission intervals so CI catches it if it returns (story 17.25).

0.7.33

Changed

  • Recall Safe simplified — the group-level Recall Safe introduced in 0.7.32 has been removed entirely. Recall Safe is now strictly per-channel : no more propagation from groups to their members, no more inherited-master indicator on member cells, no group safe UI in Multi XYZ or Mixer. The group-level model added complexity without matching how engineers actually use Recall Safe in the field. If you need to protect several channels at once, lock each channel individually (multi-select still works in the Recall Safe screen). Reverts stories 17.22 + 17.23 (story 17.24).

Fixed

  • Privacy Policy and Terms of Service are now visible from Settings → About (links open in-app) and inside the Diagnostics opt-in dialog. The opt-in dialog also lists explicitly every event sent to Sentry and PostHog (5 crash report items + 10 analytics events + 4 super-properties + 3 exclusion categories) — full transparency before you consent. Bigger tap zones on the Privacy / Terms links, scrollable bottom sheet for smaller screens (story 14.12).
  • mDNS / Bonjour discovery hardened : when your Mac or server advertises multiple IP addresses (VPN active, multi-interface laptop, IPv6 link-local present), the app now prefers a routable IPv4 address and brackets IPv6 in WebSocket URLs. Avoids occasional connection failures on multi-network setups that previously worked intermittently (story 14.14).

0.7.32

Added

  • Check for Update now opens a full modal with the new version's release notes and three buttons (Update / Later / Skip this version) instead of a small notification. The app also checks once a day at boot and signals you when an update is available — except in Show mode (no popup during a live show). Skipping a version is remembered until the next one drops (story 14.1).
  • Stream Deck is now marked "(BETA)" in Settings. The integration is fully functional but its mappings and behaviors may evolve before the v1.0 release — the label sets the right expectation while keeping the feature accessible to power users (story 14.8).
  • Privacy Policy and Terms of Service are now bundled inside the app and accessible from Settings → About. They detail exactly what data is collected (only when you opt in to crash reports or product analytics), where it goes, how long it's kept, and your rights under GDPR / CCPA. Anonymous IPs guaranteed — Sentry and PostHog configs were pinned to match the promise (story 14.9).
  • OSC remote control of cues extended: external systems (QLab, Lab Monkey, custom OSC scripts) can now use /cue/go/id <uuid> to recall by stable UUID, plus /cue/lock, /cue/description, /cue/color, /cue/trigger-mode to edit metadata remotely. Show mode now blocks destructive edits over OSC (transport pass-through, editing block) — your live setup stays safe even when external surfaces are connected. New reference doc: docs/osc-cue-control-reference.md (story 17.20).

Fixed

  • Cue transitions now interpolate from the runtime state at the moment you press GO, not from the source cue's snapshot (industry-standard QLab / EOS pattern). Bug fix: if you tweaked a fader or moved a Multi XYZ point between cue A and cue B, the value used to jump back to A's stored snapshot at t=0 before interpolating — visible bump on the pad and audible OSC spike. Now the transition starts smoothly from wherever you currently are. Workaround for the old behavior: explicit recall of cue A before pressing GO (story 17.21).
  • Recall Safe Source Groups tab renamed from "Srcgrp" to the full "Source Groups" label. Marking a source group as recall-safe now also protects its member channels in every category (Multi XYZ + Mixer + Settings) — previously only the group's own row was protected, members got recalled anyway. UI dim+lock indicator on member cells shows when a parameter is inherited-safe via group (story 17.22).
  • Multi XYZ Global view: the background image stays visible after deleting a control zone (was getting wiped out — regression from the recent rendering refactor) (story 18.8).
  • Multi XYZ tabs: switching from Global to a Zone tab now renders the zone-cropped background correctly on the first frame — no more squashed-image artifact requiring a tab re-tap (story 18.9).
  • Multi XYZ REC: hitting the record button while in Global view now correctly skips channels that are not in a control zone (no orphan automations created silently — invariant from story 18.7 finally enforced at the recording engine level). In-zone channels record normally (story 18.10).
  • Multi XYZ automation orphan handling: when a channel is removed from a zone OR deleted, the linked automation now shows a clear, distinct message ("channel out of zone" vs "channel deleted") and the Reassign dropdown only proposes channels that are currently in a control zone. Auto-recovery: re-assigning the original channel to a zone restores the automation transparently (story 18.11).

0.7.31

Changed

  • Behind the scenes: the What's New content (this popup) is now fetched at boot from a public source and cached locally — typos, translations and forgotten entries can now be corrected after release without needing a new app build. The app still ships a fallback bundled with each release, so the popup works offline at first launch (story 14.6).
  • Public metadata channel established: the app now reads a public JSON manifest for version availability and release notes, completely separate from the private source repo and store-distributed binaries. Prepares the ground for the upcoming "Check For Update" feature (story 14.7).

Fixed

  • Source groups sync: the Recall Safe "Source Groups" tab and the Home "Groups" brick now always show the same content as the audio processor. No more ghost groups remaining after a wipe — the three internal representations (canonical map, Multi XYZ mirror, channel list) have been unified into a single source of truth (story 15.18).

0.7.30

Added

  • Background config modal: the preview pad now matches the Global view of the Multi XYZ exactly — image preserves its 1:1 ratio (letterboxing with black bands instead of being stretched), pinch zoom + 2-finger pan + double-tap reset. The 2-point calibration modal benefits from the same rendering. What you calibrate is what you see next in usage
  • Multi XYZ automations now follow the control zone of their channel. Three new rules: (1) you can only create a Multi XYZ automation on a channel assigned to a control zone (create button disabled with explanatory tooltip otherwise); (2) the edit pad displays the crop of the channel's zone (XYZ rectangular or AED circular) rather than the global geometry; (3) when you reassign a channel to a different zone, a popup proposes to adapt the linked automations (transform, keep absolute, or cancel). Reassign + transform is undoable in a single Cmd+Z. Legacy out-of-zone automations are preserved and marked as orphan (banner + read-only) — assign their channel to a zone to edit them

0.7.29

Added

  • Multi XYZ Global view: the background image now preserves its 1:1 aspect ratio (letterboxing with black bands) instead of being stretched to fill the pad — matches what Holophonix displays. Pinch with 2 fingers to zoom, drag with 2 fingers (or Alt/Cmd-drag on desktop) to pan, double-tap to reset
  • Multi XYZ virtual world canvas: zoom out far beyond the stage geometry (up to ~5× extent) to navigate freely. Points, labels and icons stay at constant pixel size at any zoom level; grid lines stay readable when dezooming
  • Auto-rescale of cue positions on reference change: when you swap the background image, change the drawing length / center, or move / resize a control zone, the app now asks if you want to rescale the affected cue positions (3 choices: Yes transform / No keep absolute / Cancel). For control zones, only sources assigned to that zone are affected. One Cmd+Z undoes both the reference change and the rescale in a single step

0.7.28

Added

  • Multi-select cues in the Cues screen (edit mode): Cmd/Ctrl-click to toggle, Shift-click to extend a range, Cmd+A to select all, Esc to clear. With 2+ cues selected, a bulk header appears with grouped actions: Delete, Duplicate, categorized Paste, Color, Icon, Description, Trigger toggle, Lock, Recall safe, Reorder by dragging a block (animated), Move to position. Bulk-link automations / OSC / MIDI to multiple cues at once. Locked cues are silently skipped (with a recap notification); the Delete button is disabled when every selected cue is locked

Fixed

  • PostHog observability: the "connection mode" dashboard dimension now reports standalone / server / client correctly (it used to stay stuck on "unknown" because the default standalone boot did not trigger a refresh). Sentry crash reporting unaffected
  • What's New popup now follows the active app locale (Settings → Language). Defaults to English; French is shown when the app is set to French

0.7.27

Added

  • Multi XYZ automations: new playback mode toggle per automation. Tracer-paced (default, same as before) — the speed % multiplies the speed at which you originally drew the movement. Time-paced (new) — fixed configurable duration, the speed % acts as a global duration factor (like Mixer automations). Useful to sync a Multi automation to a known cue duration or fixed tempo, independent of the original drawing speed. The original speed profile is preserved in time-paced mode (fast-then-slow stays fast-then-slow, just compressed/stretched)
  • Bug report modal: your message now also reaches the Sentry User Feedback tab in addition to technical Issues (cross-referenced). Easier follow-up on the support side

Fixed

  • Automation recording: no more 1-2px visual jump on record start/stop across the 3 tabs (Multi XYZ, Mixer, Control). The red "rec" border no longer shifts content
  • Multi XYZ automation edit modal: if an automation has waypoints outside the current display range, its trace no longer overflows the "Path Preview" area to spill over Direction / Loop / Speed controls

0.7.26

Fixed

  • Crash report opt-in popup: now shows correctly on first launch (before What's New). Explicit choice required (back / Esc blocked) — you can change later via Settings → Diagnostics
  • Removed "Send test crash" button from release builds (had no place in a production UI)
  • Latent bug: TextEditingController not disposed in the bug report modal

0.7.25

Added

  • Sentry crash reporting (opt-in disabled by default, popup on first launch + toggle in Settings → Diagnostics): when enabled, crashes are reported automatically with the context of recent actions. Privacy-first: project names, user paths and local IPs are anonymized before sending. Available to Achille + Felix only for now
  • Bug report modal redesigned: sends via Sentry when active (with the last crash stack trace optionally linked), email fallback when disabled. No more misleading "logs attached" promise
  • Patches Home triplet as native OS windows: Control Zones, Multi XYZ Patch (+ Glide / Home / All Glide / All Home sub-modals) and Mixer Patch now each open in their own movable / resizable window (behind the Settings → Native Windows flag)
  • Cue compare modal: trigger-only cues are now selectable (previously greyed out). New Links section with visual diff + added in green / − removed in red, link order insensitive (two cues linking the same actions in a different order are no longer flagged as different)

Fixed

  • Custom MIDI modal in client mode: rows were stuck on tap (Duplicate / Copy / Paste / Save buttons appeared permanently disabled). Selection unblocked, multi-select working

0.7.24

Added

  • Cue Duplicate / Copy / Paste: new one-shot Duplicate button creates a complete copy immediately; Copy + Paste 2-step flow with categorized dialog (Positions / Mixer / Links / Metadata × ~20 sub-categories) to mix subsets of parameters across cues. Last selection remembered. Expandable preview deltas. Keyboard shortcuts Cmd+D / Cmd+C / Cmd+V
  • Current position indicator on XY/Z/Width automation cards + recording snap magnetism: when you start drag-recording near the current position (< 5% of the pad), the first waypoint snaps automatically (toggle in Settings → General Parameters)

Fixed

  • Cue link modals visual consistency (automation / OSC / MIDI): no more layout shift on check/uncheck, automation modal widened so long names no longer truncate, Material ripple removed on OSC/MIDI items
  • Position lock modal: the N/M counter no longer shifts the "Lock all" / "Unlock all" buttons on toggle (tabular figures)
  • Cue compare modal: no more shift on check, opaque header, consistent rounded corners
  • Memory leak hygiene: ui.Image GPU resource properly disposed when swapping background in Multi XY (latent bug fix)

0.7.23

Added

  • Centralized MIDI device management: the MIDI Controller modal becomes the single place for Scan / Connect / Disconnect / Learn (the device section is removed from the Custom MIDI modal). "Assign controller" dropdowns filter on connected devices + the previously selected device if it is currently disconnected
  • Auto-reassign by name unified: when a MIDI device reconnects with a new OS ID (DevSrvsID on macOS), all mappings + Custom MIDI + Control automations re-bind automatically (previously this only worked for Custom MIDI)
  • MIDI device status badges on Custom MIDI rows, Control automation cards, MIDI mapping rows. Non-intrusive pre-launch warning if a device is missing when launching a cue or automation

Fixed

  • Server-client mode: after an XY automation finished, dragging the track on the XY pad would oscillate / glitch around the final position. Echo loop between the Holophonix state push and the local drag fixed via a client-side drag guard
  • MIDI device auto-reconnect on boot: Custom MIDI / Control automations would no longer fire until a manual disconnect/reconnect via the MIDI Controller modal. The initial scan now propagates correctly to consumer services

0.7.22

Fixed

  • Server mode automation play: the UI did not refresh visually when starting an automation, even though the data was being sent (you had to restart the Remote to resync). Cause: single-callback antipattern overwritten between UI and WS broadcast. Architectural multi-listener fix
  • WS server start: 2-3s freeze with a macOS spinner when starting the server. mDNS registration moved to a fire-and-forget background task — the server now accepts connections immediately, mDNS catches up in the background

0.7.21

Added

  • WS automation sync refactor: WS automation actions now route by stable automationId instead of index, fixing race conditions on concurrent multi-client add/remove/rename/reorder. Strict protocol version v=2 with handshake refusal on mismatch (explicit popup on the client)
  • Client MIDI mirror minimal: client mode now receives explicit entityActionFailed feedback on lookup miss, midi_learn_state snapshot on welcome connect, macOS deviceId wildcard purge. CRUD UI un-greying tracked in a follow-up story
  • Drag-end IPC registry per screen: fixes the clobber between mixer↔multixyz when both screens are mounted simultaneously (IndexedStack / keep-alive)
  • Bulk-edit IPC token: Reset all / Paste operations on the detached Dynamics modal now collapse to a single Cmd+Z (instead of 11). Project switch automatically closes any open subwindows

Fixed

  • Control automation MIDI/OSC can no longer contaminate the OSC position on a corrupted state (silent fallthrough removed, explicit branches per type)
  • "Convert to Binary" button removed from Control + Mixer automation cards (became redundant once boolean detection + silent snap-on-apply landed)
  • Bus Reverb undo now dispatches OSC to Holophonix (no more app↔processor desync after Cmd+Z)
  • 18 quick defensive fixes: recall safe header "fully vs none" mix, factory MIDI presets validation, deleteSourceGroup orphan parity, BusReverbModal hide EQ/Dyn buttons null handler

0.7.17.1

Changed

  • Mixer + Control bool snap UX unified: the "Boolean Parameter" confirmation dialog on Mixer mute/solo is replaced by the same hint icon + silent-snap UX as Control bool params. The toggle_on icon overlay on continuous presets warns pre-apply, the post-apply notif mentions Cmd+Z to undo

0.7.17

Added

  • Control automation curve presets: Apply preset on Control timeline (MIDI / OSC 1-arg) opens a 1D modal — sine, ramp, triangle, square, exponential, s-curve. Range clamped to automation min/max, integer enforcement on MIDI / OSC intArg targets
  • Control automation curve presets — XY 2D for OSC 2-args: same Multi XYZ presets (circle, polygon, square, triangle, line, figure8, spiral, random) with axis-asymmetric ranges and stripped spatial units
  • Boolean detection: hint Icons.toggle_on overlay on continuous presets (sine/triangle/sawtooth/exponential/sCurve) when target is bool, with silent snap to extremes at apply
  • Cmd+Z post-apply notif: the success toast now mentions undo for one-shot recovery

Fixed

  • MIDI input fields enforce integer-only entry (digitsOnly + clamp). PitchBend signed UI (-8192..8191) deferred to a follow-up

0.7.16

Added

  • Control automations — Duplicate with destination picker: pick a different MIDI/OSC target when duplicating a Control automation (cross-type allowed)
  • Control automations — Boolean detection: MIDI continuous (max-min == 1) and OSC int (max-min == 1) auto-render as step (toggle) timelines, no interpolation
  • Custom MIDI — Library system: factory presets (curated console/DAW mappings) + Save as preset for user-saved Custom MIDI actions, browsable from the editor

Fixed

  • Cues screen show mode: NEXT / ON DECK card title, icon, padding and description font now scale with screen height (tablet no longer truncates the description)

0.7.15

Added

  • Control automations: new tab to automate outgoing MIDI (CC, NRPN, PitchBend, NoteOn/Off, PC, sceneRecall) and OSC (1 or 2 args, int/float/bool) with full keyframe playback + live recording (capture incoming MIDI/OSC into waypoints)
  • Recording anti-loop guard: outgoing messages echoed within 200 ms are ignored at the input — record from a controller without feedback corruption
  • Cards full-fidelity (timeline for MIDI/OSC-1arg, XY pad for OSC-2args), conflict detection between automations sharing the same target, Stream Deck LCD with MIDI/OSC icons, External OSC /automation/play|stop|record/{id}
  • Cue link works cross-type — link Control automations to cues alongside Multi XYZ and Mixer ones

0.7.14

Added

  • Custom OSC + Custom MIDI: multi-select with cmd/shift-click, plus Duplicate / Copy / Paste header buttons and drag-and-drop reorder
  • Multi-edit dialog with ≠ markers for divergent values across the selected items (open via dedicated Edit button)
  • Server ↔ Client sync extended to Custom OSC bulk operations (parity with MIDI)

0.7.13

Added

  • Trigger cue: mark a cue as "Trigger" to fire its MIDI/OSC links without applying the snapshot — ideal for triggering QLab/lights/video mid-scene without disturbing the audio state
  • Cue list auto-scroll: list scrolls automatically when the current cue moves out of the comfortable [25%, 75%] viewport zone (next AND previous)
  • Background modal as native desktop window (Home brick), with dedicated calibration subwindow
  • History panel as native desktop window (per-category dedup, transverse 7 screens)

Fixed

  • Custom OSC editor: desktop now allows direct keyboard input for int/float arg values (instead of numpad popup)
  • Custom OSC + MIDI: "show as button in strip" checkbox unchecked by default
  • Position lock modal: "Clear all" button renamed to "Unlock all" for consistency

0.7.12

Fixed

  • Recall Safe mixer: global toggle (top-left) now propagates to the Sends sub-group — busCount tracked across readers, mutators, and WS handlers (no more phantom flags on non-existent bus slots)

0.7.11

Added

  • Channel config modals (Add/Delete/Source Group) detachable to native desktop windows

Fixed

  • Recall Safe: select-all now includes channels that are members of a point group (was silently skipped)
  • Recall Safe: D2M and Bus mixer params (gain/mute/sends) now properly protected during cue recall
  • MIDI CC/PitchBend feedback cache auto-clears after 200ms (prevents latent echo bug)

0.7.10

Added

  • Automation recording now works in detached native windows (EQ, Dynamics, Reverb, Bus Reverb, Sends)
  • Multixyz modal edits produce proper undo/redo entries (parity with mixer)

Fixed

  • MIDI send mute: "un coup sur 2" bug fixed — absolute mode now writes on both CC 127 and CC 0 (was forcing toggle regardless of mapping setting)
  • Preset change on Holophonix auto-resyncs the Remote (channel list, names, positions, all params)
  • WS reconnect refreshes channel cache so new preset data shows up
  • Backgrounds preserved — loading a new one keeps the previous ones in the project folder (library behavior)

0.7.9

Added

  • Mixer multi-selection: Shift+click range, Cmd/Ctrl+click toggle, grouped fader/mute/solo/lock/monitoring/dim/phase/link with relative delta and composite undo
  • Prevent display sleep toggle in Settings > General Parameters (default ON)

Fixed

  • MIDI send mutes: bool mappings were created as continuous (curve) instead of toggle — classifier fixed + silent migration of existing mappings
  • MIDI reverb toggles: 6 toggles (directMute/directLink/earlyMute/earlyLink/lateMute/lateLink) were stuck ON due to snake_case/camelCase key mismatch
  • MIDI echo guard no longer blocks fast consecutive user presses (< 200ms) on bool mixer params and cue transport buttons

0.7.8

Fixed

  • Client connection lost: detection + reconnect popup (no more silent disconnect)
  • Client auto-reconnect after Server restart
  • Multi XYZ / Mixer layout preferences preserved across app updates
  • Point group barycentre recalculated after cue recall (no more drag jump)
  • MIDI mapping editor modal: enlarged to fit toggle fields without scroll
  • RecallSafe: removed "G" indicator (single-layer model)

0.7.7

Added

  • Recall Safe 2-layer: Global settings + per-cue Position Lock (sidebar section, modal, 🔒 badge)
  • Native desktop windows: Reverb + Reverb EQ modals detachable (macOS/Windows/Linux)
  • Client MIDI sync + remote editing via WS (mappings, devices, custom actions)
  • Custom MIDI: Reassign banner when device disconnected

Fixed

  • MIDI auto-reconnect: rewrites stale device IDs (macOS DevSrvsID)
  • Channel lock respected by MIDI and Stream Deck input
  • Custom OSC/MIDI links visible on Client + MIDI/OSC triggered on cue recall
  • Recall safe blocks MIDI position feedback
  • Cue badges sync when a custom action is deleted
  • MIDI mapping: all channels available for mixer params (only position filters patch)
  • Custom numpad used for all numeric inputs on tablet
  • scanDevices at startup: unblocks MIDI sends automatically

0.7.6

Added

  • Native desktop windows (experimental): EQ and Dynamics modals detachable on macOS/Windows/Linux

Fixed

  • Custom OSC/MIDI action links in cues not showing on Client
  • Recall safe now properly blocks MIDI position feedback
  • Cue badges stay in sync when a custom action is deleted
  • MIDI↔OSC sync for all mapped params (sends, gain, mute, EQ, dynamics, reverb)
  • Channel lock now respected by MIDI and Stream Deck input
  • MIDI mapping: only position filters by Multi XYZ patch (all channels available for mixer params)
  • Multi XYZ level bar anchored above the point, tweaked width

0.7.5

Added

  • Holophonix 2.4 compatibility: 6 stories (icons, dynamics, knee, EQ gainRange, reverb 3-shelf, sourcegroups)
  • Reverb extended: 3-shelf EQ on Direct/Early per channel + spread on buses
  • Sourcegroups: receive from Holophonix, DCA control, CRUD, monitoring button
  • Channel icons synced bi-directionally with Holophonix (13 3D models)

Fixed

  • Sourcegroup DCA: mute/solo sent directly (no double-application)
  • Monitoring button delta sync fixed (key mismatch)
  • 25+ deferred fixes: dynamics, security, performance, tests (2671 total)

0.7.4

Added

  • Recall Safe per-cue: each cue carries its own protected parameters
  • New cues inherit recall safe from previous cue
  • RecallSafe screen contextual on selected cue

Fixed

  • VU-meter: linear release (constant dB/s) — uniform descent like Smaart
  • VU-meter: shows -∞ instead of -60 when signal drops to silence
  • Audio Dropouts removed from connection status (unreliable WS counter)

0.7.3

Added

  • VU-meter speed setting: Fast (Peak), Medium (PPM), Slow (VU) in Settings & VU modal
  • Persisted per-device, with corrupted-value validation

0.7.2

Added

  • External OSC settings: toggle + port in Connection screen modal
  • Auto-retry if port is in use, badge shows actual bound port

Fixed

  • External OSC cue control restored: /cue/go, /cue/go/name, /cue/next, etc. on port 8000
  • Regression from WS migration (story 9.6) — UDP listener was removed

0.7.1

Added

  • Lab Monkey compatibility: Remote detected as QLab via mDNS + OSC TCP
  • Cue list, transport, push updates in real-time to Lab Monkey
  • Toggle + passcode in Connection screen

Fixed

  • CI: platform builds only on release tags (saves GitHub Actions minutes)

0.7.0

Added

  • Control Zones: dynamic zone tabs, channel filtering, clamp, overlay, CRUD modal, WS sync
  • Background sync with Holophonix 2.4: drawing params, venue handlers, image HTTP download/upload
  • Calibrate from Scale v2: native image resolution, zoom/pan, device-independent results
  • Background rotation 90° CCW matching Holophonix display
  • MarqueeText: auto-scrolling long names (cues, channels, VU-meters)
  • Zone patch modal, groups config modal

Changed

  • Stage Geometry removed from Home (derived from background drawing params)
  • Zone tabs colored by zone color
  • Settings preview with fictive zones and stereo point

Fixed

  • Background aligned with points regardless of pad proportions (PadMapping.fill)
  • Layout Multi XYZ now persisted to .hrc (was lost on reinstall)
  • MIDI: Pitch Bend calibration range, toggle mode, automation LED feedback
  • Home brick drag swap, smooth drag on small zones
  • VU-meter modal: visible selection border

0.6.19

Added

  • VU-meter modal: full metering view with Input/Bus/Output sections
  • Pre/post fader toggle, clip indicators, peak reset

Fixed

  • Settings screen grid alignment and uniform padding
  • WS errors: fixed malformed OSC addresses for singleton channels

0.6.18

Added

  • Anti-double Go: configurable cooldown (100-2000ms) in Settings > Cues Options
  • Version check: warning popup if Holophonix processor version is too old
  • All OSC commands now sent via WebSocket (single bidirectional channel)

Fixed

  • Icon picker showing blank square instead of icon grid

0.6.17

Added

  • VU-meters & gain reduction in mixer channel strips (real-time via WebSocket)
  • Processor info in connection status: model, version, I/O, sample rate, buffer size, project, preset
  • Channel selection sync: selecting a channel in Holophonix selects it in the Remote

Changed

  • Multi XYZ channel strip unified with Mixer — same EQ/dynamics painters, VU-meters, layout
  • Channels created with sequential names and automatic position spread

Fixed

  • Reverb defaults incorrect when creating tracks from Remote (auto-correction applied)
  • Snapshot: nested values (cutoff, cluster/gain, air) now parsed correctly

0.6.16

Added

  • WebSocket Holophonix 2.4: real-time data reception via TCP instead of OSC polling
  • Failover: dual WebSocket connections (primary + backup) with transparent switch
  • MIDI/Stream Deck: map a button to recall a specific cue directly
  • Logs: selectable messages, tap to copy, improved format
  • 1730+ new automated tests (total: 2202)

Changed

  • Connection: instant TCP detection replaces 2-4s OSC timeout
  • Removed OSC polling, scan timer, and keepalive (-1200 lines)
  • Removed Output Port from connection screen (no longer needed)
  • Updated: bonsoir 6, font_awesome 11, ffi 2.2

Fixed

  • Channels not updating after add/remove from Holophonix
  • Sequencer: tracks without Z lane not moving on first Go
  • Cue links: one failing link no longer blocks the rest
  • MIDI link delays now included in sequencer progress bar
  • ActionTarget crash on unknown kind (corrupted project files)

0.6.15

Added

  • Lightweight OSC keepalive: ~75% less network traffic in steady state
  • 212 new tests for project lifecycle, undo/redo, export/import
  • hrcVersion field in project format for future migrations

Changed

  • State architecture simplified: 11 → 8 mixins
  • SaveTracker replaces 19 duplicated save state fields
  • Extended project switch rollback (more state preserved)

Fixed

  • Connection stuck on "waiting for response" — timeout now fires correctly
  • Double failover canceling itself (backup switch guard)
  • Backup active without being configured (ghost backup)
  • Connection lost dialog: now auto-dismisses when connection restores
  • Connection lost dialog: updates reactively when both processors are lost
  • Backup state persisting across sessions (singleton cleanup)
  • Server mode now has proper failover logic
  • Inverted primary/backup IPs in connection lost popup
  • Auto-save project retry limit (prevents infinite loop on persistent errors)
  • Atomic file write on macOS/Linux (no more race condition)

0.6.14

Added

  • Holophonix Backup Server: dual-send OSC to primary + backup processor
  • Auto-failover: transparent switch to backup when primary is lost
  • Auto-restore: switch back to primary when it comes back online
  • Backup keepalive detection (alive/dead status)
  • Backup IP/port configuration in connection screen (side-by-side layout)
  • Status bar: BACKUP badge (orange) with wifi icon when running on backup
  • Connection lost popup: shows both processor states after failover
  • Primary restored popup: confirms switch back to primary
  • Backup status in connection screen (connection, target, active indicator)
  • Separate recent IPs for primary and backup

0.6.12

Added

  • Automation progress bar in cue list and cue toolbars (blue, distinct from transition)
  • Automation progress ring on GO button when autoload advances to next cue
  • Sequencer playhead moves during automation-only playback (no transition needed)
  • Transition and automation progress synced to WebSocket clients

Changed

  • GO button progress ring reserved space permanently (no layout shift)

Fixed

  • Sequencer shows wrong cue pair during transition with autoload (now uses actual transition indices)
  • Sequencer stays on current cue during automation playback instead of jumping to next
  • Cue toolbar: automation progress bar only shown when displayed cue matches playing cue
  • GO button: automation ring only shown when no transition active (avoids redundancy)
  • SQ Scene Recall: default scene number set to 1 (minimum valid value)

0.6.11

Added

  • Scene Recall (A&H SQ) in custom MIDI actions
  • Transition progress bar in cue list, mixer & multi XYZ toolbars
  • Show mode: LOADED cue card with progress fill
  • Stream Deck show mode: auto-switch, timer, position, protected buttons
  • Stream Deck brightness control in settings
  • "What's New" popup on app update + accessible from Help menu and About

Changed

  • Custom MIDI/OSC editor: color picker shown only when button is visible
  • Stream Deck select page: channel color on selected button

Fixed

  • WebSocket client connection failure (busReverbParams serialization)
  • Cue-linked automations not playing in Standalone mode
  • MIDI feedback sent for recall-safe parameters during cue recall
  • Transition/automation conflict: automation now has priority
  • MIDI auto-reconnect by device name (macOS ID changes)
  • MIDI "Device already connected" crash report
  • Stream Deck+ button rendering (stale HID device path)
  • mDNS server browser: spinner and server list
  • Recall safe: EQ available for monitoring, column alignment
  • Cue list: stable border width (no layout shift on selection)
  • Sequencer auto-zoom on transition duration change
  • Settings page responsive layout on tablet (3-col threshold raised)

0.6.10

Fixed

  • WebSocket client connection (busReverbParams int keys)
  • Cue automations in Standalone mode
  • MIDI recall-safe feedback
  • MIDI device reconnect crash
  • Recall safe EQ for monitoring
  • mDNS browser spinner

0.6.9

Added

  • Stream Deck show mode with timer and position indicators
  • Stream Deck brightness knob in settings
  • Channel color on Stream Deck select page

Fixed

  • Stream Deck+ cue transport buttons not rendering
  • Autoload button background color

0.6.8

Fixed

  • Project persistence: save all data before switching
  • Load automations on project switch
  • Prevent settings cross-contamination between projects
  • MIDI mute/solo/bypass: absolute value instead of toggle
  • Project list refresh in home screen