Sprite is a self-hostable service that takes a video URL and produces sprite sheets + WebVTT files ready for any video player's thumbnail preview. No FFmpeg setup on your end.
Submit a URL, wait for processing, scrub through the result.
I was working on a video platform and needed thumbnail previews — the kind where you hover over a progress bar and see a frame from that point in the video. Every solution I found either required running FFmpeg myself on each upload, or paying for a closed-source service with no visibility into what it was doing.
Sprite is what I wished existed: a clean REST API, async job processing, multiple output formats, and a dashboard for when you just want to click around. It's fully open source so you can read every line, self-host it, or just use the hosted version.
— Rafik
From video URL to ready-to-use sprites in three steps.
Configure output formats (WebP, AVIF, JPG, Blurhash), resolution, sprite grid, and interval once. Reuse it across any number of jobs.
POST a video URL with your spec ID via the REST API or the dashboard. Sprite fetches the video, runs FFmpeg, and assembles the sprite sheets asynchronously.
Grab the ZIP — sprite images and a WebVTT file ready for Video.js, Plyr, Shaka Player, or anything that supports the WebVTT thumbnail spec.
POST /thumbnails-generation-job
// Headers: Authorization + X-ACCOUNT-ID
{
"videoURL": "https://example.com/video.mp4",
"jobSpecId": "your-spec-id"
}
Everything you need, nothing you don't.
WebP, AVIF, JPG, and Blurhash — generate all of them from a single job.
Jobs are queued via RabbitMQ and processed with automatic retries. Fire and forget.
Integrate from your backend with API keys. OAuth2 (Firebase JWT) also supported.
Set rows, columns, resolution, and interval per format. Balance quality vs. file size.
Scrub through generated thumbnails directly in the dashboard before downloading.
Sprite images and a matching WebVTT file in every download ZIP, ready for any player.
A straightforward stack — nothing exotic.
Sprite is fully open source. Clone the repo, spin up the dependencies with Docker, point it at your own storage bucket, and you're running your own instance. The backend is a single Spring Boot JAR, the frontend is a static Vite build.
# clone the repo
git clone https://github.com/rafiksargsyan/sprite
# start dependencies
docker compose up -d postgres rabbitmq
# run the backend
./gradlew bootRun
# run the frontend
cd web-ui && pnpm dev