MY / TYPE  ·  SHOWCASE  ·  V 1.1  ·  2026  ·  INTERNAL

A typographic system in three voices.

A single CSS file. Three families, twelve roles, one baseline grid. Sans for clarity, serif for reading, mono for truth.

Sans · iA Writer Quattro

Serif · Newsreader

Mono · Commit Mono

§ 02Foundations

i

Sans

Quattro

iA Writer Quattro

A duospaced sans drawn by iA — the makers of iA Writer — for the act of writing. Most letters are proportional; the narrow few (i, l, t) were widened until they read with the rhythm of a monospace.

Distinctive i · l · t

illit & 0123

Quattro's i, l and t are wider than they would be in a typical sans — close to monospace widths.

Variable · weight 100—900
100Hello, type.
300Hello, type.
500Hello, type.
700Hello, type.
900Hello, type.
GlyphsAa Bb  ·  0123  ·  &?@
FamilyiA Writer Quattro
ClassSans, duospaced
Axeswght 100—900
StylesUpright + italic
FormatTTF Variable
DesigneriA
LicenceSIL OFL 1.1
Sourcegithub.com/iaolo

ii

Serif

Newsreader

Newsreader

An editorial serif by Production Type, drawn for digital long-form reading. Newsreader's defining feature is its optical-size axis — a single file that behaves correctly from a footnote at 8 px to a masthead at 72 px.

Distinctive · opsz 6—72
8Small caption · sturdy serifs.
14Body · calm and balanced.
36Heading register
60Display

A single file. The drawing changes at every size — thinner serifs at display, sturdier at caption.

Variable · weight 200—800
200Reading.
400Reading.
600Reading.
800Reading.
GlyphsAa Bb  ·  0123  ·  &?@
FamilyNewsreader
ClassSerif, editorial
Axeswght 200—800 · opsz 6—72
StylesUpright + italic
FormatWOFF2 Variable
DesignerProduction Type
LicenceSIL OFL 1.1
Sourcegithub.com/productiontype

iii

Mono

Commit

Commit Mono

A programmer's monospace by Eigil Nikolajsen. Built for code: tall x-height, disambiguated letterforms, and a bank of stylistic alternates you can configure at commitmono.com and download as a custom build.

Distinctive · alternates ss03 · ss04 · ss05
ss03 ·illuminate · file
ss03 ✓illuminate · file
ss04 ·geography · log
ss04 ✓geography · log
ss05 ·-> => != >= ===
ss05 ✓-> => != >= ===

ss03 (i/l) and ss04 (g) on by default; ss05 (ligatures) opt-in.

Variable · weight 200—700
200true === true
350true === true
500true === true
700true === true
GlyphsAa Bb  ·  0123  ·  &?@
FamilyCommit Mono v1.43
ClassMonospace
Axeswght 200—700
StylesUpright (variable) · italic (static)
FormatWOFF2 + TTF
DesignerEigil Nikolajsen
LicenceSIL OFL 1.1
Sourcegithub.com/eigilnikolajsen
§ 03The scale

Modular scale17 × 1.25n

Every line-height is a whole number of grid units of 4 px. The base sits at 17/28 — the size at which Newsreader reads with the calm of a printed book. Sizes above and below relate by a major third, with intermediates where legibility asks for them.

.t-display
Three voices
52 / 56  ·  w 600  ·  −0.040  ·  ×1.255  ·  14 u
.t-title
A title set in sans
36 / 40  ·  w 600  ·  −0.030  ·  ×1.253  ·  10 u
.t-heading
A section heading
28 / 36  ·  w 550  ·  −0.022  ·  ×1.252  ·  9 u
.t-subheading
A subsection heading
21 / 28  ·  w 550  ·  −0.005  ·  ×1.251  ·  7 u
.t-lede
A lede in serif italic.
21 / 32  ·  w 380  ·  −0.003  ·  ×1.251  ·  8 u
.t-prose← base
Long-form prose set in serif. Calm enough to disappear into.
17 / 28  ·  w 400  ·  0  ·  ×1.250  ·  7 u
.t-body
Body text for UI surfaces — labels, paragraphs, helper text.
15 / 24  ·  w 450  ·  0  ·  —  ·  6 u
.t-caption
Caption · helper text · timestamps
13 / 20  ·  w 500  ·  0.005  ·  ×1.25−1  ·  5 u
.t-micro
Micro · eyebrow · stamps
11 / 16  ·  w 500  ·  0.10  ·  ×1.25−2  ·  4 u
.t-code
const x = compute(42);
13 / 20  ·  w 400  ·  0  ·  —  ·  5 u
.t-kbd
K
12 / 16  ·  w 500  ·  0  ·  —  ·  4 u
.t-tabular
$1,234.56 · −0.83 % · 2026‑05‑08
13 / 20  ·  w 450  ·  0  ·  —  ·  5 u
§ 04In motion

