An unofficial SDK for Elgato's Wave Link (v2 — targets Wave Link 3.x)
This package provides utilities to manipulate and read the Wave Link application from your own codebase.
Having reverse engineered the Wave Link plugin for Elgato's StreamDeck, I was able to create an SDK for communicating with Wave Link's WebSocket RPC.
Upgrading from v1? See UPGRADE.md for a full before/after migration guide.
npm install @darrellvs/node-wave-link-sdkyarn add @darrellvs/node-wave-link-sdkpnpm add @darrellvs/node-wave-link-sdk- Auto port discovery — reads Wave Link's
ws-info.jsonat startup; falls back to port scanning if unavailable - Channels — read and set master level, mute, per-mix send levels, and effects on any software mixer channel
- Mixes — N named mixes (e.g. "Personal Mix", "Stream Mix") replacing the old hardcoded local/stream split
- Input devices — access physical Wave microphone hardware controls (gain, mic/PC blend)
- Output devices — read and change output device assignments and the main output selection
- Level meters — opt-in push updates for VU meters (per channel or per mix)
- Focused app routing — opt-in push updates for the OS-focused application; route it to any channel
- Fully typed — all data types exported from the package root
import { WaveLinkController } from '@darrellvs/node-wave-link-sdk';
const sdk = new WaveLinkController();
sdk.on('ready', () => {
const channels = sdk.getChannels();
console.log('Channels:', channels.map(c => c.name));
const mixes = sdk.getMixes();
console.log('Mixes:', mixes.map(m => m.name));
});
sdk.on('disconnected', () => console.log('Wave Link disconnected'));
sdk.connect();All communication is bi-directional. Listen for changes on the root controller:
sdk.on('channelChanged', (id, _mixIds, changedProperties) => {
const channel = sdk.getChannelById(id);
if (changedProperties.includes('level')) {
console.log(`${channel.name} level: ${channel.level}`);
}
});
sdk.on('mixChanged', (id) => {
const mix = sdk.getMixById(id);
console.log(`${mix.name} — level: ${mix.level}, muted: ${mix.isMuted}`);
});More extensive examples available here.
As long as Elgato doesn't break anything.
Minor issues may be patched, major feature requests may or may not be implemented.
Feel free to open a PR adding your own contributions!