TypeScript library to connect to Denon DJ hardware via the StageLinq protocol.
npm install stagelinq
import { 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
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 informationRun examples:
# Main CLI
npx ts-node cli/index.ts
# Discovery
npx ts-node cli/discover.ts
# Beat info
npx ts-node cli/beatinfo.ts
A 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 report
205 tests across 14 test files.
This library incorporates code and ideas from other StageLinq implementations:
These libraries power Now Playing — a real-time track display app for DJs and streamers.
MIT
$ claude mcp add StageLinq \
-- python -m otcore.mcp_server <graph>