Fast thumbnails for
online media.
-
aerial-city.mp4
-
portrait-session.jpg
-
product-360.mp4
-
landscape-raw.cr3
-
interview-b-roll.mov
-
concert-crowd.jpg
-
timelapse-stars.mp4
-
product-flat-lay.png
-
drone-coastline.mp4
-
fashion-editorial.jpg
-
astrophoto-deep.tiff
-
event-highlight.mp4
Why Thumbrella
- High performance Processing written in Rust. Remote data only downloads what is needed. Render processes are sandboxed for safety and stability.
- Advanced caching Cache thumbnails across 300+ worldwide regions. Every response includes standard HTTP cache headers. Re-requesting the same thumbnail is nearly free.
- Open source — Apache 2 Use it commercially, modify it, redistribute it. No strings attached. Source on GitHub.
- Self-host for free Run Thumbrella on your own hardware with an SQLite cache. No account required, works offline. Single binary — runs standalone or in Docker.
- Client libraries npm install @thumbrella/client — or pip install thumbrella. Same URL-based interface in both runtimes. Docs →
Media formats
- Video×14 MP4, MOV, MKV, WebM, AVI, FLV, TS, M4V, 3GP, OGV, RM, ASF, WMV, MPEG. Extracts frames at any timestamp.
- Images×18 JPEG, PNG, WebP, AVIF, GIF, TIFF, BMP, HEIC, JXL, and more — plus camera RAW: CR2, CR3, NEF, ARW, DNG, RAF, ORF, RW2, and dozens of manufacturer formats.
- Documents×3 PDF, DOCX, PPTX — generates a preview image of any page.
- 3D geometry×3 OBJ, GLTF, STL — renders an isometric preview of 3D models.
- Vector graphics×3 SVG, EPS, AI — rendered at any resolution without quality loss.
Get Started
Install a client library and point it at a media URL. You'll need a free API key — .
Works in Node.js, Deno, Bun, and the browser. TypeScript types included. The response is inline — thumb.data is base64 image bytes, thumb.format is the format string ("webp"). Pass your API key as YOUR_KEY, or a full URL for a self-hosted server.
npm install @thumbrella/client import { Thumbrella } from '@thumbrella/client';
const tbr = new Thumbrella('YOUR_KEY');
const thumb = await tbr.thumb('https://example.com/video.mp4');
img.src = `data:${thumb.format};base64,${thumb.data}`; Python 3.9+. Works in Django, FastAPI, scripts, and notebooks. .to_pil() and .save() bridge the base64 result directly to Pillow and the filesystem.
pip install thumbrella from thumbrella import Thumbrella
tbr = Thumbrella("YOUR_KEY")
thumb = tbr.thumb("https://example.com/video.mp4")
img = thumb.to_pil() # PIL/Pillow Image
thumb.save("thumb.webp") # write decoded bytes to file No install. The response is the raw image — pipe it wherever you need it.
curl https://go.thumbrella.dev/thumb/https://example.com/video.mp4 \
-H "Authorization: Bearer YOUR_KEY" \
-o thumb.webp Use the JS client in any .astro component, server-side at build time.
npm install @thumbrella/client ---
import { Thumbrella } from '@thumbrella/client';
const tbr = new Thumbrella(import.meta.env.THUMBRELLA_KEY);
const thumb = await tbr.thumb(Astro.props.mediaUrl);
---
<img
src={`data:${thumb.format};base64,${thumb.data}`}
alt="thumbnail"
/> Async-first, tokio runtime. Pairs with the image crate for further processing.
cargo add thumbrella let tbr = thumbrella::Client::new("YOUR_KEY");
let thumb = tbr.thumb("https://example.com/video.mp4").await?;
let img = image::load_from_memory(&thumb.data)?; Idiomatic Go module. Returns decoded []byte ready for the standard image package.
go get github.com/thumbrella/thumbrella-go tbr := thumbrella.New("YOUR_KEY")
thumb, err := tbr.Thumb("https://example.com/video.mp4")
img, _, err := image.Decode(bytes.NewReader(thumb.Data)) Plain Ruby gem, no runtime dependencies beyond the standard library.
gem install thumbrella require "thumbrella"
tbr = Thumbrella.new("YOUR_KEY")
thumb = tbr.thumb("https://example.com/video.mp4")
File.write("thumb.webp", Base64.decode64(thumb.data)) Composer package, PSR-18 compatible HTTP client.
composer require thumbrella/thumbrella-php $tbr = new \Thumbrella\Client('YOUR_KEY');
$thumb = $tbr->thumb('https://example.com/video.mp4');
file_put_contents('thumb.webp', base64_decode($thumb->data)); .NET 8+. Async throughout, returns byte[] ready for SkiaSharp or ImageSharp.
dotnet add package Thumbrella var tbr = new Thumbrella.Client("YOUR_KEY");
var thumb = await tbr.ThumbAsync("https://example.com/video.mp4");
await File.WriteAllBytesAsync("thumb.webp", thumb.Data); Swift Package Manager. Works on iOS, macOS, and Linux.
.package(url: "https://github.com/thumbrella/thumbrella-swift", from: "1.0.0") let tbr = Thumbrella(key: "YOUR_KEY")
let thumb = try await tbr.thumb("https://example.com/video.mp4")
let image = UIImage(data: thumb.data) Start Hosting
Choose where Thumbrella runs. The API is identical across every option.
Download the standalone binary for your platform — Linux, macOS, or Windows. No account needed, fully offline capable. One optional argument adds SQLite-backed thumbnail caching.
# Run the thumbnail server (default port 8000)
TBR_PORT=8000 thumbrella serve
# With SQLite cache
thumbrella serve --cache ./thumbrella-cache.db
# One-shot from the command line
thumbrella thumb ./sample.mov --output ./sample.webp Docker-first distribution with every renderer pre-bundled. Fully offline, pluggable caching backends (Redis, Postgres), and a perpetual license. Requires a sponsor arrangement — see pricing →
docker run --rm -p 8000:8000 \
ghcr.io/thumbrella/thumbrella-sponsor:latest serve Run Thumbrella as a serverless model on Replicate. No installation. The platform bills per render — there is no additional Thumbrella cost.
npm install replicate import Replicate from 'replicate';
const replicate = new Replicate();
const output = await replicate.run(
"thumbrella/thumb",
{ input: { url: "https://example.com/video.mp4" } }
);
// output — base64 image data Thumbrella on fal.ai is coming soon. The fal.ai integration will follow the same pattern as Replicate — serverless, pay-per-render, no Thumbrella account required.
Why thumbnails matter
Previews load before users decide to click. A well-placed thumbnail can be the difference between a media library that feels alive and one that feels like a wall of filenames. Thumbrella turns that decision from an infrastructure project into a single API call.
One URL, any media
Pass the source URL in the request path. Get a thumbnail back. No SDK required — a plain
curl or an <img src> tag is enough to start. The client libraries for JavaScript,
TypeScript, and Python add type safety and convenience but are entirely optional.
Caching built in
Every response includes standard HTTP cache headers. The hosted service uses a global CDN. Self-hosted binaries support optional on-disk SQLite caching with one extra config argument. Re-requesting the same thumbnail is nearly free.
Open source, no lock-in
Thumbrella is Apache 2 licensed. Read the code, fork it, self-host it permanently, or move to the hosted service whenever it makes sense. The API is identical in every deployment mode.
thumbrella.dev