Inspiration

KICK chat moves faster than any streamer can read. Viewers ask questions, repeat requests, hype up moments, react with emotes, and signal generosity through gifts or sub-gifter activity. The hard part isn't counting messages — it's deciding what to do while the audience is still there. We kept coming back to one question: what is chat trying to make happen right now, and what safe action should the streamer take next?

What it does

KICK WinWin turns live chat into a full engagement loop across three stages:

  • Before stream — a research/search view (word cloud, TL;DR summaries, gifter cues) helps the creator prepare topics and interaction seeds.
  • During stream — on /live, KICKWIN watches chat and gift-like signals in real time, detects lulls, hype spikes, repeated requests, questions, and gifter moments, then suggests a safe action (a question, a poll/quest, a celebration) — always kept behind streamer approval before it goes public. Viewers can shape the moment through Community Quest votes, gestures, and a collaborative canvas.
  • After stream — clicking End live opens an instant Stream Summary (estimated gift revenue, unique chatters, gift-driving supporters, a recap-style Event Intelligence timeline, and one best next-stream topic). The full /stream-recaps view goes deeper: Topic Map, Gift Drivers, Audience Intelligence, high-frequency questions, and a Next-Stream Strategy Brief.

How we built it

  • Frontend: Next.js 16, React 19, TypeScript — a KICK-style creator and viewer UI (/live, /stream, /research, /stream-recaps, /demo).
  • Backend: FastAPI + Pydantic for deterministic live/recap analysis, with a LangChain-ready insight service for optional Claude enrichment.
  • Real Kick integration: a signed webhook receiver (POST /webhooks/kick) verifies Kick's RSA-SHA256 signature against Kick's published public key, rejects replayed events outside a 5-minute window, de-duplicates by message_id, and persists real chat.message.sent / kicks.gifted events — optionally into Supabase, with a local JSON fallback so the demo stays reliable offline.
  • OAuth2: standard Kick login (authorization-code flow) plus a client-credentials app token used to subscribe channels to webhook events.
  • Deterministic rules keep the whole demo reliable without an LLM key; an optional AI enrichment path adds richer insight when one is configured.

Challenges we ran into

  • Keeping the audience's actual signal (questions, hype, gifting) legible inside a chat stream that moves far faster than any human can read.
  • Verifying real webhook signatures correctly (RSA-SHA256 over message_id.timestamp.raw_body) and handling Kick's redelivery/replay behavior without dropping or duplicating events.
  • Being disciplined about real vs. simulated data — every proxy metric (e.g. "gift activity proxy", "returning audience proxy") had to be labeled honestly instead of implied as ground truth.
  • Presenting a two-sided (streamer + viewer) story in a single demo window without real cross-device state sync, which we solved with a dedicated /demo split-screen page sharing one React state tree.

What we learned

  • Webhooks and OAuth solve two different problems (event delivery vs. authorization) and shouldn't be conflated — but both matter for a real platform integration.
  • A hackathon demo is stronger when every simulated mechanic is clearly labeled rather than implied to be live multi-user data.
  • Small, fast, honestly-scoped features (a 3-second gesture prediction window, a fast collaborative canvas reveal) demo better under a 5-minute clock than slower, more "realistic" versions of the same idea.

Accomplishments that we're proud of

A real, signature-verified Kick webhook pipeline feeding a full before/ during/after engagement loop — not just a mockup, but a system that can actually receive and act on live Kick chat data.

What's next for KICK WinWin

Wire the pre-stream research view directly into the live signal detector, extend gift-driven topic detection with more granular Event Intelligence drilldowns, and move from local JSON fallback to Supabase as the default store for production reliability.

Built With

Share this project:

Updates