Changelog
New

Custom fonts in compose and caption.burn

Name any Google Fonts family in style.font, or declare your own files in the fonts input under family names you pick. A stack falls through instead of failing.

API

Text in a compose timeline used to resolve to one of seven bundled families. Anything else silently rendered in whatever the render machine happened to have, and you were billed for a video in a typeface you did not choose.

Four lines of sample text, each rendered in a different typeface, labelled with the exact font value that produced it: Inter, Playfair Display, a declared file named Display, and the stack Missing, Bebas Neue
Four ways to name a font, in one timeline. Rendered by compose, job_a9836abdf0554063.

Three things changed.

Any Google Fonts family works by name. Nothing to upload, nothing to configure. The family is fetched at render time.

"style": { "font": "Bebas Neue", "size": 96, "weight": 700 }

Your own files, under names you pick. Put the URLs in the job’s fonts input. There is no limit on how many. TTF, OTF, TTC, WOFF and WOFF2 all work, and an uploaded asset’s content URL works in src like any other input.

"inputs": {
"fonts": [
{ "family": "Display", "src": "https://cdn.example.com/BrandDisplay.woff2" },
{ "family": "Body", "src": "https://cdn.example.com/BrandText.otf" }
]
}

You choose the name. The alternative is referencing the family string buried inside the file, which you have to find with a font inspector and which often is not what the file is called. Omit family and that embedded name is read for you.

A fallback stack is a failure policy. style.font takes a CSS-style list and falls through in order, so an unreachable CDN or a font catalogue outage gives you the next entry rather than a failed job or a silent substitution.

"style": { "font": "Display, Bebas Neue, sans-serif" }

Every substitution is reported back on the job, under steps[].meta.fontFallbacks, so a render that did not use the font you asked for tells you which one it used instead. A value that names nothing resolvable is rejected at submit, which catches pasting a font URL into style.font instead of into fonts.

Where it works

Every job that renders text, on the same rules.

  • compose takes all of the above, including the fonts array and stacks.
  • caption.burn and captions.animate take a family by name or a stack in font, and their font input takes your own file, which wins over the name.

The captions jobs take one file rather than an array, because they render one caption track.

Scripts

Latin, Cyrillic, Greek, Vietnamese, Turkish, Arabic, Hebrew, Thai, Devanagari, Bengali, Tamil, Amharic, Khmer, Chinese, Japanese and Korean all render, with right-to-left joining and conjunct shaping handled by the engine. Colour emoji does not render in text assets.

A table of sixteen writing systems, each with a sample word rendered by the engine: Latin, Cyrillic, Greek, Arabic, Hebrew, Devanagari, Bengali, Tamil, Thai, Amharic, Khmer, Vietnamese, Chinese, Japanese, Korean and Turkish
Sixteen scripts, one render, no configuration. Rendered by compose, job_91e157f3c4a54cdf.

Full reference in the compose fonts docs.

Clip timing changed the same day: see compose timelines without clip timing.

Share