SurveyStream

SurveyStream · Type system v1.0.0

Typography

Two readers who want opposite things. The aggregator stares at a metric table for an hour and needs figures that never shift and a zero that can never be an O. The taker wants a form that feels short and a payout that feels like it arrived. One scale, one family set, two numeral behaviours.

Scale1.200 minor third · 16px base
DisplayArchivo · wght 100–900 · wdth 62–125
BodyInter · opsz 14–32
MonoJetBrains Mono · wght 100–800
VerifiedFont binaries parsed, not assumed

01 — Font pairing

Chosen on measured evidence.

Every candidate below was downloaded and its GSUB feature table parsed directly. x-height is read from OS/2 and divided by unitsPerEm. Nothing here is from a specimen page or memory.

FaceRolex-height tnumzerocaseVariable axesVerdict

Display · wordmark

Archivo

The only display candidate with a width axis. The wordmark widens to wdth 112 for presence without a heavier weight that would close the counters and fight the loop mark. Carries zero, case, lnum, onum.

UI · body

Inter

Highest x-height measured at 0.546 em, and the only candidate with an optical-size axis — so a 13px caption and a 40px title get different letterforms, not one scaled outline. Richest feature set of anything tested.

Mono · telemetry

JetBrains

x-height 0.550 — within 0.6% of Menlo, the closest fallback match of any mono tested, so the column barely moves on font swap. Slashed zero and case both present.

Four common choices, disqualified on evidence

  • IBM Plex Sans has no tnum. Widely assumed to. It ships lnum onum zero ss01–03 and no tabular figures at all — so a currency column would shift as digits change. Disqualifying for a payouts product.
  • Source Sans 3 has no tnum. Same failure.
  • Martian Mono has no zero. Tallest x-height measured (0.600) and an attractive width axis, but with no disambiguated zero it cannot carry an ID or a hash. Fine for tracked uppercase labels; not for data.
  • Roboto Mono has no features of interest at all. No zero, no case, no calt.

Premium alternative

Klim's Söhne suite — Breit, regular, Mono

The argument isn't that Söhne is prettier. It's that one foundry means one license negotiation, one set of vertical metrics, and one figure width shared across all three faces — so a number in a mono telemetry column optically aligns with the same number in body copy. No cross-foundry pairing gives you that for free, and for a product whose core screen is a table of numbers, that alignment is the whole game.

Swap in GT Walsheim for display if the wordmark needs more overt geometry, accepting the cross-foundry metric cost.

Verify before purchase. These binaries are paywalled — I could not parse them. Confirm tnum, zero, case and figure-width behaviour on the foundry's trial fonts. Don't take the feature list on trust, including from me.

Alternate display face

Gabarito

More distinctive curves, and measurably weaker equipment: x-height drops to 0.488, weights start at 400, and it has no zero and no case — so it cannot set an all-caps label or a disambiguated numeral. A brand call, not a technical one.

02 — Scale

1.200 minor third, and why not 1.250.

Leading snapped to a 4px grid. Tracking is systematic rather than eyeballed: , tightening monotonically as size grows. Each specimen below is rendered at its real computed size.

Both ratios, computed

Why the minor third wins here

At 1.250 the mid-range opens too far for a dashboard — a 25px card title and a 31px subsection heading inside a dense metric panel read as marketing, not instrumentation. The minor third keeps title at 23px and h3 at 28px: clearly above 16px body without shouting. Marketing drama is recovered by one off-scale step, not by stretching the whole product's scale to reach it.

Two off-scale steps, declared

A geometric scale from 16px yields only three sizes at or below 20px — 13, 16, 19. A dense aggregator table needs a fourth. Rather than pretend the ratio covers it: body-dense at 14px/20px for data tables, and display-xl at 64px for marketing only. Both are flagged $offScale: true in the token file so a linter can enforce where they appear.

03 — Numerals

Where a type system earns its keep.

Three contexts, three different settings, and two of them are opposites. Toggle each demo — the failures are much more convincing seen than described.

3.1 Payouts and balances

Survey batchPayout
Consumer panel · wave 4$1,284.50
B2B decision-makers$903.00
Longitudinal health$11,070.25
Screener reject credit−$118.00
Referral bonus$40.00

