How Tuzzle works

Upload once.
Use everywhere.

Tuzzle sits between your storage and your users. You upload originals once. We handle every variant, format, and size your UI could ever need — with zero preprocessing required.

The Tuzzle architecture

Your app
Tuzzle API
Origin storage
User browser
Tuzzle CDN
Edge cache
01

You upload the original

Your app sends the file to the Tuzzle management API via REST, multipart upload, or a signed URL. We store the original untouched in your dedicated storage bucket. You keep ownership. We keep the metadata.

upload.js
const res = await fetch('https://api.tzzl.io/v1/upload', {
  method: 'POST',
  headers: { 'X-Api-Key': 'tzk_live_abc123' },
  body: formData, // FormData with 'file' field
})
const { id, url, size, mime } = await res.json()
02

You build the delivery URL

The delivery URL is predictable and deterministic. Append transform parameters to the base URL and use it anywhere — in an <img> tag, CSS, API response, or email template. No extra API call needed.

urls.js
// Same image, different transforms — all valid URLs
const thumbnail = `https://cdn.tzzl.io/s/${spaceSlug}/${id}.jpg?w=200&h=200&r=thumb&g=face`
const hero = `https://cdn.tzzl.io/s/${spaceSlug}/${id}.jpg?w=1920&f=webp&q=80`
const og = `https://cdn.tzzl.io/s/${spaceSlug}/${id}.jpg?w=1200&h=630&r=fill`
03

We transform and cache it

On the first request for any URL, Tuzzle fetches the original from storage, applies the transforms, writes the processed variant to the edge cache in the visitor's region, and delivers it. Every request after that is a cache hit.

response-headers
# Response headers on first request (cache miss):
X-Tuzzle-Cache: MISS
X-Tuzzle-Node: LOS1
X-Tuzzle-Process-Time: 61ms
Cache-Control: public, max-age=31536000, immutable

# Response headers on subsequent requests (cache hit):
X-Tuzzle-Cache: HIT
X-Tuzzle-Node: LOS1
X-Tuzzle-Process-Time: 1ms

Ready to try it yourself?

Free tier, no credit card, live in 5 minutes.