A simple web-based video editor with timeline editing, overlay support, and FFmpeg-powered export.
- Upload video/audio files (MP4, MOV, WebM, MKV) via drag-and-drop or file picker
- Timeline editing with 4 tracks (1 main + 3 overlay layers)
- Trim, split, and reorder clips on the main track
- Multi-layer overlay with position, size, and opacity controls
- Canvas preview with real-time compositing
- Export to MP4 (H.264 + AAC) via FFmpeg
- Range request support for streaming large files
- Backend: Node.js (built-in
httpmodule, no frameworks) - Frontend: Vanilla HTML/CSS/JS + HTML5 Canvas
- Media processing: FFmpeg / ffprobe via
child_process - Storage: Local filesystem (no database)
project/
├── server.js # All backend logic
├── public/
│ ├── index.html # Main page
│ ├── style.css # Styles
│ └── editor.js # Editor logic
├── uploads/ # Uploaded source files
├── output/ # Exported files + job status
├── SPEC.md # Project specification
└── AGENTS.md # AI execution protocol
- Node.js 18+
- FFmpeg and ffprobe installed and available in PATH
# No dependencies to install — uses only Node.js built-in modulesnode server.jsOpen http://localhost:3000 in a browser.
Set a custom port:
PORT=8080 node server.js- Upload media — Click "Add media" or drag files into the upload area
- Edit timeline — Drag clips to reorder, resize to trim, use Split to divide clips
- Add overlays — Drag media onto overlay tracks (1-3), adjust position and opacity
- Preview — Use the canvas preview and transport controls
- Export — Click "Export" to render the final video
| Method | Path | Description |
|---|---|---|
| POST | /api/upload |
Upload a video/audio file (multipart/form-data) |
| GET | /api/media/:id |
Get media info |
| GET | /api/media/:id/stream |
Stream media file (supports Range) |
| Method | Path | Description |
|---|---|---|
| POST | /api/export |
Start export job with timeline JSON |
| GET | /api/export/:jobId/status |
Get export job status and progress |
| GET | /api/export/:jobId/download |
Download exported file (supports Range) |
- Container: MP4
- Video: mpeg4
- Audio: AAC, 128kbps
- Default resolution: 1280x720 @ 30fps
GNU General Public License v3 (GPLv3) — see LICENSE file