Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
127 commits
Select commit Hold shift + click to select a range
b193b78
feat(desktop): ask the OS for microphone and camera access
Oct 5, 2026
a31456a
feat(takes): store recorded takes and tracks, and render take videos
Oct 5, 2026
70bf7e7
feat(recording): record takes over the song in the studio
Oct 5, 2026
76330c6
feat(video): film a take with the camera and make a video of it
Oct 5, 2026
ba8a1f5
Merge feat/0210-media-permissions into big-release
Oct 5, 2026
900234d
Merge feat/0210-takes-backend into big-release
Oct 5, 2026
afbe4d3
Merge feat/0210-recording-frontend into big-release
Oct 5, 2026
aecad79
Merge feat/0210-video-frontend into big-release
Oct 5, 2026
15917e0
fix(recording): list track inputs by name in the desktop app
Oct 5, 2026
e363ed0
test(desktop): check mic and camera permissions in the real WebView2
Oct 5, 2026
c297ba4
Merge feat/0210-media-permissions-verify into big-release
Oct 5, 2026
d1d4296
fix(export): limit the true peak of lossy exports
Oct 5, 2026
65c8281
Merge feat/0210-export-clipping-verify into big-release
Oct 5, 2026
c0bacca
fix(takes): keep a take's sound when camera parts are missing
Oct 6, 2026
75e6b09
fix(video): place the camera by its first frame's capture time
Oct 6, 2026
ebf3e0c
fix(video): render the take's own span, with each frame at its time
Oct 6, 2026
610cca8
test(video): measure camera to sound sync in the rendered video
Oct 6, 2026
567e37c
Merge feat/0210-video-verify into big-release
Oct 6, 2026
b06f93b
fix(analyze): measure loudness as BS.1770-4 on the whole stereo mix
Oct 6, 2026
1440ef0
Merge feat/0210-loudness-fix into big-release
Oct 6, 2026
da783a3
fix(peaks): build a missing peaks.json on the first request
Oct 6, 2026
3037cfd
fix(player): choose the engine before it starts, never swap it
Oct 6, 2026
9e05a9d
fix(recording): never lose a take to an engine that went away
Oct 6, 2026
09c8bba
fix(player): let played chunks go during playback
Oct 6, 2026
dd9c059
Merge feat/0210-recording-reliability into big-release
Oct 6, 2026
d77a746
feat(eq): per-lane and master EQ in the live audio graph
Oct 6, 2026
b5f48e1
feat(export): render the studio EQ with the live engine's coefficients
Oct 6, 2026
c3c29b1
feat(eq): preview an EQ without saving it
Oct 6, 2026
8451902
Merge feat/0210-eq-engine into big-release
Oct 6, 2026
1843108
feat(eq): EQ tab on every lane and a panel row under it
Oct 6, 2026
2ce2c5c
feat(eq): graphical parametric EQ panel for drums and general lanes
Oct 6, 2026
fe13804
feat(eq): Bass EQ, a pedal-style panel on the shared engine
Oct 6, 2026
ad947ab
feat(eq): Guitar EQ on the pedal panel
Oct 6, 2026
d8693b5
feat(eq): Keys EQ for piano lanes
Oct 6, 2026
727bed2
feat(eq): voice placeholder panel for vocal lanes
Oct 6, 2026
8eada7a
feat(eq): translate the EQ panels and explain them in the Guide
Oct 6, 2026
f8793f0
test(eq): EQ panels, from knob maths to the measured sound
Oct 6, 2026
00bcd25
fix(eq): a spectrum that reads on real stems
Oct 6, 2026
ab0698d
test(eq): the 48 kHz export note shows only when the rates differ
Oct 6, 2026
0844f1b
Merge feat/0210-eq-panels into big-release
Oct 6, 2026
19e26b0
feat(export): master an export to a loudness target under a true-peak…
Oct 6, 2026
dd95de0
fix(export): stop a loudness measurement whose client left
Oct 6, 2026
026963c
feat(master): live master effect after the master EQ
Oct 6, 2026
6ace0a5
feat(master): Master drawer, footer pill and export row
Oct 6, 2026
b6164e7
Merge feat/0210-mastering into big-release
Oct 6, 2026
45e823c
feat(eq): measure a lane's loud passages and fit EQ bands to a target…
Oct 6, 2026
0503cce
feat(api): suggest EQ for a lane and EQ plus a loudness preset for th…
Oct 6, 2026
6999e91
fix(eq): no boost where the content is missing, one shelf of each kind
Oct 6, 2026
ea4c68e
feat(eq): Suggest in every EQ panel and in the Master drawer
Oct 6, 2026
2d3208d
feat(i18n): Suggest EQ strings in all languages and its Guide entries
Oct 6, 2026
ee8c623
test(eq): Suggest from the panel's view, with real answers of the server
Oct 6, 2026
95476a8
test(eq): build the dash check from character codes
Oct 6, 2026
a80212c
Merge feat/0210-suggest-eq into big-release
Oct 6, 2026
06c710d
feat(mixer): EQ tab in the track header, larger header controls
Oct 6, 2026
3519ee3
test(mixer): measure the track header and the EQ tab in it
Oct 6, 2026
5a035e5
chore(license): declare AGPL-3.0-only in the package metadata
Oct 6, 2026
3b2f829
docs(license): state AGPL-3.0-only in the README, CONTRIBUTING and no…
Oct 6, 2026
a75c8dd
build(license): ship the license text in every package and the image
Oct 6, 2026
722fad1
feat(about): name the license and link to the source code
Oct 6, 2026
aa2985d
Merge feat/0210-track-header into big-release
Oct 6, 2026
1af1f04
test(e2e): run the browser suite in parallel shards on separate ports…
Oct 6, 2026
6e97a4e
test: changed-areas helper says which suites a diff needs
Oct 6, 2026
10a316d
Merge feat/0210-test-parallel into big-release
Oct 6, 2026
b3a3d9b
license: replace the Apache-2.0 text with the AGPL-3.0 text
Oct 6, 2026
39eea4b
fix(eq): no click on every EQ knob step
Oct 6, 2026
811f8e1
feat(eq): live spectrum behind the Bass, Guitar and Keys EQ curves
Oct 6, 2026
56b47cb
feat(eq): Drum EQ band list on the left, like the knob panels
Oct 6, 2026
d4d0aa8
feat(mixer): side-rail track header (#776)
Oct 6, 2026
164ffa1
fix(master): four mastering bugs and the drawer layout
Oct 6, 2026
4cbb6bc
feat(library): no Tags section under the collections
Oct 6, 2026
6b4e73a
Merge feat/0210-agpl into big-release
Oct 6, 2026
eae36bc
feat(tracks): audio and video tracks; Record films a video track's take
Oct 6, 2026
fb3b678
feat: Detect lyrics toggle, Practice and Advanced modes, video tracks…
Oct 7, 2026
0dec58a
feat(library): Try again on a failed import; no heart on library cards
Oct 7, 2026
e7a8fe0
fix(recording): place takes recorded with the live master on 12 ms ea…
Oct 7, 2026
ed299e3
fix(guide): show the key tip again; bring stale e2e specs up to date
Oct 7, 2026
44dc9d6
feat(karaoke): Karaoke Mode with its own saved mix per mode and a dra…
Oct 8, 2026
af46c45
feat(karaoke): own transport, no speed box, footer hidden while open
Oct 8, 2026
1e1408d
docs(karaoke): add the Karaoke Mode design hand-off
Oct 8, 2026
f2ae15e
Merge feat/0210-karaoke-mode into big-release
Oct 8, 2026
7cc3fd4
fix(mixer): no "-0.0" in the level readout; take names no longer clip
Oct 8, 2026
e7a5e9d
feat(streamer): Streamer Mode shell, preview and own saved mix (phase 1)
Oct 8, 2026
0917e00
feat(streamer): layer editing, undo and the live Take Timeline (phase 2)
Oct 8, 2026
b712a4b
feat(streamer): real camera and microphone devices, input meter and o…
Oct 8, 2026
9efa13a
feat(streamer): record a take and export it as an MP4 through the ser…
Oct 8, 2026
6504500
feat(streamer): polish, image layers and the bug and performance fix …
Oct 9, 2026
c89e1f4
Merge feat/0210-streaming-mode into big-release
Oct 9, 2026
e6c6007
feat(streamer): "I play" stem choice and a backing track without that…
Oct 9, 2026
b771233
Merge feat/0210-streamer-backing into big-release
Oct 9, 2026
58fd58c
fix(streamer): record the chosen interface input, a live lane for the…
Oct 9, 2026
324f8dc
Merge fix/0210-streamer-input-lane into big-release
Oct 9, 2026
3b101bb
feat(export): GPU video encoder with automatic CPU fallback
Oct 9, 2026
43ba27f
feat(i18n): Keys and Voice in the Streamer "I play" list; Karaoke's O…
Oct 9, 2026
7b86670
Merge feat/0210-gpu-encoder into big-release
Oct 9, 2026
4817e61
Merge wording change into big-release
Oct 9, 2026
6665a21
feat(stems): each mode keeps its own stem choice; exports rebuild the…
Oct 9, 2026
ae0025a
Merge big-release into feat/0210-mode-stems
Oct 9, 2026
a088994
feat(streamer): remove 4K output; Streamer exports at 720p or 1080p
Oct 10, 2026
10faa08
Merge feat/0210-no-4k into big-release
Oct 10, 2026
0741f69
fix(security): cross-site guard, safer auto-delete and a registry tha…
Oct 10, 2026
2304edf
Merge fix/0210-hardening into big-release
Oct 10, 2026
de65527
feat(modes): remove the Streaming placeholder; Streamer is now called…
Oct 10, 2026
4f42f58
Merge feat/0210-rename-performance into big-release
Oct 10, 2026
82855ac
fix(playback): free the audio engine on reload, resume after a stem c…
Oct 10, 2026
a1f170a
Merge fix/0210-pass1 into big-release
Oct 10, 2026
4c611c6
fix(performance): the take is audible after recording; the Video lane…
Oct 10, 2026
fe0f985
Merge fix/0210-take-playback into big-release
Oct 10, 2026
6318164
fix(performance): the view fits the window without scrolling
Oct 10, 2026
86f4e5f
Merge feat/0210-performance-fit into big-release
Oct 10, 2026
834d147
feat(settings): redesign the Settings dialog
Oct 10, 2026
770b583
Merge feat/0210-settings-redesign into big-release
Oct 10, 2026
736da96
fix(performance): remove the Live Controls tab and the metronome clic…
Oct 10, 2026
f3262b3
Merge feat/0210-no-live-controls into big-release
Oct 10, 2026
e465945
feat(performance): Track Info groups the title, album art and wavefor…
Oct 10, 2026
bd4e3dd
Merge feat/0210-track-info into big-release
Oct 10, 2026
c7ed9e2
feat(performance): review window plays the recorded take; Karaoke and…
Oct 11, 2026
1fd699b
Merge feat/0210-review-preview into big-release
Oct 11, 2026
ef16c2c
test(e2e): bring the browser suite up to date; fix a take-recorder ra…
Oct 11, 2026
c41b5e0
Merge fix/0210-e2e into big-release
Oct 11, 2026
27c6c97
ci: harden the CI workflow and record four unreachable uv.lock adviso…
Oct 11, 2026
bc75863
Merge fix/0210-trivy into big-release
Oct 11, 2026
4ac8965
fix(ci): ffmpeg 5.1 loudness, filmstrip length on newer ffmpeg, ffmpe…
Oct 11, 2026
e467a0c
Merge fix/0210-ci into big-release
Oct 11, 2026
1ccb367
feat(guide): cover every Practice and Advanced control, fix the Setti…
Oct 11, 2026
aa99794
Merge feat/0210-guide-audit into big-release
Oct 11, 2026
d0651ac
test: cover the mix, the workers, stems edges, startup and library mo…
Oct 12, 2026
996d8c4
Merge test/0210-coverage into big-release
Oct 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 19 additions & 10 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@ on:
release:
types: [published]

# No job writes to the repository, so the token gets nothing. Checkout of this
# public repository and the artifact upload work without it, as in the other
# workflows.
permissions: {}

env:
UV_LINK_MODE: copy
# Version is git-derived (hatch-vcs). CI's clone is shallow/tagless, which
Expand All @@ -25,7 +30,7 @@ jobs:
container:
image: ghcr.io/astral-sh/uv:python3.12-bookworm-slim
steps:
- uses: actions/checkout@v7.0.1
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
# diffq (a mandatory transitive dependency of audio-separator, #275) has
# no prebuilt wheel for Python 3.11+ on Linux -- its last release only
# ever shipped cp310 wheels -- so uv sync must compile it from source.
Expand All @@ -43,7 +48,7 @@ jobs:
container:
image: ghcr.io/astral-sh/uv:python3.12-bookworm-slim
steps:
- uses: actions/checkout@v7.0.1
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
# build-essential: see the matching comment in the lint job above.
- run: apt-get update && apt-get install -y --no-install-recommends ffmpeg build-essential
- run: uv sync --frozen --all-extras
Expand All @@ -54,7 +59,7 @@ jobs:
container:
image: node:20-alpine
steps:
- uses: actions/checkout@v7.0.1
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- run: for f in static/js/*.js; do node --check "$f"; done
- run: for f in tests/js/*.test.mjs; do node "$f"; done

Expand All @@ -77,8 +82,8 @@ jobs:
matrix:
shard: [1, 2, 3]
steps:
- uses: actions/checkout@v7.0.1
- uses: actions/setup-node@v7.0.0
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: "20"
cache: npm
Expand All @@ -87,9 +92,13 @@ jobs:
- run: uv sync --frozen --all-extras
- run: npm ci
- run: npx playwright install --with-deps chromium
# The backend under test is real, and finishing a recorded take renders
# it with ffmpeg (app/pipeline/take_render.py). The runner image has no
# ffmpeg, so without this the take specs get a 500 and time out.
- run: sudo apt-get update && sudo apt-get install -y --no-install-recommends ffmpeg
- run: npx playwright test --shard=${{ matrix.shard }}/3
- if: failure()
uses: actions/upload-artifact@v7.0.1
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
# Per shard: a second upload under the same name fails the job.
name: playwright-report-${{ matrix.shard }}
Expand All @@ -104,7 +113,7 @@ jobs:
linux-installer:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7.0.1
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- run: bash -n packaging/linux/install.sh
- run: sudo apt-get update && sudo apt-get install -y --no-install-recommends shellcheck desktop-file-utils
- run: shellcheck -S warning packaging/linux/install.sh
Expand All @@ -115,7 +124,7 @@ jobs:
container:
image: ghcr.io/astral-sh/uv:python3.12-bookworm-slim
steps:
- uses: actions/checkout@v7.0.1
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- run: uv tool install bandit
- run: uv tool run bandit -r app/ -ll # fail on medium+ severity

Expand All @@ -124,7 +133,7 @@ jobs:
container:
image: ghcr.io/astral-sh/uv:python3.12-bookworm-slim
steps:
- uses: actions/checkout@v7.0.1
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- run: uv tool install pip-audit
- run: uv pip compile pyproject.toml -o /tmp/requirements.txt
# Ignored CVEs (review when upgrading torch or demucs):
Expand Down Expand Up @@ -185,7 +194,7 @@ jobs:
trivy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7.0.1
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
# Scans the source tree for: known CVEs in deps, leaked secrets,
# and Dockerfile / compose misconfigurations. Skips .venv (it can
# be left over from earlier steps in the shared workspace; trivy
Expand Down
35 changes: 35 additions & 0 deletions .trivyignore
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,38 @@ CVE-2026-63374
# bump the next time the lock moves for another reason, and drop these then.
CVE-2026-97687
CVE-2026-97689

# CVE-2026-104851 (added 2026-10-11): fsspec runs arbitrary code from a
# crafted reference document. Fixed in fsspec 2026.6.0; the lock pins 2026.3.0.
#
# StemDeck never opens a reference:// filesystem. fsspec is here transitively,
# through torch and huggingface-hub. huggingface-hub uses it only in
# HfFileSystem, and StemDeck downloads models with hf_hub_download (see
# allin1_infer/models/loaders.py), which does not go through fsspec.
#
# Deferred on purpose: any uv.lock change sends every existing Windows and
# Linux desktop install to a full download instead of an in-app update (see
# the desktop-update-gate skill). Take the bump in a release that already
# requires a reinstall, and drop this entry then.
CVE-2026-104851

# CVE-2026-106439, CVE-2026-106441 and CVE-2026-106442 (added 2026-10-11):
# hydra-core runs arbitrary code from an attacker-controlled config, through
# the execution policy, the logging configuration and a bypass of the
# instantiate target blocklist. Fixed in hydra-core 1.3.7 (106439) and 1.3.6
# (106441, 106442); the lock pins 1.3.5.
#
# StemDeck never hands hydra a config it did not ship. hydra-core is here
# transitively: allin1_infer/config.py imports only ConfigStore, and the
# allin1 model config comes from the fixed Hugging Face checkpoint through
# OmegaConf.create, not hydra. dora uses hydra only for demucs/train.py,
# which StemDeck never runs. No runtime path calls hydra.utils.instantiate
# or hydra.main.
#
# Deferred on purpose for the same reason as CVE-2026-104851: any uv.lock
# change sends every existing Windows and Linux desktop install to a full
# download. Take the bump in a release that already requires a reinstall, and
# drop these entries then.
CVE-2026-106439
CVE-2026-106441
CVE-2026-106442
5 changes: 3 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,9 @@ New API endpoints and pipeline stages should come with tests under `tests/`. The

## License

StemDeck is licensed under the [Apache License 2.0](LICENSE). By contributing, you agree that your
contributions are licensed under the same terms.
StemDeck is licensed under the [GNU Affero General Public License v3.0 only](LICENSE)
(AGPL-3.0-only). Contributions are accepted under the same license: by contributing, you agree
that your contributions are licensed under AGPL-3.0-only.

## Questions

Expand Down
Loading
Loading