How the pair check reads a combination
Every font in the picker carries a class: serif, slab, sans, display or mono. The note under the preview compares the two classes and the heading weight you set. These are the rules behind each verdict.
| Heading | Body | Verdict | Reason |
| Serif or slab | Sans | Strong | Stroke contrast splits the two levels at a glance. |
| Sans | Serif | Strong for long reads | Serif body text holds the line on sharp screens. Keep paragraphs at 17px or larger. |
| Display | Sans or serif | Strong, headings only | Condensed and fat faces lose their shape under 28px. |
| One family | Same family | Fine | Contrast comes from weight and size alone. Set the heading at 600 or heavier. |
| Sans | A second sans | Risky | Two near-identical shapes look like a mistake. Push the weight gap to 300 or more. |
| Any | Mono | Niche | Fits docs and changelogs. Long prose in mono reads slow. |
| Any | Display | Avoid | Display faces tire the eye after two lines of text. |
Treat the verdict as a rule of thumb, not taste. Fraunces over Lora breaks the serif on serif rule and still looks right on a wine list or a menu. When the label and the preview disagree, trust the preview.
Eight starting pairs and where each one fits
The chips in the tool load these pairs with a matching heading weight. Each pair suits a different kind of page.
- Playfair Display 700 with Source Sans 3
- Magazine features and recipe blogs. Playfair hairlines need 32px or more, so keep the face off buttons and labels.
- Fraunces 600 with Inter
- Product blogs and changelogs. Fraunces brings soft, chunky serifs. Inter carries dense interface text down to 13px.
- DM Serif Display 400 with DM Sans
- Portfolios and studio sites. One team drew both, so cap heights line up. DM Serif Display ships a single weight.
- Oswald 600 with Lato
- Scores, event listings, dashboards. Condensed capitals fit long headlines into narrow cards without wrapping.
- Montserrat 700 with Merriweather
- Long guides and documentation. An inverted pair. Merriweather was drawn for screens, with a tall x-height for small sizes.
- Roboto Slab 700 with Roboto
- Admin panels and Android apps. Same skeleton, slab serifs added on top. Contrast comes from the serifs, not the shapes.
- Bebas Neue 400 with Karla
- Posters and event landing pages. Bebas Neue has capitals only. Lowercase input renders in caps too.
- Libre Baskerville 700 with Lato
- Law firms, bookshops, print-style sites. Baskerville runs wide. Set headings one step smaller than with a narrow serif.
What the code panel writes, line by line
With the default pair, the Link tag tab produces three lines for your page head:
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:wght@700&family=Source+Sans+3:wght@400;700&display=swap" rel="stylesheet">
- Two preconnect lines. The stylesheet comes from fonts.googleapis.com and the font files from fonts.gstatic.com. Opening both connections early saves a round trip on first visit. The second host needs
crossorigin because font files load in CORS mode.
- One heading weight.
wght@700 asks for the weight you picked and nothing else. Every extra weight is another file download, and most pages never use the 300 or 900 a template requests.
- Body regular plus bold. The body family gets 400 for paragraphs and 700 for
<strong>. When a family has no 700, the tool takes the heaviest weight it ships.
- Weights in ascending order. The css2 API rejects
wght@700;400 with an HTTP 400 error.
- Only weights the family ships. Ask Playfair Display for 300 and the whole request fails, so every font on the page falls back to system fonts. The weight menu lists only what each family offers.
- display=swap. Text shows at once in the fallback font, then switches when the web font arrives. Without the flag, Chrome hides text for up to three seconds on a slow connection.
The CSS rules tab sets two custom properties, --font-heading and --font-body, each with a fallback stack matched to the font class. Headings get sizes from the type scale in rem, so a user who raises the browser font size still gets the right ratios.
Limits worth knowing before you ship
- 38 fonts, not the full library. Google Fonts lists well over 1,500 families. The picker covers faces people pick most often for running text. For a niche face, copy its name into the URL pattern above by hand.
- No italics in the link. The italic word in the preview is a browser fake, a slanted upright. Serifs look crude this way. Add the italic axis yourself, for example
family=Lora:ital,wght@0,400;1,400.
- Latin text only. Cyrillic, Greek and Vietnamese coverage differs by family. Check the family page on fonts.google.com before you ship a site in those scripts.
- Visitor privacy. Loading from Google's servers sends each visitor's IP address to Google. In January 2022 a Munich regional court ordered a site operator to pay 100 euros in damages over this under GDPR. For EU audiences, download the files and self-host them.
- Renamed families. Source Sans Pro is now Source Sans 3, and Source Serif Pro is Source Serif 4. Older tutorials still use the Pro names. The picker uses the current ones.
- Network dependent preview. On a network blocking Google Fonts, the specimen falls back to system fonts and the status line says so.