All work

Personal project2025

vibin.click

Spotify Jam–style YouTube listening party — one host plays, anyone with the link queues and skips, realtime sync via Supabase.

Next.jsTailwindSupabase (Postgres + RLS + Realtime)Google OAuthYouTube Data API v3Vercel

Context

vibin is the Spotify Jam I wished existed for YouTube. One host plays audio in their browser; everyone else opens a shared link, searches YouTube, queues tracks, and skips to the next song — and the host's tab automatically picks up the change via realtime broadcast. No accounts, no installs.

I built it end-to-end as a weekend project to play with Supabase Realtime, anonymous auth, and Google OAuth for playlist import.

What I built

  • Realtime shared queue powered by Supabase Postgres + Realtime channels and row-level security; anonymous auth means guests don't sign up.
  • Host-only YouTube playlist import via Google OAuth (`youtube.readonly`) with server-only token storage — service-role key never reaches the client.
  • YouTube Data API v3 for search; YouTube IFrame API for host playback with autoplay-friendly first-track handshake.
  • iOS-friendly PWA — viewport-fit=cover, safe-area padding, Add-to-Home-Screen manifest.
  • Deployed on Vercel; Supabase Realtime over WSS.

Deep dive

Why a host model

YouTube's terms forbid serving the audio yourself, so playback has to happen in a real browser tab. The host model puts that tab at one user (whoever started the jam) and uses Realtime broadcast for everyone else to nudge it — search, queue, skip, advance. Guests stay lurkers from YouTube's perspective.