VideoLM Factory is a full-stack video generation workspace. It combines research ingestion, NotebookLM automation, Gemini-compatible generation, FFmpeg rendering, and a queue-backed API that can be used from the hosted web UI.
Current reviewer URL:
https://54-162-84-165.sslip.io/engine-demo
Tip
The reviewer-safe HOMES-Engine demo uses the cached 8min21s MP4 below. It is served publicly and validated by HEAD 200 with content-type: video/mp4 before the player appears.
https://54-162-84-165.sslip.io/videos/videolm_primary_cached.mp4
The project has several moving parts, so reviewers should be able to understand the system from screenshots before running a long render. Add the images below to the root assets directory with the exact file names shown here.
Note
These screenshots should show the hosted production UI at https://54-162-84-165.sslip.io, not local development mocks.
- React + Vite frontend for creating videos, running NotebookLM research, uploading sources, and downloading generated artifacts.
- NestJS backend that serves the app and exposes
/api/...endpoints. - BullMQ + Redis render queue so heavy FFmpeg jobs run one at a time.
- NotebookLM integration through
notebooklm-mcp-cli. - Docker Compose production stack with Caddy HTTPS reverse proxy.
- Public no-auth demo bridge for reviewer smoke tests.
- Architecture
- API Reference
- NotebookLM Setup
- Deployment
- Operations
- Security Notes
- AWS Production Runbook
export APP_URL="https://54-162-84-165.sslip.io"
curl -fsS S "$APP_URL/api/video/demo/health"Expected response:
{
"status": "ok",
"service": "VideoLM Demo Bridge",
"baseUrl": "https://54-162-84-165.sslip.io",
"timestamp": "..."
}}If a client receives HTML or Unexpected token '<'t;', it is calling a frontend route instead of an API route. API clients must call /api/....
Start with the hosted demo instead of local setup:
- Open
https://54-162-84-165.sslip.io/engine-demo. - Click
[run] $ homes-engine health. - Click
[run] $ homes-engine demo. - Confirm the terminal logs
cache,verifying mp4,HEAD 200,content-type: video/mp4, andmp4 verified. - Play the MP4 that appears in the page, or open the public MP4 directly:
https://54-162-84-165.sslip.io/videos/videolm_primary_cached.mp4
For advanced NotebookLM artifacts, run $ homes-engine config or $ homes-engine notebooklm --help in the page. The heavy NotebookLM path is intentionally secondary so the reviewer demo is deterministic.
For the full authenticated workspace at https://54-162-84-165.sslip.io, use:
email: [email protected]
password: VideoLMReview2026!
The Register button is optional for new accounts. Reviewers should use the demo credentials above if they only need to inspect the hosted app.
The hosted app avoids local FFmpeg and local environment setup for reviewers. NotebookLM and AI-key setup are documented for users who want to run the full workflow themselves.
Requirements:
- Node.js 20+
- npm
- Redis for queue-backed rendering
- FFmpeg
- Python 3 and
uvif using NotebookLM locally
Install dependencies:
npm installCreate a local environment file:
cp .env.example .envRun frontend and backend together:
npm run devBackend only:
cd server
npm install
npm run devevImportant
NotebookLM is optional for the basic hosted demo, but setting it up makes testing much better. With a valid NotebookLM profile, VideoLM can list notebooks, ingest sources, generate NotebookLM video overviews, download MP4/PNG artifacts, and apply the project branding automatically.
Install the upstream CLI:
uv tool install notebooklm-mcp-cliLog in with the browser-based flow:
nlm login
nlm login --check
nlm doctororThe default profile stores cookies at:
~/.notebooklm-mcp-cli/profiles/default/cookies.json
VideoLM can use that file directly on the server, or users can paste/upload their cookies.json in the Research Lab UI. Full setup details are in docs/NOTEBOOKLM_SETUP.md.
Create .env in the repo root:
GEMINI_API_KEY=...
OPENROUTER_API_KEY=...
HF_TOKENS=...
JWT_SECRET=replace-this
NLM_HOME=/home/ubuntu/.notebooklm-mcp-cli
PUBLIC_BASE_URL=https://54-162-84-165.sslip.ioip.ioStart the stack:
docker compose up -d --buildExpected containers:
videolm_factory
videolm_redis
videolm_caddy
y
Caddy serves HTTPS on port 443 and reverse-proxies to the app container on port 3001.
The no-auth demo bridge is intended for reviewer smoke tests.
GET /api/video/demo/health
POST /api/video/demo/assemble
GET /api/video/:projectId/status
GET /videos/*.mp4
p4
POST /api/video/demo/assemble expects multipart/form-data:
audio required WAV/MP3 narration file
images required JPG/PNG/WebP scene files, up to 100
script optional script text for captions
bgMusic optional background music upload
bgMusicId optional file name from server/data/music
projectId optional stable id for polling
ling
Use docs/API.md for exact request and response shapes.
npm run build
cd server &∓& npm test -- --runInBand
curl -fsS https://54-162-84-165.sslip.io/api/video/demo/healthhApp.tsx Main React shell
components/ResearchDashboard.tsx NotebookLM research UI
services/ffmpegService.ts Browser-side video assembly client
server/src/research NotebookLM research API
server/src/video FFmpeg render API and queue bridge
server/public/videos Generated video files
server/data/database.sqlite SQLite database
docker-compose.yml Production services
Caddyfile HTTPS reverse proxy
e proxy
This stack is CPU-bound and can run without a GPU. For a short review window, the main AWS costs are EC2 instance hours, EBS disk, snapshots, data transfer, and public IPv4. Stop unrelated VMs, keep one production VM online, and set a billing alert.