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 | This repo |
|---|---|---|---|
| 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
- alphatheta-connect β Pioneer Pro DJ Link integration
- metadata-connect β Audio metadata extraction with partial file reads
- 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