Bitter + Karla

Grumpy wizards make toxic brew

A standfirst set in Karla, one size up — where a pairing starts earning trust.

The five boxing wizards jump quickly over the lazy dog, mixing jugs of quiet vodka while the jury watches. Click anywhere in this preview and type your own text to try the pairing.

“Type is a beautiful group of letters, not a group of beautiful letters.”

— Matthew Carter

Fig. 1 — Bitter over Karla, in the wild.

Bitter 700 / Karla 400 — click any section and type your own copy.

Why it works

Bitter is a slab serif designed for screens — sturdy rectangular serifs, minimal contrast, a large x-height — so bold headings feel warm and grounded rather than bookish. Karla brings a complementary looseness: its grotesque forms carry small irregularities in spacing and terminals that read as handmade charm at text sizes. Slab-plus-quirky-sans is a classic blog recipe because both faces are low-contrast and even in color, keeping the page cohesive while the serifs supply the personality.

More about each face: Bitter · Karla

Use this pairing

HTML — Google Fonts embed
<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=Bitter:wght@700&family=Karla:wght@400;600&display=swap" rel="stylesheet">
CSS
h1, h2, h3 {
  font-family: 'Bitter', Georgia, 'Times New Roman', serif;
  font-weight: 700;
}

body {
  font-family: 'Karla', 'Trebuchet MS', Helvetica, Arial, sans-serif;
  font-weight: 400;
}
Next.js — next/font
import { Bitter, Karla } from "next/font/google";

const heading = Bitter({
  subsets: ["latin"],
  weight: "700",
  variable: "--font-heading",
});

const body = Karla({
  subsets: ["latin"],
  weight: "400",
  variable: "--font-body",
});

Related pairings