The rules

  • Tabular always. A balance moving from $1,199.00 to $1,284.50 must not change width, or a live figure visibly twitches.
  • Two decimals always, even at .00. $40 next to $39.50 breaks the decimal column.
  • True minus U+2212 for debits, not a hyphen — tnum governs figures, not punctuation, so a hyphen stays narrow even in a tabular font.
  • Right-align. Tabular figures only give decimal alignment if the column is right-aligned.

Slashed zero OFF — the rule people get backwards

Inside money a slashed zero reads as a correction mark or a struck figure. $1,024.00 looks annotated, not authoritative. The slash belongs to identifiers, not to value. This is the exact inverse of the telemetry rule below, and the inversion is deliberate.

3.2 Percentage completion

Proportional, no reserved width

0%

Watch the bar's left edge. The label changes width as digits change, so the track shifts sideways while it fills. This is the single most common progress-bar defect, and it's a typography bug, not a layout one.

Tabular + min-width: 4ch

0%

The label is already as wide as 100% when it reads 7%, so nothing moves. Zero decimals — a completion bar is a glance target, not a measurement.

3.3 Telemetry — IDs, hashes, timestamps

respondent_id 0OB3D0-4c9f-40Oa-b8e1-0O7d2f
batch_hash sha256:0d0OO93f8b1c0e5a0O2d4f6b8a0c1e3d
ingested_at 2026-08-26T13:04:22Z
latency_p99 148.03 ms · 0 dropped · status != 200

Slashed zero ON — inverse of the currency rule

In 0OB3D0 the distinction between zero and capital O is the payload. Toggle it off above and read the respondent ID again.

No tnum, and that's not an omission

A monospace face is fixed-advance by construction — every glyph already occupies one cell, so tnum has nothing to do. That's why none of the six monos tested carries the feature. Asking for tnum on a mono is a no-op that signals the author didn't know why they were asking. What you do need is calt: 0 — JetBrains Mono's contextual alternates fuse != into a ligature, and an ID needs the literal sequence.

04 — The wordmark

The medial capital is structural, not decorative.

It splits the name into its two halves — the same two-audience idea the mark encodes. Lose it and the brand reads as one undifferentiated word.

Correct · Archivo 700 · wdth 112 · tracking −0.04em

SurveyStream

Tracking is tighter than the scale's −0.034em at this size. The capital S in the middle opens an optical gap the systematic rule can't know about — this is a deliberate manual override, and the only one in the system.

All-caps is prohibited — including inside all-caps contexts

In a tracked uppercase eyebrow or a table header, the brand name stays sentence case as a deliberate exception. Enforce it rather than trusting authors:

.ss-brand { text-transform: none !important;
  hyphens: none; white-space: nowrap; }

Example — eyebrow with the exception applied

POWERED BY SurveyStream · Q3 PANEL

Setting rules

  • Two-tone (Survey in text-primary, Stream in the accent) is for the lockup only. In running copy the name takes the colour of surrounding text.
  • Minimum size 20px cap height, roughly 96px wide. Below that use the mark alone.
  • Never break across lines, never hyphenate, never letter-space to fill a measure.
  • Lowercase only in technical identifierssurveystream.com, @surveystream. Never in prose.

05 — Fallbacks

Measured, not guessed.

A fallback with a different x-height makes the page reflow when the webfont lands. The fix is size-adjust, and the correct value is a ratio of measured x-heights — both sides read out of the actual binaries.

See the reflow

Your payout of $1,284.50 has cleared and will arrive within two business days. You completed 24 of 30 surveys this month, which puts you 6 away from the next reward tier.

Switch between the first two — the block barely moves. Switch to the third and the line breaks change, which is exactly the layout shift your users see on a cold load. This demo relies on a local Helvetica or Arial, so the effect is strongest on macOS and Windows and may not render on Linux.

Print

  • Static instances, not variable fonts. Some RIPs mishandle variable axes and silently render the default instance.
  • Use Inter's text optical size (opsz 14) for print body. The display cut is built for backlit screens and looks cramped in ink.
  • 8pt body minimum, 6pt caption. Below 8pt the high x-height stops helping and counters fill in on uncoated stock.
  • No fallback chain — fonts are embedded. Confirm embedding permissions in the PDF export.

Licensing

  • Open-source stack: all three are OFL. Free for commercial use, web embedding and PDF embedding. The reserved-name clause means don't ship a modified font under the same name.
  • Premium stack: desktop licenses per seat, a web license usually metered by monthly pageviews, and a separate app license if the faces ship inside a native client. Budget all three and re-check the pageview tier before launch.