It's the best software in the world, but running FFmpeg at scale sucks. Ittybit handles all the annoying edge cases for you, lets you encode loads of files in parallel, and uses GPUs to process jobs upto 50x faster than AWS.
ittybit video \
-i input.mov \
--quality high \
--format mp4 ittybit video \
-i input.mov \
--width 720 \
--height 1280 \
--fit cover ittybit image \
-i input.mov \
--width 720 \
--height 1280 \
--fit cover \
--format webp ittybit adaptive \
-i input.mov \
-o s3://mybucket/stream.m3u8 ittybit audio \
-i input.mov \
--format mp3 Add video, audio, and image processing to your app with a few lines of code.
npm i -g @ittybit/cli brew install ittybit/tap/ittybit curl -fsSL https://ittybit.com/install.sh | sh Install ittybit from github.com/ittybit for your runtime.
Run `ittybit login` to create an account and get an API key.
Run `ittybit video -i https://ittyb.it/sample.mp4 --width 240` to process your first file. Convert formats, resize media, reduce filesize, extract thumbnails, or create adaptive streams. All with an API that stays consistent across video, audio, and images in just about any format; even those janky framerate uploads from the user with the random 2013 Android. The same props work identically across CLI, SDKs, and REST; from local dev to production.
Convert between formats to optimize for size, quality, or compatibility. Use modern codecs like av1 and opus for dramatic size reductions, or normalize to h264 and mp3 for universal playback.
ittybit video \
-i s3://bucket/input.mov \
--format webm const task = {
kind: "video",
input: "s3://bucket/input.mov",
options: { format: "webm" },
};
await fetch("https://api.ittybit.com/jobs", {
method: "POST",
headers: {
Authorization: "Bearer ittybit_...",
"Content-Type": "application/json",
},
body: JSON.stringify(task),
}); ittybit video \
-i s3://bucket/input.mov \
--quality high const task = {
kind: "video",
input: "s3://bucket/input.mov",
options: { quality: "high" },
};
await fetch("https://api.ittybit.com/jobs", {
method: "POST",
headers: {
Authorization: "Bearer ittybit_...",
"Content-Type": "application/json",
},
body: JSON.stringify(task),
}); ittybit video \
-i s3://bucket/input.mov \
--width 1080 \
--height 1920 \
--fit cover const task = {
kind: "video",
input: "s3://bucket/input.mov",
options: { width: 1080, height: 1920, fit: "cover" },
};
await fetch("https://api.ittybit.com/jobs", {
method: "POST",
headers: {
Authorization: "Bearer ittybit_...",
"Content-Type": "application/json",
},
body: JSON.stringify(task),
}); ittybit video \
-i s3://bucket/input.mov \
--start 10 \
--end 30 const task = {
kind: "video",
input: "s3://bucket/input.mov",
options: { start: 10, end: 30 },
};
await fetch("https://api.ittybit.com/jobs", {
method: "POST",
headers: {
Authorization: "Bearer ittybit_...",
"Content-Type": "application/json",
},
body: JSON.stringify(task),
}); ittybit adaptive \
-i s3://bucket/input.mov const task = {
kind: "adaptive_video",
input: "s3://bucket/input.mov",
};
await fetch("https://api.ittybit.com/jobs", {
method: "POST",
headers: {
Authorization: "Bearer ittybit_...",
"Content-Type": "application/json",
},
body: JSON.stringify(task),
}); ittybit audio \
-i s3://bucket/input.mov \
--format mp3 const task = {
kind: "audio",
input: "s3://bucket/input.mov",
options: { format: "mp3" },
};
await fetch("https://api.ittybit.com/jobs", {
method: "POST",
headers: {
Authorization: "Bearer ittybit_...",
"Content-Type": "application/json",
},
body: JSON.stringify(task),
}); ittybit image \
-i s3://bucket/input.mov \
--start 5.0 \
--format webp const task = {
kind: "image",
input: "s3://bucket/input.mov",
options: { start: 5.0, format: "webp" },
};
await fetch("https://api.ittybit.com/jobs", {
method: "POST",
headers: {
Authorization: "Bearer ittybit_...",
"Content-Type": "application/json",
},
body: JSON.stringify(task),
}); ittybit probe \
-i s3://bucket/input.mov const task = {
kind: "probe",
input: "s3://bucket/input.mov",
};
await fetch("https://api.ittybit.com/jobs", {
method: "POST",
headers: {
Authorization: "Bearer ittybit_...",
"Content-Type": "application/json",
},
body: JSON.stringify(task),
}); {
"object": "external_file",
"url": "s3://bucket/input.mov"
} {
"object": "file",
"kind": "video",
"format": "webm",
"width": 1920,
"height": 1080,
"duration": 45200,
"codecs": { "video": { "codec": "vp9" }, "audio": { "codec": "opus" }, "string": "vp9, opus" }
} {
"object": "file",
"kind": "video",
"format": "mp4",
"width": 1920,
"height": 1080,
"duration": 45200,
"filesize": 8400000,
"codecs": { "video": { "codec": "h264" }, "audio": { "codec": "aac" }, "string": "h264, aac" }
} {
"object": "file",
"kind": "video",
"format": "mp4",
"width": 1080,
"height": 1920,
"duration": 45200,
"codecs": { "video": { "codec": "h264" }, "audio": { "codec": "aac" }, "string": "h264, aac" }
} {
"object": "file",
"kind": "video",
"format": "mp4",
"width": 1920,
"height": 1080,
"duration": 20000,
"codecs": { "video": { "codec": "h264" }, "audio": { "codec": "aac" }, "string": "h264, aac" }
} {
"object": "file",
"kind": "adaptive_video",
"format": "m3u8",
"variants": [
{ "width": 1920, "bitrate": 5000000 },
{ "width": 1280, "bitrate": 2500000 },
{ "width": 640, "bitrate": 1000000 }
]
} {
"object": "file",
"kind": "audio",
"format": "mp3",
"duration": 45200,
"filesize": 3600000,
"codecs": { "audio": { "codec": "mp3" }, "string": "mp3" }
} {
"object": "file",
"kind": "image",
"format": "webp",
"width": 1920,
"height": 1080,
"filesize": 184000,
"codecs": { "image": { "codec": "webp" } }
} {
"object": "file",
"kind": "video",
"format": "mov",
"width": 1920,
"height": 1080,
"duration": 45200,
"fps": 23.976,
"bitrate": 8500000,
"filesize": 48062500,
"codecs": { "video": { "codec": "h264", "profile": "High", "level": 4.1, "bitdepth": 8 }, "audio": { "codec": "aac", "sample": 48000, "channels": 2 }, "string": "h264, aac" }
} When you're ready to scale past your demo, ittybit's cloud gives you reliable on-demand processing with a single line-of-code. Process parallel files at lightning-fast speeds on our custom GPU infrastructure. Skip terraform and provisioning. It scales up for millions of files when you need and down to zero when you don't.
Our founding team has 35 years experience building video and imaging pipelines. All the parts that suck? We've battled through them multiple times. Now at ittybit we sweat the details for you. (So you can focus on all the other parts of your app that suck).
Get detailed metadata for every file, without parsing walls of stdout. Track granular progress without accidentally starting a giant infrastructure project. Or fire-and-forget with async tasks and reliable event-driven notifications.
Create a free account, install the CLI, and process your first file in under a minute. No credit card, sales calls, or 90-page procurement doc required.
The CLI and encoding engine are open source under Apache 2.0. Run locally in dev, self-host in production, or use our managed cloud. Switch between them with a single flag. We want you to stay because we've built the best system and we've earned your business every month, not because of some long-term contract bullshit or enterprise deal rug-pull. If you do leave, your code and your files stay yours.
1 AWS Elemental MediaConvert with accelerated transcoding enabled.
2 FFmpeg on 2x Xeon, 64GB RAM. Same source files across all tests.
3 Adaptive Bitrate Ladder (1920x1080, 1280x720, 640x360, and 320x180 renditions).