Fast thumbnails for
online media.
-
wavy-wall.svg
-
grass-texture.dds
-
miss-library.avif
-
stanford-bunny.stl
-
math-codes.jpg
-
apollo-exterior.glb
-
space-colony.jpg
-
base-glove.usdz
-
kids-theater.heic
-
math-guide.odt
-
city-newsletter.pdf
-
ontario-oss.pdf
-
harbor-trucks.mp4
-
blue-scooter.fbx
-
stream-barn.mkv
-
raw-pentax.pef
-
dudu-intro.mp3
-
packing-boxes.avi
-
raw-canon.cr2
-
boone-train.jp2
-
neon-block.png
-
pocket-game.webp
-
pixel-forest.gif
-
padres-stereo.exr
-
game-level.png
-
golden-gate.exr
-
missing-file
-
corrupt.jpg
-
kapaa-mips.exr
-
wavy-wall.svg
-
grass-texture.dds
-
miss-library.avif
-
stanford-bunny.stl
-
math-codes.jpg
-
apollo-exterior.glb
-
space-colony.jpg
-
base-glove.usdz
-
kids-theater.heic
-
math-guide.odt
-
city-newsletter.pdf
-
ontario-oss.pdf
-
harbor-trucks.mp4
-
blue-scooter.fbx
-
stream-barn.mkv
-
raw-pentax.pef
-
dudu-intro.mp3
-
packing-boxes.avi
-
raw-canon.cr2
-
boone-train.jp2
-
neon-block.png
-
pocket-game.webp
-
pixel-forest.gif
-
padres-stereo.exr
-
game-level.png
-
golden-gate.exr
-
missing-file
-
corrupt.jpg
-
kapaa-mips.exr
-
wavy-wall.svg
-
grass-texture.dds
-
miss-library.avif
-
stanford-bunny.stl
-
math-codes.jpg
-
apollo-exterior.glb
-
space-colony.jpg
-
base-glove.usdz
-
kids-theater.heic
-
math-guide.odt
-
city-newsletter.pdf
-
ontario-oss.pdf
-
harbor-trucks.mp4
-
blue-scooter.fbx
-
stream-barn.mkv
-
raw-pentax.pef
-
dudu-intro.mp3
-
packing-boxes.avi
-
raw-canon.cr2
-
boone-train.jp2
-
neon-block.png
-
pocket-game.webp
-
pixel-forest.gif
-
padres-stereo.exr
-
game-level.png
-
golden-gate.exr
-
missing-file
-
corrupt.jpg
-
kapaa-mips.exr
About
Thumbrella brings fast, beautiful thumbnails to any online gallery, with support for 100+ formats: photos, video, documents, 3D models, and other media.
Run the open-source server with one command, zero config, and all the features and functionality. Then connect with client libraries for the browser or any of the other supported languages.
Also check out the Thumbrella Cloud for a distributed server and caching system. This genuine free tier is built for real every day projects; connected in two clicks.
MP4, MOV, MKV, AVI, FLV, TS, M4V, 3GP, OGV, WMV, MPEG... Images×19 Common image formats designed to be lightweight for a variety of digital uses. From tiny pixel art to panoramic megapixels.
JPEG, PNG, WEBP, AVIF, GIF, TIFF, BMP, HEIC, JP2, JXL, ICO, PSD, PPM, TGA... Photographs×27 Camera and film formats are often heavy and high definition frame captures, multichannel imagery that requires color processing.
RAW, DNG, EXR, HDR, CR2, NEF, ARW, ORF, RW2, PEF, SRW, RAF, 3FR, MEF... 3D geometry×26 Three dimensional models and scenes that can contain triangles, shaders, and textures.
OBJ, GLTF, GLB, STL, FBX, USDZ, IGES, DAE, PLY, 3DS, VRML... Documents×6 Documents are usually multi-page collections of styled text and media.
DOCX, PPTX, ODT, XLSX, ODS, ODP, PDF. And more×10 Many more formats provide ways to generate thumbnails or embed them directly.
SVG, MP3, FLAC, OGG, M4A, AAC...
News
First Steps
docker run --name tbr --publish 3114:3114 --rm \
thumbrella/server:latest export TBR_CONNECT=http://localhost:3114
uvx thumbrella-client basic \
https://demo.thumbrella.dev/media/math-guide.odt npx @thumbrella/server thumb \
brilliant-document.odt thumb.jpeg Grab a Client
The Javascript client is a great starting point for node, and similar environments.
- Stream async results as the server renders thumbnail batches
- Zero runtime dependencies, only needs
fetch - Caching takes full advantage of HTTP header directives
- Binary thumbnails load easily into
sharpand other image libraries - Placeholders for failures, even when disconnected or misconfigured
- Bundled CLI for thumbnailing local files
- Thumbrella supports over one hundred formats
// Install with, `npm install @thumbrella/client` //
import { Client } from "@thumbrella/client";
// Connect and generate a single thumbnailconst tbr = await new Client();const result = await tbr.thumb("https://demo.thumbrella.dev/media/pocket-game.webp");console.log(result.status, result.media!.thumbnail.length, "bytes");
// Stream results as they completefor await (const result of tbr.stream([ "https://demo.thumbrella.dev/media/padres-stereo.exr", "https://demo.thumbrella.dev/media/golden-gate.exr",])) { console.log(result.url, result.status);}The source comes with several starting point examples. See the client documentation for more details and information.
- examples/element.html
Use the
<tbr-thumb>element in a small, fixed gallery. - examples/browser.html Stream multiple thumbnails as they render through the Client API.
The Javascript client provides additional functionality to integrate into web browsers.
- Defines custom
<tbr-thumb>HTML element - Zero runtime dependencies, only needs
fetch - Automatic lazy streaming and batch requests through viewport visibility
- Caching takes full advantage of HTTP header directives
- No build imports, works directly in simple web pages
- Placeholders for failures, even when disconnected or misconfigured
- Thumbrella supports over one hundred formats
The custom element <tbr-thumb> element is defined under the optional
export /element. Use the setup function as the easiest way to register
everything.
<script type="module"> import { tbrSetup } from "https://cdn.jsdelivr.net/npm/@thumbrella/client@1/browser.js"; tbrSetup("http://localhost:3114");</script>
<h1>Hello, Thumbrella</h1><tbr-thumb src="https://demo.thumbrella.dev/media/pocket-game.webp"></tbr-thumb><tbr-thumb src="https://demo.thumbrella.dev/media/padres-stereo.exr"></tbr-thumb>A separate export at /browser provides a lightwer weight set of functions
to help integrate Thumbrella client results with dom nodes.
The package source comes with several starting point examples. See the client documentation for more details and examples.
- examples/element.html
Using the custom
<tbr-thumb>element. - examples/browser.html Track multiple thumbnails as they stream.
The Python client uses requests for blocking and optionally aiohttp for
async streaming results.
- Caching takes full advantage of HTTP header directives
- Binary thumbnails load easily into
PIL,Qt,Pygame, and others - Placeholders for failures, even when disconnected or misconfigured
- Bundled CLI for thumbnailing local files
- Thumbrella supports over one hundred formats
## Install with, `uv add thumbrella-client` ##
import thumbrella
# Connect to server and generate a thumbnail.tbr = thumbrella.Client()result = tbr.thumb("https://demo.thumbrella.dev/media/blue-scooter.fbx")print(result.status, len(result.media.thumbnail), "bytes")
# Pillow can decode from a zero-copy buffer.from PIL import Imageimg = Image.open(result.media.thumbnail.io)The source comes with several starting point examples. See the client documentation for more details and examples.
- examples/basic.py Download a thumbnail from a single url.
- examples/stream.py Stream multiple thumbnails as they render.
- examples/collage.py Assemble thumbnails from multiple sources into a single grid image.
The Rust client provides easy, high level functionality for caching, error
control, and other conveniences. By default it provides async calls using
reqwests and tokio. Using the blocking feature provides a blocking
interface for simpler environments.
- Async-first with reqwest (rustls TLS)
- Minimal dependencies,
reqwest,serde,base64,thiserror - Stream results as the server renders thumbnails
- In-memory LRU cache takes full advantage of HTTP header directives
- The client and server always provide placeholder images, even when disconnected
- Typed results with media classification and metadata
- Thumbrella server supports hundreds of formats
// Install with, `cargo add thumbrella-client` //
use thumbrella_client as thumbrella;
#[tokio::main]async fn main() -> Result<(), thumbrella::Error> { let tbr = thumbrella::Client::new(None); tbr.verify().await?;
// Get result and write thumbnail to jpeg file let result = tbr.thumb("https://demo.thumbrella.dev/media/game-level.png").await?; if let Some(media) = &result.media { println!("{} bytes {}", media.thumbnail.len(), media.kind); std::fs::write("thumb.jpg", media.thumbnail.bytes())?; }
Ok(())}The source comes with several starting point examples. See the client documentation for more details and examples.
- examples/basic.rs Download a thumbnail from a single url.
- examples/stream.rs Stream multiple thumbnails as they render.
The direct HTTP requests are designed to be usable without rich clients. This
can work from any language with any HTTP library. Also from command line tools
like curl or wget.
- Batch requests process in parallel
- Streamable batch results with
ndjsonorsse - Every request results in a valid image or placeholder
- Server provides advanced HTTP caching support
- Thumbrella server supports hundreds of formats
curl -OG "http://localhost:3114/thumb.jpeg" \ --data-urlencode "url=https://demo.thumbrella.dev/media/harbor-trucks.mp4"To interact with Thumbrella Cloud, register online for a quick and free account. Then add the token into the Authorization header.
curl -OG "https://cloud.thumbrella.dev/thumb.jpeg" \ --data-urlencode "url=https://demo.thumbrella.dev/media/golden-gate.exr" \ --header "Authorization: Bearer tbr_e_3QnzBcWx7KpRmYT2000example"See the client API documentation for more details how these calls can be used.
Grab a Server
Self hosting your own Thumbrella server is designed to be straightforward and simple. Find the prepackaged option that best fits your environment.
# Run through packaged npm servers (uvx package also available)npx @thumbrella/server serve
# Docker containerdocker run --name tbr --publish 3114:3114 --rm thumbrella/server
# Download binaries for your platform (statically linked, no difficulties)wget http://github.com/thumbrella-dev/thumbrella/releases/latest/thumbrella-win64.exethumbrella-win64 serveBy default the server will listen on port 3114. This can be override by
setting $TBR_PORT to a different value. There are several other
settings also managed by environment variables. These can be validated
by running thumbrella check for a simple report and diagnostics.
See the Server Documentation for more commands and configurations. Including how different media formats are handled. This also has instructions on optionally compiling Thumbrella for yourself.
Thumbrella provides a set of online servers that are ready to work. These provide several immediate benefits.
- All media formats and features supported
- Caching CDN to over 300 regions
- Usable free tier for all users
Sign up with your existing Github or Google account with two clicks. No payment info or additional data required.
Once registered you will receive an authentication token. Set your
$TBR_CONNECT environment variable to this token and use any of the
available client libraries.
The Thumbrella Demo gallery also hosts a Thumbrella server that can be used immediately with no account. The only restriction is that this only provides thumbnails for media in in the demo gallery.
set TBR_CONNECT=https://demo.thumbrella.dev
This makes it one of the easiest ways to test client tools and environments. It requires no server, and no Thumbrella cloud account.
The demo site provides an index.json
that describes the catalog of media.
curl -OG "https://demo.thumbrella.dev/thumb.jpeg" \ --data-urlencode "url=https://demo.thumbrella.dev/media/wavy-wall.svg"Run Thumbrella as a serverless model on Replicate. No installation. The platform bills per render, there is no additional Thumbrella cost.
This is not yet enabled. Wait for Thumbrella’s general release to access this service.
npm install replicateimport Replicate from 'replicate';const replicate = new Replicate();
const output = await replicate.run( "thumbrella/thumb", { input: { url: "https://demo.thumbrella.dev/media/harbor-trucks.mp4" } });// output base64 image dataYou can greatly reduce the efficiency of using Replicate by attaching your Thumbnail Cloud token to each request. This allows Replicate to use Thumberlla Cloud’s distributed caching. Use with your free account to cache thousands of thumbnail results.
Sponsors
Great looking media projects have excellent thumbnails. Anyone can build incredible project using Thumbrella. The ideal future of Thumbrella’s development and features will be driven by sponsors.
For teams and developers looking to get the most out of Thumbrella, a sponsorship goes a long way to securing the future of this project and service for all users.
See the sponsors page for more details.
thumbrella.dev