Repository navigation
Releases: stemdeckapp/stemdeck
Release list
v0.20.0
Important
macOS first launch (no code signing yet). After dragging StemDeck to Applications, clear the Gatekeeper quarantine flag or macOS will say the app is damaged:
xattr -dr com.apple.quarantine /Applications/StemDeck.app
Which file do I download?
| Your setup | Download |
|---|---|
| Windows, NVIDIA GPU | StemDeck-Windows-x64.NVIDIA.zip |
| Windows, no NVIDIA GPU | StemDeck-Windows-x64.zip |
| Linux, NVIDIA GPU | StemDeck-Linux-x64.NVIDIA.tar.gz |
| Linux, no NVIDIA GPU | StemDeck-Linux-x64.tar.gz |
| macOS, Apple Silicon (M1-M4) | StemDeck-macOS-arm64.dmg |
| macOS, Intel | StemDeck-macOS-x64.dmg |
| Docker / Unraid | Nothing here, pull ghcr.io/stemdeckapp/stemdeck:0.20.0 |
Pick one. Each Windows and Linux download is complete on its own: unzip and run, no installer, no toolchain. Everything else in the asset list is used by StemDeck itself, in particular the small -app files are the updater's payload and will not run on their own.
What's new in 0.20.0
StemDeck can now explain itself. A new Guide button turns the studio into its own manual, the Trash is easier to see and to use, and a song you delete while it extracts now stops for real. All four bugs in this release were reported by @wastedbits, in clear detail. Thank you.
Guide
There is a new button in the left rail, below Trash: Guide. Click it, and everything it can explain glows for a moment, so you can see where to point. Then point at anything in the studio: a ring goes around that control and a box beside it says what it does, in plain words. Every button, lane control and setting is covered, each number in the song facts row says what it measures, and Settings lists all of its options, tab by tab. It works before you open a song, too.
While Guide is on, a click explains instead of acting, so you can explore without starting an extraction or changing a song. Press Esc, or click Guide again, to go back to normal (#757, #760).
The Trash
- A count on the icon. The Trash icon shows how many songs are in it, the same way the Queue does. Deleted songs stay on disk until you empty the Trash, and the number is what reminds you they are there (#749, from @wastedbits).
- Hold to restore. Point at a song in the Trash and its second line says how: hold the left mouse button for one second. A fill across the row shows the hold, and letting go early does nothing.
- Several at once. Click a song to select it, Ctrl+click to add or remove one, Shift+click to take a range. Holding any selected song restores all of them (#755).
A click on a song in the Trash now selects it rather than opening it in the studio.
Deleting a song while it extracts
- It stops. Moving a song to the Trash while it is being separated now stops the separation and frees the queue for the next song. Before, it kept running, and after a restart it could start again on its own (#748, from @wastedbits).
- Nothing is lost. The song waits in the Trash as Stopped, with its files. Restore it and it comes back to the library, still stopped, with an Extract button to run it again whenever you choose. Its files are only removed when you empty the Trash.
- Two related edge cases are fixed too: a song cancelled in its very last seconds no longer finishes anyway (#750), and on Windows a cancelled import no longer leaves its folder behind when a file is briefly locked (#751).
Imports stay in the background
Importing a song no longer takes over the studio while it is processed. The song you have open stays open, and if the studio is empty when the import finishes, the new song opens by itself (#747, from @wastedbits).
We Recommend
Adrianna Claro, a soul and contemporary R&B singer, songwriter and composer, joins Artists & Creators. A card can now carry several links, so hers points to both Spotify and Apple Music, Killah Trakz adds Spotify and Apple Music beside Instagram, and NIHIL adds Spotify (#761).
Portable install on Windows
A portable StemDeck placed in a folder it cannot write to, such as Program Files, now stops at once with a message that names the folder and suggests a writable place like C:\StemDeck. Before, it failed partway through with "Access is denied" (#746, from @wastedbits). The Windows readme now says where to extract it.
Let me know how it goes.
v0.19.1
Important
macOS first launch (no code signing yet). After dragging StemDeck to Applications, clear the Gatekeeper quarantine flag or macOS will say the app is damaged:
xattr -dr com.apple.quarantine /Applications/StemDeck.app
Which file do I download?
| Your setup | Download |
|---|---|
| Windows, NVIDIA GPU | StemDeck-Windows-x64.NVIDIA.zip |
| Windows, no NVIDIA GPU | StemDeck-Windows-x64.zip |
| Linux, NVIDIA GPU | StemDeck-Linux-x64.NVIDIA.tar.gz |
| Linux, no NVIDIA GPU | StemDeck-Linux-x64.tar.gz |
| macOS, Apple Silicon (M1-M4) | StemDeck-macOS-arm64.dmg |
| macOS, Intel | StemDeck-macOS-x64.dmg |
| Docker / Unraid | Nothing here, pull ghcr.io/stemdeckapp/stemdeck:0.19.1 |
Pick one. Each Windows and Linux download is complete on its own: unzip and run, no installer, no toolchain. Everything else in the asset list is used by StemDeck itself, in particular the small -app files are the updater's payload and will not run on their own.
What's new in 0.19.1
Slowed-down practice sounds right again, and you choose how slow. NVIDIA setup is sturdier on older cards, favourites reach your phone, and the top bar works at any window width. Most of this release comes from people who took the time to report what went wrong or suggest something better. Thank you.
Slowed playback
Playing at 0.75x had three problems, and all three are fixed.
- Stutter and skips. On long tracks, slowed playback ran out of audio after a minute or two and started skipping. It now plays through to the end (#722, reported in #701 by @goermezer).
- Doubled kicks. A drum hit could sound twice, like a flam, right after it landed (#728).
- Echo. Held vocals, pads and guitars picked up a faint chorus at slow speeds (#729).
The last two came from the way the audio was stretched. Slowed playback now uses Signalsmith Stretch, which keeps each hit single and held notes clean. Normal speed is unchanged.
The slow speed is yours to set. Point at the 0.75x button and scroll, or press the up and down arrow keys on it, to move it a hundredth at a time anywhere from 0.50x to 0.99x. Some fills want 0.75x, some only a nudge. 1x stays one press away, and the slow speed is remembered (#701, also from @goermezer). Half speed has a button of its own, 0.5x, beside it (#742).
NVIDIA setup
@digidirt reported a CUDA setup that failed and left StemDeck unable to separate anything (#723). Following that thread turned up four related problems, now fixed:
- When CUDA setup fails and StemDeck falls back to the CPU, the original PyTorch is put back exactly as it was. Before, a failed fallback on Windows could leave PyTorch unable to load at all (#731).
- Older cards such as the GTX 900 series get a PyTorch build that still runs on them. Before, they were only offered the newest build, which has no support for them, and always fell back to the CPU (#732).
- A card that no PyTorch build supports is set up for the CPU once, instead of repeating about 45 seconds of CUDA setup on every launch (#733).
- If PyTorch still cannot load, StemDeck starts anyway, and Settings says the separation engine could not start and that reinstalling repairs it. Before, the app did not open at all (#730).
The top bar
- Extract stems. The yellow button now says Extract stems, to match the Extract row it acts on, and the top bar's right-hand end is tidier: Detect structure sits over the button, and the Collapse toggles stack beside them. Both were @wastedbits' suggestions (#725).
- At any window width. Below a wide window, the now-playing card used to disappear, and About this song went with it. The card now shrinks instead: the artwork goes first, then the title, and the heart and the About this song button always stay (#735).
Favourites
- On your phone. Favourites are kept by StemDeck itself now, not only in the desktop window. The phone has a heart on every track, its Favorites filter shows just your favourites, and a heart set on either screen shows on the other (#734).
- From the library. Every library row has a heart when you point at it, and favourited songs show a small red heart under their title (#724, from @wastedbits).
Key
- Minor keys. Songs in a minor key were often reported as their relative major, B minor as D major for example. Key detection now tells them apart, and it checks itself again against the separated stems (#726, thank you @wastedbits).
- One key label. Key and scale were shown three times across the screen and the Key card cut long names off. It is now one label, such as "F# minor", that wraps instead of being cut (#736).
Lyrics
The Lyrics tab used to search LRCLIB on its own, with its own copy of the rules for which version belongs to a track, and the two copies could disagree. It now asks StemDeck to look the song up the same way an import does, so a track gets the same answer in both places, and lyrics it finds are there on your phone too. Your browser no longer contacts LRCLIB directly (#719).
Security
The desktop app's network library is updated past a published advisory, along with a library used while building the app (#738).
Updating
- Windows and Linux: the one-click update in the app works for this release.
- macOS: install the new app from the table above.
- Docker and Unraid: pull the new image as usual.
Nothing in your library is touched. If something still sounds or looks off, open an issue and let me know.
v0.19.0
Important
macOS first launch (no code signing yet). After dragging StemDeck to Applications, clear the Gatekeeper quarantine flag or macOS will say the app is damaged:
xattr -dr com.apple.quarantine /Applications/StemDeck.app
Which file do I download?
| Your setup | Download |
|---|---|
| Windows, NVIDIA GPU | StemDeck-Windows-x64.NVIDIA.zip |
| Windows, no NVIDIA GPU | StemDeck-Windows-x64.zip |
| Linux, NVIDIA GPU | StemDeck-Linux-x64.NVIDIA.tar.gz |
| Linux, no NVIDIA GPU | StemDeck-Linux-x64.tar.gz |
| macOS, Apple Silicon (M1-M4) | StemDeck-macOS-arm64.dmg |
| macOS, Intel | StemDeck-macOS-x64.dmg |
| Docker / Unraid | Nothing here, pull ghcr.io/stemdeckapp/stemdeck:0.19.0 |
Pick one. Each Windows and Linux download is complete on its own: unzip and run, no installer, no toolchain. Everything else in the asset list is used by StemDeck itself, in particular the small -app files are the updater's payload and will not run on their own.
What's new in 0.19.0
On Windows or Linux, this update is a fresh download rather than a one-click update: press Download, unzip it, and run it. Your library stays as it is. "Updating" at the end says why.
The track you are playing now knows what it is. StemDeck names the song, the artist and the show or film it comes from, and the Lyrics tab follows the singer line by line while you practise. It works the same for a Mandarin ballad or a K-pop single as for an English band.
Every track knows what song it is
Most YouTube uploads carry nothing but a title, so until now a track only knew its song when the file happened to be tagged. Each import is now identified while it separates: from its tags when it has them, otherwise from its title, looked up on MusicBrainz. The now-playing card shows the song, and the info button opens the artist: history, members, albums, and their website, Instagram, Spotify and Apple Music when those exist. A song from a musical or a film says which one (#704, #706, #707).
For bands Wikipedia does not cover, an optional Discogs token fills the artist box. With an optional AcoustID key, the audio itself is fingerprinted first, which finds songs whose titles say nothing. Both live in a new Song details tab in Settings, and both are off until you add a key. A key AcoustID refuses is caught when you save it, with a message that says which kind of key to use (#712, #718).
Lyrics that follow the singer
Lyrics are found on LRCLIB during the import and kept with the track. They are only kept when both the song and the artist match; otherwise the tab says none were found, rather than showing somebody else's words (#702).
LRCLIB often holds a song timed to another cut: the album version against a video with a longer intro, or a live take. StemDeck now listens to the vocals stem and times those lyrics line by line, so each line lands when it is sung, not just shifted as a block. I checked this on 57 songs across all ten languages the app speaks: 90% to 100% of lines start within half a second of the voice, depending on the language (#716).
A song no database has can be transcribed from the vocals instead. That uses Whisper on your own machine, on NVIDIA GPUs by default. The first time it runs it downloads its model, about 1.6 GB.
Sync lines: time the lyrics yourself
When a line is still off, or a song has lyrics with no timing at all, open Sync lines in the Lyrics tab. Play the song and tap T or Enter as each line starts. Each line also gets a marker on a Lyrics lane above the waveform, and you can drag it into place the way you would the beat grid. There is undo, nudging by a fraction of a second, and a way back to the detected timing. Timing you make yourself always wins, and it is kept with the track. Align is there too, for moving all the lyrics at once (#717).
Every language the app speaks
Chinese, Japanese and Korean songs used to be found almost never. Titles in two scripts, traditional and simplified Chinese, and full-width text are understood now, and artists are matched through their real alternative names rather than guesses. The artist box reads the artist's own Wikipedia when yours only has a stub, and shows their native name next to the translated one. Karaoke fills Chinese and Japanese a character at a time and Korean by syllable (#705, #709).
LRCLIB holds many Polish songs with every accented letter deleted. Those letters come back, taken from an intact copy or from what the vocals say (#703). Tags written in old Central European or Cyrillic code pages read correctly (#711).
Fixes
- An error is a readable card you can close, not a faint red strip over the top bar (#708).
- The timeline ruler stays legible on an hour-long track (#710).
- Cancel works right away while a YouTube link is still being looked up, instead of up to 20 seconds later (#715).
From the issue tracker
@wastedbits reported five things in 0.18.1, and each one is in here. The now-playing card's date wraps instead of being cut off (#698). The Unsorted folder no longer pretends it can be reordered or given subfolders (#695). The click track box stays solid when no song is loaded (#697). Count-in says that it plays even with the click off (#696). And the top bar now reads as one extraction row with the now-playing card at its end, which was their idea (#699). Thank you for all of them.
Privacy
To identify a song, its names (artist, song, album, show) are sent to MusicBrainz, Wikidata, Wikipedia and LRCLIB. An audio fingerprint goes to AcoustID only if you have added a key, and names go to Discogs only if you have added a token. The lyrics stay on your machine. The Song details tab says the same.
Updating
This release adds Whisper to the Python runtime, and that decides how it reaches you.
- Windows and Linux: the app will tell you 0.19.0 is out, but this time with a download link rather than the one-click update. The one-click update replaces the app and keeps the runtime you already have, and this release needs a new runtime. Download your package from the table above once, unzip it, and run it.
- macOS: install the new app from the table above. Its first launch downloads the matching runtime.
- Docker and Unraid: pull the new image as usual.
Nothing in your library is touched.
v0.18.1
Important
macOS first launch (no code signing yet). After dragging StemDeck to Applications, clear the Gatekeeper quarantine flag or macOS will say the app is damaged:
xattr -dr com.apple.quarantine /Applications/StemDeck.app
Which file do I download?
| Your setup | Download |
|---|---|
| Windows, NVIDIA GPU | StemDeck-Windows-x64.NVIDIA.zip |
| Windows, no NVIDIA GPU | StemDeck-Windows-x64.zip |
| Linux, NVIDIA GPU | StemDeck-Linux-x64.NVIDIA.tar.gz |
| Linux, no NVIDIA GPU | StemDeck-Linux-x64.tar.gz |
| macOS, Apple Silicon (M1-M4) | StemDeck-macOS-arm64.dmg |
| macOS, Intel | StemDeck-macOS-x64.dmg |
| Docker / Unraid | Nothing here, pull ghcr.io/stemdeckapp/stemdeck:0.18.1 |
Pick one. Each Windows and Linux download is complete on its own: unzip and run, no installer, no toolchain. Everything else in the asset list is used by StemDeck itself, in particular the small -app files are the updater's payload and will not run on their own.
What's new in 0.18.1
One fix, and it is the search box.
"Search failed. Check your connection."
Typing anything into the search box failed, and the message blamed a connection that was fine. Pasting a link kept working, which made it look stranger still. It affected every download on this page, on every platform, and it had nothing to do with the network.
StemDeck ships yt-dlp with only the YouTube and SoundCloud extractors in it. The other 930 are unreachable, since every other host is rejected before yt-dlp is ever called, and several dozen of them are adult sites that have no business sitting on your disk. The list that rebuilds that trimmed copy named the extractors that handle links, and left out the three that handle searches. So the search box asked for a part that was not in the box.
All three tabs work again: YouTube songs, YouTube playlists and SoundCloud songs. The search that failed for the person who reported this now returns results in the app I tested it in.
Packaging refuses to build a runtime with search missing, and the tests now read the app's own list of permitted extractors rather than a second copy of it, so a future addition cannot get ahead of the packaging step the way this one did.
Thank you to @athleticsfan for the report, and for the log that made it obvious where to look. Closes #692.
Updating
This fix lives in the Python runtime rather than in the app, and that decides how it reaches you.
- macOS: updating downloads a fresh runtime on the next launch, so the fix arrives on its own.
- Windows and Linux: the in-app update replaces the app but keeps the runtime you already have, so it does not carry this fix. Download your package from the table above once, unzip it, and run it.
Nothing in your library is touched.
v0.18.0
Important
macOS first launch (no code signing yet). After dragging StemDeck to Applications, clear the Gatekeeper quarantine flag or macOS will say the app is damaged:
xattr -dr com.apple.quarantine /Applications/StemDeck.app
Which file do I download?
| Your setup | Download |
|---|---|
| Windows, NVIDIA GPU | StemDeck-Windows-x64.NVIDIA.zip |
| Windows, no NVIDIA GPU | StemDeck-Windows-x64.zip |
| Linux, NVIDIA GPU | StemDeck-Linux-x64.NVIDIA.tar.gz |
| Linux, no NVIDIA GPU | StemDeck-Linux-x64.tar.gz |
| macOS, Apple Silicon (M1-M4) | StemDeck-macOS-arm64.dmg |
| macOS, Intel | StemDeck-macOS-x64.dmg |
| Docker / Unraid | Nothing here, pull ghcr.io/stemdeckapp/stemdeck:0.18.0 |
Pick one. Each Windows and Linux download is complete on its own: unzip and run, no installer, no toolchain. Everything else in the asset list is used by StemDeck itself, in particular the small -app files are the updater's payload and will not run on their own.
What's new in 0.18.0
A new top bar, a vocals control that says what it does, and a count-in that plays every time. Most of the rest came from people who wrote in about something that did not behave the way it looked. Thank you for those.
If you are on 0.17.2 or 0.17.3, the in-app updater will offer this one. Nothing about the Python runtime changed, so there is no full download to do.
A top bar that fits on two lines
The top bar used three lines for two lines of content. It is a grid now. The first row is upload, search, the track you have open and the two actions. The second is Extract and its stems, with the Collapse row beside them.
When the window narrows, the stems no longer wrap and push the bar taller. They fold behind a ⋯ button one at a time, from the end of the row, and come back as the window widens. The bar is the same height from 2560px down to 900px, in every language. French and Polish used to wrap at 1280px while English fit, which is how that went unnoticed.
The logo opens stemdeck.app, in your browser rather than inside the app.
Two controls left, because they no longer governed anything: the Timeline toggle, whose waveform strip went with the old footer, and "All" in the Collapse row.
The vocals control
The vocals mode that sat beside the chip was called "All", a few pixels from the other "All" that selects every stem. It is called Combined now, in every language.
Combined and Lead + Backing are the vocals control itself, not a setting waiting on the chip:
- Press the lit one to switch vocals off.
- Press the other to change mode and keep vocals on.
- Press either while vocals are off to switch them on in that mode.
- The Vocals chip still works, and turns vocals on as Combined.
The phone's Extract screen works the same way.
Two bugs came out with it. Pressing the last selected stem turned all six back on, and it now just switches that one off. And an empty selection used to send every stem, because the server reads an empty list as "all". Split is disabled while nothing is selected.
The count-in plays every time
The count-in played on the first press of play and never again for that track. After a stop, a pause or the end of the track, its clicks were timed against the previous start and landed in the past, where they make no sound. It plays on every start now, with the click track on or off.
The click panel also stopped looking live when the click is off. Switching the click off closes the beat-grid editor, since the editor edits the beats the click plays. The toggle said "ON" in every language whether it was on or not, and is now the metronome icon, lit when it is on.
A library that reads the same on every row
The line under each title was stored when the track was added, by six different code paths that did not agree. A track picked up at startup could read " · 6 stems", or "0 stems". It is built when the row is drawn now: length and stem count for a finished track, "Processing" or "Import failed" otherwise, and it follows your language.
The Recent section is gone. It listed the three newest tracks, which are already at the top of their folder, so one song could appear four times.
Tracks you uploaded yourself show their file format where artwork would be, as a small file icon with a band coloured per format: WAV, FLAC, MP3, M4A, OGG, OPUS and MP4 each have their own colour. The track panel's quality line reads "Lossless (WAV)" or "Compressed (MP3)" for uploads too, which it never managed before. Tracks already in your library pick this up at startup, as long as StemDeck kept their original file.
Dropping files on Linux
On the Linux desktop app, dropping a file turned the window into a bare media player, or typed its path into the URL box. The Linux webview never tells the page a drag contains files, so the page cannot receive them at all. The app takes the drop itself now and hands the page the file, by the same path as the file picker. Windows and macOS were not affected and are unchanged.
YouTube imports and FFmpeg
When setup rejected the FFmpeg in StemDeck's data folder and chose another, YouTube imports kept using the rejected one. An FFmpeg unpacked into a bin folder inside the data folder was invisible to them altogether. Both now use the FFmpeg setup actually verified.
The waveform after a lead and backing split
After a lead and backing split on a track you already had, the new stems played under the old waveform, and no reload fixed it. The browser had been told the waveform could never change, and took that literally. It checks for a newer one now.
Smaller things
- The favourite heart started an extraction. It sat inside the import form and acted as its submit button. It is an ordinary button again.
- The analysis panel's text stays inside its cards. Below about 1250px wide, values like "Natural Minor" painted over the card beside them, and long labels wrapped onto the value.
- Lanes line up with their faders. The empty studio drew seven lanes against six faders, and the first track of a session drifted a few pixels per lane.
- The now-playing card has a sensible maximum width instead of filling whatever space the bar had spare.
- The updater only offers the release GitHub marks as latest. A release published without ticking either box could have been offered to everyone.
- Not Another Audio Podcast joins We Recommend.
Closes #639, #651, #655, #656, #658, #659, #661, #662, #663, #664, #666, #668, #669, #670, #672, #673, #674, #675, #676, #677, #678, #681, #684, #686, #688 and #690.
Full changelog: v0.17.3...v0.18.0
v0.17.3
Important
macOS first launch (no code signing yet). After dragging StemDeck to Applications, clear the Gatekeeper quarantine flag or macOS will say the app is damaged:
xattr -dr com.apple.quarantine /Applications/StemDeck.app
Which file do I download?
| Your setup | Download |
|---|---|
| Windows, NVIDIA GPU | StemDeck-Windows-x64.NVIDIA.zip |
| Windows, no NVIDIA GPU | StemDeck-Windows-x64.zip |
| Linux, NVIDIA GPU | StemDeck-Linux-x64.NVIDIA.tar.gz |
| Linux, no NVIDIA GPU | StemDeck-Linux-x64.tar.gz |
| macOS, Apple Silicon (M1-M4) | StemDeck-macOS-arm64.dmg |
| macOS, Intel | StemDeck-macOS-x64.dmg |
| Docker / Unraid | Nothing here, pull ghcr.io/stemdeckapp/stemdeck:0.17.3 |
Pick one. Each Windows and Linux download is complete on its own: unzip and run, no installer, no toolchain. Everything else in the asset list is used by StemDeck itself, in particular the small -app files are the updater's payload and will not run on their own.
What's new in 0.17.3
This one is mostly about getting StemDeck running on machines where it would not. Two setup failures that left people stuck before they could separate anything, and one that stopped an imported file being split a second time.
Apple Silicon Macs that could not run FFmpeg
StemDeck fetches FFmpeg on first launch. There are two sources for it: the main one publishes a build per chip, and the backup publishes Intel builds only. When the main source cannot be reached, an Apple Silicon Mac was handed an Intel build, and without Rosetta installed it will not run at all.
Setup did not notice, because it only checked the files were there. So the failure turned up much later, in the middle of a job, as Could not read file duration: [Errno 86] Bad CPU type in executable.
Setup now runs both binaries instead of checking they exist, so a mismatch is caught during setup rather than during a job. It says the architecture is wrong and offers Rosetta or a custom download URL, rather than pointing at your firewall. A bad download is also no longer permanent: it used to fail identically on every launch afterwards with nothing to do but delete the folder by hand, and setup now falls through to a working system FFmpeg or fetches a fresh copy over it.
What this does not fix: on Apple Silicon the backup source still has no arm64 build, so if the main source is unreachable StemDeck still cannot fetch a working FFmpeg on its own. It now stops at that step and says so, with two ways forward, instead of failing partway through a job.
NVIDIA builds that quietly ran on CPU
The NVIDIA build installs a CUDA version of torch at first run and picks which one from what your driver reports. A driver reporting CUDA 12.0 to 12.3 was sent to an index that has never published the torch version StemDeck installs, so the install failed with No matching distribution found, the CPU version went back in, and separation ran on the processor with a working GPU sitting idle.
Every CUDA 12 driver now gets a build that exists and runs on it. If that build installs but cannot launch a kernel, setup now tries a second one instead of dropping straight to CPU.
If you have an NVIDIA card and StemDeck has been running on the processor, this one is worth a look.
Splitting a file you imported yourself
Pressing Split stems on a track imported from a file threw an error and left the button reading "Process" for the rest of the session. The same press on a YouTube track worked.
Three things were wrong at once. The composer was holding the bare filename of an upload, so the button posted it as though it were a link. The button renamed itself permanently on the first submit of a session, successful or not. And underneath both, the button acted on whatever was in the composer rather than on the track you were looking at.
The song structure button says what it does
It is called "Detect structure" now, and hovering it explains that it applies to the next import rather than to a track you already have open.
Nothing about it has changed, only the name. It was read as the switch that shows and hides the sections bar, so clicking it on an open track looked broken: the button changed colour and nothing else moved. The sections bar has its own control, "Sections" in the Collapse row along the top, and the tooltip now points at it.
Three smaller things in the interface
The bullets in the Extract chips are gone. Each was a dot in the button's own text colour, repeating what the chip already said by changing its border, background and text.
The green dot on library rows now appears only when it means something. A finished import is the resting state of every row, so a dot on all of them marked nothing out. Importing, queued and unavailable keep theirs, and are easier to pick out for it.
The notification bell has moved into the library rail, under We Recommend. The top bar is the import and split controls, and a bell at the end of it read as part of that job.
Closes #634, #635, #636, #637 and #644.
Full changelog: v0.17.2...v0.17.3
v0.17.2
Important
macOS first launch (no code signing yet). After dragging StemDeck to Applications, clear the Gatekeeper quarantine flag or macOS will say the app is damaged:
xattr -dr com.apple.quarantine /Applications/StemDeck.app
Which file do I download?
| Your setup | Download |
|---|---|
| Windows, NVIDIA GPU | StemDeck-Windows-x64.NVIDIA.zip |
| Windows, no NVIDIA GPU | StemDeck-Windows-x64.zip |
| Linux, NVIDIA GPU | StemDeck-Linux-x64.NVIDIA.tar.gz |
| Linux, no NVIDIA GPU | StemDeck-Linux-x64.tar.gz |
| macOS, Apple Silicon (M1-M4) | StemDeck-macOS-arm64.dmg |
| macOS, Intel | StemDeck-macOS-x64.dmg |
| Docker / Unraid | Nothing here, pull ghcr.io/stemdeckapp/stemdeck:0.17.2 |
Pick one. Each Windows and Linux download is complete on its own: unzip and run, no installer, no toolchain. Everything else in the asset list is used by StemDeck itself, in particular the small -app files are the updater's payload and will not run on their own.
What's new in 0.17.2
This one is all transport footer. On a 15 inch laptop with the library sidebar open, the click track controls used to stack into a column and the footer grew to about three times its height. That is fixed, along with two smaller things in the same strip.
The click track fits the row it is on
The footer measures itself and collapses when it runs out of width. It had one move for the click track: squeeze the options into a fixed 190px and let them wrap. That is narrower than two of those controls side by side, so the wrap came out as a five row column.
The width is now measured. The footer asks for exactly the pixels it is short and no more, so on most windows the options simply wrap to two rows and stay where they were. Only when two rows are still too wide do they move into a popover, opened from a small button beside the on/off toggle. Everything is still there and still works, and it comes back inline the moment the window has room again.
Affects 15 inch laptops, and any 4K display running at 250 percent scaling.
The click volume is a fader
It used to be a wide horizontal slider with a percentage after it, sitting on a row of square buttons and lining up with none of them. It is now a button beside the on/off toggle that opens a vertical fader, with the level above it. It stays on the row even at the widths where the other click options go behind the button.
The loop fields show their whole value
The two exact loop boxes under Position were cutting off their last digit: a loop ending at 01:45.100 displayed as 01:45.10. They now show total seconds, so that same loop reads 105.100 and fits. You can still type mm:ss.mmm if that is what your fingers know.
Also
The standing "Groups" label next to the beat grouping box is gone. The box already shows 3+2+2 as its own placeholder and explains itself on hover.
Full changelog: v0.17.1...v0.17.2
0.17.1
Important
macOS first launch (no code signing yet). After dragging StemDeck to Applications, clear the Gatekeeper quarantine flag or macOS will say the app is damaged:
xattr -dr com.apple.quarantine /Applications/StemDeck.app
Which file do I download?
| Your setup | Download |
|---|---|
| Windows, NVIDIA GPU | StemDeck-Windows-x64.NVIDIA.zip |
| Windows, no NVIDIA GPU | StemDeck-Windows-x64.zip |
| Linux, NVIDIA GPU | StemDeck-Linux-x64.NVIDIA.tar.gz |
| Linux, no NVIDIA GPU | StemDeck-Linux-x64.tar.gz |
| macOS, Apple Silicon (M1-M4) | StemDeck-macOS-arm64.dmg Still being built |
| macOS, Intel | StemDeck-macOS-x64.dmg Still being built |
| Docker / Unraid | Nothing here - pull ghcr.io/stemdeckapp/stemdeck:0.17.1 |
Note
2 of 6 downloads are still building. Each row becomes a link the moment its file is ready, so nothing here is ever a link to something that is not there yet.
Pick one. Each Windows and Linux download is complete on its own: unzip and run, no installer, no toolchain. Everything else in the asset list is used by StemDeck itself - in particular the small -app files are the updater's payload and will not run on their own.
What's new in 0.17.1
Additions to the click track, the export and the sections ribbon, and a long list of things that were quietly wrong. Almost all of it came from people who reported it, and several of them did the diagnosis themselves.
Additions
The count-in can be longer than one bar
It was one bar, fixed. At 120 BPM in 4/4 that is two seconds between pressing play and the song arriving, which is not long enough to get a hand back to an instrument.
It is now a length: off, or 1 to 4 bars. Asked for by @wastedbits in #587.
The click follows odd and compound meters
The click marked exactly one beat per bar, which is right for 2/4, 3/4 and 4/4 and wrong for everything else. 7/8 was seven even clicks with no pulse to lock onto, and 6/8 sounded like slow 3/4.
The bar is now grouped, so 7/8 can be 3+2+2 and 6/8 counts in two. You can set the grouping yourself when the default is not the one your song uses.
Exports keep your transposition
Transposition happens in the browser, so a mix exported from a transposed session came back in the original key with nothing to say it had. The export now carries the per-lane semitone shift through to the file.
A section can be pinned so it cannot be nudged
Every section was a drag target across its whole width, so a pointer aimed at the waveform, or a scroll that began a few pixels too high, could slide one off the moment it marked. There is no undo for the timeline, so the repair was to drag it back by eye and hope.
A padlock now sits beside the delete cross. While it is set, the section cannot be dragged, resized or renamed, and the padlock turns red so a locked one is obvious at a glance rather than only once you try to move it and fail.
Looping over a locked section still works, since that reads it without changing it. Deleting still works too, because the cross is a deliberate press on one section rather than something the pointer does on its way somewhere else.
Asked for by @digidirt in #573.
A loop and a section can now become each other
Both are a start time and an end time on the same track, and getting from one to the other meant reading the numbers off and rebuilding the span by hand.
Press Add with a loop armed and the new section lands on the loop. Before, it appeared at the start of the track instead, wherever the loop actually was, with nothing saying why.
Click a section and the loop arms over it. A single click, so double-click is still rename.
A loop drawn across a section that already exists is refused, and says so beside the button. Sections cannot overlap, and the alternatives were to trim the new one to whatever space was free or to shove its neighbours aside. Both hand back a different region than the one you picked, and shoving could move a section you had just locked.
Asked for by @digidirt in #573 and #474.
Fixes
Renaming a section did nothing
Double-clicking a section's label is meant to turn it into a text field. It did nothing at all, on every section and every track, so there was no way to name a section.
Dragging a section takes pointer capture, which redirects the rest of the gesture to the block itself. The double-click that ends a real double-click was therefore delivered to the block, while the code listening for it sat on the label inside, and never ran.
Sending those same events by hand works perfectly, which is why this survived every check I made of it, and why I told @digidirt in September that renaming already worked. It did not. It does now, and it has browser tests for the first time.
The app opened to a window that ignored you (Windows)
If StemDeck installed cleanly and then refused to respond to anything, this is the release that fixes it.
Hovering worked. You could type in the search bar and select text. Buttons did nothing, and neither did dropping a file. The logs were clean, because nothing had failed: every request returned 200.
Windows keeps a MIME type for each file extension in the registry, and other software sometimes sets .js there to plain text. Python reads that registry when it decides how to describe a file it is serving, so on an affected machine StemDeck handed the browser every one of its JavaScript modules labelled as plain text. Browsers refuse to run a module that arrives that way, by specification. Nothing attached itself to the buttons, and what was left was a window that drew correctly and ignored you.
StemDeck now states the types it serves for itself at startup, so the registry no longer gets a vote.
Found by @DrSiemer in #617, who read the browser console, worked out the cause and posted the fix along with it. If you are on an affected machine right now, setting .js back to text/javascript in the registry gets your current install working again.
A start that fails now says why
The one above arrived as silence, and that is its own fault.
The error reporting was set up at the end of the same startup run that was failing. When the run broke early, nothing was left to write the error down, so the logs stayed clean and the screen said nothing at all.
A small script now runs before everything else, with no dependencies of its own that could fail with it, and catches whatever goes wrong. A failure during startup now shows the reason on screen instead of leaving you with a window that will not answer. #618.
Pops, crackle, and no sound at all on some setups
If StemDeck crackled through a whole track, or played the timeline with no sound, this is the release that fixes it.
The pitch stage offers one input per semitone, and it is supposed to do nothing at all when no lane is transposed. It never did. Every input was wired in the moment playback was set up, and a wired input carrying nothing still arrives as a channel of silence, so the stage built twelve pitch shifters and ran all of them, on silence, for the whole track. At zero transpose. On every track anyone has ever played.
Its cost per second of audio rises with your output device's sample rate, which is why the same bug looked like three different problems:
| Your output device | Before | Now |
|---|---|---|
| 44.1 kHz | 17.8% of the audio budget | 0.2% |
| 48 kHz | 20.9% | 0.3% |
| 96 kHz | 78.4% | 0.8% |
| 192 kHz | more than real time, so no sound | 1.5% |
On a desktop at 44.1 kHz you would not have heard it, only a fan. On a laptop it was continuous pops. At 96 kHz it was audible distortion, and at 176.4 and 192 kHz the audio thread could not keep up at all and produced nothing.
It was not only wasted work. Measured against a 440 Hz tone at zero transpose, the audio coming out differed from what went in by up to half of full scale. Playback is now identical to the file, sample for sample, when nothing is transposed.
Found and fixed by @pywkt in #576, including the measurements above. @wastedbits reported the silent 192 kHz case in #575, and the detail that cracked it open was giving the exact rate at each symptom: fine at 48, distorted at 88.2 and 96, silent at 176.4 and 192. A fault that goes absent, then audible, then total along one axis is a fault whose cost scales with that axis, and that is what pointed at the real cause.
StemDeck no longer works four times harder for nothing on a high-end DAC
Chasing the above turned up something underneath it.
StemDeck ran its whole audi...
0.17.0
Important
macOS first launch (no code signing yet). After dragging StemDeck to Applications, clear the Gatekeeper quarantine flag or macOS will say the app is damaged:
xattr -dr com.apple.quarantine /Applications/StemDeck.app
Which file do I download?
| Your setup | Download |
|---|---|
| Windows, NVIDIA GPU | StemDeck-Windows-x64.NVIDIA.zip |
| Windows, no NVIDIA GPU | StemDeck-Windows-x64.zip |
| Linux, NVIDIA GPU | StemDeck-Linux-x64.NVIDIA.tar.gz |
| Linux, no NVIDIA GPU | StemDeck-Linux-x64.tar.gz |
| macOS, Apple Silicon (M1-M4) | StemDeck-macOS-arm64.dmg |
| macOS, Intel | StemDeck-macOS-x64.dmg |
| Docker / Unraid | Nothing here - pull ghcr.io/stemdeckapp/stemdeck:0.17.0 |
Pick one. Each Windows and Linux download is complete on its own: unzip and run, no installer, no toolchain. Everything else in the asset list is used by StemDeck itself - in particular the small -app files are the updater's payload and will not run on their own.
What's new in 0.17.0
Two things this release is about: getting audio out of StemDeck without a dialog, and being able to use it from a device that is not the one it runs on.
Drag a stem or a loop straight into your DAW
Mark a loop and every lane grows a small handle inside the right edge of the selection, in that lane's own colour. Drag one and you get that track's slice of the loop. A wider handle on the top edge carries the mix, with the fader balance, click track and count-in you set.
Drop it on a DAW timeline or into a folder. It is one action instead of three.
A lane handle gives you that stem on its own, at full level, the way the lane's download button already does. Mute and solo shape the mix, so those apply to the handle on the top edge rather than to a single track.
Files land in an exports folder next to your stems folder, and nothing is ever cleaned out of it automatically. That is deliberate: DAWs like Reaper point at a dropped file where it lies rather than copying it into the project, so a file that got tidied away later would take the project's audio with it. You can move the folder in Settings.
Desktop only. A browser cannot hand a file to another application, whatever it is running on.
StemDeck works from your phone now
Opening StemDeck from a phone used to give you playback and a key control that silently did nothing. Transpose is an AudioWorklet, and browsers only grant those on a secure origin, which http://192.168.x.x is not.
So the desktop app now serves the LAN over https on port 8443, with a certificate it generates on your own machine. Nothing is shipped: a certificate in the download would publish its private key to everyone who downloaded it.
Your phone will show a "connection is not private" warning the first time. That is expected, it is your own machine's certificate, and you tap through it once per device. Settings says so before you ever see it.
The phone also gained the key control itself, and when the origin cannot support it the stepper is visibly disabled and says why instead of sitting there dead.
The phone opens roughly four times faster
Opening the phone UI pulled about 456 KB of uncompressed JavaScript, CSS and HTML every time, most of it the language tables. Text responses are compressed now. Measured on a real network, the largest file went from 334 KB to 88 KB.
Audio is deliberately left alone, so seeking within a track behaves exactly as before.
One library, every device
There were two answers to "what is in my library": the desktop built its list from storage on that machine, the phone asked the server. Deleting a track on the desktop left the job on the server, so the phone kept listing songs you thought you had thrown away.
The Trash lives on the server now and both agree. Trashing is still not deleting: the stems stay on disk and restoring costs nothing, so a mistaken tap on a phone never destroys audio. Only emptying the Trash removes anything.
Zoom goes to 10x
Twice as far into the waveform as before. This needed the underlying data to change as well as the limit: the peak files carried enough detail for about 5x, and past that the bars start repeating their neighbours rather than showing you anything new.
Songs you separated before this release keep their old peak files. They will zoom all the way, but past 5x the picture stops gaining detail until you separate them again.
A tidier yt-dlp
Every install shipped 939 yt-dlp site extractors. StemDeck downloads from YouTube and SoundCloud and refuses every other host before yt-dlp is ever called, so none of the rest were reachable. 930 are gone and 9 remain.
The set that stays is worked out from what StemDeck actually needs rather than written by hand, and every packaging path fails the build if YouTube or SoundCloud stop matching.
Smaller things
- Settings tabs scroll. The Network tab had outgrown the dialog, which drew the Done button on top of the Port setting with no way to reach what was underneath.
- Transpose explains itself. When the key control is unavailable it now names the actual reason rather than guessing at one.
- The licenses the downloads only named are included. Every package carries the third-party license texts it refers to.
- We Recommend has three new names, a Writers and Storytellers category, and the full statement that I take no money, sponsorship or funding from anyone on that list. That last part is the point of the list and it was only ever said in the README.
Upgrading
Windows and Linux can update in place from Settings. This release does not change the Python runtime, so the in-app updater can offer it.
macOS is unaffected by the runtime issue that made 0.16.1 a full download.
Thanks
The drag-out and the loop work came from discussion #474. Keep them coming, the requests in there are consistently better than my own list.
0.16.1
Important
macOS first launch (no code signing yet). After dragging StemDeck to Applications, clear the Gatekeeper quarantine flag or macOS will say the app is damaged:
xattr -dr com.apple.quarantine /Applications/StemDeck.app
Which file do I download?
| Your setup | Download |
|---|---|
| Windows, NVIDIA GPU | StemDeck-Windows-x64.NVIDIA.zip |
| Windows, no NVIDIA GPU | StemDeck-Windows-x64.zip |
| Linux, NVIDIA GPU | StemDeck-Linux-x64.NVIDIA.tar.gz |
| Linux, no NVIDIA GPU | StemDeck-Linux-x64.tar.gz |
| macOS, Apple Silicon (M1-M4) | StemDeck-macOS-arm64.dmg |
| macOS, Intel | StemDeck-macOS-x64.dmg |
| Docker / Unraid | Nothing here - pull ghcr.io/stemdeckapp/stemdeck:0.16.1 |
Pick one. Each Windows and Linux download is complete on its own: unzip and run, no installer, no toolchain. Everything else in the asset list is used by StemDeck itself - in particular the small -app files are the updater's payload and will not run on their own.
What's new in 0.16.1
Mostly a fix release. If you are on macOS, this one matters: 0.16.0 shipped with a broken runtime and automatic song sections have not worked since.
macOS song sections work again
0.16.0's macOS package carried AppleDouble sidecar files that broke the Python runtime. matplotlib failed to import, which took the section analyser down with it, so no song ever got its sections detected automatically. The runtime is clean now.
Because the fix is inside the runtime and the updater cannot replace that, macOS users need to download this release rather than update in place.
Your library stops arguing with you
- Deleted songs stayed deleted. A delete that could not remove every file was reported as a success, the app then forgot it had ever happened, and the song was adopted back into the library on the next start. The deletion is recorded on the server now.
- Trashed songs stay in the Trash. If you had processed the same source twice, importing one copy quietly evicted the other from the Trash and it reappeared in the library after a restart.
- Your settings survive.
settings.jsonwas written by truncating the file first, so an interrupted write left it empty and unrecoverable. At least one person lost their port and network settings that way. Writes are atomic now, and a damaged file is kept aside and recovered from the mirror instead of being treated as a first run.
Playback and loops
- The footer scrub bar works. It was driving a silent copy of the track while the real clock ran elsewhere, so dragging it did nothing you could hear, and "set loop in at playhead" always wrote zero.
- Loop regions can be adjusted instead of redrawn. Drag either edge on its own, or drag the middle to slide the whole region without changing its length. From discussion #507.
- Scroll a loop bound to nudge it. Hover either time field: left of the decimal point moves seconds, right of it moves milliseconds.
Cancelling actually cancels
- A cancel that arrived in the wrong moment could strand a job at "queued" forever: invisible, still counted against capacity, its source file never freed, and re-queued on every restart.
- Cancellation now reaches every process it is meant to stop, and a force-quit no longer leaves a GPU-holding process behind.
- A cancelled or failed job tears its worker down instead of leaving a poisoned one warm for the next job.
Around the studio
- Collapse everything at once. The panel row has an "All" button that puts the three panels and the library away together, and brings them back.
- We Recommend is grouped by category and fits without scrolling, three logos that had been broken since they were listed are fixed, and r/bass is finally in the app as well as the README.
- The Click track's "Alpha" badge is gone. It has been through several releases and is no longer alpha.
Under the hood
Security and robustness work you should not have to notice: the in-app updater now refuses an installer from anywhere but GitHub, Linux FFmpeg is verified against a pinned checksum before it is run, fork pull requests can no longer execute code on the machine that builds releases, and a handful of ways to hang or exhaust the backend are closed.
Linux Rust is also compiled on every pull request now. It was previously first compiled during a release build, which is a poor moment to find out it does not.
Thanks to everyone who reported something. If you hit anything in this release, open an issue and I will take a look.