AI-assisted short-form video workflow: script -> storyboard -> video editor. Node.js/Express backend, vanilla HTML/CSS/JS frontend, Supabase auth, SQLite, FFmpeg media processing, and HyperFrames rendering.
- Node.js 22+ (
node -v) - FFmpeg + FFprobe on PATH (
ffmpeg -version,ffprobe -version) - Supabase project keys for auth
- Optional: Chrome path via
HYPERFRAMES_BROWSER_PATHwhen HyperFrames cannot find a browser automatically
npm install
copy .env.example .env
npm run devFill .env with at least:
SUPABASE_URL=...
SUPABASE_PUBLISHABLE_KEY=...For production-style signup with server-side auto-confirmed users, also add:
SUPABASE_SERVICE_ROLE_KEY=...npm run devOpen:
http://localhost:3000
http://localhost:3000/scripts.html
http://localhost:3000/storyboard.html
http://localhost:3000/vshorts.html
The editor takes one or more uploaded clips and produces a short-form video. The current export pipeline is:
- Uploaded clips are stitched into one source video with FFmpeg.
- Talking-head pauses are detected from audio with FFmpeg
silencedetect. - Long pauses are removed while keeping a small natural audio buffer.
- The cleaned source is normalized to browser-playable H.264/AAC MP4.
- HyperFrames generates the motion package, branded overlays, BGM, and final vertical export.
- Progress streams back through
edit_jobs.stageandedit_jobs.stage_msg.
Default pause-cut behavior:
minSilenceSeconds:0.45silenceThresholdDb:-36silencePaddingSeconds:0.11
These can be overridden in the edit job config. Set autoCutPauses: false to disable pause cutting.
Drop royalty-free audio files into server/assets/music/ using preset ids from
public/vshorts.html, for example:
server/assets/music/viral-energy.mp3
server/assets/music/dark-ambient.mp3
server/assets/music/lofi-chill.mp3
If a preset is selected but the file is missing, the backend generates a simple fallback beat so the export still completes locally.
- The original frontend pages are preserved:
scripts.html,storyboard.html, andvshorts.html. - The old CutClaw bridge remains in the repository as legacy code, but the active export path no longer calls it.
- Generated uploads, SQLite data, local env files, and local logs are gitignored.