Geist
About Geist
- Source
- Google Fonts ↗
- Classification
- sans-serif
- Weights
- Variable (100-900)
- Features
- Variable, Italics
Free to use, modify, and distribute. Can be used commercially without attribution.
What's allowed?
- ✓ Client work
- ✓ SaaS / Web apps
- ✓ YouTube / Video
- ✓ Sell products
- ✓ Print materials
Note: Derivative fonts must use the same license.
Full license guide →Geist is a Swiss-influenced sans-serif commissioned by Vercel and drawn at basement.studio. Vercel announced it on 27 October 2023; it entered the Google Fonts catalogue on 2 October 2024. The version shipping there today is 1.800: two variable files, roman and italic, one wght axis each running 100–900, nine named instances per file, 975 glyphs and 728 mapped codepoints. Google's metadata API put it between 20 and 40 million requests a day across the 90 days ending 11 August 2026, averaging 29 million. Three things most write-ups about it get wrong, all fixed below: it does have italics, it does have Cyrillic, and the file Google's CSS API serves is not the file the specimen describes.
What Geist is, and where it came from
Vercel commissioned the typeface. basement.studio drew it. Those two credits get collapsed constantly, and the binary keeps them apart: the Designer record (name ID 9) reads Basement.studio, Andrés Briganti, Mateo Zaragoza, the Manufacturer record (name ID 8) reads Basement.studio, Vercel, Andrés Briganti, Guido Ferreyra, Mateo Zaragoza, and the vendor ID in the version string is VRCL. Briganti and Zaragoza are the designers; Ferreyra is the font developer and authored the Cyrillic redesign that shipped in 2026. Google's METADATA.pb lists six names — those two plus Guillermo Rauch, Evil Rabbit, José Rago and Facundo Santana — which mixes drawing credit with the principals on both sides of the commission. The Designer record names only basement.studio's people.
The official statement of ancestry is in the upstream repository's readme, under a heading called "Inspiration", and it has been there unchanged since the 1.0.0 tag in October 2023. Geist "has been influenced and inspired by the following typefaces": Inter, Univers, SF Mono, SF Pro, Suisse International, ABC Diatype Mono and ABC Diatype. Seven faces, named by the people who drew it — worth taking at face value, and worth reading closely, because two of them (ABC Diatype and SF Pro) turn up again below as premium faces Geist is asked to replace. basement.studio's own account is the narrative around that list rather than a rival to it: Vercel approached them in late 2022 with a short brief — legibility at small sizes, a modern aesthetic, a "techy vibe", consistency across weights — and it names a shorter version of the same set. Beyond those two sources, every comparison you will read is somebody's inference. Vercel's framing is shorter: Geist "embodies our design principles of simplicity, minimalism, and speed, drawing inspiration from the renowned Swiss design movement," made for "developers and designers."
The upstream repo makes the family's history easy to check, which matters because much of the published description still refers to the launch build. 1.0.0 shipped 27 October 2023; Cyrillic in 1.1.0 that November; 1.3.0 (March 2024) redrew base letters and raised the x-height in the heaviest master; 1.4.0 (September 2024) made "many changes to comply Google Fonts spec", immediately preceding the Google onboarding. Italics for both Geist and Geist Mono landed in 1.5.0 on 28 May 2025, Vietnamese in 1.6.0 that November, a full Cyrillic redesign in 1.7.0 in January 2026 — which also moved Geist Mono's coding ligatures out of the defaults and into its Stylistic Set 11 — and 1.8.0 in March 2026. That ligature change is worth qualifying, because it gets quoted as a family-wide one and it is not: it applies to Mono. Geist Sans's liga still carries its ligatures and is still on by default.
The family now has three members: Geist Sans, Geist Mono and Geist Pixel, the five-variant pixel set announced on 6 February 2026. All three are on Google Fonts. Pixel was added on 10 June 2026, and the catalogue build is not the same shape as the one on vercel.com/font: instead of five separate cuts it is a single variable file on an ELSH axis running 0–100, with Square, Circle, Grid, Triangle and Line sitting on that axis as named instances.
Design characteristics
Numbers below are measured from the v1.800 google/fonts binary at wght 400, on a 1000-unit em.
Ascenders stop at the cap line. x-height is 530, cap height 710, and l and b top out at exactly 710 — the same as H. There is no ascender overshoot at all, which is the single most consequential decision in the design: mixed-case lines have a flat top edge, so headlines read as an even band and all-caps settings sit flush against lowercase rather than towering over it. The x-height/cap ratio is 0.75 and x-height/em is 0.53 — large, in the screen-first grotesque range, but not extreme.
Descenders are short. p and y reach −150, g −162, against a 530 x-height. Short descenders plus no ascender overshoot means Geist tolerates tight leading better than most sans-serifs of this x-height. The declared metrics disagree: hhea and typo ascender/descender are both 1005/−295 with lineGap 0, and Google's metadata gives a default line height of 1.30 — considerably more air than the drawing needs. Set line-height yourself.
The x-height is not constant across the axis. It sits at 530 from Thin through Regular, then climbs in two-unit steps: 532 at 500, 534 at 600, 536 at 700, 538 at 800, 540 at 900. Cap height stays 710 at every weight. The whole rise is 10 units — about 2% — and the font declares it rather than leaving you to measure: MVAR carries an xhgt record, so OS/2.sxHeight reports the correct value at any point on the axis. That is deliberate optical compensation — the upstream 1.3.0 changelog records "Heaviest master x-height raised" — so a Black setting is proportioned slightly differently from a Regular one, not just fatter. Measure it off x, not o or n: those are round and arched, and overshoot the x-height by 12 units at every weight, which is how the effect gets reported as twice its real size.
The stroke model is near-monoline. In o at Regular the vertical stems measure 88 units against 80 for the horizontal top and bottom — a thin/thick ratio of 0.91, conventional horizontal thinning and nothing more. Stems elsewhere at Regular: n 84, H 86, I 86, l 84. Every coordinate in the shipped file is an integer.
Eleven stylistic sets, and the binary names all of them. ss01 "No tail a", ss02 "Alt a" (a single-storey ɑ), ss03 "Alt l" (straight, tailless), ss04 "Alt R", ss05 "Alt I", ss06 "Alt G", ss07 "Alt arrows", ss08 "Rounded dot" (85 substitutions, by far the largest), ss09 "Alt numbers" (two substitutions — zero and one), ss10 "Alternative enclosing shapes" (brackets, braces, parens, guillemets, angle brackets) and ss11 "Contextual brand styles". Nine of the eleven are plain one-for-one swaps. ss10 is a ligature lookup — as well as swapping each bracket, brace, paren, guillemet and angle bracket for an alternate, it turns << and >> into single guillemet glyphs. ss11 is the only contextual set in the file — it substitutes the alternate I and the alternate zero, the same glyphs ss05 and ss09 reach directly, but only in particular surroundings. It holds no ligatures, and if you have read that it does, that is a Geist Mono fact on the wrong page: Mono's ss11 is called "Coding ligatures" in its own binary, and Mono's is the one that carries them. Defaults: a is double-storey with a tail, and l carries a tail curving right at the foot — the default l extends to x=243 where ss03's straight, tailless l stops at 176, so the swap is a visible one, not a detail. Vercel's own spec panel at vercel.com/font still says nine stylistic sets, and basement.studio's 2024 write-up still says 825 glyphs. Against the shipped file both are stale: eleven sets, 975 glyphs.
The rest of the feature list. GSUB carries aalt, case, ccmp, dlig, dnom, frac, liga, locl, numr, ordn, pnum, sinf, ss01–ss11, subs, sups and tnum; GPOS has kern, mark and mkmk. liga holds exactly eleven substitutions — ff, fi, fl, tt and seven arrow forms (->, -->, --->, <-, <--, <---, <->). dlig holds two: AI and UI. Default figures are proportional (zero 663 units, one 384, seven 524); tnum swaps in a tabular set where every digit is 600. ordn maps No. to the numero sign №.
The italic is a sloped roman. italicAngle is −12.0 and the roman skeleton is kept — a stays double-storey, g stays single-storey. It is not a cursive italic. It is also not a mechanical oblique: the outlines are separately drawn, with different contour and point structure from the roman in a, e, g, k, l, n, o, R, t, u, b and y. Roman and italic are two files joined by a STAT table declaring wght and ital; there is no interpolable slant.
One axis, nine instances, two files. wght 100–900, default 400, identical in both files. The named instances in the binary are Thin, ExtraLight, Light, Regular, Medium, SemiBold, Bold, ExtraBold, Black — and Thin Italic through Black Italic. Vercel's web playground labels the same nine differently: Thin, Ultra Light, Light, Regular, Medium, Semi Bold, Bold, Black, Ultra Black. Those are not marketing inventions — they are the original style names, still on the site. The 1.0.0 release really did ship Geist-UltraLight.woff2 and Geist-UltraBlack.woff2, and the 1.4.0 changelog lists "Renamed styles" among the changes made "to comply Google Fonts spec". The catch is that the rename was not a straight relabel at the top of the scale, and this is where people lose a weight: the playground's Black is 800, which the binary calls ExtraBold, and its Ultra Black is 900, which the binary calls Black. Match by number, not by name.
The Google-served files are not the full font
This is the practical detail nobody mentions, and you can verify it by downloading what the CSS2 API returns. The subsetted woff2 files Google serves are feature-stripped: the latin subset retains only ccmp, dnom, frac, liga, locl, numr, pnum and tnum, and the latin-ext subset retains only locl. None of ss01–ss11 survive, and neither does dlig. So font-feature-settings: "ss02" against the Google-hosted font does nothing — the single-storey a, the straight l, the alternate R and G and the alternate figures all require self-hosting the full file from vercel.com/font or the google/fonts TTF.
The reverse surprises people too: the arrow ligatures live in liga, which is on by default and does survive subsetting. Typing -> in Geist Sans renders as an arrow glyph even through the Google-served subset. In prose, that is usually a bug.
Where Geist works
Product and marketing UI is the obvious home and a genuine strength. The flat top edge and short descenders let interface text sit on tight line heights without collisions — dense tables, sidebars, form labels, dashboard chrome — and the tabular set behind tnum survives into the Google subset, so numeric UI works without self-hosting. Nine weights on a single variable axis cover a full type scale from one file, and the italic gives you a real emphasis channel rather than forcing everything through weight.
Documentation sites and developer-facing marketing are the second fit, mostly because Geist Mono exists and is drawn to the same brief, so prose and code share a voice. It also holds up at display sizes: the near-monoline stroke and 0.75 x-height ratio give large headlines a flat, engineered look, and the heavier masters' raised x-height keeps Black settings from looking top-light.
Where Geist struggles
Long-form reading. A 0.53 x-height with no ascender overshoot is a screen-UI proportion, not a book proportion. Over several hundred words, the flat top edge that makes interfaces tidy reduces the word-shape variation readers use to skim. For running editorial text, pair it with a serif and let the serif carry the body.
Anything needing a width or optical-size axis. There is exactly one axis. No condensed, no display cut, no optical sizing. A design system that wants width contrast has to leave the family.
Neutrality cuts both ways. Geist was drawn to feel like infrastructure and succeeds at it. Its default forms carry little personality, and the alternates that would give it some — ss02's single-storey a, ss03's straight l, ss06's alternate G — are precisely the ones the Google CDN strips. Distinctiveness costs you a self-hosting setup.
No Greek. The coverage settles it: exactly six Greek-block codepoints are mapped — Λ Ω λ μ π ω — and every one of them is a maths symbol. There is no Greek alphabet to set. Don't take the layout tables as the evidence here, because they cut the other way: GSUB declares DFLT and latn only, but GPOS declares DFLT, cyrl, grek and latn. The grek script is registered; there is simply nothing Greek for it to position.
Arrow ligatures on by default. In technical prose that mentions -> outside a code block, liga substitutes an arrow you did not ask for.
No hinting. The file is unhinted TrueType with PANOSE left all zeros. On modern rendering stacks that is unremarkable; if you are targeting old Windows GDI rendering, test rather than assume.
Which premium fonts Geist substitutes for
The substitution case is strongest against neutral, screen-first grotesques with a wide weight range, and weakest wherever the premium face was chosen for a specific quirk.
- SF Pro Display and ABC Diatype are the two cases where you are not guessing: both are named in the upstream readme's list of acknowledged influences. That is as close to a designer-endorsed substitution as this catalogue gets, and it should reorder how you test. Geist is a legitimate stand-in for SF Pro in web and cross-platform contexts where the Apple licence does not reach — though it is not metric-compatible, so an SF Pro layout will reflow, and SF Pro's optical-size behaviour has no equivalent here. Diatype is the more interesting swap of the two: an influence rather than a target, so expect a shared temperament and different specifics, and expect Geist to be the plainer face.
- Söhne, Akkurat and Calibre are the neo-grotesque swaps, and the strongest group after those two. Geist substitutes for the register — neutral, Swiss, evenly weighted, built for screens — and covers the same jobs at the same sizes with a wider weight range than most of them offer. What it does not do is reproduce their letterforms. Set the
a,g,Randtside by side at 120px before committing; that is where each family declares itself and where the substitution holds or fails. - Aeonik and Moderat are the geometric case, and it needs stating carefully, because Geist's own makers describe it as "a modern, geometric typeface that is based on the principles of classic Swiss typography". Take the label; check the drawing. The skeleton is grotesque rather than compass-derived: at Regular the
Omeasures 649 units wide against 742 tall and theo485 against 554 — narrowed ovals in both cases, not rings — and the acknowledged influences are Univers, Suisse International and Inter, all grotesques. Geist substitutes for the temperature — contemporary, technical, tech-adjacent — but if circular geometry is what got Aeonik or Moderat chosen, this is the wrong direction. - Neue Montreal and Favorit are the weakest matches here, and for the same reason: both carry deliberate character that Geist's defaults do not. Geist is the more neutral face by design. Where those were picked for the quirk, no neutral grotesque substitutes.
- Instrument Sans and Satoshi deserve a straight answer: both are already free, so this is a fit question, not a cost one. Instrument Sans is on Google Fonts under the OFL with weight and width axes. Satoshi's licence forbids modification and subsetting where Geist's OFL permits both. Geist's own case is nine weights, drawn italics and Cyrillic.
- Pitch Sans is the honest non-substitute. It is monospaced; Geist Sans is proportional, and where fixed widths are the point — aligning code, tabular data, a deliberately mechanical grid — it cannot stand in. Use Geist Mono or JetBrains Mono instead.
Pairing Geist
Contrast structurally, not decoratively. Geist is near-monoline, flat-topped and large in the x-height; a partner should differ on at least two of those or the page reads as an accident rather than a system.
The natural partner is Geist Mono — same commission, same brief, fixed widths for code, data and captions, with nine weights and italics of its own. For editorial contrast, a serif with real stroke modulation does the separating: Instrument Serif at display sizes, Source Serif Pro, Newsreader or Literata when the serif carries running text and Geist handles interface furniture.
Pair it with itself using the axis, not just the named steps: 400 body against 600 or 700 headings is a cleaner ramp than jumping to 900, whose raised x-height changes the proportions. What to avoid is the rest of the neutral free-sans shelf — Inter most of all, since the designers named it as a reference, but also Public Sans, Work Sans and Figtree. Two faces that are 90% alike look like a mistake.
Licensing and self-hosting in plain terms
Geist is under the SIL Open Font License 1.1. That is stated four ways: OFL.txt in google/fonts/ofl/geist, the binary's licence record (name ID 13), the GitHub repository's OFL-1.1 licence, and vercel.com/font's own "Licensed under OFL". The copyright string is Copyright 2024 The Geist Project Authors (https://github.com/vercel/geist-font). fsType is 0 — installable embedding, no restriction.
- You may use it commercially, on the web, in apps, in client work, embedded in documents and inside products you sell — and you may self-host, subset and modify it.
- You must keep derivatives under the OFL and ship the licence with the files.
- You may not sell the font on its own. Bundling it inside something you sell is fine; selling the font as the product is not.
Google's CSS2 API serves both roman and italic as variable woff2 with font-weight: 100 900, split across latin, latin-ext, vietnamese, cyrillic and cyrillic-ext subsets. That is the low-effort path and it is fine for most sites — unless you need stylistic sets. If you do, take the full files from vercel.com/font or the google/fonts TTFs and subset them yourself; the upstream repo also ships 18 static styles per family (nine weights × roman and italic) in otf, ttf and woff2, plus the two variable webfonts.
Frequently asked questions
Does Geist have italics?
Yes — nine, Thin Italic through Black Italic, in a separate variable file with italicAngle −12.0. They shipped upstream in 1.5.0 on 28 May 2025 and are in the Google Fonts release: Geist-Italic[wght].ttf sits alongside the roman, and css2?family=Geist:ital,wght@0,100..900;1,100..900 returns real italic @font-face rules. Any page telling you Geist has no italics is out of date. They are sloped romans, not cursive italics.
Who actually designed Geist? Andrés Briganti and Mateo Zaragoza at basement.studio, with Guido Ferreyra as font developer. Vercel commissioned and publishes it. The binary's name table carries the two credits separately.
Is Geist really on Google Fonts, or just hosted by Vercel?
Genuinely in the open catalogue. google/fonts/ofl/geist exists with OFL.txt and METADATA.pb, date_added is 2024-10-02, and the CSS2 src URLs point at fonts.gstatic.com/s/geist/v5/ — the open-catalogue path.
Does Geist support Cyrillic? Yes. The binary maps 134 Cyrillic codepoints and Google serves separate cyrillic and cyrillic-ext subsets. Cyrillic arrived in 1.1.0 (November 2023) and was completely redrawn in 1.7.0 (January 2026), so use a current build. Vietnamese is covered too, added in 1.6.0. Greek is not: the six Greek-block characters present are maths symbols.
Why don't the stylistic sets work on my site?
You are almost certainly loading the Google-hosted subset, and none of ss01–ss11 survive subsetting. Self-host the full file to get the alternate a, l, R, G, arrows or figures.
Why does typing -> turn into an arrow?
Seven arrow forms sit in liga, which browsers enable by default and which does survive Google's subsetting. Set font-variant-ligatures: none or font-feature-settings: "liga" 0 on the affected text.
How many weights does Geist have?
Nine, 100 to 900 in 100 steps, in both roman and italic — 18 styles. Google ships them as two variable files with a single wght axis; the upstream repo also provides all 18 as statics.
Is there a Geist Mono?
Yes, on Google Fonts too, with matching italics from the same 1.5.0 release — see Geist Mono. Geist Pixel makes three: five variants, introduced on 6 February 2026, and on Google Fonts since 10 June 2026. Older write-ups say Pixel is vercel.com/font-only, and that stopped being true in June. The catalogue version differs from the one Vercel distributes — one variable file on an ELSH axis rather than five separate cuts, with Square, Circle, Grid, Triangle and Line as named instances on it.
Which brands use Geist? There is no verifiable public list. Vercel's own properties are the only usage confirmable from a primary source, since Vercel commissioned and publishes the family. The one honest adoption measure is request volume — over the 90 days to 11 August 2026, Google's metadata API showed a daily range of 20 to 40 million, averaging 29 million and trending up through the window — which says the font is widely loaded and nothing about who loads it. Treat specific brand claims as unsourced unless someone shows you the CSS.
Is Geist free for commercial use? Yes. OFL 1.1 permits commercial use, embedding, self-hosting, subsetting and modification. Derivatives stay under the OFL, and you cannot sell the font file by itself.
Is Geist on Google Fonts?
Yes, Geist is available for free on Google Fonts. Get Geist on Google Fonts ↗
Alternative For (12)
Geist is a free alternative to the following premium fonts:
Tech-focused neo-grotesque with similar market positioning
Modern system font with similar tech-forward aesthetics and tight, efficient proportions
Tech-focused grotesque with rational character that shares Favorit's contemporary positioning
Vercel's system font with similar tech-forward aesthetics and screen optimization
Vercel's own typeface with very similar tech-focused aesthetic
Developer-focused neo-grotesque with similar technical precision and rational construction
Compare Geist
See how Geist compares to other fonts side by side.
Variable Font Axes
Geist is a variable font with 1 axis you can fine-tune.
| Axis | Min | Default | Max |
|---|---|---|---|
| wght | 100 | 400 | 900 |
Font Pairings
Fonts that pair well with Geist based on contrast and complementary design characteristics.
Performance
Key metrics for evaluating Geist in production.
- Score
- 70 /100 Good
- File Size
- 114.1 KB Light
- Weights
- 9 (variable)
- Languages
- 2 groups CDN delivery
Font Metrics
- x-Height Ratio
- 0.53
- Cap Height Ratio
- 0.71
- Ascender
- 1005
- Descender
- -295
Fallback CSS Overrides
Apply these overrides to Arial to minimize layout shift when loading Geist.
@font-face {
font-family: 'Geist Fallback';
src: local('Arial');
ascent-override: 100.5%;
descent-override: 29.5%;
line-gap-override: 0%;
size-adjust: 102.21%;
} How to Use Geist
Copy these code snippets to quickly add Geist to your project.
CSS code for Geist
@import url('https://fonts.googleapis.com/css2?family=Geist:wght@100..900&display=swap'); HTML code for Geist
<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=Geist:wght@100..900&display=swap" rel="stylesheet"> Tailwind code for Geist
// tailwind.config.js
module.exports = {
theme: {
extend: {
fontFamily: {
'geist': ['Geist', 'sans-serif'],
},
},
},
}
// Usage in HTML:
// <p class="font-geist">Your text here</p> Next.js code for Geist
// Using next/font (Next.js 13+)
import { Geist } from 'next/font/google';
const geist = Geist({
subsets: ['latin'],
weight: ['100', '200', '300', '400', '500', '600', '700', '800', '900'],
});
export default function Component() {
return (
<p className={geist.className}>
Your text here
</p>
);
}
// Or using inline styles with Google Fonts link:
// <p style={{ fontFamily: "'Geist'" }}>Your text</p> Expo and React Native code for Geist
// Install: npx expo install @expo-google-fonts/geist expo-font
import { useFonts, Geist_400Regular } from '@expo-google-fonts/geist';
export default function App() {
const [fontsLoaded] = useFonts({
Geist_400Regular,
});
if (!fontsLoaded) return null;
return (
<Text style={{ fontFamily: 'Geist_400Regular' }}>
Your text here
</Text>
);
}