A lightweight, browser‑only DJ toolkit that lives entirely in your local machine. No server, no installation—just open the HTML file and you’re ready to spin.
What is it?
A lightweight, browser‑only DJ toolkit that lives entirely in your local machine. No server, no installation—just open the HTML file and you’re ready to spin.
| Feature | What It Does |
|---|---|
| Load Local Audio | Browse and select common audio files (.mp3, .wav, .flac, etc.) from your computer for instant playback. |
| WebGL Visuals | GPU-accelerated Waveforms, VU Meters, and Master Spectrum for 60fps professional feedback. |
| Stutter-Cueing | Audio feedback with 50ms "chattering" bursts for precise CUE point selection during scrubbing. |
| Momentary Pitch Bend | Professional +/- nudge buttons for temporary playback rate adjustments. |
| Settings Overlay | Slide-over modal for live-tuning (Tempo Range, Crossfader Curve, UI Theme). |
| localStorage Persistence | All user settings and session preferences now persist across browser restarts. |
| MP3 Metadata Display | Shows track title, artist, and album art from the file's ID3 tags. |
| Deck Controls | Play, pause, stop, loop (repeat), and crossfade between tracks. |
| Export Settings | Save your current mix state as a JSON file; reload later to pick up where you left off. |
The application is built using a modular ES6 architecture, leveraging a centralized State Management pattern to decouple the UI from the Audio Engine.
js/state.js: The single source of truth. Manages all application state (decks, mixer, metadata) and handles persistence/session logic.js/audio-engine.js: Manages the Web Audio API graph. Subscribes to the state to update audio nodes (gain, playback rate, filters) in real-time.js/ui.js: Handles all DOM interactions, canvas rendering (waveforms, VU meters), and event listeners. Publishes user actions to the State Manager.js/main.js: Coordinates the initialization and bootstrapping of the modules.
-
Initialize
- Opening
index.htmlbootstraps the modules. TheAudioEngineinitializes theAudioContextonly after the first user interaction.
- Opening
-
Add Tracks
- Choose files via "Browse" or drag-and-drop into a deck. The
UIEnginereads metadata viajsmediatagsand triggers theAudioEngineto decode the buffer.
- Choose files via "Browse" or drag-and-drop into a deck. The
-
Mix & Play
- Actions like Play, Loop, and Volume changes are sent to the
StateManager. All components subscribe to these changes, ensuring the UI and Audio remain perfectly synced.
- Actions like Play, Loop, and Volume changes are sent to the
-
Save Your Session
- "Export" captures the current
StateManagerstate into a JSON file for later "Import".
- "Export" captures the current
- Modular vanilla JS – No frameworks or build steps; uses native ES6 modules.
- Advanced State Management – Uses a reactive Pub/Sub architecture for robust, scalable feature development.
- WebGL 2.0 Rendering – High-performance GPU-accelerated rendering for all visual components.
- Zero-Allocation Pipeline – Optimized 60fps loops with pre-allocated buffers to prevent GC jank.
- Web Audio API – Professional-grade audio processing, analysis, and stutter-cueing.
- Responsive Design – Premium glassmorphism aesthetic tailored for desktop and mobile.
| Step | Action |
|---|---|
| 1 | Double‑click index.html. |
| 2 | Click “Browse” on each deck to select an audio file. |
| 3 | Hit Play. |
| 4 | Adjust volumes, tempo, and use the crossfader to mix! |
- 🎛️ 3-Band EQ: Dedicated High, Mid, and Low filters per channel.
- 🎶 Playlist Manager: Persistent queue with drag-and-drop support.
- 🎹 Key-Lock (Master Tempo): Maintain musical key during tempo adjustments.
- 🔊 Built-in Effects: Reverb, Delay, and Low-pass filters.
- 📱 Mobile UI Phase 2: Touch-optimized jog wheels and adaptive layouts.
- 🎹 MIDI Controller Support: Universal mapping for physical DJ hardware.
Feel free to fork the repo, tweak the CSS, or add your own features—DJay.ca MixKit (WEB) is designed for easy extension.
Happy mixing! 🎛️