- Multi-file drag from Finder — drop several audio files at once and they stack on consecutive free lanes; the first lands exactly where you released the cursor, and a live waveform preview follows the cursor as you drag.
- Right-click → Export on any audio track bounces the clip with track FX, parent groups, and master applied. Works from the browser or the timeline.
- Windows release pipeline — signed NSIS installer + portable zip via Azure Trusted Signing, with auto-update parity.
- Complex warp keeps the clip end in sync when you change sample BPM or warp settings.
- Settings load failures now show a toast instead of silently defaulting to factory values.
- Browser sample preview now lives inside the right column instead of overlaying the sidebar; the transport pill recenters as you resize the browser or window.
- Samples browser sort — clickable Name/Modified header; right-click the secondary cell to swap metric (Date / Size / Type); preference persists across restarts. Default panel width widened to 560px.
- Browser drag preview shows true clip length, fills the waveform progressively while analyzing, fades semi-transparent until drop, and the new clip is auto-selected once placed.
- Window — double-click the title bar toggles macOS zoom; resize now extends the grid and viewport into the new area instead of leaving a stale region.
- Layers panel scrolling — chevron, freeze, group/MIDI icons, and Tempo/Time-Sig labels clip cleanly at the search-bar separator instead of disappearing early.
- Automatic tempo detection for samples. Drop any audio in and Layers detects its BPM, shown in the right panel with ÷2/×2 buttons for octave correction (with undo). No tempo? You get a clear "—" and a hint instead of a wrong guess.
- In-app update prompts. A new bottom-left "New Version Available" card lets you Update or Skip the current version; skipped versions are remembered so you won't be nagged again.
- Split macOS builds. Separate Apple Silicon and Intel DMGs/zips — smaller downloads and native performance on each architecture.
- Browser footer with profile menu. New bottom-left profile button opens a dropdown with Settings and Command Palette.
- Freeze/Unfreeze button in the right panel now renders its background.
- Various stability improvements to the DMG installer (Applications icon on macOS 14+) and auto-updater.
- Unified Warp control. The Warp toggle and mode selector now share a single pill in the right panel; Layers remembers your last-used mode when you re-enable Warp.
- Inspector layout polish. Solo / Mute / Monitor now tile the inspector width as a neat grid with a full-width Reverse below; consistent gray palette matches the rest of the DAW.
- Dashed drop area around Add Effect. You can now drop plugins directly onto the inspector to add them.
- Right panel shows target name. Selected item's name (filename, instrument, group, or "N clips") replaces the old uppercase category bar.
- Samples browser empty state. "Nothing here yet" + Add Folder button matches the layers/plugins panels.
- First-launch browser defaults to a 50/50 split and default color intensity is now 100%.
- 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
.dmgis now shipped alongside.zipfor first-install, bringing a familiar drag-to-Applications flow.
- Auto-updater now refuses to install unless running from a real
.appbundle, 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 syncaudioclips 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
- beatsx/sizebeats sync bugs — MIDI note creation, overlap trim, text note/component instance moves, automation splitat, group sizebeats field added
- audio clips now start at exact beat-derived times — store canonical beatsx:f64 on all entities, audio engine uses beats*60/bpm instead of px/PIXELSPER_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 — lastinsttime 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 partialcmp unwrap panics, add updatecursor on automation drag, add serialization roundtrip test, remove dead autolaneclose_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 handlemouseinput 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 defaultuifamily() helper
- extract shared button component (togglecolor, actioncolor, 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 beatsx/sizebeats/startbeats/durationbeats in sync on all resize, move, overlap-resolution, and MIDI recording mutations across cursor.rs, main.rs, overlap.rs
- add beatsx/sizebeats/startbeats/durationbeats 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