Guest-only realtime MVP. No auth flow, no multi-server system, no message history guarantees beyond what is persisted, just live chat with optional voice.
Svelte 5+SvelteKit 2Ably Realtimefor chat delivery, presence, and WebRTC signalingSupabasefor message persistence and storage buckets- native
WebRTCfor voice audio MeteredTURN credentials via server endpoint@lucide/sveltefor icons@sveltejs/adapter-vercelfor deploys
- guest name join
- live chat in
#general - one voice channel UI path
- reply and delete own message
- image upload to Supabase storage
- guest avatar upload to Supabase storage
- online presence list
Copy .env.example to .env and fill these in:
ABLY_API_KEY=
PUBLIC_SUPABASE_URL=
PUBLIC_SUPABASE_ANON_KEY=
METERED_DOMAIN=
METERED_API_KEY=The app uses Metered's turn/credentials?apiKey=... endpoint, so keep METERED_API_KEY in server env and do not expose it to the browser.
Optional older TURN envs are still listed in .env.example, but the app now prefers the Metered server endpoint.
- Run
supabase-mvp-reset.sql. - Create storage buckets:
AvatarServer-images
- Add storage policies so public reads and client uploads work for your MVP.
Without Supabase envs, live Ably chat can still connect, but persisted history and uploads will not work.
npm install
npm run devDev app runs on http://localhost:5173.
This repo already uses the Vercel adapter in vite.config.ts. You do not need a custom vercel.json for the current app.
Add the same env vars in Vercel project settings:
ABLY_API_KEYPUBLIC_SUPABASE_URLPUBLIC_SUPABASE_ANON_KEYMETERED_DOMAINMETERED_API_KEY