Two regressions from #187 (SVG overview became the visible waveform in engine mode): a constant 48px left gap vs the ruler/playhead, and the bar art style replaced by a filled envelope. Zero the legacy 48px offset in the DAW layout and render the overview as WaveSurfer-style bars (3px bar / 2px gap, baseline for silence). Verified headless in WebKit.
* feat: DAW mixer UI, catalog, diagnostics, and UX polish
- Horizontal fader mixer (mx-row layout: icon → name → fader → VU → val → M/S/DL)
- Solo button with gold active state; mute button stays visible when active
- VU meter via pre-computed envelope (no Web Audio analyser dependency)
- Catalog panel with job history and quick-load
- Auto-collapse import appbar when a track is loaded; "New track" toggle to re-expand
- Footer buttons: remove underline, normalize size, add hover state
- Transport: restore synchronous play-in-gesture-handler for cross-browser compat
- AudioContext resume fire-and-forget before multitrack.play() (Safari-safe)
- Loop state reset on new track load; playhead snaps to loopStart on play
- Global error/unhandledrejection logging
- Per-stem audio element error listeners in canplay handler
- State stubs for masterBusGain/masterLimiter (unused, reserved)
* feat(appbar): collapsible icon strip, version badge, and UX polish
- Appbar collapses to a compact icon strip on double-click using the
same grid-template-rows animation as the widget sections; auto-collapses
when a track finishes processing
- Collapsed strip shows SD monogram, URL icon, per-stem colored squares
(active/inactive), and Process button — all clickable
- Stem squares toggle selection; Process submits if URL is set, otherwise
expands the appbar; SD/URL icon always expands
- Brand subtitle shortened to "AI stem separation"
- Added v0.1.0 version label with optional green "New release available"
chip that fetches the latest tag from the GitHub releases API
- Fixed footer button underline and icon sizing
* Refine app shell and library interactions
* Improve library loading feedback
* new image
* Add Windows portable launcher scaffold
* readme
* readme update
* fix
* star thistory theme changed
* feat: responsive layout, parallel setup flow, and window constraints
- Enforce 1440×900 minimum window size in tauri.conf.json
- Rewrite setup.js: parallel workspace+gpu phase, minDelay() for
guaranteed state visibility, IIFE chains, error cleanup on failure
- Add setup.css step indicators (pending/active/done/error) with
gold spinner, green checkmark, red X
- Fix stems-panel overflow into transport footer (align-self + height)
- Make transport, appbar, and wave editor fully responsive with
clamp() and fr-based grid columns
- Remove dead .stem-list span.hidden rule (covered by base.css)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore: ignore data/ directory (runtime-generated)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore: untrack .docs directory from git
* Add Windows portable release workflow
* fix(tests): rewrite yoda conditions in test_config.py
* ci: set UV_LINK_MODE=copy to suppress hardlink warning
* fix: security hardening, reliability fixes, and observability improvements
- Enforce MAX_PENDING_JOBS cap on job submissions (503 when queue full)
- Add done_callback to pipeline task to log any unhandled exceptions
- Add job_id regex validation to DELETE endpoint
- Sanitize pipeline error messages sent to clients (full detail stays server-side)
- Move sweep_old_jobs to hourly background task via lifespan (not per-submission)
- Add demucs stall watchdog: terminate if no stderr output for 30min
- Add SSE connection max lifetime (4h) to prevent zombie connections
- Replace shutil.rmtree(ignore_errors=True) with logged _rmtree helper
- Fix log levels: chroma/key diagnostics downgraded from WARNING to DEBUG
- Add bounds clamping for MAX_DURATION_SEC, JOB_TTL_SECONDS, MAX_PENDING_JOBS
- Remove filesystem paths from /health endpoint response
- Replace innerHTML with safe DOM construction for BPM and confidence in JS
* fix(events): use get_running_loop() instead of deprecated get_event_loop()
* fix(tests): update assertions to match sanitized error and health response
* star history
* feat(desktop): Windows portable app — dual CPU/NVIDIA builds, external links, transport colors
- Move frontend to desktop/ui/ and fix frontendDist to point there (fixes Tauri build)
- Dual portable zip variants: StemDeck-Windows-x64 (CPU) and StemDeck-Windows-x64.NVIDIA
- Strip torch .lib static libraries in StripVenv (-623 MB dnnl.lib alone)
- Force-reinstall CPU torch after main pip install to prevent CUDA wheel override
- Sentinel file data/cpu-only short-circuits GPU detection in ensure_torch_device()
- Add open_url Tauri command + JS click interceptor for Help/Tip external links
- Rename GPU setup step to "Configuring compute device" (accurate for both variants)
- Play button turns green when active, stop button turns red when pressed
- Update CI pipeline for dual Windows variants with manual branch trigger support
- Update README with Windows desktop app section and download variant guidance
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Fix mixer volume updates getting stuck
Clamp per-track mixer output to the browser-safe 0..1 range and isolate volume write failures so one hot fader cannot leave other channels stale. Keep the existing master-volume fallback when no master fader is present.
* fix(ui): DAW view — tracks fill window height, icons aligned per row
- stem-waveform-layer: top: 0 (waves-column already starts below ruler,
previous top: 72px pushed waveforms 72px too far down)
- stems-panel: align-self stretch + margin-bottom 6px to match
waves-column height exactly, keeping icon rows in sync with waveform rows
- ResizeObserver on waveScroll recalculates --wave-playhead-h and
multitrack pxPerSec on every container resize
- Commit desktop/package-lock.json for reproducible npm ci in CI pipeline
* image:local added for windows builds
---------
Co-authored-by: Thales <>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>