Fonts I use
The typefaces I keep coming back to, what each one is good for, previews of all of them, and the Google Fonts link to load them.
A shelf of typefaces worth remembering, so I stop rediscovering the same ones. Each is grouped by the job it does, with a preview and where to get it. All but two are free on Google Fonts.
Display and headings
Big, short, and meant to be looked at rather than read for minutes.
Cubano, heavy and confident
Marcellus SC, quietly formal
Lacquer, ink bleeding at the edges
Alata, plain and modern
Reem Kufi, geometric and open
Cubano is the one from Fireship's videos.
Body and interface
Made to be read in long runs or at small sizes.
Sen, clean at small sizes
Lexend, built for easier reading
Rubik, soft corners, friendly
Outfit, geometric and even
Neuton, a serif that stays light
Sofia Pro, warm geometric sans
Lexend is the one worth knowing about: it was drawn around reading proficiency rather than looks, which is a different design goal from everything else here.
Handwriting
Different enough from each other to be worth keeping all five.
Kalam, marker on paper
Caveat, quick margin notes
Indie Flower, round and casual
Gloria Hallelujah, looping and loud
Schoolbell, small and scratchy
Loading them
Every Google Fonts one in a single request. This is the same URL the preview block above imports.
<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=Alata&family=Caveat:wght@400;700&family=Gloria+Hallelujah&family=Indie+Flower&family=Kalam:wght@300;400;700&family=Lacquer&family=Lexend:wght@300;400;600&family=Marcellus+SC&family=Neuton:wght@300;400;700&family=Outfit:wght@300;400;600&family=Reem+Kufi:wght@400;600&family=Rubik:wght@300;400;600&family=Schoolbell&family=Sen:wght@400;700&display=swap"
rel="stylesheet">Never ship this whole list to a real page. It is a catalogue, not a stylesheet. Pick the one or two you are actually using and request only those weights, because every extra family is another file the browser waits on.
display=swap shows fallback text immediately and swaps the real font in when
it arrives, which avoids a stretch of invisible text on a slow connection.
On Next.js, next/font/google is the better route. It downloads the files at
build time and serves them from your own domain, so there is no request to
Google at runtime and no layout shift.
import { Lexend } from 'next/font/google'
const lexend = Lexend({ subsets: ['latin'], weight: ['400', '600'] })