Menu
Sign up

Fonts and emoji in generated images: what is installed, what falls back, and why

Which fonts and weights our templates can use, what happens to a font we do not have, how emoji and other scripts render, and what to do about brand fonts.

Published November 7, 2026 · 6 min read

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:

  1. 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.
  2. 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.
  3. 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

  1. Call GET /v1/fonts and use only those families in font-family lists, each ending with a generic family.
  2. Preview the template with the longest text, the emoji and every language you will send — previews are free and do not use quota.
  3. 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.

FAQ

Can I upload my own font?

No. Templates use the fonts installed on our renderer; @font-face, @import and external URLs are removed from template CSS. Pick the closest installed family, or put lettering that must be in your brand font into an image field, such as your logo.

Which fonts can I use in a template?

The families GET /v1/fonts returns: Roboto, Open Sans, Carlito, DejaVu Sans, DejaVu Serif, DejaVu Sans Mono, Ubuntu, Noto Sans CJK JP, Noto Sans CJK SC, Noto Color Emoji. Without a font-family, text uses Roboto. Name one of these families and end the list with a generic family such as sans-serif.

What happens if I name a font you do not have?

It falls back without an error. In our test, font-family: Inter on its own rendered in a Times-like serif, and Inter, sans-serif in an Arial-like sans — neither is Roboto. Add an installed family before the generic one: Inter, Roboto, sans-serif.

Do emoji render in colour?

Yes. Noto Color Emoji is installed, and in our test skin tones, combined emoji such as a person at a laptop, and flags all rendered in colour inside Roboto text, without naming the emoji font.