- New squircle app icon with silver sparkle and cool/warm gradient tails — replaces the text logo for a more native macOS feel.
- VST3 plugin scanning is now non-blocking at first launch: the UI appears immediately while scans run in a cancellable background overlay. Subsequent launches use the cache as before.
- VST3 plugin scan runs each module in a subprocess, so iLok dialogs, license prompts, and plugin `exit()` calls no longer crash the DAW.
- Signed and notarized `.dmg` is now shipped alongside `.zip` for first-install, bringing a familiar drag-to-Applications flow.
- Auto-updater now refuses to install unless running from a real `.app` bundle, preventing accidental overwrites when launched from a dev checkout.
- Progress overlay gains a fading-arc spinner plus title/subtitle rows (e.g. "Scanning VST Plug-Ins" / plugin name) — the same spinner is now shared with the update pill.
- Default grid for new users is now 1/8 notes; the empty Effects/Instruments browser shows a centered Rescan button so you're never stuck.
- Transport icons (pointer, play/pause, scissors) now render from the shared SVG pipeline — consistent look and correct sizing.
- Built-in plugin system with Pro-Q-style parametric EQ, compressor, and text-to-speech generator — all work on native and web
- Generic plugin panel framework with click-to-front z-ordering, shared UI widgets (knobs, buttons, faders), and standalone harness for plugin development
- WASM audio parity — drag-and-drop files, stereo playback, recording, offline export, fade envelopes, automation, and metering now work in the browser
- Stereo fader meters with independent L/R peak-hold in the right panel
- Background VST3 plugin scanning with progress overlay
- Fixed WASM rendering appearing too dark due to sRGB color space mismatch
- Fixed pinch-to-zoom over plugin panels no longer zooming the canvas
- Fixed palette fader mixing up gain and position domains
- Subtle macOS window vibrancy effect with darkened tint for a polished look
- Shared SVG icon pipeline and redesigned transport pill with larger controls
- New UI sandbox (`make ui <widget>`) for rapid widget iteration in isolation
- App is now signed with Developer ID certificate and notarized by Apple
- Standalone automation clips — fully redesigned automation system with editable breakpoints, VST parameter automation, and collapsible effect slots
- Freeze tracks with automatic reverb/delay tail detection and non-blocking progress overlay
- Web embeddable player configurable via postMessage and URL parameters
- Bar ruler and timeline ruler with click-to-seek navigation
- Welcome window with recent projects on startup
- AIFF audio file support
- Piano keyboard sidebar on MIDI clips with note highlighting and click-to-play
- Audio clips now use beat-derived timing for sample-accurate playback
- Fixed stereo WAV and frozen group playback
- Various bug fixes and stability improvements
- Rotary knob controls and inline RMS level meters on layer rows
- Time signature control with drag-to-change and grid integration
- UI zoom (Cmd+=/Cmd+-/Cmd+0)
- Pointer/scissors tool switcher with keyboard shortcuts
- Theme tone presets (Cool/Neutral/Warm) for gray temperature
- Progress overlays for exports, project loading, and freeze operations
- Draggable sidebar separator in browser panel
- bar ruler at top of grid with adaptive bar numbers, tick marks, playhead indicator, and click-to-seek
- timeline ruler at bottom of grid with adaptive M:SS labels, tick marks, playhead indicator, and click-to-seek
- VS Code-style UI zoom with Cmd+=/Cmd+-/Cmd+0, scales entire UI
- add search icon to browser search bar
- welcome window on startup — shows recent projects, New Project & Open buttons, scroll, Escape to dismiss
- VST param rows with drag-to-change, label+value layout, stable ordering, fix click closing right window
- input monitoring "I" button on Main layer — direct-to-master monitoring with mutual exclusion
- MIDI clip right window with instrument dropdown selector and "Open Instrument" button
- add reusable "Project" section header in sidebar before Layers, matching "Places" style
- VST instrument parameter automation — touch knobs to see params, right-click to create automation lanes
- time signature control in Layers panel with drag-to-change, metronome & grid integration
- VST plugin param automation — collapsible effect slots with last-touched param display, right-click to create automation, playback support
- move tempo from browser header to Layers panel label/value row, add ProjectParams struct
- move metronome icon and BPM tempo from transport bar to browser header row, shrink transport bar
- add SVG sound-file icon for audio files in browser panel
- metronome button active state with accent background highlight, matching tool button style
- add SVG icon rendering pipeline via resvg + tiny-skia; replace metronome timer font icon with custom SVG metronome icon
- Ableton-style automation lane hover — ghost dot on line, value label, brighter line color when editing
- Escape resets scissors tool back to pointer
- add pointer/scissors tool switcher to transport panel with V/C keyboard shortcuts
- groups movable by clicking any point inside (not just border/badge) when not in group editing mode
- browser category labels use exact #B3B4BD color (text_secondary L=0.722), full opacity; add matching theme color test
- piano keyboard sidebar on MIDI clips with sticky positioning, active note highlighting, and click-to-play
- Ableton-style Tone presets (Cool/Neutral/Warm) for theme gray temperature, color intensity defaults to 0
- automation clip point X snapping to grid when enabled
- right-click context menu on Volume/Pan controls to create automation
- thicker automation lines
- automation clip edge resize — drag left/right edges to resize, with point remapping and multi-select support
- automation dots now bigger with inner white dot; click-without-drag deletes point
- automation dot gain value labels shown on hover/drag
- show parameter label on automation clips — "Volume", "Pan", or "Param N"
- wire audio engine to read from AutomationClip entities (Phase 5 of automation refactor)
- full clip operations for AutomationClip — move, delete, copy/paste, split, create commands (Phase 4 of automation refactor)
- hit testing + point editing for AutomationClip — select, create/drag/delete breakpoints, undo/redo (Phase 3 of automation refactor)
- render AutomationClip on canvas — background rect, border, line triangles, dots (Phase 2 of automation refactor)
- add AutomationClip as first-class canvas entity — struct, operations, storage, layer tree, all match arms wired up (Phase 1 of automation refactor)
- apply middle-ellipsis truncation to layer names in browser Layers tab
- draggable sidebar separator in browser — resize left sidebar by dragging the vertical divider, persisted in app settings
- Ableton-style middle-ellipsis truncation for long filenames in browser
- dim non-audio files in browser samples, disable hover/selection/drag/keyboard nav
- add margin and border-radius to Places rows in browser sidebar
- add margin and border-radius to browser category tabs
- add Figma-style rounded bordered boxes around sidebar category and Places sections
- add border-radius to active sidebar category highlight, remove left accent bar
- reorder layer controls to RMS | knobs | label | S/M/I, S/M/I buttons hidden until hover or active
- replace inline faders with rotary knob controls on layer rows, single-row layout
- inline RMS level meters on layer rows with dB text label below meter, shown only when signal is active
- inline volume and pan faders on each layer row in browser panel with horizontal drag support
- add empty state messages for Instruments ("No instruments found") and Effects ("No effects found") browser tabs
- join session input now auto-pastes clipboard when it contains a session URL or bare ID
- join session from CLI by passing share URL as positional argument, e.g. `layers https://layers.audio/projects/...`
- widen default browser width (320→340) so Time Signature label fits without ellipsis
- Time Signature label uses ellipsis instead of wrapping text
- add MidiClip arms to all non-exhaustive pattern matches after RightWindowTarget::MidiClip variant addition
- automation dots always take priority over edge resize, even without editing mode
- remove border/fill from tempo & time signature value boxes, smaller value text
- automation dots at clip edges now take priority over resize drag
- align Tempo/Time Sig left padding and text color to match Main entry
- move tempo & time signature above Main in browser layers list
- right window instrument params now appear in touch order (append to end, not front)
- "Create Automation" focuses existing automation clip instead of creating duplicate
- creating automation from FX param context menu no longer closes right window
- clicking expanded VST param no longer triggers "Add Effect" button — selects matching automation clips instead
- automation lane for MIDI clip now targets parent instrument so FX automation actually applies
- revert instrument FX automation to original MIDI-based normalization that was working
- 20px chevron, always-visible automation values in layers, automation name includes plugin name e.g. "Blend Dry/Wet (Rev Plate 140)"
- instrument FX automation — extend bbox to include automation clips, fix layers panel live updates via text_dirty, bigger 16px chevron
- plugin param automation playback — add sync_audio_clips after creation, GroupBus automation support, bigger chevron, continuous redraw during playback
- effect slot layout bypass|chevron|name order, live param values in right panel & layers value box during playback
- VST automation — show real param names, fix bypass index mismatch, accumulate multiple params in right panel
- right-click effect slot header shows "Create Automation" context menu, ensure target entity in selected for groups
- restore click-to-open-GUI on effect slots, add separate chevron for expand/collapse; fix create automation for groups
- Cmd+L toggles loop — pressing again on overlapping range deletes loop instead of stacking
- tempo row indented as child of Main, integer-only drag snapping, bordered value box
- automation lane ghost dot click now creates point on the line instead of at mouse Y position
- right window left border now uses same divider color as browser right border
- SVG icon blinking — write instance data at distinct buffer offsets per icon group
- automation points now created on the line (at interpolated value), not at mouse Y — drag to adjust
- audio clip drop now snaps to track rows instead of free Y positioning
- group volume=0 and pan=0 silently overwritten on project load — remove broken zero-check in deserialization
- beats_x/size_beats sync bugs — MIDI note creation, overlap trim, text note/component instance moves, automation split_at, group size_beats field added
- audio clips now start at exact beat-derived times — store canonical beats_x:f64 on all entities, audio engine uses beats*60/bpm instead of px/PIXELS_PER_SECOND, export and project load updated accordingly
- first MIDI note at clip start not playing when instrument has latency — restore correct cursor boundary
- browser category tab highlight now resets correctly after navigating a Places folder
- suppress audio clip fade hover effect while dragging any selection
- first MIDI note and note-off on stop now reliable — last_inst_time moved inside inst lock, note-off flag retries on gui lock failure
- dragging automation point no longer retriggers VST notes — soft instrument update skips MIDI cursor reset
- MIDI notes keep ringing after stopping playback — note-offs now reliably delivered via persistent flag
- split Cool tone into dark(229/0.22→#333540) and light(222/0.084→#A1A5AE) params; add exact-match tests
- volume fader mousewheel direction inverted — scroll up now increases volume
- clicking inside automation clip to create point no longer deletes it on mouse up
- automation clip labels in layers tab now show param name (Volume/Pan) instead of generic "Automation"
- keep default cursor when hovering over clips instead of showing grab cursor
- automation clip rendering now applies color_intensity setting to match waveform visual appearance
- automation clip color syncs with parent waveform/MIDI clip on color change; layer panel shows actual clip color
- automation inner white dots now render on top of lines, not behind them
- arrow keys no longer move canvas clips when command palette is open
- automation point changes now apply in real-time during playback instead of only on restart
- automation clips overlap-resolve across params/targets — same-param: X-only, different-param: X+Y overlap required
- automation clip creation finds free row below target instead of overlapping existing clips
- automation clips now included in rectangular select area (multiselect)
- automation clip overlap resolution — same-param clips now slice/crop/delete when overlapping, live preview during drag
- automation clip now selectable and movable — removed zoom-threshold auto-edit that blocked selection
- remove vertical gap when creating automation clip — now flush below the source clip
- playback seeks to start of selected automation or MIDI clip
- automation clip inherits color from its source audio/MIDI clip
- automation clip requires edit mode to place points — zoom in or double-click to enter, click outside or Escape to exit
- automation clip height now matches target audio clip height exactly
- code review fixes — add div-by-zero guards in hit testing/rendering/audio, fix partial_cmp unwrap panics, add update_cursor on automation drag, add serialization roundtrip test, remove dead auto_lane_close_rects field
- selection area stays grid-aligned when BPM changes
- shift-click in browser Layers tab now selects range instead of toggling individual items
- layer text not rendered on project load until scroll/click
- show drop indicator line when reordering items within a group
- Layers tab browser entries now scroll correctly
- prevent canvas zoom/scroll/pinch when mouse is over browser or right window panel
- context menu hover and click no longer trigger outside dropdown bounds
- clicking "Join Session" / "Share Session" in command palette now works — mouse click path was closing palette before executing the command
- increase "Project" and "Places" sidebar section header font size from 9 to 10
- replace tempo/time-sig tooltips with button-style value box backgrounds
- decompose large files — split handle_mouse_input into 10 methods, introduce RenderParams struct for gpu.rs, group App fields into sub-structs
- unify all UI text to use native macOS system font (SF Pro) via platform-aware default_ui_family() helper
- extract shared button component (toggle_color, action_color, text_color) and unify settings + right window buttons to Warp-style colors
- extract shared test helpers into helpers.rs, remove 3 duplicate undo/redo tests
- move metronome icon back to transport bar, keep BPM in browser header
- move Share button from top-right corner to Settings > Developer tab
- keep beats_x/size_beats/start_beats/duration_beats in sync on all resize, move, overlap-resolution, and MIDI recording mutations across cursor.rs, main.rs, overlap.rs
- add beats_x/size_beats/start_beats/duration_beats fields to all entity structs; fix struct initializers in main.rs, clipboard.rs, and all test files; fix component_defs → components field ref
Features
Bug Fixes
Performance
Design & UI
Refactoring