Open source on GitHub

Generate video thumbnail
sprite sheets from a URL.

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.

See it in action

Submit a URL, wait for processing, scrub through the result.

Why I built this

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

How it works

From video URL to ready-to-use sprites in three steps.

1

Define a job spec

Configure output formats (WebP, AVIF, JPG, Blurhash), resolution, sprite grid, and interval once. Reuse it across any number of jobs.

2

Submit a job

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.

3

Download & use

Grab the ZIP — sprite images and a WebVTT file ready for Video.js, Plyr, Shaka Player, or anything that supports the WebVTT thumbnail spec.

REST API example
POST /thumbnails-generation-job
// Headers: Authorization + X-ACCOUNT-ID
{
  "videoURL": "https://example.com/video.mp4",
  "jobSpecId": "your-spec-id"
}

What's included

Everything you need, nothing you don't.

🎞️

Multiple formats

WebP, AVIF, JPG, and Blurhash — generate all of them from a single job.

Async processing

Jobs are queued via RabbitMQ and processed with automatic retries. Fire and forget.

🔑

API key auth

Integrate from your backend with API keys. OAuth2 (Firebase JWT) also supported.

📐

Configurable grids

Set rows, columns, resolution, and interval per format. Balance quality vs. file size.

👁️

Preview in browser

Scrub through generated thumbnails directly in the dashboard before downloading.

📦

WebVTT included

Sprite images and a matching WebVTT file in every download ZIP, ready for any player.

Built with

A straightforward stack — nothing exotic.

Spring Boot 3
Java 21 backend, hexagonal architecture
React + TypeScript
Vite, Material UI, Firebase Auth
FFmpeg
Frame extraction and sprite assembly
RabbitMQ
Async job queue with manual ACK
PostgreSQL
Primary datastore, job state tracking
Backblaze B2
S3-compatible storage for sprites

Self-host it

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.

Quick start
# 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