Plus Jakarta Sans
About Plus Jakarta Sans
- 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 →Plus Jakarta Sans is an open-source geometric sans drawn by Gumpita Rahayu at Tokotype as the typeface for a city-branding programme, then released under the SIL Open Font License. It ships seven weights from 200 to 800, each with a matching italic — fourteen styles — as two variable files, one roman and one italic, each carrying a single wght axis. Google's metadata API gives it a popularity value of 13, shared with DM Sans, with only 20 of the catalogue's 1,942 families ranked ahead of it. Two things to know before committing: the default line box is 1.26 em, and coverage is Latin only — whatever the Google Fonts subset list appears to promise.
What it is, and where it came from
The design credit is Gumpita Rahayu, verified three ways: name ID 9 (Designer) in the shipped binary reads Gumpita Rahayu while name ID 8 (Manufacturer) reads Tokotype; google/fonts' DESCRIPTION.en_us.html says the family was "designed by Gumpita Rahayu from Tokotype"; and the project FONTLOG credits him on every design release — the one ChangeLog entry not in his name, v2.600 of 11 March 2022, is a build-system migration logged by Yanone. Worth stating, because Google's metadata API lists the designer only as the studio name (designer: "Tokotype" in METADATA.pb), so the sidebar Designer byline on the specimen page reads Tokotype alone. The individual credit does reach that page, but only inside the About text Google renders from DESCRIPTION.en_us.html — never in the field most tools, APIs and listings actually read. Tokotype is an Indonesian foundry; the URL in the binary's name ID 11 is https://www.tokotype.com.
This was commissioned work, not a speculative retail release. Both the google/fonts description and the project README say the fonts "were originally commissioned by 6616 Studio for Jakarta Provincial Government program's +Jakarta City of Collaboration identity in 2020". The official microsite words it differently — "+Jakarta City of Collaboration branding designed by 6616 Creative House. Custom Typeface designed & developed by Tokotype Studio" — both are primary, so pick one rather than blending them. Releasing it under the OFL was part of that programme, which is how a municipal identity font ended up among the most-served families on Google Fonts.
On influences the README is specific, and it is the only first-party statement of intent: "Neuzit Grotesk, Futura, and 1930s grotesque sans serif with almost monoline contrast and pointy curves". (google/fonts spells it "Neuzeit Grotesk" and "almost monolinear contrast".) Interwar grotesque skeleton, geometric proportion, contrast kept near flat, curves that come to a point rather than easing off.
The dates need care. Version 1.000 shipped 21 February 2020 per the FONTLOG; the family did not enter the Google Fonts catalogue until 24 March 2022 (date_added in METADATA.pb). Google currently serves 2.071, built with gftools 0.9.30; the upstream repo's latest tag is 2.7.1, published 26 May 2023. One piece of history still misleads people: v1.000 was structured as two optical sub-families, Plus Jakarta Display and Plus Jakarta Text, and the frozen microsite still shows them. The FONTLOG for v2.400, 4 December 2020, records "Removed Plus Jakarta Sans Text Version". Today it is one unified family with no optical sizes.
Design characteristics
Measured from PlusJakartaSans[wght].ttf at the default wght 400, on a 1000-unit em.
The top of the face is unusually tight. X-height 536, cap height 745, and the ascender — yMax of b and d — reaches 757, clearing the capitals by twelve units. Close enough to read as one line, so mixed-case text sets as an even band with almost no peaks above the caps. The x-height/cap ratio of 0.72 is generous without being extreme, matching the foundry's own account: an x-height set "slight taller to provide clear spaces between caps and x-height", with "open counter and balanced spaces". The bottom is less uniform: p and q stop at -200 while g, y and j run to -220, and sTypoDescender sits deeper still at -222.
The default line height is 1.26 em, and that is the most practical fact here for a developer. Typo and hhea metrics agree at 1038 / -222 / 0; Google's metadata reports lineHeight: 1.26 for every style. Drop this into a component library that never sets line-height and every text block arrives pre-leaded more loosely than you intended. usWinAscent is 1296 and usWinDescent 356, so nothing clips — the space is real. Set leading explicitly.
Geometric forms on grotesque bones. Default a is double-storey, g single-storey, G spurless, y carries a curved hooked tail. Contrast is near-monoline and the curves come to points, as the README describes.
There are no ink traps in this typeface, and no softened corners. Rendered at 300px from the shipped binary, every stem and branch junction on n, y, K, R and G is a plain unmodified joint — no notches, no flared cuts. No primary source mentions ink traps, and "softened corners" says the opposite of the foundry's own words: clean cut forms, pointy curves.
Three stylistic sets, three different jobs
The family's most distinctive feature, and the specimen page barely mentions it. There is no salt feature; the alternates live in three sets, named on the official microsite in Indonesian with English glosses that google/fonts repeats:
ss01— Lancip (Sharp). The largest at 175 substitutions, coveringG I K U a f g h i j k l m n r t u yand their accented forms.ss02— Lurus (Straight). The smallest at 48 substitutions, acrossa j p q r y. It adds straight terminals where the default has none: theagains a flat foot at the baseline (the outline reaches 555 units instead of 495, and the advance widens from 572 to 594),j,p,qandreach gain a flat spur at the top of the stem,ralso gains a full baseline serif, andy's hooked descender straightens into a plain diagonal that stops at -200 instead of curling to -220. Note what it does not do: theakeeps its double-storey construction — bowl below, arm above — in this set and in the other two. The family ships fouraglyphs —a,a.ss01,a.ss02,a.ss03— and all four are double-storey. There is no single-storeyain this typeface.ss03— Lingkar (Swirl). 133 substitutions acrossG J K Q R a e g h l m n u y. Wheress01squares every shoulder outright, this one softens the same corners and saves its curves for the tails: thea's top arm runs dead straight inss01and curves inss03,nloses every curve inss01and gets a bowed shoulder inss03,lpicks up a tail that turns right at the baseline, and the diagonalyis replaced by one with a curved descending tail. Thetand lowercasejalternates people tend to associate with this set are not in it — they live inss01.
All three are opt-in; calt is the only contextual feature on by default.
The rest of the feature set, read from the tables: GSUB carries aalt, calt, case, ccmp, dnom, frac, liga, locl, numr, ordn, pnum, sinf, ss01, ss02, ss03, subs, sups, tnum; GPOS carries cpsp, kern, mark. Figures are proportional by default — widths run 371 for one to 732 for zero — and tnum switches to a uniform 600-unit tabular set, added in v2.600. locl handles Azeri, Catalan, Crimean Tatar, Kazakh, Moldovan, Romanian, Tatar and Turkish. Exactly five ligatures ship (fi, fl, ff, ffi, ffl), and there is no dlig, no smcp/c2sc, no onum/lnum, and no zero feature — the zero.tf glyph is the tabular figure, not a slashed zero.
The italics are corrected obliques
post.italicAngle is -8.0, and comparing the italic outlines to the roman glyph by glyph shows a hybrid. Straight-sided glyphs are an exact mechanical shear: least-squares fits give 7.97° for l, 7.95° for I and H, 8.01° for v and 7.98° for one, all with maximum horizontal residual under 2.2 units and zero vertical movement. Add a hook and the fit degrades immediately — f returns 7.79° from the same fit, but with residuals up to 8.3 units and four points that also move vertically — by -8, -3, -4 and -12 units. It is a hooked glyph, so it belongs with the redrawn curves, not with the sheared straights. The curves are genuinely redrawn — point counts differ for o (32 vs 34), n (24 vs 23), a (45 vs 46), g (52 vs 53), y (23 vs 24), O (40 vs 38), and e and S deviate far from any single shear.
So: an optically corrected oblique across the full range, shipped as a second variable font (PlusJakartaSans-Italic[wght].ttf). The letterforms stay roman — the italic a is still double-storey, the g single-storey, the f has no descender. Going italic is a file swap, not an axis move; neither file has a slnt or ital axis.
Where it works
Product and marketing UI is the obvious home, and the weight ladder is the reason more than the drawing: 200 to 800 in steps of 100 with no gaps, so a design system can use 400/500/600/700 for body, emphasis, subheads and headings and get real separation between adjacent tokens.
It suits dashboards and fintech surfaces because tnum is present and works — proportional figures for prose, a 600-unit tabular set for anything that aligns in a column, with fractions, superiors and inferiors alongside. And for brand work, its original job, the stylistic sets are the argument: ss01 alone re-cuts eighteen letters (G I K U a f g h i j k l m n r t u y) across 175 substitutions, enough to give a wordmark a second voice drawn from the same text face.
Where it struggles
Latin only, and the metadata implies otherwise. The binary maps 721 codepoints across 1,188 glyphs: 95 ASCII, 95 Latin-1, 126 Latin Extended-A, 62 Latin Extended-B, 164 Latin Extended Additional (90 of them in the Vietnamese range U+1EA0–U+1EF9), 23 combining diacritics, 24 currency signs, plus punctuation, arrows, maths operators and fractions. Vietnamese is fully covered by design — the v2.400 FONTLOG names "GF Latin Pro & GF Latin Plus" and "Adding support for multiple languages (Incl. Vietnamese)". But Google lists a cyrillic-ext subset for this family and fonts.googleapis.com/css2 will serve you that @font-face block, while the font contains zero codepoints in U+0400–U+052F. The tag is triggered by one character: U+20B4, the hryvnia sign, which happens to fall in that unicode-range. Greek is the same story — Δ, Ω and π only, as maths symbols. Ship Cyrillic or Greek and this face silently falls back.
No small caps, no oldstyle figures, no slashed zero. All three are routine requests in the enterprise and financial UI work this face otherwise fits. smcp, c2sc, onum, lnum and zero do not exist in the file, so font-variant-caps will synthesise, badly.
ExtraLight 200 is a display weight. At 14–16px the near-monoline strokes thin out, especially light-on-dark. Treat 300 as the practical floor for text.
The italics do not carry long emphasis. An 8° corrected oblique is fine for a label, a caption or a pull quote. A page of emphasised editorial copy set in a slanted roman reads as slanted roman.
No siblings. No Plus Jakarta Mono or Serif, and since v2.400 no Display or Text cuts either. A complete system has to pair outside the family.
Which premium fonts it substitutes for
What Plus Jakarta Sans brings to any of these swaps is constant: seven weights with italics, a variable axis, an OFL licence, and a geometric skeleton at near-monoline contrast. What it cannot bring is a match on a signature letterform, non-Latin coverage, or optical sizing.
- Aeonik (CoType Foundry) and Neue Montreal (Pangram Pangram) are the closest in register — contemporary sans-serifs bought for product and brand work rather than for a quirk. Jakarta reads more overtly geometric than either, with rounder bowls and pointier curve joins, so display sizes look warmer and less neutral. At body size the substitution is convincing.
- Söhne (Klim Type Foundry) is the loosest of the group. If Söhne was chosen for neo-grotesque neutrality, this is a different animal, and the spurless
Gis the first thing anyone will spot. Jakarta answers with a variable axis and a seven-step ladder at no licence cost. - GT Walsheim (Grilli Type) and Degular (OH no Type Co) are usually picked for personality — rounded terminals in the first case, optical and angled variation in the second. Jakarta has neither. What it offers back is
ss03, whose curved tails and legs onl,y,R,QandKgive a display line some character a plain geometric sans lacks. - TT Norms Pro (TypeType) is affected by coverage more than shape. If the reason for it was script range, this is not a substitute at all. If it was a clean geometric UI sans with a full weight ladder, it substitutes well.
- Brown (Lineto), Centra No.1 (Sharp Type), Euclid (Swiss Typefaces), Maison Neue (Milieu Grotesque), Marblis (Fincker Font Cuisine) and Mont (Fontfabric) sit across the same geometric-to-grotesque band, and the summary is identical for all of them: a good tonal substitute, never a metric one. Check the figures and the italic first — that is where these substitutions break.
Pairing Plus Jakarta Sans
Pair on structure, not mood. This is a near-monoline geometric face with a 0.72 x-height ratio and ascenders level with the caps; a companion should differ on at least two of those, or the page reads as an accident rather than a decision.
For editorial work a serif with real stroke contrast does the separating: Source Serif Pro or Literata when the serif carries running text, Newsreader or Playfair Display when it only sets headlines. That partner also fixes Jakarta's weakest spot by giving you a drawn italic to switch into.
There is no Plus Jakarta Mono, so code and fixed-width data need an outside partner — JetBrains Mono or Geist Mono, whose low stroke contrast keeps the page consistent while the fixed widths mark the change of role. For columns of numbers rather than code, use tnum and stay in the family.
Pairing it with itself is the strongest option: 700 headings against 400 body with 500 or 600 for subheads gives three clean tiers out of one variable file, and ss01 on a wordmark adds a fourth voice with no second download. Avoid other geometric sans families at a similar x-height — two faces that are 85% alike look like a mistake, not a system.
Licensing and self-hosting in plain terms
Plus Jakarta Sans is under the SIL Open Font License 1.1, verified four ways: OFL.txt in google/fonts ("Copyright 2020 The Plus Jakarta Sans Project Authors"), license: "OFL" in METADATA.pb, name ID 13 in the binary, and the project microsite. Google's metadata reports isOpenSource: true, isBrandFont: false.
- You may use it commercially, on the web, in apps, in client work, embedded in PDFs and in products you sell — and you may self-host, subset and modify it.
- You must keep derivatives under the OFL and pass the licence along with the files.
- You may not sell the font on its own. Bundling it in something you sell is fine; selling the font as the product is not.
The copyright string names no Reserved Font Name, and none appears in OFL.txt — derivatives still stay under the OFL, but there is no reserved name to work around when naming one.
For self-hosting, two files cover all fourteen styles: PlusJakartaSans[wght].ttf and PlusJakartaSans-Italic[wght].ttf, both carrying a STAT table so named-instance selection behaves. The upstream repository also ships 14 static TTFs (seven weights × roman and italic). Since the whole family is Latin plus Vietnamese, subsetting to latin is a large saving on an English-only site.
Frequently asked questions
Is Plus Jakarta Sans free for commercial use? Yes. The SIL Open Font License 1.1 permits commercial use, embedding, self-hosting, subsetting, modification and redistribution. You cannot sell the font file by itself, and derivatives must stay under the OFL. There is no Reserved Font Name to work around.
Is it a variable font?
Yes — two of them. PlusJakartaSans[wght].ttf and PlusJakartaSans-Italic[wght].ttf each carry a single wght axis: min 200, default 400, max 800, with seven named instances. There is no slnt or ital axis, so going italic means loading the second file, not moving a slider.
How many weights does it have? Seven — ExtraLight 200, Light 300, Regular 400, Medium 500, SemiBold 600, Bold 700, ExtraBold 800 — each with an italic, for fourteen styles. The range grew over time: ExtraLight arrived in v2.400 (4 December 2020), SemiBold in v2.600 (12 November 2021).
Does it have real italics?
Not cursive ones. italicAngle is -8.0; straight-sided glyphs are a clean mechanical shear (measured 7.95°–8.01°) and curves and hooks are redrawn to correct optically, but the letterforms stay roman — double-storey a, single-storey g, no descending f. Corrected obliques.
Does Plus Jakarta Sans support Cyrillic?
No. Google lists a cyrillic-ext subset and the CSS API will serve you that block, but the binary has zero codepoints in U+0400–U+052F. The tag is triggered by a single character, U+20B4, the hryvnia sign. Greek is the same: only Δ, Ω and π, present as maths symbols. Vietnamese, by contrast, is genuinely and fully covered.
What are ss01, ss02 and ss03?
Three opt-in stylistic sets, named on the official microsite: ss01 Lancip (Sharp, 175 substitutions), ss02 Lurus (Straight, 48 substitutions — straight spurs and feet on a j p q r y, plus a straightened y tail), ss03 Lingkar (Swirl, 133 substitutions — curved tails on l and y, and curved arms where ss01 runs them flat). Enable with font-feature-settings: "ss02" or equivalent. None of the three gives you a single-storey a — every a in the family is double-storey.
Why does my Plus Jakarta Sans text look so loosely leaded?
Because line-height is unset. The vertical metrics (1038 / -222 / 0) give a default line box of 1.26 em, and Google's metadata reports lineHeight: 1.26 for every style. Set it explicitly.
What happened to Plus Jakarta Display and Plus Jakarta Text? They were the shape of the original v1.000 release in February 2020, and the frozen project microsite still shows them. The FONTLOG for v2.400, 4 December 2020, records "Removed Plus Jakarta Sans Text Version". There is now one unified family and no optical sizes.
Does it have small caps or a slashed zero?
Neither, and no discretionary ligatures. There is no smcp, c2sc, onum, lnum or zero feature — only the five standard ligatures fi, fl, ff, ffi, ffl. The zero.tf glyph in a glyph browser is the tabular figure, not an alternate zero.
Which brands use Plus Jakarta Sans? There is no verifiable list. The one documented use is the original commission: the +Jakarta City of Collaboration identity for the Jakarta Provincial Government, credited to 6616 Studio (the microsite says 6616 Creative House) with the typeface by Tokotype. If you see a claim that a major tech company uses it, ask for a source before repeating it.
Is Plus Jakarta Sans on Google Fonts?
Yes, Plus Jakarta Sans is available for free on Google Fonts. Get Plus Jakarta Sans on Google Fonts ↗
Alternative For (12)
Plus Jakarta Sans is a free alternative to the following premium fonts:
Modern geometric with similar warmth and contemporary positioning
Modern geometric-grotesque with warm character and excellent screen optimization
Modern geometric-grotesque with design-forward character and screen optimization
Modern geometric with similar approachability and premium feel
Contemporary geometric sans with variable axes and polished detailing
Contemporary geometric with ink traps and modern details that echo TT Norms Pro's precision
Modern geometric with subtle warmth and ink traps that bridge the gap toward GT Walsheim's character
Contemporary geometric sans-serif with overlapping use cases in UI and branding
Geometric sans with rounded terminals and friendly character
Compare Plus Jakarta Sans
See how Plus Jakarta Sans compares to other fonts side by side.
Variable Font Axes
Plus Jakarta Sans is a variable font with 1 axis you can fine-tune.
| Axis | Min | Default | Max |
|---|---|---|---|
| wght | 200 | 400 | 800 |
Font Pairings
Fonts that pair well with Plus Jakarta Sans based on contrast and complementary design characteristics.
Performance
Key metrics for evaluating Plus Jakarta Sans in production.
- Score
- 64 /100 Good
- File Size
- 143.9 KB Light
- Weights
- 9 (variable) + Italics
- Languages
- 3 groups CDN delivery
Font Metrics
- x-Height Ratio
- 0.536
- Cap Height Ratio
- 0.745
- Ascender
- 1038
- Descender
- -222
Fallback CSS Overrides
Apply these overrides to Arial to minimize layout shift when loading Plus Jakarta Sans.
@font-face {
font-family: 'Plus Jakarta Sans Fallback';
src: local('Arial');
ascent-override: 103.8%;
descent-override: 22.2%;
line-gap-override: 0%;
size-adjust: 103.36%;
} How to Use Plus Jakarta Sans
Copy these code snippets to quickly add Plus Jakarta Sans to your project.
CSS code for Plus Jakarta Sans
@import url('https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@100..900&display=swap'); HTML code for Plus Jakarta Sans
<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=Plus+Jakarta+Sans:wght@100..900&display=swap" rel="stylesheet"> Tailwind code for Plus Jakarta Sans
// tailwind.config.js
module.exports = {
theme: {
extend: {
fontFamily: {
'plus-jakarta-sans': ['"Plus Jakarta Sans"', 'sans-serif'],
},
},
},
}
// Usage in HTML:
// <p class="font-plus-jakarta-sans">Your text here</p> Next.js code for Plus Jakarta Sans
// Using next/font (Next.js 13+)
import { Plus_Jakarta_Sans } from 'next/font/google';
const plus_jakarta_sans = Plus_Jakarta_Sans({
subsets: ['latin'],
weight: ['100', '200', '300', '400', '500', '600', '700', '800', '900'],
});
export default function Component() {
return (
<p className={plus_jakarta_sans.className}>
Your text here
</p>
);
}
// Or using inline styles with Google Fonts link:
// <p style={{ fontFamily: '"Plus Jakarta Sans"' }}>Your text</p> Expo and React Native code for Plus Jakarta Sans
// Install: npx expo install @expo-google-fonts/plus-jakarta-sans expo-font
import { useFonts, Plus_Jakarta_Sans_400Regular } from '@expo-google-fonts/plus-jakarta-sans';
export default function App() {
const [fontsLoaded] = useFonts({
Plus_Jakarta_Sans_400Regular,
});
if (!fontsLoaded) return null;
return (
<Text style={{ fontFamily: 'Plus_Jakarta_Sans_400Regular' }}>
Your text here
</Text>
);
}