Every stream event.
One socket.
Chat, follows, subs, tips and raids from Twitch, YouTube and X, normalized into one format and delivered over a single WebSocket.
Get an API key
$ npm i @signal-kit/client- Twitch
- YouTube
- X
Listen in a few lines
Create a key, then handle events by kind.
index.ts
1import { SignalKit } from "@signal-kit/client";23const kit = new SignalKit({ token: process.env.SIGNAL_KIT_KEY });45kit.on("tip", (e) => console.log(`${e.actor?.name} sent ${e.amount?.display}`));6kit.on("chat.message", (e) => console.log(e.actor?.name, e.message));7kit.connect();
OutputListening
mira.codes sent $20.00
pixelpilot sent 500 bits
devon_k does the SDK work in Bun?
One shape for every platform
A Twitch cheer and a YouTube Super Chat are both a tip with an amount. Write the handler once.
Twitch cheer
{"kind": "tip","platform": "twitch","actor": { "name": "pixelpilot" },"message": "the websocket is SO clean","amount": {"value": 500,"currency": "BITS","display": "500 bits"}}
YouTube Super Chat
{"kind": "tip","platform": "youtube","actor": { "name": "mira.codes" },"message": "Take my money.","amount": {"value": 20,"currency": "USD","display": "$20.00"}}
- Replay on reconnectEvents are kept for 24 hours. When the SDK reconnects it replays what you missed, without duplicates.
- Push, not pollingTwitch arrives through EventSub conduits, YouTube chat through the streamList gRPC push API, and X through the X Activity API.
- Every channel you runConnect several accounts per platform. Each event says which channel it came from.
- A CLI for the terminalThe same events, streamed to your terminal while you build.
Free. Sign in to start.
Use any account you stream on. Connect the others afterwards.