Mavi Mono v7 / Mavi Sans v4

Drawn as strokes. Shipped as a font.

Nobody outlined Mavi Mono by hand. Each glyph is a skeleton, a recipe of strokes, and thirteen parameters decide the rest. Drawn at 300 and at 800, the same skeleton gives two masters. Every weight between them is the one you are moving.

400wghtstem 87
110glyphs, ASCII and Spanish
2masters, Light and ExtraBold
300-800one axis, wght
13design parameters
560units to the cell
Mavi Type, a family of twoSans v4 / Mono v7 / 2026

One to read.one to run_

Mavi Sans wght 400-700

The voice of every Mavi screen. A quiet, gothic build: a little narrow, a tall lowercase, room around the words. It sets a settings pane and a headline with the same calm.

Mavi Mono wght 300-800

The voice of the terminal, the diff and the number. Drawn from parametric skeletons in a tight 560 cell, with rounds a little wider than straights so a full screen of it never reads square.

Same words, both faces

Click any line and type. The other face follows.
64 / 50
La cigüeña tocaba el saxofón
La cigüeña tocaba el saxofón
28 / 23
Ship the build, read the log, approve the revision. 1,280.50 in 0.34 s.
Ship the build, read the log, approve the revision. 1,280.50 in 0.34 s.
15 / 13
Both faces share one x-height, 535 units of 1000, so a path, a flag or a number set in Mono can sit inside a sentence set in Sans without stepping up or down. ¿Y en español? También: ¡ñ, ü y todos los acentos están dibujados!
Both faces share one x-height, 535 units of 1000, so a path, a flag or a number set in Mono can sit inside a sentence set in Sans without stepping up or down. ¿Y en español? También: ¡ñ, ü y todos los acentos están dibujados!
98width
535x-height
224word space
229interpunct advance
400-700wght axis
12stylistic sets

The Sans was measured until it stood next to the Mono.

Mavi Sans is tuned by numbers: a touch narrow, a wide word space, and a lowercase set at 535, the exact x-height of the Mono. Put them on one line and neither steps up or down.

Weights

Variable, one axis each

In use

Type in the box, then see them where they live.
wght 400-700
Automate the mundane.
TerminalMono 500 / 13
~/mavi-type main $ npm run font -- presets/v7.json 110 glyphs x 2 masters built dist/MaviMono[wght].ttf check ok: 112 glyphs, wght 300-800 $ ls -l dist | awk '{print $5, $9}' 17836 MaviMono[wght].ttf 7896 MaviMono[wght].woff2 $
InterfaceSans 400 / 500

Appearance

How the terminal looks on this Mac.
Interface fontMavi Sans
Terminal fontMavi Mono
Weight500 · Bold 700
Follow the system theme
ResetDone
Dataevery digit one cell
PresetCellx-heightBearingStems
v05805508580-156
v15605507179-150
v25305506379-150
v35305505879-150
v45305355879-150
v55605356579-150
v65605354779-150
v75605357076-150
Eight presets. v6 was rejected in the terminal, v7 ships.
CodeMono 500 / 12.5
@@ presets/v6.json, presets/v7.json
"width": 560,
"xHeight": 535,
- "stemLight": 79,
- "sideBearing": 47
+ "stemLight": 76,
+ "sideBearing": 70,
+ "bulge": 18
}
Rounds reach 18 units past the straights. That is the whole difference between square and not.
Togetherone x-height, 535
Put font-family: 'Mavi Mono' on a <code> and it sits in the sentence as it is. No font-size: .9em patch, no nudged baseline.
The lowercase of both faces is the same height, so code inside a sentence neither shrinks nor shouts.
Two faces.
One height.
x-height 535 of 1000
Small sizeswhere a mono earns its keep
100O 1lI {} [] () => != :: rn m ¿ñ? 0123456789
110O 1lI {} [] () => != :: rn m ¿ñ? 0123456789
120O 1lI {} [] () => != :: rn m ¿ñ? 0123456789
130O 1lI {} [] () => != :: rn m ¿ñ? 0123456789
150O 1lI {} [] () => != :: rn m ¿ñ? 0123456789
180O 1lI {} [] () => != :: rn m ¿ñ? 0123456789
NumbersSans, tabular on request
1,280.50
0.34 s · 98.6%
2026-11-13 17:54
Mavi Sans carries tabular figures, a case-sensitive set and twelve stylistic sets.

Glyphs

Pick one. In Mono you are looking at its strokes.

      

A preset is the whole design.

Thirteen numbers and a set of skeletons make Mavi Mono. Change a number and all 110 glyphs follow, at every weight.

skeletonA glyph says where its strokes go, never how thick they are.
strokesEach one is its own closed contour. Overlaps are never merged.
masters300 and 800 carry the same points in the same order, so everything between them interpolates.
bulgeRounds reach past the straights, so o is wider than n and the texture stops reading square.
Mavi Type / free under the OFL
SansAa MonoAa
Download Mavi Type ttf + woff2 + licenses
variable, both faces
Filesvariable
On a Mac, open the .ttf files in Font Book, or copy them to ~/Library/Fonts.
CSS
@font-face {
  font-family: 'Mavi Sans';
  src: url('MaviSans[wght].woff2')
       format('woff2');
  font-weight: 400 700;
}
@font-face {
  font-family: 'Mavi Mono';
  src: url('MaviMono[wght].woff2')
       format('woff2');
  font-weight: 300 800;
}
LicenseSIL OFL 1.1

Free to use, ship and change.

Both faces are under the SIL Open Font License 1.1: use them in anything, bundle them, modify them. Keep the license with the files, and don't sell the fonts on their own.