Three free sans-serifs come up whenever someone starts a SaaS design system: Inter, Geist and Satoshi. All three are free for commercial use and look clean in a hero headline. In a settings page at 13px they behave very differently, and so do their licences. This post compares the three on what product UI actually needs, then picks the monospace for each.
Want just two of them side by side with live previews? See Geist vs Inter, Satoshi vs Inter and Geist vs Satoshi. This post is the three-way decision.
The short answer
- Inter if your product is dense, multilingual or numeric. It has the tallest x-height of the three, an optical-size axis, a slashed-zero feature and Cyrillic plus Greek.
- Geist if you want something that reads as current and is lighter to load, and you’ll pair it with its own mono. It is the default font in a new Next.js app.
- Satoshi if the product is brand-led, Latin-only and not text-dense. Its small x-height makes it the weakest of the three for small UI text, and its licence is not open source.
Side by side
| Inter | Geist | Satoshi | |
|---|---|---|---|
| Designer | Rasmus Andersson | Vercel with Basement Studio and Andrés Briganti | Deni Anggara, Indian Type Foundry |
| First public release | 2017 | October 2023 | — |
| Licence | OFL-1.1 | OFL-1.1 | ITF Free Font License |
| Get it from | Google Fonts, GitHub | Google Fonts, GitHub, npm geist | Fontshare |
| Variable axes | wght 100–900, opsz 14–32 | wght 100–900 | wght 300–900 |
| Italics | Yes | Yes | Yes |
| x-height (share of em) | 0.546 | 0.530 | 0.484 |
Tabular figures (tnum) | Yes | Yes | Yes |
Slashed zero (zero) | Yes | No | No |
| Scripts beyond Latin | Cyrillic, Greek, Vietnamese | Cyrillic, Vietnamese | None |
| Latin web font, as served | ~73 KB with opsz, ~48 KB without | ~29 KB | ~43 KB (one file, can’t be subset) |
x-heights are measured from the height of the x glyph in the Regular instance of each font. File sizes are the WOFF2 that Google Fonts and Fontshare served for the full weight range on 2026-10-18.
x-height decides small UI text
Product UI lives at 12–14px: table cells, form labels, menus, tooltips. At those sizes the height of the lowercase matters more than anything else on the specimen page.
At font-size: 14px, the lowercase x is about 7.6px tall in Inter, 7.4px in Geist and 6.8px in Satoshi. To give Satoshi the same lowercase height as 14px Inter you have to set it at about 15.8px, which costs you rows in every table.
That gap comes from proportions, not quality. Satoshi’s lowercase is short relative to its capitals (x-height is 68% of cap height, against 75% for both Inter and Geist). That is what makes it look elegant at headline sizes and a little small in a sidebar.
Inter adds one more advantage here: its opsz axis runs from 14 to 32. Browsers apply it automatically (font-optical-sizing: auto is the default), so text at 14px and below gets the text design and large headings move toward the Display design, all from one file. Neither Geist nor Satoshi has an optical-size axis.
Numbers, IDs and lookalike letters
All three have tabular figures. None of them uses them by default, so turn them on wherever digits line up in columns:
.table, .metric, .price {
font-variant-numeric: tabular-nums;
}
For IDs, API keys and anything a user might type back, glyph confusion matters more than column alignment:
- Inter is the most configurable. Its
zerofeature gives a slashed zero (font-variant-numeric: slashed-zero), and stylistic setss02(“Disambiguation”) swaps in distinct forms for the usual suspects. Character variantscv05(lowercase l with tail) andcv08(uppercase I with serif) are there if you only want one. - Geist draws its lowercase
lwith a tail by default, soIl1is already readable. There is no slashed-zero feature in the sans. - Satoshi has four stylistic sets, all aesthetic (alternate a, g, t, G and Q). Its capital
Iand lowercaselare both plain vertical bars, and there is nothing to switch on. Don’t use it for anything a user has to read back character by character.
For the background on why figures matter so much in product UI, see Best Fonts for Legible Numerals in UI Design.
Licence: the difference most comparisons skip
Inter and Geist are under the SIL Open Font License. You can self-host them, subset them, commit them to a public repo and bundle them in an npm package.
Satoshi is free, but under Indian Type Foundry’s own ITF Free Font License (version 2.0, dated 17 August 2026, in the download). Commercial use, self-hosting and app embedding are all allowed. It also says:
- No modification, and that explicitly includes subsetting and format conversion. You ship the files Fontshare gives you. Your build pipeline’s font subsetter can’t touch them.
- No redistribution. That covers “publicly accessible servers”, any “repository” and other font libraries, so committing the font files to an open-source repo or publishing them in a package is out. Load them from the Fontshare API or keep them in a private deployment.
- No offering it to your users as a font choice. A SaaS template editor or design tool where customers pick Satoshi for their own content is explicitly excluded.
None of that stops a typical SaaS from using Satoshi on its own marketing site and app. It does rule it out for open-source products, embeddable widgets that ship font files, and anything with a font picker. Our licence guide covers the general differences.
Ecosystem and defaults
Defaults are why these three get compared at all:
- Geist ships with Next.js.
create-next-apploadsGeistandGeist_Monofromnext/font/googlein its default layout, so a lot of new products start in Geist before anyone picks a font. - Inter is the default body font of VitePress, which bundles its own subsets of the variable font, and it has been on Google Fonts since January 2020. The 4.0 release in November 2023 added the
opszaxis and humanist-style italics. - Satoshi comes from Fontshare, ITF’s free library, via a CSS API or a direct download.
One more thing about Geist worth knowing. Its own README calls Geist Sans “designed to be used in headlines, logos, posters, and other large display sizes” and lists Inter, SF Pro, Suisse International and ABC Diatype among its influences. It works in UI, but the brief behind it was display-first. If you liked Geist because it looks like Suisse, that is a paid family, and Geist is one of the free routes to that look.
Which mono to pair with each
A UI sans needs a monospace partner for code, IDs, logs and terminal snippets. The test that matters most is x-height: if the mono’s lowercase is taller or shorter than the sans next to it, inline code looks like it came from another page. Divide the sans’s x-height by the mono’s and you get the font-size (in em) to set the mono at:
| Sans | Mono | Mono size for matching x-height |
|---|---|---|
| Geist | Geist Mono | 1.00em (identical metrics) |
| Inter | JetBrains Mono | 0.99em |
| Inter | Geist Mono | 1.03em |
| Satoshi | Geist Mono | 0.91em |
| Satoshi | JetBrains Mono | 0.88em |
| Satoshi | Source Code Pro | 1.00em |
Geist → Geist Mono. The obvious pair, and the numbers back it up: both have an x-height of 530 and a cap height of 710 units per 1,000, and the same credited designers. Geist Mono is variable (wght 100–900) with italics, has a slashed zero by default (ss09 gives a plain one), and its coding ligatures are opt-in through ss11, so => stays two characters unless you ask. It also has the full box-drawing block, which matters if you render CLI output.
Inter → JetBrains Mono. The x-heights are within 1% at the same font-size, so inline code needs no size correction. Both cover Cyrillic and Greek. Geist Mono has Cyrillic but no Greek subset on Google Fonts. JetBrains Mono’s ligatures live in calt, so turn them off in UI (font-variant-ligatures: none) and let people keep them in their editor. The Geist Mono vs JetBrains Mono comparison shows them side by side.
Satoshi → Geist Mono at about 0.9em. Satoshi has no monospace sibling. Geist Mono’s clean, low-contrast drawing sits comfortably next to it once you scale it down to Satoshi’s smaller x-height. Source Code Pro matches Satoshi’s x-height at the same size if you’d rather not scale anything.
To pin the ratio once instead of per element, font-size-adjust (supported in all major browsers since 2024) scales a font so its x-height is a set share of the font size:
:root {
--font-ui: "Inter", system-ui, sans-serif;
--font-code: "JetBrains Mono", ui-monospace, monospace;
}
code, kbd, samp, pre {
font-family: var(--font-code);
font-size-adjust: 0.546; /* Inter's x-height */
font-variant-ligatures: none;
}
Willing to pay for the mono? MonoLisa is a commercial coding font that comes in personal (Developer) and commercial (Creator) licences, and MonoLisa vs JetBrains Mono shows how close the free option gets. For a broader view of free monos, see Best Free Monospace Fonts for 2026.
Picks by situation
- Data-heavy B2B app, admin panels, analytics: Inter + JetBrains Mono. Tallest x-height,
opsz, slashed zero, Greek and Cyrillic. Moving off Roboto? Inter vs Roboto covers that switch. - Developer tool, Next.js product, or anything with lots of code on screen: Geist + Geist Mono. Matched metrics, the lightest pair to load here, and already wired into the framework.
- Brand-led consumer SaaS with short, large text: Satoshi for headings and marketing, with Inter or Geist for dense app screens if the product grows. Check the licence before shipping it in anything open source.
FAQ
Is Geist just a copy of Inter?
No. Geist’s README lists Inter as one influence among several (Univers, SF Pro, SF Mono, Suisse International, ABC Diatype). The two differ where it shows in UI. Geist has a tailed l, a shorter x-height (0.530 against 0.546) and no optical-size axis.
Is Satoshi free for commercial use? Yes. The ITF Free Font License allows personal and commercial use in any medium, including self-hosted web fonts and apps. It is not an open-source licence: you can’t modify, subset or redistribute the files, or offer the font to your own users as a choice.
Can I use Satoshi in an open-source project? Not by committing the font files. The FFL bars making them available through public repositories or servers. Loading Satoshi from the Fontshare API keeps the files out of your repo. If you want a font you can vendor freely, use Inter or Geist.
Which is best for dashboards? Inter, for the x-height, the optical-size axis and the slashed zero. See Best Fonts for Dense Dashboards for the wider field.
Does Geist Mono have ligatures?
Yes, but they’re off by default. Turn on stylistic set ss11 (“Coding ligatures”) with font-feature-settings: "ss11" if you want them.
Which of the three loads fastest?
Geist. Its Latin WOFF2 from Google Fonts was about 29 KB for the full weight range, against about 48 KB for Inter without opsz (73 KB with it) and about 43 KB for Satoshi’s single variable file.