The video-conferencing layer for AI-Interviewer, so a one-to-one interview can run in the product instead of on Google Meet. A Next.js client on @livekit/components-react, an Express server that creates interview rooms and issues short-lived LiveKit access tokens, MongoDB for interviews and participants. March 2026, built alone.
Live: https://web-rtc-pied.vercel.app · part of https://satyamkumarsingh.com/work/playground
dashboard/create-interview --POST /api/interviews (admin key)--> Interview + room id in MongoDB
interview/[roomId] --GET /api/interviews/:roomId/token--> LiveKit AccessToken (identity, room grant, TTL)
--LiveKit cloud (LIVEKIT_URL)--------> audio, video, screen share via @livekit/components-react
server/src/utils/token.ts:AccessTokenfromlivekit-server-sdkwith a room-scoped grant; the API key and secret never reach the browser.server/src/lib/livekit.ts:RoomServiceClientfor room lifecycle.server/src/routes/interview.routes.ts: create and list interviews behindauthenticate(admin API key); fetch an interview and mint a participant token by room id.client/src/app/interview/[roomId]: the room UI on LiveKit's React components;dashboard/create-interview: the admin form.render.yaml: the API on Render (listens before the DB connects so health checks pass during cold starts); the client on Vercel.
npm run install:all
# server/.env: MONGODB_URI, LIVEKIT_API_KEY, LIVEKIT_API_SECRET, LIVEKIT_URL, CLIENT_URL, ADMIN_API_KEY
npm run dev:server # :4000
npm run dev:client # :3000Working demo on free tiers (Render cold starts apply). The AI-Interviewer product it plugs into lives in a teammate's repository; this repository is the video layer only.