Skip to content
hs108 docs

Typography Usage

Decision framework

Every typographic decision answers three questions:

  1. What is the register? Display (bold, emotive, large) — or functional (small, quiet, legible)?
  2. What is the mood? Warm/editorial → Instrument Serif. Neutral/technical → Geist. Code/data → Geist Mono.
  3. What size? Start from the content hierarchy, not from aesthetics.

Instrument Serif — when to use

Use for emotional, editorial, and brand-facing moments:

  • Page titles and hero headlines
  • Pull quotes and thesis statements
  • Zine and archive titles
  • Any text where warmth or humanity matters

Always italic at --size-hero and --size-h1. Upright is available but use it sparingly — the italic form is the primary expression.

Don’t use for body copy, UI labels, metadata, or code.


Geist — when to use

Use for everything that needs to work quietly:

  • Body paragraphs
  • Captions and metadata
  • UI labels at sizes above 13px
  • Navigation text (when not monospaced)
  • Prose in journal and archive entries

Weight guidance:

WeightTokenUse
300font-weight: 300Light captions, subdued metadata
400font-weight: 400Default body copy
500font-weight: 500Slightly emphasised labels
600font-weight: 600Inline bold, <strong>
700font-weight: 700Rare — only for critical callouts

Geist Mono — when to use

Use for structured, data-like, or identity-critical text:

  • All button text and navigation links (.nav__link)
  • Tag labels (.tag)
  • Token names and code values
  • Date strings and metadata beside technical content
  • The hs108 wordmark HS108 / Field Notes

Always set uppercase with letter-spacing: 0.12em–0.16em. This is not optional — monospaced labels without tracking look broken.


Alternate pairings — when to use

Use alternates when a project deliberately departs from the studio’s default register:

PairingUse when…
A — Genos + RajdhaniTechnical client, data-heavy deliverable, engineering context
B — Michroma + IBM Plex SerifFormal proposal, printed document, academic register

Alternate pairings are whole-page or whole-project decisions — don’t mix core and alternate families on the same surface.


Prose styles

Long-form content (journal entries, archive pieces) uses the .prose class:

.prose {
font-family: var(--font-body);
font-size: var(--size-body);
line-height: 1.75;
max-width: 68ch; /* optimal reading measure */
}

Key prose rules:

  • Max-width 68ch — never let text run wider than this.
  • Line height 1.75 — not 1.5. Long-form reading needs more air.
  • Italic blockquotes in Instrument Serif — border-left: 2px solid var(--accent-strong)
  • Code inline uses Geist Mono with a subtle surface background.

What to avoid

AvoidWhy
Instrument Serif at --size-bodyIt’s optimised for display — hard to read at text sizes
Geist at --size-hero without italicFeels like a placeholder, not a typographic decision
Geist Mono without uppercase + trackingLoses its identity, reads like generic code font
Mixing two display fonts in one contextCompetes for attention, undermines hierarchy
font-weight: 700 on Instrument SerifThe typeface doesn’t have bold — it will synthesise and look wrong