signal kit

Docs

Build with Twitch events.

The relay exposes a single authenticated WebSocket. Messages are JSON, the event payload is the raw Twitch EventSub event, and the message type is the EventSub subscription type.

Quick start

Two ways to connect.

Browser overlay

vanilla JS
overlay.html
<script src="/twe-client.js"></script>
<script>
  const events = new SignalKitClient({
    url: "wss://signal.ryan.ceo/ws",
    token: "sk_live_...",
  });

  events.on("channel.cheer", ({ event }) => {
    document.body.dataset.bits = event.bits;
  });

  events.connect();
</script>

Node / Bun

TypeScript
bot.ts
import { SignalKit } from "@signal-kit/client";

const events = new SignalKit({
  url: "wss://signal.ryan.ceo/ws",
  token: process.env.SIGNAL_KIT_TOKEN!,
});

events.on("*", (payload) => console.log(payload));
events.connect();

Message shape

One envelope, one event.

The relay never reshapes Twitch payloads. The event field is exactly what Twitch sends. Use type to route, ignore everything you don't care about.

message.json
{
  "type": "channel.cheer",
  "subscription": {
    "id": "...",
    "type": "channel.cheer",
    "version": "1"
  },
  "event": {
    "user_id": "1234",
    "user_name": "viewer",
    "broadcaster_user_id": "5678",
    "bits": 100,
    "message": "PogChamp",
    "is_anonymous": false
  },
  "receivedAt": "2026-05-15T00:00:00.000Z"
}

Event catalog

Everything Signal Kit subscribes to.

Subscriptions are created when the granted Twitch scopes cover them. Anything missing a scope appears in the dashboard with a hint.

Channel Updatev1

channel.update

Title, category, language, or mature flag changed.

Stream Onlinev1

stream.online

The channel goes live.

Stream Offlinev1

stream.offline

The channel goes offline.

Followv2

channel.follow

A viewer follows the channel.

Subscribev1

channel.subscribe

A viewer subscribes.

Subscription Endv1

channel.subscription.end

A subscription ends.

Gift Subv1

channel.subscription.gift

A viewer gifts one or more subscriptions.

Resub Messagev1

channel.subscription.message

A viewer sends a resubscription message.

Cheerv1

channel.cheer

A viewer cheers Bits.

Incoming Raidv1

channel.raid

Another broadcaster raids this channel.

Reward Redemption Addv1

channel.channel_points_custom_reward_redemption.add

A channel points reward is redeemed.

Reward Redemption Updatev1

channel.channel_points_custom_reward_redemption.update

A redemption status changes.

Poll Beginv1

channel.poll.begin

A poll starts.

Poll Progressv1

channel.poll.progress

A poll receives votes.

Poll Endv1

channel.poll.end

A poll ends.

Prediction Beginv1

channel.prediction.begin

A prediction starts.

Prediction Progressv1

channel.prediction.progress

A prediction receives participation.

Prediction Lockv1

channel.prediction.lock

A prediction locks.

Prediction Endv1

channel.prediction.end

A prediction resolves.

Hype Train Beginv2

channel.hype_train.begin

A Hype Train starts.

Hype Train Progressv2

channel.hype_train.progress

A Hype Train progresses.

Hype Train Endv2

channel.hype_train.end

A Hype Train ends.

Goal Beginv1

channel.goal.begin

A goal starts.

Goal Progressv1

channel.goal.progress

A goal progresses.

Goal Endv1

channel.goal.end

A goal ends.

Charity Startv1

channel.charity_campaign.start

A charity campaign starts.

Charity Progressv1

channel.charity_campaign.progress

A charity campaign progresses.

Charity Stopv1

channel.charity_campaign.stop

A charity campaign stops.

Charity Donatev1

channel.charity_campaign.donate

A viewer donates to charity.

Ad Break Beginv1

channel.ad_break.begin

An ad break starts.

Chat Messagev1

channel.chat.message

A chat message is sent.

Chat Notificationv1

channel.chat.notification

A system chat notification appears.

Chat Settingsv1

channel.chat_settings.update

The channel chat settings change.

Shoutout Createv1

channel.shoutout.create

A shoutout is created.

Shoutout Receivev1

channel.shoutout.receive

The broadcaster receives a shoutout.