RC4Sans · Mono · Pixel · OFL 1.1

Medeo

Open typefaces for interfaces, code and headlines: Latin and Cyrillic.

Weights
100–900
x-height to cap height
75%
Axes
wght · opsz
Characters
905
Stylistic sets
11
Languages
759
Currencies
₸ ₼ ₾ ₺
License
OFL 1.1

Tall lowercase,
close setting.

The x-height is 75% of the cap height. At display sizes the optical-size axis narrows the sidebearings, and the letters sit closer than in running text.

Text · opsz 14 4.25 em

Heading · opsz 32 4.23 em

One word, Medeo Sans 400, the same size both times;
the figure is the width of the word, the line marks where it ends at opsz 14

Why Medeo

Medeo evens out letter pairs: the gap in “aw” opens from 14 to 15 units. In Geist 1.8 some pairs stuck together and others drifted apart. Under a prtner.ai video a viewer pointed this out in the Cyrillic; we rebuilt the Cyrillic kerning and brought the Latin pairs into line with Geist.

The kerning is checked against Geist; ₸ ₼ ₾ ₺ and accent marks are added. Below are five Latin pairs, before and in Medeo; the Cyrillic ones are on the Russian and Kazakh pages.

@royalvenom

Geist’s Cyrillic has an optical imbalance in its letter spacing: one Cyrillic pair looks too tight, another too loose. (paraphrased from Russian)

The video and the discussion on Instagram

Geist — the base design. Inter — some letters and the yardstick for the kerning. Medeo — the Cyrillic kerning, the opsz axis and the ₸.

Geist
Inter
Medeo

The wght axis sets the weight, 100–900. The opsz axis fits shapes and spacing to the size, 14–32. An italic for every weight.

wght 300opsz 14scroll

Family · three typefaces

Size96
Tracking0 %
Stylistic sets

Got a DM at 3:47 a.m.? The reply just needs your yes.

Languages

Samples in ten languages

Kazakh in Cyrillic and in the 2021 Latin alphabet, Uzbek in Latin and Cyrillic. On a stressed Ukrainian i, the accent replaces the dot.

Medeo Sans in text

Lead · 28/34 px · 500

Even setting from headline to footnote.

Body · 17/27 px · 400

Medeo Sans keeps an even texture: the spacing is measured, and the optical size axis tightens it in headlines and opens it up in text.

At 17 px the x-height is 9 px, the same in Cyrillic and Latin.

Caption · 14/21 px · 400 and italic

Letter pairs before and after the kerning fix.

Italic for quotes, titles and emphasis.

Cap height710
x-height530
Baseline0
Descender−150

Examples

MEDEO SANS
RC4
905 CHARACTERS
OFL 1.1
DNF · 2026

Points and handles

Ice season
2026

Sans 500Mono 400RC4OFL 1.1

More thana rink.

MEDEO SANS
72 — 12

Medeu
Ice season

34.21

  1. 500 m34.21
  2. 1000 m1:08.97
  3. 1500 m1:46.40
  4. 5000 m6:21.08
Medeo Pixel · Mono

MedeoRC4

Sans

Mono · Pixel

Q · U+0051

$ · Mono

& · ampersand

G · Pixel

Medeo Sans 300 · 500

MEDEO PIXEL
ELSH 1 — 80

font-variation-settings: "ELSH"

Installation

Add Medeo

RC4 is the fourth release candidate for 1.0. What may change before 1.0 → Sources on GitHub →

npm, recommended

For Next.js and any bundler. Every character, stylistic set and axis of all three typefaces.

npm i medeo-font

With Next.js

import { MedeoSans } from "medeo-font/sans";
import { MedeoMono } from "medeo-font/mono";
import { MedeoPixel } from "medeo-font/pixel";

Put it in app/layout.js and set MedeoSans.className on <html>. Details are in the package README.

CSS from a CDN

No bundler: one line in <head>, then the variables --font-medeo-sans, --font-medeo-mono, --font-medeo-pixel.

<link rel="stylesheet"
  href="https://cdn.jsdelivr.net/npm/medeo-font@1.0.0-rc.4.1/dist/medeo.css">
body { font-family: var(--font-medeo-sans); }
@font-face by hand

Medeo Mono is added the same way. Medeo Pixel comes as a .woff file with format("woff"): the browser’s font sanitizer rejects it as woff2.

@font-face {
  font-family: "Medeo Sans";
  src: url("MedeoSansVariable.woff2") format("woff2");
  font-weight: 100 900;
  font-display: swap;
}
@font-face {
  font-family: "Medeo Pixel";
  src: url("MedeoPixelVariable.woff") format("woff");
  font-display: swap;
}

What each method includes

Ways to install
FeaturenpmCDNZIP
All charactersyesyesyes
Next.jsyesmanualmanual
Updatesyesmanualmanual
Desktopnonoyes

ZIP archive

Download ZIP

TTF for every typeface, WOFF2 for Sans and Mono, WOFF for Pixel, and the license text. SIL Open Font License 1.1: free for websites, apps, print and commercial projects. The fonts may be modified, embedded and redistributed under the same license, but not sold by themselves.

Separate files · WOFF2, WOFF, TTF

TTF for Mono and Pixel is in the archive.

Versions

Changelog

RC4 is the fourth release candidate for 1.0: the fonts are ready to use. Before 1.0 the kerning and the shapes of individual characters may change. The names Medeo Sans, Mono and Pixel, the imports medeo-font/sans|mono|pixel, the CSS files and the --font-medeo-* variables stay the same; font file names may change. Next comes 1.0.

Feedback and questions on Telegram: t.me/akhimov

  1. RC4. Expanded Latin and Cyrillic coverage; corrected marks, letter joins and spacing. Sans and Mono render small text more clearly on Windows, and the ZIP includes static styles. Alphabets for 759 languages were checked against Google Fonts data: coverage verification, not a linguistic review. All changes → medeo-font 1.0.0-rc.4.1.

  2. RC3. Medeo Pixel now loads in Safari, in every iPhone browser and in Instagram’s in-app browser: the dots its letters are built from became references to one shared part, and the TTF went from 5.4 to 0.4 MB. The design is unchanged. Nine ogonek letters (Ą Ę Į ą į ų and alternates) drop a duplicate dot. Medeo Sans and Mono change only their version number. medeo-font 1.0.0-rc.3 on npm.

  3. 1.0.0-rc.2.1: the fonts in the npm package match the repository byte for byte; the release workflow now checks this before publishing.

  4. RC2. The opsz axis is now built from the sources. Medeo Pixel gains six more Cyrillic letters, upper and lower case: Serbian, Bosnian and Turkmen Cyrillic are fully covered. 55,216 letter pairs from the ten languages checked, upright and italic, Thin to Black: in none do the letters overlap. The font moved to the open repository DNFDEVS/medeo-font, and medeo-font 1.0.0-rc.2 was published from there to npm.

  5. 1.0.0-rc.1.1: short imports medeo-font/sans|mono|pixel; the old medeo-font/font/* paths still work. 1.0.0-rc.1.2: a README with examples for Next.js, Tailwind and Medeo Pixel.

  6. RC1. The first open release: Medeo Sans, Mono and Pixel. Latin and Cyrillic for ten languages. Sans has 736 characters, the wght 100–900 and opsz 14–32 axes and 11 stylistic sets. SIL OFL 1.1 license. The medeo-font package on npm, CSS from a CDN and the ZIP.