Spaces:
Sleeping
Custom UI replacement
Last updated: 2026-05-12
What changed
The active interface is a custom browser UI served from web/ by the FastAPI app in app.py. The old Gradio files live in legacy/ and are no longer used by the active application.
UX goals
- Match the supplied minimal reference image as the default view: file identity, one purple extract action, large waveform, compact right controls, and sample cards.
- Keep the first screen focused on extraction and audition, not pipeline/debug/editor internals.
- Preserve advanced workstation features behind a single secondary
Review & editworkbench. - Keep stage timing, logs, run history, and semantic supervision available without dominating the default layout.
- Make
stem=allandonline_previewavailable as advanced presets instead of primary controls. - Keep the frontend deployable without a JavaScript build step until the interaction model stabilizes.
Pass 6 visual simplification
The UI was first restyled to the supplied minimal reference direction:
- light native-feeling canvas instead of the previous dark dashboard;
- compact top bar with file selector/status and one primary purple
Extract Samplesaction; - large waveform-first workspace with colored lollipop onset markers;
- right-side control card for the primary extraction decisions;
- advanced DSP/model parameters moved into a collapsible panel;
- representative samples rendered as auditionable cards with waveform thumbnails;
- pipeline, run history, supervision, and raw tables kept available as collapsible utility panels.
Pass 7 reference-alignment hardening
This pass closed the visual fidelity gaps from the previous approximation:
- removed the visible waveform header so the canvas is quiet like the reference image;
- replaced separate native stem/reconstruction audio controls with one minimal transport row: play button, time, progress line, and Source/Stem/Reproduced preview modes;
- renamed the right card to
Common controlsand limited it to stem, hit sensitivity, sample groups, plus fast-preview/best-quality presets; - collapsed pipeline/history/supervision/tables into one
Review & editworkbench below the sample cards; - hid selected-hit/sample audio elements from the default layout while preserving click-to-audition behavior;
- tightened card spacing, border radii, font scale, waveform height, and sample-card proportions to better match the supplied image.
The UI is still not a pixel-for-pixel clone because it must remain functional across arbitrary audio files and preserve the project’s editing tools, but the default screen is now intentionally aligned with the reference composition.
Pass 8 fixed workstation layout
This pass responds to the no-scroll workstation requirement and the missing-upload affordance:
- the document body is fixed to the viewport with
overflow: hidden; - the app uses a top bar, left sidebar, center workspace, right sidebar, and bottom dock;
- pipeline/history/selection tools moved into the left sidebar;
- extraction/export/advanced controls moved into the right sidebar;
- semantic review/edit tools and raw tables moved into the bottom bar;
- all long content now scrolls only inside its own panel;
- the upload affordance is now an explicit
Upload audiobutton in the top bar; - dropping a file anywhere on the app loads it and shows a full-screen drop overlay while dragging.
UI structure
| Area | Purpose |
|---|---|
| Top bar | App identity, explicit upload button, selected-file metadata, backend status, and one primary purple Extract Samples action. |
| Left sidebar | Source/drop guidance, selected-hit/sample context, pipeline logs, and run history. |
| Center workspace | Quiet waveform canvas, Source/Stem/Reproduced transport row, and representative sample cards. |
| Right sidebar | Common controls, exports, and collapsed advanced parameters grouped by stem separation, hit detection, grouping, export, and cache. |
| Bottom dock | Review/edit semantic supervision tools and raw tables in expandable panels. |
Frontend implementation
Files:
web/index.htmlweb/styles.cssweb/app.js
The frontend uses modern browser APIs directly:
fetchfor API calls.FormDatafor upload.<audio>for previews.<canvas>for waveform/onset visualization.- CSS grid, responsive layout, custom properties, and backdrop filters for layout/polish.
No Gradio runtime, iframe, or generated UI framework is involved.
Backend integration
The frontend creates a job with POST /api/jobs, then polls GET /api/jobs/{id} until completion. Completed jobs expose direct download URLs for:
- sample pack ZIP
- MIDI reconstruction
- source mix WAV
- target stem WAV
- non-target context bed WAV
- target reconstruction WAV
- full-context reproduced mix WAV
- individual sample WAVs
The run history panel calls GET /api/jobs and can reload any completed manifest still present under .runs/.
Clustering UX
Two modes are exposed:
| Mode | UX intent |
|---|---|
batch_quality |
Slower, final-quality clustering using all-pairs similarity plus agglomerative clustering. |
online_preview |
Faster near-realtime-style clustering using prototype assignment. Best for quick iteration after bypassing Demucs. |
Why SSE progress with polling fallback instead of websockets
The active UI uses Server-Sent Events through GET /api/jobs/{job_id}/events for stage/log updates, with the older polling loop retained as a fallback. WebSockets are unnecessary here because the pipeline is stage-oriented and the frontend does not need bidirectional streaming while extraction runs.
Remaining UI improvements
- Add waveform zoom/pan while keeping the fixed workstation layout uncluttered.
- Add inline cluster merge/split/relabel workflows inside
Review & edit. - Add A/B comparison between parameter runs.
- Add downloadable timing report per job.
- Add filters/search to the run history browser.
- Convert the frontend to TypeScript when the UX stops moving quickly.
Latest review UI additions
The current UI now includes:
- Hidden selected-hit and selected-sample audio elements for click-to-audition without visible player clutter.
- Clickable waveform onset markers that select and audition the nearest detected hit.
- A detected-hit review table backed by
review/hits/*.wavartifacts. - Audition buttons for representative sample rows.
- Server-sent-events job progress via
GET /api/jobs/{job_id}/events, with polling fallback.
This still stops short of destructive editing. The next UI layer should store edits as manifest overlays, then call a re-export endpoint that reuses cached hit audio instead of rerunning Demucs/onset detection.
Pass 9 reproduced audio and parameter hierarchy
This pass made the audio preview and control model more explicit:
reconstruction.wavis now a full-context reproduced mix, not just the sample-triggered target layer.target_reconstruction.wavpreserves the sample-only target reconstruction for focused inspection.source.wav,stem.wav, andcontext_bed.wavare exported as explicit layers.- The transport has Source, Stem, and Reproduced preview buttons and switches to Reproduced after extraction.
- The right sidebar now separates Common controls from Advanced parameters.
- Advanced parameters are grouped by pipeline stage: stem separation, hit detection, grouping, export/cache.
See docs/REPRODUCED_AUDIO_AND_PARAMETERS.md.
Pass 10 clean-default refinement
This pass responds to the UI being too cluttered after the workstation and reproduced-audio additions.
Changes:
- all non-essential side/bottom panels are collapsed by default;
- the bottom dock is compact until a review/table tool is opened;
- top-bar controls are shorter and visually lighter;
- common controls hide explanatory copy and show only the core knobs;
- pipeline logs, run history, exports, supervision, and raw tables remain present but opt-in;
- the no-scroll workstation constraint is preserved.
See docs/CLEAN_DEFAULT_UI.md.
Immediate waveform and extraction progress update
The default workflow now starts with visible feedback: selecting or dropping a file causes the browser to decode the uploaded audio and render a peak-envelope waveform immediately. This happens before /api/jobs is called. The user can play the uploaded source through the transport while choosing common controls.
During extraction, the waveform is reused as the progress surface. The backend sends a real progress object through the normal job payload and SSE stream. The frontend clips an accent-colored copy of the waveform from the left to exactly that progress fraction and leaves the remaining waveform neutral. No estimated time progress is animated.
A compact Start here panel was added to the left sidebar to make the sequence obvious: Load audio → Set controls → Extract → Review/export.