Upload a video, get HLS streams in 360p / 720p / 1080p with hover thumbnails.
- Web — Next.js (
apps/web) - API — Express, uploads + serving (
apps/api) - Worker — FFmpeg transcoding + thumbnails (
apps/worker) - DB — Neon Postgres + Drizzle (
packages/db) - Queue — BullMQ + Upstash Redis (
packages/queue)
pnpm installCreate a .env in the repo root:
DATABASE_URL=postgresql://...
REDIS_URL=rediss://...
Push the schema:
cd packages/db && npx drizzle-kit pushFFmpeg binaries are bundled in tools/ffmpeg/bin — nothing to install. (Or set FFMPEG_PATH to use your own.)
pnpm run dev- Web: http://localhost:3000
- API: http://localhost:4000
- Upload at
/upload - Worker generates thumbnail sprite + VTT
- Transcodes to HLS (360p / 720p / 1080p)
- Watch at
/videos/{id}, delete via the ⋮ menu