Notes · No. 04 · 8 May 2026

The third voice

Most digital design systems pick a side: everything in sans, or everything in mono. Both work. Both leave something on the table — the long, slow read.

There are three jobs that text does on a screen, and asking one face to do all of them is asking too much. The interface needs to be scanned in fragments — labels, captions, helper text. The article needs to be read across long stretches without making the eye tired. The code needs to be unambiguous: a 0 should never look like an O, a column of figures should line up without negotiation.

The argument against serifs in product UI used to be technical. Modern variable serifs ship with optical-size axes that make a single file behave correctly from 8-px footnote to 96-px masthead. Newsreader has a wght axis from 200 to 800 and an opsz axis from 6 to 72.

A system with one voice instructs. A system with three voices reasons, structures, and reads. — from the system spec

What changes once a serif joins is not where sans gets used; it is how. Sans now does what sans is best at — structure, hierarchy, navigation — and stops trying to also be the voice for a 1,200-word piece. The serif takes that job. The reader settles in.

The system routes text to face by role, not element. The same <p> tag lands on a different face depending on context — serif inside a long-form article, sans inside a UI surface, mono inside a code block. The routing is the system's quietest discipline.

Footnotes

  1. Modular scales after Robert Bringhurst, The Elements of Typographic Style, Hartley & Marks, 1992.
  2. iA Writer Quattro, Newsreader, and Commit Mono are released under the SIL Open Font License.
§ 05How to use

A single CSS file. Drop it into the head, write semantic HTML, and the system does the routing. Five short snippets — pulled from the actual typography.css.

1. Include in your <head> html
<link rel="stylesheet" href="typography.css">
<link rel="stylesheet" href="patterns.css">  // optional patterns
2. The tokens — a peek inside typography.css typography.css · :root
/* Three families, each in its own register */
:root {
  --font-sans:  "Sans", ui-sans-serif, system-ui, sans-serif;
  --font-serif: "Serif", Charter, Georgia, serif;
  --font-mono:  "Mono", ui-monospace, Menlo, monospace;

  /* Twelve roles, derived from base 17 px × ratio 1.250 */
  --t-display-family:  var(--font-sans);
  --t-display-size:    52px;
  --t-display-line:    56px;
  --t-display-weight:  600;

  --t-prose-family:    var(--font-serif);
  --t-prose-size:      17px;
  --t-prose-line:      28px;
  --t-prose-opsz:      14;

  /* …and ten more */
}
3. Apply with utility classes html
<h1 class="t-title">A page title</h1>
<p  class="t-lede">An italic-serif lede.</p>
<p  class="t-prose">Long-form prose set in serif.</p>
<span class="t-tabular">$1,234.56</span>
<kbd class="t-kbd">⌘ K</kbd>

// or just use semantic HTML — element defaults are wired
<h1>Page title</h1>
<p>Body paragraph</p>
<code>inline code</code>
4. Read a token in your own CSS your.css
.my-component {
  font-family:           var(--t-display-family);
  font-size:             var(--t-display-size);
  line-height:           var(--t-display-line);
  font-variation-settings: "wght" var(--t-display-weight);
  letter-spacing:        var(--t-display-tracking);
}
5. Override at root for any project your.css
:root {
  /* swap the neutral defaults for a brand palette */
  --paper:  #f8f4ec;   // cream
  --ink:    #1a1814;   // warm dark
  --muted:  #6c685e;

  /* tighten leading for a denser product UI */
  --t-body-line:  20px;
  --t-prose-size: 18px;

  /* or remap a role to a different family */
  --t-prose-family: var(--font-sans);  // sans body in product
}
§ 06Credit

I — Sans

iA Writer Quattro

By iA · SIL OFL 1.1
Released as part of the iA Fonts family.

Get on GitHub

II — Serif

Newsreader

By Production Type · SIL OFL 1.1
Editorial serif drawn for digital long-form reading.

Get on GitHub
ABCDEFGHIJKLM NOPQRSTUVWXYZ abcdefghijklm nopqrstuvwxyz 0123456789.,; !?@#$%&*+-=/\
ABCDEFGHIJKLM NOPQRSTUVWXYZ abcdefghijklm nopqrstuvwxyz 0123456789.,; !?@#$%&*+-=/\
ABCDEFGHIJKLM NOPQRSTUVWXYZ abcdefghijklm nopqrstuvwxyz 0123456789.,; !?@#$%&*+-=/\