Skip to content

KAPOW!

KAPOW! is a karaoke queue system for bars, events and parties. The host opens a room, guests join by scanning a QR code on their own phone with nothing to install, everyone searches and votes songs up the queue, and a separate display view drives the screen in the room.

  1. Host creates a room → gets a host token, a 6-character join code, and a QR code
  2. Guests join via code or QR → search YouTube for karaoke tracks → add to queue with their name
  3. Everyone votes → highest-voted pending song rises to the top
  4. Host manages playback from /host/:code, drives the TV display at /display/:code
  • Easy join - Scan QR code or enter 6-digit code
  • Search YouTube - Find any karaoke track
  • Queue songs - Add to the session playlist
  • Vote collaboration - Upvote songs you want to hear
  • Real-time updates - See queue changes instantly
  • Session management - Create and control rooms
  • Playback control - Play, pause, skip tracks
  • Queue management - Reorder songs, remove bad entries
  • Control booth - Dedicated host interface
  • Display mode - TV-ready display for guests
  • Real-time sync - Built with Supabase subscriptions
  • YouTube integration - Search the complete YouTube Music catalog
  • Drag-and-drop - Reorder queue easily
  • Voting system - Democratic song selection
  • Node.js 24 LTS
  • pnpm (or npm/yarn)
  • Supabase account
  • YouTube Data API key
  1. Clone the repository:
Terminal window
git clone https://github.com/Get-Coral/kapow.git
cd kapow
  1. Install dependencies:
Terminal window
pnpm install
  1. Set up environment variables:
Terminal window
cp .env.example .env
  1. Add your credentials to .env:
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_PUBLISHABLE_KEY=<your Supabase publishable / anon key>
YOUTUBE_API_KEY=<your YouTube Data API v3 key>

Verified against KAPOW/.env.example and KAPOW/src/lib/env.ts.

VariableRequiredPurpose
SUPABASE_URLYesSupabase project URL
SUPABASE_PUBLISHABLE_KEYYesSupabase publishable (anon) key
YOUTUBE_API_KEYYesYouTube Data API v3 key, used for song search
SUPABASE_DB_URLNoDirect database connection, for the migration scripts
SUPABASE_DB_PASSWORDNoDatabase password. Used by supabase link and in CI — not read by the app
HOSTNoInterface the server binds to (default 0.0.0.0)
PORTNoPort the server listens on (default 3000)

SUPABASE_URL and SUPABASE_PUBLISHABLE_KEY each accept aliases, so an existing Supabase .env usually works unchanged:

  • URL: SUPABASE_URL, VITE_SUPABASE_URL
  • Key: SUPABASE_ANON_KEY, SUPABASE_PUBLISHABLE_KEY, SUPABASE_KEY, VITE_SUPABASE_ANON_KEY, VITE_SUPABASE_PUBLISHABLE_KEY, VITE_SUPABASE_KEY

supabase/migrations/ is the source of truth for the schema; schema.sql is a reference snapshot. The pnpm db:* scripts (db:start, db:reset, db:lint, db:test, db:push:remote) drive it. Publishing to a remote project needs the SUPABASE_ACCESS_TOKEN and SUPABASE_PROJECT_REF CI secrets.

  1. Create a Supabase project at supabase.com
  2. Copy your project URL and Anon key
  3. Create a database password in project settings
  4. Run migrations to set up tables
  1. Go to Google Cloud Console
  2. Create a new project
  3. Enable YouTube Data API v3
  4. Create an API key
  5. Add to your .env
Terminal window
pnpm dev

KAPOW runs on http://localhost:3000

  1. Visit http://localhost:3000
  2. Create a new room
  3. Share the code or QR code with guests
  4. Go to host control at /host/:code?token= — the host token from step 2 is required; the route will not open without it
  1. Scan QR code or visit with the 6-digit code
  2. Enter your name
  3. Search for karaoke tracks
  4. Add songs to queue
  5. Vote on pending songs
RouteDescription
/Landing — create or join a room
/room/:codeGuest view — search songs, add to queue, vote
/host/:code?token=Host control booth — manage queue, advance songs
/display/:codeTV display — now playing, full-screen comic mode

KAPOW! publishes to getcoral/kapow on Docker Hub and ghcr.io/get-coral/kapow.

Running from source:

Terminal window
pnpm build
pnpm start

Whichever way you deploy, Supabase and the YouTube API key have to be configured for the environment, and YouTube’s daily quota is the limit you will hit first on a busy night.

Supabase stores:

  • rooms - Active karaoke sessions
  • queue - Songs in the queue
  • votes - Guest votes on songs
  • guests - Participants in sessions

Real-time subscriptions push changes to all connected clients instantly.

Uses Supabase realtime to push:

  • New songs added to queue
  • Vote changes
  • Playback state changes
  • Guest joins/leaves