Assets
Fonts and images you upload once and bake into template versions.
An asset is a font or image your organization owns, uploaded to a shared registry and baked into the templates that declare it. Because the render sandbox runs with the network blocked, a template can never fetch a resource at render time — the bytes must already be inside the baked shell. Assets are how brand fonts and logos get in.
Kinds & accepted formats
| Kind | Content types | Extensions |
|---|---|---|
font | woff2, woff, ttf, otf | .woff2 .woff .ttf .otf |
image | png, jpeg, webp, svg+xml | .png .jpg .jpeg .webp .svg |
Uploads are validated twice: the declared content type must be in the accepted
list, and the file's real magic bytes must match what was declared (so a
renamed .png posing as a font is rejected at the border, not at render time).
Naming
An asset name is a conservative slug: 2–64 characters, lowercase letters,
numbers, and hyphens, starting and ending with a letter or number (e.g.
acme-sans, company-logo). The name is the contract:
- Fonts — the component uses it as the literal CSS
font-family:font-family: 'acme-sans'; - Images — the component reads it from the asset map:
window.__RENDUO_ASSETS__['company-logo'](returns a data URI ready for asrc).
Uploading
Assets live at the organization level — a brand font is uploaded once and shared across templates. Upload via the CLI:
renduo assets push ./acme-sans.woff2 --name acme-sans
renduo assets listor from the dashboard's Assets page. There is no per-file size cap beyond the limits below.
Declaring assets in a template
A template declares which assets it uses at push time. Only the declared assets are baked into the version's shell — never the whole registry — so a version only weighs what it actually uses:
renduo push Invoice.tsx --slug invoice --assets acme-sans,company-logoIf a declared asset doesn't exist, the push fails with a clear error at registration time — never at render time. In your component:
const props = JSON.parse(window.__RENDUO_PROPS__)
const logo = window.__RENDUO_ASSETS__['company-logo'] // data URIStorage limits
Assets count against your plan's storage quota, not your template count:
| Plan | Storage | Max assets |
|---|---|---|
| Free | 10 MB | 5 |
| Starter | 100 MB | unlimited |
| Growth | 500 MB | unlimited |
| Enterprise | custom | custom |
renduo assets list shows current usage vs. the limit.
Immutability
Assets are baked into the version. Re-uploading an asset does not change templates you already published, and deleting an asset does not break anything already published — it only stops you from declaring it in future versions. See templates & versions for the full reasoning.
See also
- Custom fonts guide — an end-to-end walkthrough.
- Templates & versions — asset immutability.
- Plans & limits — the full limits table.
- API reference — Assets