TT2026
Ten weights, upright and italic, in Subtle, Worn and Battered. Ten changing impressions per character.
All 60 faces, with built-in x, dash and underscore corrections. Available Latin and script coverage included. Try the font.
Ready to use / 03
Ready-made fonts for documents and websites. Choose TT2026 or The Last Remaining Typewriter. No build required.
Ten weights, upright and italic, in Subtle, Worn and Battered. Ten changing impressions per character.
All 60 faces, with built-in x, dash and underscore corrections. Available Latin and script coverage included. Try the font.
A separate machine with bent types, uneven pressure and thirty impressions. Ten weights, upright and italic.
All 20 faces, with thirty impressions for each correction; 114-character core. Meet the machine.
Choose individual TTFs to install only the weights and styles you need, or a TTC collection to install the same faces from one file. Unzip the download and open the font files in your system’s font installer. Install either the TTFs or the TTC, to avoid duplicate families. If an application does not accept TTC collections, use the TTFs instead.
The desktop weight names are Thin, Extra Light, Light, Regular, Medium, Semi Bold, Bold, Extra Bold, Black and Extra Black, with matching italic styles.
Choose the family in your application. Subtle, Worn and Battered are separate families. Both desktop formats include the correction features. Select stylistic set 1 for x overprinting, set 2 for dashed strike-through, or set 3 for typed underscores. Set 4 adds red correction ink. Your application must expose stylistic sets; colour rendering also requires colour-font support.
Enable contextual alternates in applications that offer the setting. This lets repeated characters use different impressions. Support varies between applications; the text still works when alternation is off.
Unzip the web download, copy its fonts folder to your site,
and link the included stylesheet. Keep the license and notice with it.
<link rel="stylesheet" href="fonts/fonts.css">
<style>
.typewritten {
font-family: 'TT2026 Worn', monospace;
font-weight: 400;
font-style: normal;
font-feature-settings: 'calt' 1;
font-synthesis: none;
line-height: 1.4;
}
</style>
Choose TT2026 Subtle, TT2026 Worn or
TT2026 Battered. For LRT, use its download and
TT2026 The Last Remaining Typewriter.
Set weights from 100 through 1000 and use font-style: italic
when wanted. These are separate static faces.
The ZIP contains the full range, but visitors download only the faces and character ranges used on your page. You do not need to preload them all. Keep separately downloaded font folders apart if using more than one bundle.
X overprints, dashes and underscores are built into every weight and style. TT2026 has ten impressions of each mark; LRT has thirty. The marks follow a different sequence from the letters, without adding character width. No separate correction font is needed.
.crossed {
font-feature-settings: 'calt' 1, 'ss01' 1;
text-decoration: none;
}
.struck { font-feature-settings: 'calt' 1, 'ss02' 1; }
.underlined {
font-feature-settings: 'calt' 1, 'ss03' 1;
text-decoration: none;
}
/* Optional coloured ink: add ss04 alongside one correction. */
.red-correction { font-feature-settings: 'calt' 1, 'ss01' 1, 'ss04' 1; }
Choose one of the three correction features at a time. Marks use the text colour by default; set 4 uses a translucent red palette. The inks overlap with normal transparency, not Multiply blending. The lettering stays selectable, and spaces carry correction marks too.
Enable ss04 to use coloured correction ink, then override palette entry 0 with @font-palette-values. This example makes the x marks blue at 80% opacity while the letters keep their ordinary CSS color. No font rebuild or extra download is needed.
@font-palette-values --blue-corrections {
font-family: "TT2026 Worn";
override-colors: 0 rgb(40 100 210 / 80%);
}
.blue-correction {
font-family: "TT2026 Worn", monospace;
font-feature-settings:
"calt" 1,
"cv99" var(--start, 0),
"ss01" 1,
"ss04" 1;
font-palette: --blue-corrections;
text-decoration: none;
}
<del class="blue-correction">This needs correcting.</del>
Change rgb(40 100 210 / 80%) to the colour and opacity you want. The palette override replaces the default translucent red; its opacity is not multiplied by the default red’s opacity. Use 100% for opaque ink. The palette name is used directly in font-palette, without var().
The font-family in the palette rule must match the family used by the text. Replace TT2026 Worn in both places with TT2026 Subtle, TT2026 Battered or TT2026 The Last Remaining Typewriter as needed. The override applies across that family’s weights and both styles. To use the same palette name with several families, repeat the @font-palette-values block for each family.
Replace "ss01" 1 with "ss02" 1 for dashes or "ss03" 1 for underscores, keeping "ss04" 1 enabled. Without ss04, the marks follow the text colour and ignore the palette. The cv99 setting preserves the paragraph’s selected starting impression; it defaults to 0 when --start is unset.
Custom palettes require browser support for colour fonts and @font-palette-values. If palette overrides are unavailable but colour fonts work, the marks keep their built-in red. These CSS palette rules apply on the web; desktop colour controls depend on the application.
I vary the starting impression across headings and paragraphs, so a heading and the paragraph after it need not open with the same mark. This compact CSS-only rule uses their positions in the article. No JavaScript is needed.
.article > :is(h1, h2, h3, h4, h5, h6, p) {
font-feature-settings:
"calt" 1,
"cv99" mod(sibling-index() - 1, 10);
}
sibling-index() counts from 1. Subtracting 1 makes the first child start at impression 0, and mod(..., 10) wraps the sequence through 0–9. A heading followed by two paragraphs starts at 0, 1 and 2; the eleventh child starts at 0 again. Zero selects the first stored impression. "calt" 1 keeps impressions alternating within each heading or paragraph rather than applying that starting impression to every letter.
Every sibling element counts, including images and lists, even though this rule only applies the font features to headings and paragraphs. The > selector targets direct children of .article. Nested sections and blockquotes are not part of that direct-child sequence; give a nested container the article class to start its own sequence. This is a position within each parent, not a counter carried across the whole document or from the ending impression of the previous paragraph.
The Last Remaining Typewriter has thirty starting impressions. Change 10 to 30 to cycle through 0–29. With 10, LRT still alternates through its full set inside each text block, but only the first ten starting positions are selected. CSS does the wrapping; the font does not calculate a modulus for larger values.
Inline text inherits the computed font features unless another rule overrides them. If a correction or other rule sets font-feature-settings, it replaces the whole list: retain calt and the intended cv99 value alongside the correction features. Font or style changes can also restart shaping.
For older browsers without sibling-index() or mod(), use these explicit rules instead of the compact rule above. They produce the same 0–9 sequence for headings and paragraphs. Here, :nth-child() deliberately counts every sibling element too; :nth-of-type() would count headings and paragraphs separately.
.article > :is(h1, h2, h3, h4, h5, h6, p) {
font-feature-settings: "calt" 1, "cv99" var(--start, 0);
}
.article > :nth-child(10n + 1) { --start: 0; }
.article > :nth-child(10n + 2) { --start: 1; }
.article > :nth-child(10n + 3) { --start: 2; }
.article > :nth-child(10n + 4) { --start: 3; }
.article > :nth-child(10n + 5) { --start: 4; }
.article > :nth-child(10n + 6) { --start: 5; }
.article > :nth-child(10n + 7) { --start: 6; }
.article > :nth-child(10n + 8) { --start: 7; }
.article > :nth-child(10n + 9) { --start: 8; }
.article > :nth-child(10n) { --start: 9; }
The --start custom property supplies the selected value to cv99; var(--start, 0) defaults to 0 if it is unset. For all thirty LRT starts, expand this fallback to thirty 30n rules with values 0–29.
The regular desktop fonts include all available printable source characters: 729 upright and 462 italic. The web package separates Latin and common symbols from additional scripts, which load when needed.
60 faces, with ten impressions per character.
| Style | Package | Characters | WOFF2 per face |
|---|
Web fonts share letter and accent components to save space, including where they overlap. Desktop TTF and TTC files retain individually distressed accented letters. The Last Remaining Typewriter keeps its individual letterforms in both formats.
LRT has its own 114-character core: ASCII, selected Nordic and European letters, the euro sign, curly quotes and typographic dashes. The correction features cover Latin and common symbols for regular TT2026, and the same core for LRT.
Coverage is inherited from the source designs. Greek, Armenian and Hebrew
have no italic source; Cyrillic coverage differs between styles.
Prefer precomposed accented letters: combining marks and Hebrew vowel-mark
positioning are not included. The italic source lacks a nonbreaking space.
Unsupported characters use your fallback font. The web download includes
coverage.json with the full audit.
TT2026 and LRT are open-source fonts under the SIL Open Font License 1.1. Every download includes the license and credits for Fredrick Brennan’s original work and my continuation.
To change the pressure, wear, character set or other generation settings, see the source repository and build instructions. The ready-made downloads above need no Python or build tools.
See the illustrated making of TT2026, or read about the mechanics behind LRT.