Create
Start from a template
Browse allindex.html + frames/ — host anywhere.My Exports
Activity
Analytics
Export activity
Format breakdown
Export type breakdown
Viewer Analytics
Frame Dropoff Heatmap
A/B Tests
Current billing period
API Keys
Bring your own API keys to generate videos with AI. Your keys are encrypted at rest with AES-256-GCM.
Billing
Current Usage
Plans
- Videos up to 30s
- 5 exports/month
- HTML export only
- 1200px max resolution
- Videos up to 5 min
- 50 exports/month
- AI generation (BYOK)
- HTML + React + Vue
- 1800px max resolution
- Videos up to 30 min
- 200 exports/month
- Batch processing (10)
- All formats
- 10 GB storage
- Unlimited videos
- Unlimited exports
- Batch processing (50)
- 4K resolution
- 100 GB storage
Invoice History
Settings
Export Defaults
These defaults will pre-fill the Create form for new projects.
Export Features
Default feature toggles for new exports. Can be overridden per project.
Email Notifications
Choose which emails you'd like to receive.
Developer
API keys for CLI, MCP server, and programmatic access.
Loading...
Profile
Account
Danger zone
Permanently delete your account and all data. This action cannot be undone.
Documentation
Get Started in 3 Steps
Get an API Key
Go to API Keys to generate a platform key (starts with ff_live_). This key authenticates CLI, MCP, and direct API access. (Requires Starter plan or above)
Choose Your Integration
Use the MCP Server for AI agent workflows, the CLI for terminal-based processing, or the REST API for custom integrations.
Process Your First Video
Upload a video and get back a ZIP with scroll-synced frames + an HTML/React/Vue/Svelte/Astro/Next.js component ready to drop into your site.
Explore
Processing Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
fps | number | 30 | Frames per second (1-120) |
width | number | 1200 | Output width in pixels (100-4096) |
height | number | 675 | Output height in pixels (100-4096) |
format | string | webp | Frame format: jpg, webp, or avif |
theme | string | dark | Viewer theme: dark, light, or cinematic |
scrollLength | number | 300 | Scroll distance in vh units (10-10000) |
exportFormat | string | html | Component format: html, react, vue, nextjs, astro, svelte, wordpress |
responsive | boolean | false | Generate multiple resolutions (600, 1200, 1800px) |
adaptive | boolean | false | Generate quality tiers (low, mid, high) per resolution |
Setup
The FrameFlow MCP server lets AI agents (Claude, Cursor, Windsurf, etc.) create scroll experiences programmatically. It uses the Model Context Protocol over stdio transport.
Requirements
An API key (starts with ff_live_) — generate one from API Keys.
Claude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"frameflow": {
"command": "npx",
"args": ["-y", "frameflow", "mcp"],
"env": {
"FRAMEFLOW_API_KEY": "ff_live_your_key_here"
}
}
}
}Cursor / Windsurf
Add to .cursor/mcp.json or .windsurf/mcp.json:
{
"mcpServers": {
"frameflow": {
"command": "npx",
"args": ["-y", "frameflow", "mcp"],
"env": {
"FRAMEFLOW_API_KEY": "ff_live_your_key_here"
}
}
}
}Upload a local video file and process it into a scroll-controlled experience. Returns the path to the downloaded ZIP export.
| Parameter | Type | Required | Description |
|---|---|---|---|
videoPath | string | Yes | Absolute path to the video file |
fps | number | Frames per second (default: 30) | |
width | number | Output width in pixels (default: 1200) | |
height | number | Output height in pixels (default: 675) | |
format | string | Frame format: jpg, webp, avif | |
theme | string | Viewer theme: dark, light, cinematic | |
scrollLength | number | Scroll length in vh (default: 300) | |
exportFormat | string | Export framework: html, react, vue, nextjs, astro, svelte, wordpress | |
outputPath | string | Where to save the ZIP (default: auto) |
Create a scroll experience from a set of images using Ken Burns effects or simple sequencing.
| Parameter | Type | Required | Description |
|---|---|---|---|
imagePaths | string[] | Yes | Array of absolute paths to image files |
mode | string | Mode: kenburns or sequence | |
fps | number | Frames per second | |
width | number | Output width in pixels | |
height | number | Output height in pixels | |
durationPerImage | number | Duration per image in seconds (1-30) | |
outputPath | string | Where to save the ZIP |
Combine multiple video clips into a single seamless scroll experience.
| Parameter | Type | Required | Description |
|---|---|---|---|
videoPaths | string[] | Yes | Array of absolute paths to video files |
fps | number | Frames per second | |
width | number | Output width in pixels | |
height | number | Output height in pixels | |
outputPath | string | Where to save the ZIP |
Generate a video using an AI provider, then process it into a scroll experience.
| Parameter | Type | Required | Description |
|---|---|---|---|
provider | string | Yes | AI provider: runway, replicate, luma, kling, minimax, pika, stability, veo, hailuo, genmo |
prompt | string | Yes | Text prompt describing the video |
imageUrl | string | Reference image URL (image-to-video) | |
duration | number | Video duration in seconds | |
aspectRatio | string | Aspect ratio (e.g. 16:9, 9:16) |
List the authenticated user's past exports.
| Parameter | Type | Required | Description |
|---|---|---|---|
page | number | Page number (default: 1) | |
limit | number | Results per page (default: 20) |
Download a specific export by its ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
exportId | string | Yes | The export/job ID |
outputPath | string | Where to save the ZIP |
List all available presets (built-in + user-created).
No parameters required.
Check the progress and status of a processing job.
| Parameter | Type | Required | Description |
|---|---|---|---|
jobId | string | Yes | The job ID to check |
Check server health (DB connectivity, disk space, ffmpeg availability).
No parameters required.
Installation
Install FrameFlow globally or use npx:
# Install globally npm install -g frameflow # Or run directly with npx npx frameflow --help
Authentication
For remote/cloud features, authenticate via browser OAuth or API key:
# Browser-based login (opens OAuth flow) frameflow login # Or set API key directly export FRAMEFLOW_API_KEY=ff_live_your_key_here # Manage API keys frameflow api-key create --label "my-key" frameflow api-key list frameflow api-key revoke <id>
Credentials are stored in ~/.config/frameflow/credentials.json.
Process a local video into a scroll-controlled experience.
| Option | Default | Description |
|---|---|---|
--output, -o | ./export | Output directory |
--fps | 30 | Frames per second |
--width | 1200 | Output width |
--height | 675 | Output height |
--format | webp | Frame format (jpg, webp, avif) |
--theme | dark | Viewer theme (dark, light, cinematic) |
--scroll-length | 300 | Scroll distance in vh |
--export-format | html | Component format (html, react, vue, nextjs, astro, svelte, wordpress) |
--responsive | false | Multi-resolution output |
--adaptive | false | Quality tiers per resolution |
--start | Start time in seconds | |
--end | End time in seconds | |
--preset | Use a named preset | |
--zip | false | Output as ZIP instead of directory |
frameflow process hero.mp4 --fps 8 --width 1200 --format webp --export-format react
Process multiple videos at once. Accepts the same options as process.
frameflow batch clip1.mp4 clip2.mp4 clip3.mp4 --fps 12 --format webp
Quick video probe — shows duration, FPS, resolution, and estimated frame count.
frameflow preview hero.mp4
List available presets. Built-in presets: product-reveal, hero-section, tutorial, parallax-showcase.
Manage project-level defaults via .frameflowrc.
# Create a .frameflowrc in current directory frameflow config --init # Show current config frameflow config --show # Set a default frameflow config --set fps=12 frameflow config --set format=webp
Config format (.frameflowrc):
{
"fps": 12,
"width": 1200,
"height": 675,
"format": "webp",
"theme": "dark",
"scrollLength": 300,
"exportFormat": "html",
"responsive": false,
"adaptive": false
}Start the FrameFlow web server with the full dashboard UI.
frameflow serve --port 5177
Remote Commands
Cloud-based processing via the FrameFlow API (requires authentication):
| Command | Description |
|---|---|
remote process <video> | Upload and process via cloud |
remote images <images...> | Create scroll from images |
remote stitch <videos...> | Combine clips remotely |
remote generate | Generate video with AI |
remote status <jobId> | Check job progress |
remote download <jobId> | Download completed export |
remote exports | List your exports |
remote presets | List available presets |
remote whoami | Show current user |
remote health | Check server health |
# Process video in the cloud frameflow remote process hero.mp4 --fps 8 --format webp # Generate AI video and process it frameflow remote generate --provider runway --prompt "Cinematic product reveal"
Authentication
All API requests can be authenticated via API key or JWT token:
# API Key (recommended for automation) curl -H "Authorization: Bearer ff_live_xxxxxxxxxxxx" \ https://frameflow.sh/api/health # JWT (from browser session, for web integrations) curl -H "Authorization: Bearer eyJhbGciOi..." \ https://frameflow.sh/api/user/profile
Upload and process a single video. Returns a job ID for progress tracking.
| Field | Type | Required | Description |
|---|---|---|---|
file | file | Yes | Video file (multipart/form-data) |
fps | string | Frames per second | |
width | string | Output width | |
height | string | Output height | |
format | string | Frame format | |
theme | string | Viewer theme | |
scrollLength | string | Scroll distance (vh) | |
exportFormat | string | Component framework | |
responsive | string | "true" for multi-resolution | |
adaptive | string | "true" for quality tiers |
curl -X POST https://frameflow.sh/api/process \
-H "Authorization: Bearer ff_live_..." \
-F "file=@hero.mp4" \
-F "fps=8" \
-F "format=webp" \
-F "exportFormat=react"
# Response: { "jobId": "abc-123-..." }Server-Sent Events stream for real-time job progress. Connect with EventSource.
const es = new EventSource("/api/progress/abc-123");
es.onmessage = (e) => {
const data = JSON.parse(e.data);
// { status: "extracting", progress: 42, total: 120 }
console.log(`${data.progress}/${data.total} frames`);
if (data.status === "done" || data.status === "error") es.close();
};Download the completed export ZIP for a given job ID.
curl -O -J https://frameflow.sh/api/download/abc-123 \ -H "Authorization: Bearer ff_live_..."
Process multiple videos in one request (up to 20). Returns a batch ID.
curl -X POST https://frameflow.sh/api/batch \ -H "Authorization: Bearer ff_live_..." \ -F "files=@clip1.mp4" \ -F "files=@clip2.mp4" \ -F "fps=12" \ -F "format=webp"
Combine up to 10 video clips (max 5 min total) into a single scroll experience.
Create a scroll experience from images (up to 50). Supports Ken Burns effects and simple sequencing.
Generate a video using an AI provider, then automatically process it into frames.
| Field | Type | Required | Description |
|---|---|---|---|
provider | string | Yes | AI provider name |
prompt | string | Yes | Text prompt |
imageUrl | string | Reference image (image-to-video) | |
duration | number | Duration in seconds | |
aspectRatio | string | e.g. 16:9, 9:16 |
List all presets (built-in + user-created).
Create or save a custom preset.
Delete a user-created preset.
Rate Limits
| Endpoint Group | Limit |
|---|---|
| General API | 60 req/min per IP (120 if authenticated) |
| Authentication | 20 req / 15 min |
| Uploads | 30 req / hour |
| Presets | 30 req / min |
| Share links | 30 req / min |
Requirements
| Dependency | Version | Notes |
|---|---|---|
| Node.js | 18+ | LTS recommended |
| ffmpeg | 5+ | Must be on PATH |
| npm | 9+ | Comes with Node.js |
Quick Setup
# Clone the repository git clone https://github.com/tonycdr-prog/FrameFlow.git cd FrameFlow # Install dependencies npm install # Start the server npm start # Or start in development mode with auto-reload npm run dev
The server starts on http://localhost:5177 by default. No Supabase, Stripe, or external services required for local processing.
Environment Variables
All optional for basic self-hosted usage:
| Variable | Default | Description |
|---|---|---|
PORT | 5177 | Server port |
NODE_ENV | development | Environment (development/production) |
APP_URL | Public URL (for share links) | |
REDIS_URL | Redis URL for caching (falls back to in-memory LRU) | |
ENCRYPTION_KEY | AES-256-GCM key for encrypting stored API keys | |
SENTRY_DSN | Sentry error tracking DSN |
To enable SaaS features (auth, billing, analytics), set SUPABASE_URL and SUPABASE_SERVICE_KEY.