Every generated image is HTML drawn by Chrome on our servers, so the text can only use fonts installed there. This page lists them, shows what we measured when a template asks for something else, and explains emoji, other writing systems and brand fonts. The short version: name one of our families, end with a generic family, check a free preview — and do not expect a font we do not have to "just work", because it silently falls back.
All renders on this page were made on 2026-11-07 through our own template pipeline (the same Chromium and fonts as production), using a free template preview.
The fonts you can count on
GET /v1/fonts returns the families every template can rely on: Roboto, Open Sans, Carlito, DejaVu Sans, DejaVu Serif, DejaVu Sans Mono, Ubuntu, Noto Sans CJK JP, Noto Sans CJK SC, Noto Color Emoji. The visual editor offers exactly this list, and our AI template drafts are told to use only these. Styles installed per family, as fontconfig lists them on the renderer:
| Family | Weights and styles |
|---|---|
| Roboto | 100, 300, 400, 500, 700, 900, each with italic |
| Open Sans | 300, 400, 600, 700, 800, each with italic |
| Ubuntu | 100, 300, 400, 500, 700, 800, with italics and condensed widths |
| Carlito | 400 and 700, with italics (metric-compatible with Calibri) |
| DejaVu Sans | 400 and 700 |
| DejaVu Serif | 400 and 700 |
| DejaVu Sans Mono | 400 and 700, with obliques |
| Noto Sans CJK JP / SC | 400 and 700 |
| Noto Color Emoji | colour emoji |
Text with no font-family of its own uses our base stack, 'Roboto', 'Open Sans', 'DejaVu Sans', sans-serif, so the default is Roboto. The built-in templates mostly use DejaVu Sans, DejaVu Serif, DejaVu Sans Mono and Roboto; the template gallery shows each one rendered.
A weight that is not installed is drawn with the nearest one: DejaVu Sans at font-weight: 300 came out as the regular 400. An italic that is not installed is slanted by Chrome: DejaVu Sans has no italic file, and font-style: italic produced an oblique of the upright letters. For a real light weight or a true italic, use Roboto, Open Sans or Ubuntu.
A font we do not have falls back — check how
Template HTML is not checked against the font list, so a template can name any family. What happens then is the most common font surprise. We rendered the same line four ways:
| CSS on the element | Rendered in |
|---|---|
font-family: Inter |
a Times-like serif |
font-family: Montserrat |
a Times-like serif |
font-family: Inter, sans-serif |
an Arial-like sans, not Roboto |
| none (inherits the base stack) | Roboto |
The first case surprises most people: an element that names only an unknown family does not inherit Roboto from the page — font-family on the element replaces the inherited list, and Chrome's own default font is a serif. So always write a full stack with one of our families before the generic one:
.title { font-family: Inter, Roboto, sans-serif; font-weight: 700; }
If you later run the same HTML somewhere Inter is installed, it uses Inter; with us it uses Roboto, which you chose and previewed, rather than whatever Chrome picks. A few common names are mapped to look-alikes on the renderer: Arial and Helvetica render in Liberation Sans, Times New Roman in Liberation Serif, Calibri in Carlito.
Emoji
Noto Color Emoji is installed, and Chrome uses it automatically for emoji inside any font — no need to name it. In our test, inside Roboto text, these all rendered in colour: 🎉 🚀, a thumbs-up with a skin tone (👍🏽), a combined emoji (👩💻, a woman and a laptop joined by a zero-width joiner), a flag (🇵🇱) and ✅. The installed version is the Debian package of Noto Color Emoji 2.051. An emoji newer than the font, or a sequence the font does not combine, shows as separate pictures or a box; send one test render with the emoji you plan to use.
Emoji are large, detailed pictures. At small sizes — a badge, a footer line — they read as coloured dots; give them at least the size of the surrounding text, and keep one or two per image rather than a row.
Other writing systems
The families in the list cover Latin, Greek and Cyrillic (Roboto, Open Sans, Ubuntu, DejaVu) and Chinese and Japanese (Noto Sans CJK). The renderer also has fonts for other scripts, which Chrome picks per character when the named family lacks a glyph. In two test renders, Arabic, Hebrew, Hindi (Devanagari), Thai, Korean, Chinese, Japanese and Vietnamese all came out with the right shapes, and Arabic letters joined correctly.
Those extra fonts are not part of the GET /v1/fonts promise: they serve as fallbacks, and their design may not match the family you named. Name a listed family for the Latin text and let fallback handle the rest, then check a preview in each language. Right-to-left layouts need more than fonts — see localized images.
Brand fonts: what to do instead
We do not host customer fonts: template CSS loses @font-face, @import and any url() outside data: when it is saved, and the renderer does not fetch fonts from the network. That keeps every render fast and the same as its preview, and it means a font licence never has to cover our servers. If your brand uses its own typeface, three things work:
- Choose the closest listed family for changing text: Roboto or Open Sans for most neutral sans-serif brands, Ubuntu for rounder ones, DejaVu Serif for serif text. Match weight and letter spacing, which matter more than the letter shapes at social-card sizes.
- Put fixed lettering in an image. A logo, a wordmark or a tagline that never changes can be a PNG or SVG in an image field, exported from your design tool with the brand font.
- Keep the font for the parts people read slowly — your website, your documents — and use the template for what changes: titles, names, numbers.
What does not work: text that changes per render, set in a font we do not have. Any service that renders it has to have the font file.
Size and long text
Font size is up to the template, and long values are handled by the template too: the built-in templates shrink a long title to fit its box, and your own templates can do the same with a .fitbox container and data-autofit (API reference). Raster images come out at twice the template size by default, so small text stays sharp on high-density screens.
Checking before a campaign
- Call
GET /v1/fontsand use only those families infont-familylists, each ending with a generic family. - Preview the template with the longest text, the emoji and every language you will send — previews are free and do not use quota.
- If a line looks like Times or Arial and you did not ask for it, the family is missing: fix the stack, not the text.
If you render HTML yourself with Puppeteer instead, the same rules apply on your own machine — install the fonts and emoji you need; our Puppeteer emoji and fonts guide shows how. Chrome's font matching follows the CSS rules for font-family and font fallback; the emoji font is Google's Noto Emoji project.