TypeScript library to connect to Denon DJ hardware via the StageLinq protocol.
npm install stagelinqimport { StageLinq } from 'stagelinq';
const stagelinq = new StageLinq({ downloadDbSources: true });
stagelinq.devices.on('trackLoaded', (status) => {
console.log(`${status.title} - ${status.artist} loaded on deck ${status.deck}`);
});
stagelinq.devices.on('nowPlaying', (status) => {
console.log(`Now Playing: ${status.title} - ${status.artist}`);
});
await stagelinq.connect();| Feature | Go | Python | TS v2 |
|---|---|---|---|
| Device Discovery | ✅ | ✅ | ✅ |
| StateMap Service | ✅ | ✅ | ✅ |
| BeatInfo Service | ✅ | ❌ | ✅ |
| FileTransfer Service | ✅ | ❌ | ✅ |
| TimeSync Service | ✅ | ❌ | ✅ |
| Broadcast Service | ✅ | ❌ | ✅ |
| EAAS (gRPC library) | ✅ | ❌ | ✅ |
| EAAS (HTTP files) | ✅ | ❌ | ✅ |
| Windows Support | ✅ | ✅ | ✅ |
| macOS Support | ✅ | ❌ | ✅ |
| Linux Support | ✅ | ✅ | ✅ |
| Multi-interface discovery | ✅ | ✅ | ✅ |
| Database download | ✅ | ❌ | ✅ |
| Track path resolution | ❌ | ❌ | ✅ |
| Instance-based API | ✅ | ✅ | ✅ |
| Static class API | ❌ | ❌ | ✅ |
| CLI demo tools | ✅ | ✅ | ✅ |
| Wireshark dissector | ❌ | ✅ | ✅ |
| Unit tests | ✅ | ✅ | ✅ |
Go = go-stagelinq, Python = PyStageLinQ
- Denon SC6000 / SC6000M
- Denon SC5000 / SC5000M
- Denon Prime 4 / Prime 2 / Prime Go
- Denon X1850 / X1800 mixers
- Denon LC6000
import { StageLinq } from 'stagelinq';
const stagelinq = new StageLinq({
downloadDbSources: true,
maxRetries: 3,
});
// Device events
stagelinq.devices.on('ready', (info) => {
console.log(`Connected to ${info.software.name}`);
});
stagelinq.devices.on('trackLoaded', (status) => {
console.log(`Loaded: ${status.title} on deck ${status.deck}`);
});
stagelinq.devices.on('nowPlaying', (status) => {
console.log(`Playing: ${status.title}`);
});
// Database events
stagelinq.devices.on('dbDownloaded', (sourceId, dbPath) => {
console.log(`Database saved to ${dbPath}`);
});
await stagelinq.connect();
// Later...
await stagelinq.disconnect();import { StageLinq } from 'stagelinq';
StageLinq.options = { downloadDbSources: true };
StageLinq.devices.on('nowPlaying', (status) => {
console.log(`Playing: ${status.title}`);
});
await StageLinq.connect();// Track events
stagelinq.devices.on('trackLoaded', (status: PlayerStatus) => {});
stagelinq.devices.on('nowPlaying', (status: PlayerStatus) => {});
// Device events
stagelinq.devices.on('ready', (info: ConnectionInfo) => {});
stagelinq.devices.on('deviceConnected', (info: ConnectionInfo) => {});
// State events (200+ states per deck)
stagelinq.devices.on('stateChanged', (state: StateData) => {});
// Beat events (real-time BPM, beat position)
stagelinq.devices.on('beatMessage', (data: BeatData) => {});
// Database events
stagelinq.devices.on('dbDownloaded', (sourceId, dbPath) => {});The library tracks 200+ state values per deck:
| Category | Example States |
|---|---|
| Track | ArtistName, SongName, TrackNetworkPath, TrackLength |
| Playback | Play, PlayState, CurrentBPM, Speed |
| Sync | SyncMode, DeckIsMaster, MasterTempo |
| Loop | LoopEnableState, CurrentLoopSizeInBeats |
| Mixer | ExternalMixerVolume, CrossfaderPosition |
See the cli/ folder for complete examples:
cli/index.ts- Full example with all eventscli/discover.ts- Network discovery democli/beatinfo.ts- Real-time beat information
Run examples:
# Main CLI
npx ts-node cli/index.ts
# Discovery
npx ts-node cli/discover.ts
# Beat info
npx ts-node cli/beatinfo.tsA Lua dissector for Wireshark is included for protocol debugging:
# Copy to Wireshark plugins folder
cp tools/wireshark/stagelinq.lua ~/.local/lib/wireshark/plugins/npm test # Run tests
npm run test:watch # Watch mode
npm run test:coverage # Coverage report205 tests across 14 test files.
- Events Reference - All events and state data
- Protocol Specification - StageLinq protocol details
- StateMap - Track state, playback, faders
- BeatInfo - Real-time beat and tempo
- FileTransfer - Database and file downloads
- EAAS - Engine Library gRPC/HTTP access
- Connection Health - Auto-reconnection
- CHANGELOG - Version history
- Chris Le (@chrisle) - Maintainer
- Martijn Reuvers - Core development
- MarByteBeep (@MarByteBeep) - Original TypeScript implementation
- honusz - BeatInfo, TimeSync, Broadcast services
- Kalle Kirjalainen - Contributions
- docBliny - Contributions
This library incorporates code and ideas from other StageLinq implementations:
- go-stagelinq by Carl Kittelberger (icedream) - EAAS, Windows fix, token utilities
- PyStageLinQ by Jaxc - Wireshark dissector, protocol documentation
- kyleawayan/StageLinq by Kyle Awayan - Track path resolution fixes
- prolink-connect — Pioneer Pro DJ Link integration
- rekordbox-connect — Rekordbox database integration
- serato-connect — Serato DJ integration
These libraries power Now Playing — a real-time track display app for DJs and streamers.
MIT