What Brennan noticed
In his account of TT2020, Brennan describes a problem with typewriter fonts: distress repeated perfectly becomes another kind of digital regularity. Seeing the typewritten props in Joker helped prompt him to turn a postponed idea into a font. His target was variation between strikes, not just a uniformly damaged alphabet. Read his explanation, “The Problem”.
His solution stored nine versions of a glyph and let contextual OpenType substitutions choose between them. He credited Skef Iterum with helping him find a simpler class-based approach after considering a more substitution-heavy alternative. Spaces carried the sequence too. Read “My Solution”.
The underlying designs came from IBM Selectric Pica 10 Pitch and Light Italic 12 Pitch. His documented workflow used FontForge, seeded bitmap distress through GIMP/GEGL, and traced outlines. TT2026 retains the supplied base outlines and the idea of variation inside the font; it replaces that build workflow with a configurable Python pipeline. The original project is preserved in my mirror and Brennan’s repository.
Decisions made by looking, not by adding knobs
I developed TT2026 by comparing specimens and adjusting what looked wrong. I wanted the damage to resemble missing or uneven ink, while keeping the font useful on a web page.
Wear became broader. Fine, evenly scattered noise looked artificial. Larger connected losses and smoother contours gave the letters a more convincing surface. Interior damage became rarer than edge damage, especially as heavier strokes filled with ink.
Heavy ink needed its own behaviour. Corners collect ink and nearby strokes can merge. The remaining internal losses are larger, irregular patches that loosely follow the stroke; some can open through the edge. Weight 1000 is deliberately flooded with ink; weight 100 is fragile and faint, with strokes that can break into traces as wear increases. Both ends are expressive extremes.
Fragile details needed care, not immunity. Rings, dots and other detached shapes receive geometric protection against complete erasure. They can still chip and break. Punctuation wear was subsequently reduced so that small marks would not become distracting. Very narrow scratches and pinholes are healed.
Pressure became uneven. A keyboard-finger model makes some keys lighter on average, with a stronger difference at heavy wear and smaller variation between impressions of one key. It is an artistic approximation based on US ANSI positions, not a claim about every typist. Accents usually follow their base letters; æ follows a, ø follows o, and € follows e.
The italic found a middle ground. After comparing running text, I settled on 90% of its original height while retaining its original outline width. Its fixed advance and line metrics match the upright. That preserves the italic’s character without requiring a taller line box.
Smaller files won. Aggressive contour simplification survived both body-text and heading comparisons. Quadratic curves then softened the visible corners with restrained fitting error. I chose ten stored impressions as a compromise between variety, build time and download size.
From a letterform to an impression
Follow one å through the actual build: upright, weight 400, Battered, impression 4. Every stage uses the same scale; the curve detail is enlarged.
Shape & ink
Start with the original outline, adjust its weight and let ink collect in corners. Small detached features receive support so they can survive thinning and wear.
Wear & trace
Apply repeatable, correlated noise, with stronger damage near the edges. Blur, threshold and trace the worn shape into contours; add occasional irregular internal losses.
Protect, chip & heal
Apply key pressure and per-impression variation. Let small features chip without losing their identity, and heal implausibly narrow scratches and pinholes. Punctuation gets a lighter touch.
Simplify & fit curves
Remove unnecessary vertices, then fit quadratic curves within strict shape and topology limits. Here, 113 polygon points become 110 points with 14 fitted curves. Some straight edges and sharp wear remain deliberately.
Coloured segments are the fitted curves. Circles lie on the outline; squares and dashed handles show how each curve is controlled.
The same bend, enlarged:
Package & alternate
Store the impressions with identical 547-unit advances and add OpenType substitutions. WOFF2 compresses the outlines; the browser selects the stored shapes as it lays out text.
åååååååååå
Ten stored impressions; unchanged character spacing.
A continuation, not a compatibility layer
TT2026 has new family names, a new build interface and its own defaults. It does not reproduce TT2020’s filenames or build environment. The compact core covers 114 characters. An expansion build adds the available Latin outlines and separate script packages loaded through Unicode ranges. Coverage differs between upright and italic; the package table reports the current build and its limits. Nothing is randomly generated by the browser. These are static TrueType outlines packaged as WOFF2, with deterministic contextual alternation. Repeated text can repeat its impressions, and shaping boundaries can restart the sequence.
In memory / 1994–2026
Rest in peace, Fredrick Brennan.
From helping build 8chan to publicly opposing the toxic culture and far-right movements around it, Brennan’s life included a difficult change of direction. His later work did not erase the earlier harm. It did show a willingness to reconsider. As a programmer and type designer living with osteogenesis imperfecta, he left work that continues to inspire me. Thank you, Fredrick – and good luck, wherever the next journey leads.
Context: Brennan’s 2020 interview, his opposition to QAnon and 8chan, his 2015 interview, and Arthur Jones’s remembrance, which reports his death on 10 January 2026.