📱 Best on a desktop or laptop — there you get stem separation, more memory headroom and the full side-by-side mixer. Everything on this phone still works.
Deck A
A ⟷ B
Deck B
Beatmatch — drag a lane to move that deck; on release it snaps into the other deck's grid
Settings
Audio outputs
The one-time mic permission only unlocks device labels — the microphone is never used or recorded.
Recording
The container/codec used when you record the master mix. Only formats your browser can record are listed.
Stem separation
Mobile devices skip stem separation by default — the WebGPU model routinely exhausts phone memory and crashes the tab. You can still mix, cue, EQ and beatmatch; per-stem faders and vocal/instrumental mashups need separation. Enable this to force it (may crash low-memory devices). Applies to newly added tracks.
Offline
Installed, Decks opens and replays your saved library with no connection. Separating new tracks also needs the separation model + WebGPU runtime — on desktop this downloads automatically once you install the app; on mobile it's optional (separation is off by default there). Fetch or remove it here anytime.
Keyboard
Click Learn on a control, then press a key to bind it. Shortcuts fire whenever you're not typing in a field; Esc and Tab stay reserved for the interface.
MIDI controller
not connected
Load a preset for a quick start, or click Learn on a control and move a knob / press a pad to bind it.
Two gestures worth knowing: double-click a slider/knob/readout to reset it, and hold Shift while setting a cue/loop/jump to invert Quantize for that action.
Top command bar
☰ LibraryOpen the track library.
⇤ StartSend both decks toward the start, preserving their offset (beat-locked decks stay locked).
« ‹ › »Rewind / fast-forward both decks in sync. « » fast, ‹ › slow fine-scrub. Hold to scrub.
▶ Play bothStart / stop both decks together.
⏺ RecRecord the master mix to a file. Toggles to ⏹ Stop.
Master · LIMMaster output level → limiter. LIM lights when peaks are being caught — back off.
▚ Skin · ◐ Mode · ⧉ LayoutCycle skin (techno / VHS / flyer), theme (auto / light / dark), and layout (Perform deck-dominant / Control library-dominant — auto-suggested when a controller connects).
⛶ FullFullscreen — immersive view, drops the browser chrome, keeps the mixer. Shortcut F; Esc exits.
Deck — transport
⏮Jump this deck to the start of the track.
▶ / ⏸Play / pause this deck.
CUETemp cue — works like a hot cue (one slot, accent flag on the waveform). Unset → press sets it (even while playing); set → press jumps there (keeps playing, or previews when paused). Right-click clears.
⇆ syncBeatmatch to the other deck — match tempo (nearest ½/1/2× octave) + phase-align downbeats.
🎧Pre-listen (cue) this deck in the headphone output.
⟨§ / §⟩Jump to the previous / next detected song section.
↺Reset the deck (tempo, key, keylock, EQ, filter, gain, stems) — keeps cues, loop, FX & position.
WaveformClick to seek within the visible window.
Section blocksSong-structure timeline below the pads — click a block to jump (quantized); right-click to assign it to the next free hot cue.
Deck — tempo, key & channel
tempo0.5×–2×. Keylock off = varispeed; on = time-stretch (pitch held). Dbl-click → 1×.
− / +Momentary tempo bend (hold to repeat).
BPM ▾Double-click to type an exact BPM. The ▾ caret opens beatgrid tools: ⇤ set downbeat, ◄► nudge, ½/×2 octave fix, tap tempo — persisted to the library track.
key · ▾Current key / Camelot. Dbl-click → reset transpose. The ▾ caret opens a 24-code Camelot picker to correct a mis-detected key (persists to the track, re-ranks the match-sort).
♭ / ♯ · ⇅ keyTranspose ±1 semitone (±6); ⇅ key transposes to match the other deck harmonically.
CUE 1–8Empty: set a hot cue at the playhead. Set: jump/preview; right-click clears. Persist with the library track. Standard CDJ behavior.
LOOP 1/2/4/8Toggle a beat-loop of that many beats. IN/OUT set a manual loop. SLIP: when on, exiting a loop jumps to where the track would be (as if it never looped).
SAVED 1–4Saved loop slots. With a loop active, press an empty slot to save it; a lit slot holds a loop — press to recall (jump + re-loop), press again to exit, right-click to clear. A slot turns accent-colored while its loop plays. Persist with the library track.
IN / OUTManual loop — IN arms the start, OUT closes & loops (or exits).
ROLL 1/8–1Momentary loop-roll — hold to roll, release catches up.
JUMP ⟵4 ⟵1 1⟶ 4⟶Jump backward / forward by beats.
FX selector + pads + depthSend FX (wet mixed in parallel). Click the FX label to cycle echo / reverb / flanger / phaser; the 4 pads relabel per effect. Tap a pad to engage, tap the active one to turn off. Echo re-times to the beat. The depth slider at the end sets wet/dry (live); dbl-click → 0.5.
INSERT selector + pads + depthInsert FX (run in the dry path, not a send — can be on together with a send FX). Cycle sweep / gate / crush; pads pick the preset. Tap to engage, tap again for dry. Sweep & gate follow the beat. The depth slider sets dry/wet (turn down to soften); dbl-click → full wet.
Beatmatch strip
Drag a laneMove that deck; synced grids line up under the center playhead. With scratch off (default) it's a silent reposition; with scratch on it's an audible platter scratch (reverse/forward). Each lane shows a stacked frequency-colored waveform (low/mid/high) — read both tracks' structure while aligning.
ScrollZoom the strip's time window (up = tighter/finer, down = more context). Nudge a deck with its − / + bend buttons (Z/X · , /.) or a MIDI jog wheel (Deck A/B jog wheel).
scratchWhether a lane drag is audible: off (default) = silent reposition scrub; on = scratch like a platter. Independent of snap.
snapOn release, snap the dragged deck onto the grid, aligned to the other deck. Works with scratch on or off.
bar / beatSnap unit: bar = downbeats (phrase-safe); beat = nearest beat (finer).
rememberedscratch, snap and bar/beat all persist across sessions.
Quantize & the Shift modifier
Quantize(Mix → Timing) Snap cues / loops / jumps to the beatgrid so they land on-beat. On by default.
Shift + actionForce the opposite of Quantize for that press: on → exact playhead, off → snap to beat.
Rule of thumbOn-beat to keep time; exact to mark a specific sound (off-grid stab, riser, phrase head).
Library
+ Add tracksSeparate, analyze & cache audio files for reuse — or drag audio files onto the library to import.
drag a rowDrag a library row onto a deck to load it (both layouts — in Perform the library fades aside as you drag so the decks become drop targets).
▶ pre-listenAudition a track in the headphone cue without loading a deck (needs a cue device). Tap again to stop.
→ A / → BLoad onto Deck A / B. A still-separating track loads instantly as its raw mix and the stems + beatgrid swap in automatically when separation finishes (same playhead). Audio stays smooth; the playhead may briefly stutter while the model runs (cosmetic — it's using the GPU). With a deck loaded, the list re-ranks by mixability.
StorageHeader shows cached MB + ~tracks left. When low, a banner offers “⌫ oldest” and “Keep cached” (persist).
✎Open the track editor.
nameDouble-click to rename.
✕Remove from the library.
Track editor (✎)
Drag edges / ▸ ◂Trim the in/out points; drag the fade handles for fade-in/out.
▶ Preview · click · ⏮Loop & audition (follows changes live); click the waveform to scrub; ⏮ restarts.
stem rowsInclude toggle + level per stem, baked in — turn a stem off to drop it (e.g. instrumental).
Save as new / OverwriteChild copy (default, original kept) or replace the original (two-click confirm).
Mix & Settings
🎤 A ▸ B / B ▸ AMashup — one deck's vocals over the other's bed. Sync + Play both to lock.
pitch-lock syncMake ⇆ sync match tempo without changing pitch.
Force on mobileExtract stems on mobile anyway (may crash low-memory devices).
⤓ Download for offlineCaches the separation model for offline separation (auto on desktop once installed; opt-in on mobile). The app + your saved library already work offline.
Keyboard / MIDILearn-then-bind: click Learn, then press a key / move a knob / hit a pad.
Edit — track
Loading track…
Drag the edges to trim and the fade handles (▸ ◂) for fades. Preview loops the region; click the waveform to scrub the playhead.
loops the trimmed region · click to scrub · stem levels update live
Trim in 0:00Trim out 0:00Length 0:00Fade in 0.0sFade out 0.0s