Platform for video analysis and social media content creation.
- Frontend: Vite, React, TypeScript, Shadcn UI
- Backend: Node.js, Fastify, Drizzle ORM, Lucia Auth
- Database: PostgreSQL, Redis (Docker)
Prerequisites: Docker Desktop, Node.js 20+
-
First time only — copy
.env.exampleto.envand fill in your Cloudflare R2 credentials (see docs/CLOUDFLARE_R2_SETUP.md):cp .env.example .env # Edit .env with your R2_ACCOUNT_ID, R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY, R2_BUCKET_NAME, R2_ENDPOINT -
Start everything with one command:
npm run dev
This will:
- Start Docker (Postgres, Redis, screencast-worker)
- Wait for Redis to be ready
- Apply the database schema
- Start backend (port 3001 by default) and frontend (port 5173)
-
Open http://localhost:5173 (or 5174)
Port conflicts? This project uses non-standard ports by default (Postgres 5433, Redis 6380, Backend 3001) to avoid conflicts with other projects. Override in .env with POSTGRES_PORT, REDIS_PORT, PORT if needed.
When you add a video by pasting a replay URL, the system records the screen and audio from that page:
- Backend enqueues a job in BullMQ and returns immediately
- Screencast worker (runs in Docker) opens the URL in Chromium, records with FFmpeg + PulseAudio, uploads to R2
The screencast worker runs automatically when you use npm run dev. It reads R2 credentials from the root .env file.
Recording strategies:
docker: Uses Xvfb + PulseAudio + FFmpeg x11grab. Runs in Docker, suitable for server deployment.puppeteer-stream(default): Uses Chrome's internal streaming API. Works on macOS/Windows without Docker. The browser opens off-screen (--window-position=9999,9999) so it does not steal focus or expand to fullscreen. On Linux, useXvfb :99 -screen 0 1920x1080x24 &andDISPLAY=:99for a fully invisible browser (like Docker).
For live preview (the image you see while recording is what the worker is actually capturing), set BACKEND_URL and SCREENCAST_PREVIEW_SECRET in .env. Use the same secret value so the worker can send frames to the backend; e.g. BACKEND_URL=http://host.docker.internal:3001 and any random string for SCREENCAST_PREVIEW_SECRET.
See CONTRIBUTING.md. The project is conducted entirely in English (code, comments, UI).
For S3-compatible object storage, see docs/CLOUDFLARE_R2_SETUP.md for credentials and setup.
There are no default credentials. Go to /register to create an account, then sign in with your email and password.