LUDIC/MONO Ludic Sans

Fixed-pitch variable system

LM—001 / Interactive proof

Code has
a voice.

A technical companion to Ludic Sans for interfaces, terminals, data, diagrams, and everything that needs to line up without going quiet.

const future = await agent.build("type");

LIVE COORDINATES wght 500 · slnt 0 · opsz 16 · ss11 off · ss09 off 600-UNIT CELL

01 / Cell discipline

Every character gets the same room.

Different silhouettes, identical advances. The grid stays intact from a whisper to a warning.

MiW.0O 1lI|{}
000000000000000000000000 iiiiiiiiiiiiiiiiiiiiiiii WWWWWWWWWWWWWWWWWWWWWWWW Mi.0O1lI|{}[]()<>/\!?@#

02 / Identity

Designed for the characters that cause mistakes.

Ambiguity is tested in context, where a glyph has to work—not in an isolated alphabet poster.

AMBIGUITY MATRIX / DEFAULT

Ambiguous character combinations in Ludic Mono
ProbeGlyphsIdentifier
Zero / O0 O ØO0_AUTH_08
One / line1 l I |llI1_PIPE
Brackets{ } [ ] ( )map[key_01]
Marks. , : ; ' `v1.10::next
Operators- = ~ < >a != b -> c

IDENTIFIER STRESS / 14PX

request_0O1lI_2026 API_KEY="Il10O0-ff" release/v3.2.0-rc.01 sha256:7f0a1c9e42bd 192.168.001.010:4173

03 / Working languages

One rhythm across the stack.

Four syntax densities expose punctuation, indentation, numerals, casing, and optional coding ligatures.

TypeScriptindex.ts
01  type Session = {
02    id: string;
03    active: boolean;
04  };
05
06  const result = await deploy({
07    id: "LD-042", active: true,
08  }); // input -> output
JSONmanifest.json
01  {
02    "family": "Ludic Mono",
03    "axes": ["wght", "slnt", "opsz"],
04    "fixedPitch": true,
05    "build": 20260711,
06    "probe": "0O1lI"
07  }
Shellbuild.sh
01  #!/usr/bin/env zsh
02  set -euo pipefail
03
04  bun run build && bun run check
05  git status --short
06  printf '%-12s %08d\n' "done" 42
07  # source -> variable.woff2
SQLaccounts.sql
01  SELECT
02    account_id,
03    annual_value,
04    renewal_date
05  FROM accounts
06  WHERE status != 'paused'
07    AND annual_value >= 10000
08  ORDER BY renewal_date;

04 / Terminal graphics

Lines meet. Blocks hold.

Complete box drawing and block elements keep dashboards, CLIs, and text diagrams continuous.

┌────────────────────┬──────────┐
│ JOB                │ STATUS   │
├────────────────────┼──────────┤
│ build_variable_042 │ ███████░ │
│ subset_latin_core  │ ▓▓▓▓▒░░░ │
│ deploy_production  │ ████████ │
└────────────────────┴──────────┘

▁▂▃▄▅▆▇█

█▉▊▋▌▍▎▏

░▒▓█▓▒░

▖▗▘▙▚▛▜▝▞▟

05 / Variable proofs

Three axes. One fixed rhythm.

Weight carries hierarchy, slant signals motion, and optical size adjusts the drawing without changing the voice.

Weight / wght

100 ship --dry-run

200 ship --dry-run

300 ship --dry-run

400 ship --dry-run

500 ship --dry-run

600 ship --dry-run

700 ship --dry-run

800 ship --dry-run

900 ship --dry-run

Slant / slnt

await response

−4° await response

−8° await response

−12° await response

Optical size / opsz

09 data_pipeline_01

16 data_pipeline_01

48 data_pipeline_01

96 data_pipeline_01

06 / Interface sizes

Read it where software actually lives.

Small sizes are shown at literal CSS pixels on both sides of the theme.

Light surface#F0ECE2

11px GET /v1/accounts/0O1lI · 200 OK · 42ms

12px build_042 completed with 0 warnings

14px const status = response.ok;

16px Deploy ready for review →

Dark surface#0C0D0B

11px GET /v1/accounts/0O1lI · 200 OK · 42ms

12px build_042 completed with 0 warnings

14px const status = response.ok;

16px Deploy ready for review →

07 / Product language

Identifiers travel, too.

Precomposed accents, combining marks, Vietnamese, Russian, and Ukrainian appear in code-like contexts.

VI / Vietnamese

người_dùng = "Nguyễn Ánh"; đồng_bộ(trạng_thái); phiên_bản_đầu = 2026; tài_khoản.đã_xác_minh

RU / Russian

пользователь_01 синхронизация = готово; версия_сборки_042 статус != "ошибка"

UK / Ukrainian

користувач_їжак синхронізація = готова; версія_збірки_042 стан != "помилка"