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.
How It Works
Section titled “How It Works”- Host creates a room → gets a host token, a 6-character join code, and a QR code
- Guests join via code or QR → search YouTube for karaoke tracks → add to queue with their name
- Everyone votes → highest-voted pending song rises to the top
- Host manages playback from
/host/:code, drives the TV display at/display/:code
Features
Section titled “Features”For Guests
Section titled “For Guests”- 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
For Hosts
Section titled “For Hosts”- 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
Technical Features
Section titled “Technical Features”- 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
- TanStack Start - React SSR framework with file-based routing
- TanStack Router + TanStack Query - Type-safe routing and server-state management
- Supabase - PostgreSQL database with realtime subscriptions for live queue/vote sync
- Tailwind CSS v4 - Styling
- dnd-kit - Drag-and-drop queue reordering
- YouTube Data API v3 - Song search
Getting Started
Section titled “Getting Started”Prerequisites
Section titled “Prerequisites”- Node.js 24 LTS
- pnpm (or npm/yarn)
- Supabase account
- YouTube Data API key
Installation
Section titled “Installation”- Clone the repository:
git clone https://github.com/Get-Coral/kapow.gitcd kapow- Install dependencies:
pnpm install- Set up environment variables:
cp .env.example .env- Add your credentials to
.env:
SUPABASE_URL=https://your-project.supabase.coSUPABASE_PUBLISHABLE_KEY=<your Supabase publishable / anon key>YOUTUBE_API_KEY=<your YouTube Data API v3 key>Environment
Section titled “Environment”Verified against KAPOW/.env.example and KAPOW/src/lib/env.ts.
| Variable | Required | Purpose |
|---|---|---|
SUPABASE_URL | Yes | Supabase project URL |
SUPABASE_PUBLISHABLE_KEY | Yes | Supabase publishable (anon) key |
YOUTUBE_API_KEY | Yes | YouTube Data API v3 key, used for song search |
SUPABASE_DB_URL | No | Direct database connection, for the migration scripts |
SUPABASE_DB_PASSWORD | No | Database password. Used by supabase link and in CI — not read by the app |
HOST | No | Interface the server binds to (default 0.0.0.0) |
PORT | No | Port 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
Database migrations
Section titled “Database migrations”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.
Get Supabase Credentials
Section titled “Get Supabase Credentials”- Create a Supabase project at supabase.com
- Copy your project URL and Anon key
- Create a database password in project settings
- Run migrations to set up tables
Get YouTube API Key
Section titled “Get YouTube API Key”- Go to Google Cloud Console
- Create a new project
- Enable YouTube Data API v3
- Create an API key
- Add to your
.env
Start Development
Section titled “Start Development”pnpm devKAPOW runs on http://localhost:3000
Running a Session
Section titled “Running a Session”As Host
Section titled “As Host”- Visit
http://localhost:3000 - Create a new room
- Share the code or QR code with guests
- Go to host control at
/host/:code?token=— the host token from step 2 is required; the route will not open without it
As Guest
Section titled “As Guest”- Scan QR code or visit with the 6-digit code
- Enter your name
- Search for karaoke tracks
- Add songs to queue
- Vote on pending songs
Routes
Section titled “Routes”| Route | Description |
|---|---|
/ | Landing — create or join a room |
/room/:code | Guest view — search songs, add to queue, vote |
/host/:code?token= | Host control booth — manage queue, advance songs |
/display/:code | TV display — now playing, full-screen comic mode |
Deployment
Section titled “Deployment”KAPOW! publishes to getcoral/kapow on Docker Hub and
ghcr.io/get-coral/kapow.
Running from source:
pnpm buildpnpm startWhichever 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.
Architecture
Section titled “Architecture”Database Schema
Section titled “Database Schema”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.
Real-time Updates
Section titled “Real-time Updates”Uses Supabase realtime to push:
- New songs added to queue
- Vote changes
- Playback state changes
- Guest joins/leaves
Learn More
Section titled “Learn More”Related
Section titled “Related”- KAPOW! vs Karaoke Eternal — local library versus YouTube search
- Encore — the planned equivalent for Jellyfin music requests
- Get-Coral/KAPOW on GitHub