
Assets tab, upload, storage meter, per-file rows.
What is accepted
- Images, JPEG, PNG, GIF, WebP.
- PDFs.
Per-file cap and per-plan budget
Per file:- Images: up to 5 MB.
- PDFs: up to 20 MB.
- Free: 0 (upload disabled).
- Starter: 1 GB.
- Pro: 5 GB.
- Business: 20 GB.
- Enterprise: 100 GB.
Upload
Drag onto the tab or click Upload. Runs with a real progress bar so you know it is doing something. On upload the file is:- Sniffed for its real type (extension is not trusted).
- Hashed with SHA-256.
- Deduplicated by content hash within the site. If the same content already exists, the existing URL is returned and no new storage is used.
The URL you get back
Every file gets an immutable, canonical URL:<namespace>, a per-site 32-character hex string, isolated from other sites.<hash>, the content hash. A change to content produces a new hash and therefore a new URL.<filename>, canonical filename. A request with the wrong filename returns a 308 redirect to the canonical one.
Cache-Control: public, max-age=31536000, immutable.
Browsers and CDNs cache forever, because it truly is forever, content
is content-addressed, so a change means a new URL.
Where the URL is safe
- Variant JS, hard-code the URL.
- Variant CSS,
background-image: url(https://usercontent.abtestly.com/...). - PDFs, reference in a download link.
- Emails, public and immutable, safe to send as an image reference.
Dependents lookup
Click a file to see which variants reference it. Substring match on the URL across every variant’s JS and CSS on the site, accurate enough that you can safely delete a file that shows zero dependents.Serving
Access-Control-Allow-Origin: *, so images work inline anywhere.
Full URL-shape, cache, and takedown detail on Serving.