Simple commands. Structured output. Local or cloud.
ittybit video -i https://example.com/video.mp4 \
--width 1280 --format mp4 --cloud TASK='{
"input": "https://example.com/video.mp4",
"kind": "video",
"options": { "width": 1280, "format": "mp4" }
}'
curl -X POST https://api.ittybit.com/tasks \
-H "Authorization: Bearer $ITTYBIT_API_KEY" \
-H "Content-Type: application/json" \
-d "$TASK" const task = {
input: "https://example.com/video.mp4",
kind: "video",
options: { width: 1280, format: "mp4" },
};
const res = await fetch("https://api.ittybit.com/tasks", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.ITTYBIT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify(task),
});
const data = await res.json(); import requests
task = {
"input": "https://example.com/video.mp4",
"kind": "video",
"options": {"width": 1280, "format": "mp4"},
}
res = requests.post(
"https://api.ittybit.com/tasks",
headers={"Authorization": f"Bearer {api_key}"},
json=task,
)
data = res.json() {
"id": "task_abc123",
"object": "task",
"kind": "video",
"status": "succeeded",
"input": "https://example.com/video.mp4",
"output": "https://store.ittybit.net/org_123/output.mp4",
"steps": [
{ "kind": "probe", "status": "succeeded" },
{ "kind": "ingest", "status": "succeeded" },
{ "kind": "video", "status": "succeeded" },
{ "kind": "upload", "status": "succeeded" }
]
} We split video at keyframe boundaries and encode chunks in parallel. Locally, that uses your CPU cores. On our cloud, it uses a fleet of workers.
| FFmpeg (8-core) | MediaConvert | Ittybit | |
|---|---|---|---|
| 44min 4K → AV1 | 5h 16m | — | 7m 56s |
| 22min 4K → H264 | — | 14m 25s | 48s |
Same output. Fraction of the time. If a chunk fails, it retries that chunk — not the whole file.
No filter graphs. No YAML configs. No parsing stderr.
ittybit video -i input.mp4 --width 1280 --quality medium
ittybit audio -i podcast.wav --format mp3
ittybit image -i video.mp4 --start 5 --format webp
ittybit adaptive -i input.mp4 -o stream.m3u8 Every task returns typed JSON — status, URL, dimensions, duration, file size.
brew install ittybit/tap/ittybit
ittybit video -i input.mp4 --width 1280