The Tuzzle architecture
Tuzzle API
Tuzzle CDN
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: 1msReady to try it yourself?
Free tier, no credit card, live in 5 minutes.