BH Swiss TUI Canon · §Apex · 2026.04
Est. 2026
Nodes 7,513 · Edges 24,363 · Tokens 122
Rev. Apex Fullmerge · Lic. Open

VHX

Subject
A Swiss grid retrofitted for the terminal. One family, one accent, one contract.
Medium
ASCII · ANSI · Unicode · Motion
Set in
Geist Mono · 9 weights, roman only
§0000
Setting the type

Geist Mono, set without apology.

FamilyGeist Mono Nerd Font
Cuts9 weights · roman only · Thin 100 → UltraBlack 900
PrincipleOne family, set at the right size, with enough air.
VHX
Wordmark · 240px
UltraBlack 900
Tracking −7.5%
Leading 0.82
ThinAa Bb 01 ←→ ░▒▓█100
UltraLightAa Bb 01 ←→ ░▒▓█200
LightAa Bb 01 ←→ ░▒▓█300
RegularAa Bb 01 ←→ ░▒▓█400
MediumAa Bb 01 ←→ ░▒▓█500
SemiBoldAa Bb 01 ←→ ░▒▓█600
BoldAa Bb 01 ←→ ░▒▓█700
BlackAa Bb 01 ←→ ░▒▓█800
UltraBlackAa Bb 01 ←→ ░▒▓█900
mega240240 / 800
displayType, set.96 / 200
h2Deterministic.52 / 800
h3Every glyph carries a fallback.24 / 600
bodyThe page lints itself on mount and reports in §08.16 / 400
uimetric_row · dash · 24 tests · 100%13 / 500
microSwiss TUI Canon · Apex10 / 700
§0101
The contract

Determinism, or nothing.

Signatureresolve(token, profile, t) → cells
MediumSame contract for 7 surfaces — truecolor, ANSI16, ASCII-only, DOM, canvas, mobile, static snapshot.
01·a Pipeline

    
01·b Surface profiles
ProfileColorGlyphMotion
01·c Quality gates
rect_gridno ragged rows
border_closescorners match
no_tabtabs break cells
grapheme_safeno width drift
ascii_fallbackrequired
contrast≥ 4.5 (text)
flash≤ 3 / s
reduced_motion→ 8 fps step
§0202
Palette

Eleven themes, nine slots each.

Slotsbg · surface · panel · fg · accent · a · b · c · status×4
ContractEvery hex declares an ANSI16 fallback and a density glyph. Click a card to apply.
§0303
Atoms

Density · borders · glyphs.

RuleEvery primitive has an ASCII-only twin. Coverage is measured, not felt.
03·a Density ramp — 6 steps, measured
03·b Sparkline — 8 steps, falls to ramp
▁ ▂ ▃ ▄ ▅ ▆ ▇ █
Fallback → . - = + * # @
Flow
──→   ←──   ─┬─   ─┼─
Tesseract vertices
·  far      ◇  mid      ◆  near
§0404
Moving pictures

Motion is a formula, not a mood.

Rigiditycursor 1.0 · conveyor 0.9 · breathe 0.25 · water 0.15
Reducedcadence collapses to 8 fps stepwise.
04·a Behaviors
idformularig.
breathebase + A·sin(2π · 0.25 · t)0.25
conveyor⌊t·12⌋ mod L0.90
water½n₁ + ³⁄₁₀n₂ + ¹⁄₅n₃0.15
smoothstep3x²(3−2x)
04·b Machines — 8 state machines, every state listed
breathe(t)

    
conveyor(t)

    
water(x,y,t)

    
§0505
Live specimen

Four atoms, rotating.

Stage1 family · 1 size · 1 accent. The motion does the talking.

    
§0606
After Paul Bourke · Acerola

ASCII is not pixels. Shape matters.

Method6-D shape vector per glyph · nearest-neighbor lookup · contrast enhancement.
WhyCharacters have geometry. Treat them like it.
06·a Source signal
96×96 luma field, rotating.
06·b Rendered with shape vectors

    
06·c Controls
Contrast exponent
Shape mode
Note Shape mode uses per-glyph top/middle/bottom density; pixel mode uses a single luma-to-char lookup. Edges sharpen, rings form.
§0707
In the lineage of cmatrix · pipes.sh · unimatrix

Screensaver as system check.

Cadence30 fps · reduced → 8 fps stepwise.
DeterministicSeed · time · width → frame. No RNG in the pipeline.

    
vhx-time 0.4.1
accentphosphor
frame0000
t0.00s
cells0
reduced-motionoff
§0808
Atoms, shipped

Twelve sprites for agents & status.

Signaturesprite(t) → string. Declared cell footprint; frames never shift size.
§0909
Families

Fourteen component families.

EachContract · live specimen · validator rows.
09·a metric row — dashboards

      
09·b sparkline — charts

      
09·c table

      
09·d form — error state

      
09·e control matrix

      
09·f message stream

      
09·g navigation rail
09·h flow diagram
§1010
Breakage math

Borders don't break, probabilistically.

ActionDrag the bottom-right corner of the panel to resize.
cols 80 · bp standard P(break) 0.00
10·a formula
P = clamp01(
  smoothstep3(1 − (cols − min)/(min·0.5))
  + 0.25 · has_wide_glyphs
  + 0.15 · has_ligatures
  + 0.20 · near_breakpoint
)
10·b breakpoints · 4-cell hysteresis
narrow40 — 79
standard80 — 119
wide120 —
10·c live breakdown
§1111
Self-validation

The page lints itself.

ScopeEvery specimen on this sheet runs the validator suite on mount. Report, below.
11·a rolled-up report
§1212
Implementation

Six export targets.

SourceJSON tokens. Rust · Go · Zig · WASM · Pretext.js read the same file.

§1313
Accessibility

Eight non-negotiable rules.

AXStatus is never color-only. Every motion has a reduced path.
AXcontrast.text≥ 4.5 · WCAG AA
AXcontrast.non_text≥ 3.0
AXflash≤ 3 / s · WCAG 2.3.1
AXreduced_motioncadence → 8 fps step
AXascii_fallbackrequired for every primitive
AXpause_availablefor motion > 5 s
AXstatus_glyphnever color-only
AXplain_textsnapshot ≡ rendered
Status, stripped of color
✓  OK       build passed · 12s
▲  WARN     rate limit · 840 / 900
✗  ERROR    upstream timeout · retry 3 / 5
◇  INFO     agent idle · wake < 0.1s
Each prefix carries meaning even when color is stripped.
§1414
Live data

Eight instruments, all in cells.

EngineOne ticker · 30 fps · 8 fps reduced · same t → same frame.
PactNo RNG. Every pixel is f(t). The page can be screenshotted.
14·a trend — multi-line plot
14·b heatmap — activity by hour
14·c horizontal bars — system perf
14·d vertical bars — daily active
14·e spinners — six rotors
14·f progress — four idioms
14·g wave + glow
14·h message status