Skip to content

Getting audio out of StemDeck takes three actions, every time #570

Closed

Description

@thcp

Raised in #474 (item 4), alongside the loop-selection and zoom requests.

The problem

Every way audio leaves StemDeck today ends in a save dialog. To get one loop into a project you pick a format, click Export, then find the folder in a system dialog. For someone auditioning ideas against a session, that is not one interruption. It is the whole workflow, repeated for every candidate.

Dragging is the gesture these users already have in their hands. Every sample library and file browser they use supports it, and a DAW timeline is a drop target by default.

Why it is not already there

A WebView cannot hand the OS a file. HTML5 dragstart carries text, and in Chromium only, a DownloadURL some file managers accept. A DAW wants a real path on a real filesystem, and no browser will produce one. So this needs the native shell, which means it is a desktop-only capability.

Constraints anyone fixing this will hit

  • The gesture cannot wait for a render. A platform drag has to be handed to the OS while the mouse button is still down. A region mixdown is an ffmpeg run, so rendering during the gesture means the button is released before the drag ever attaches, and nothing happens.
  • The file has to outlive the drop. DAWs disagree about what a dropped file means. Reaper references it where it lies; others copy it into the project. So the file cannot live in the mixdown render cache, which is pruned at 20 files / 500 MB and would eventually delete audio somebody's project still points at.
  • The path must not come from JavaScript. The existing exports hold the destination in Rust behind an opaque token, precisely so nothing running in the WebView can write an arbitrary URL to an arbitrary location. The page is served over http by the Python backend, which Tauri treats as a remote origin, so app-defined commands are not ACL-gated and that rule is the only thing holding. Any drag implementation has to keep it.
  • The loop region is already interactive. It can be moved and both edges dragged. An HTML5 drag and a pointer drag on the same element fight, so a drag-out affordance cannot simply be the region itself.
  • Two regions of one song must not collide. The existing Export Region filename does not encode the bounds, so reusing it would mean a second drag silently handing over the first region's audio.

What is not in scope

The clipboard. Tauri's clipboard is text and images only, file copy needs per-OS code, and most DAWs will not paste a file anyway.

Browser and phone. DownloadURL is Chromium-only, drops into a folder and never into a DAW, so it would behave differently in every browser while never solving the actual request.

Activity

  1. added a commit that references this issue on Sep 4, 2026
    37a2c5f
  2. self-assigned this
    on Oct 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions