No description
  • TypeScript 61.8%
  • JavaScript 28.3%
  • HTML 9.9%
Find a file
2026-08-15 10:12:36 -07:00
com.redlintu16.crosssound.sdPlugin First push of the Stream Deck plugin 2026-08-15 10:12:36 -07:00
scripts First push of the Stream Deck plugin 2026-08-15 10:12:36 -07:00
src First push of the Stream Deck plugin 2026-08-15 10:12:36 -07:00
.gitignore First push of the Stream Deck plugin 2026-08-15 10:12:36 -07:00
package-lock.json First push of the Stream Deck plugin 2026-08-15 10:12:36 -07:00
package.json First push of the Stream Deck plugin 2026-08-15 10:12:36 -07:00
README.md First push of the Stream Deck plugin 2026-08-15 10:12:36 -07:00
rollup.config.mjs First push of the Stream Deck plugin 2026-08-15 10:12:36 -07:00
tsconfig.json First push of the Stream Deck plugin 2026-08-15 10:12:36 -07:00

CrossSound — Elgato Stream Deck plugin

Control the CrossSound desktop app from a Stream Deck (and Stream Deck +):

Control What it does
Play / Pause button Toggles playback (icon reflects playing state)
Next Track button Skips forward
Previous Track button Skips back
Like / Unlike button Likes/unlikes the current track (icon reflects liked state)
Now Playing dial (SD+) Touch strip shows album art · progress bar · countdown; the dial turns volume; press the dial or tap the strip to play/pause

How it works

CrossSound's Electron main process runs a tiny dependency-free HTTP bridge on http://127.0.0.1:52124 (otherservices/streamdeck.js):

  • GET /state → the current now-playing snapshot (title, artist, artwork, position, duration, isPlaying, isLiked, volume).
  • POST /command { "action": "playpause" | "next" | "prev" | "like" | "volume", ... } → forwarded to the renderer over the existing crosssound-media-action IPC channel (the same one hotkeys / tray / Xbox Game Bar already use).

The plugin polls /state once a second and interpolates the position locally, so the countdown and progress bar tick smoothly. CrossSound must be running for the plugin to connect (it shows "CrossSound offline" otherwise).

Prerequisites

  • Node.js 20+
  • Stream Deck software 6.5+ (6.5 is the minimum for encoder/touch-strip layouts)
  • Elgato CLI: npm install -g @elgato/cli

Build & install

cd streamdeck-plugin
npm install
npm run build          # generates placeholder icons + bundles src → .sdPlugin/bin/plugin.js
streamdeck link com.redlintu16.crosssound.sdPlugin
streamdeck restart com.redlintu16.crosssound

During development: npm run watch rebuilds and restarts the plugin on save.

Then, in the SCSC repo, rebuild the desktop app so the bridge is included and launch it:

cd ..
npm run build && npm run vmp-sign && electron .

Drag the CrossSound actions onto your Stream Deck from the CrossSound category.

Notes

  • Icons are solid-colour placeholders generated by scripts/gen-icons.mjs. Replace them with real artwork by dropping PNGs at the same imgs/... paths (keep the @2x variants: action-list icons 20/40px, key images 72/144px).
  • The Now Playing touch-strip action requires a Stream Deck +. The four buttons work on any Stream Deck.
  • Bridge port is 52124 (the OAuth callback server uses 52123). Change it in both otherservices/streamdeck.js and src/crosssound.ts if it clashes.
  • Volume step is 0.02 per tick — tweak VOLUME_STEP in src/actions/now-playing.ts.