Skip to content

Typography

Text is shaped and rasterised by the platform’s own text stack: CoreText on macOS and iOS, FreeType and HarfBuzz on Linux. Core decides which font each character comes from and how many cells it occupies, so a session reads the same on every client.

The examples below use the Noir theme.

Five underline styles, superscripts, subscripts and multiline mathematical brackets in Noir.
Styled underlines, raised and lowered text, and assembled mathematics.

The default face is SF Mono where it is installed; otherwise it is the bundled JetBrains Mono, with variable weight in upright and italic. The app also bundles Monaspace Neon, Symbols Nerd Font Mono for icons, and GNU Unifont, which is compiled into Core so that every client has a last-resort face. Linux bundles Noto Sans for proportional runs and Noto Color Emoji.

Fallback routing picks a face per character, in order: your per-range overrides ([[font.range_map]]), per-language fallbacks for Han, kana and Hangul ([[font.language_fallbacks]], cjk_fallback), the symbol face, emoji, script fallbacks, and then the system’s own cascade. The routing policy lives in Core; CoreText and fontconfig resolve the families.

Programming ligatures (calt) are on by default. font.features allows or blocks individual OpenType features, including stylistic sets ss01 to ss20 and the slashed zero. Ligature runs are shaped once and cached. On Linux the same features go through HarfBuzz.

Faces with variable axes take font.weight, font.bold_weight, font.width and arbitrary axes through font.variations. A program can choose a weight per run with CSI 1 : n m (n from 0 to 7, an Ubiquitty extension); plain CSI 1 m stays exactly bold.

A program can print a run in a proportional face, or at two to five times the cell size, with OSC 66. Each run declares how many cells it occupies, and Core holds that footprint, so the run lands in the same cells on every client and on replay. Alignment inside the footprint can be left, right, centred or justified.

A local Ubiquitty window with proportional prose, bold and italic lines, alongside monospaced code and an aligned table.
Proportional prose and monospaced code in a local native window.
A remote typography pane with proportional text in a review-queue box, styled underlines, superscripts, subscripts and multiline mathematics beside documentation in Neovim.
Proportional text and precise terminal layout, together over QUIC.

DEC double-width and double-height lines (DECDWL, DECDHL) are supported on every client; the Welcome screen’s title is one.

Single, double, curly, dotted and dashed underlines, coloured underlines (SGR 58 and 59), overline, framed and encircled text. Skip-ink breaks the underline where a descender crosses it, with an adjustable gap ([underline] skip_ink, skip_ink_pad).

Two underlined lines in large type, 'Typography, gauging jumpy quays' with a straight rule and a curly red rule below the second line; both rules break around the descenders of g, j, p, q and y.
With skip-ink on (the default), the rule breaks around descenders.
The same two underlined lines with skip-ink off: the rules run straight through the descenders.
With skip-ink off, the rule runs through them.
Plate II, styles, rules and colour: inverse, struck, overlined, concealed and faint italic text; single, double, curly, dotted and dashed underlines, two in colour; ideogram marks on CJK text; a hyperlink; ANSI colours, the 256-colour cube, the grey ramp and a truecolour gradient.
Underline shapes, coloured rules and ANSI-to-truecolour palettes.

Grapheme clusters follow Unicode’s segmentation rules, so ZWJ sequences, flags, skin tones, variation selectors and stacks of combining marks each stay one character in one or two cells. Colour emoji come from CoreText on Apple platforms and from the bundled Noto Color Emoji on Linux; CSI 76 : n m pins emoji or text presentation for a run. East-Asian ambiguous width is a setting, and legacy encodings (Latin-1, KOI8-R, Shift_JIS, EUC-JP, EUC-KR, GB18030, Big5 and others) are decoded before segmentation.

Plate IV, scripts, marks and emoji: Chinese, Japanese and Korean text two cells per glyph, a sized CJK glyph and emoji, precomposed and combining accents, colour emoji with variation selectors and ZWJ sequences, arrows and geometric shapes.
Wide scripts, combining marks and emoji sequences in the terminal grid.

Arabic joining and part of the bidirectional algorithm are implemented, using presentation forms. Contextual alternates and mark positioning are not.

Plate V, boxes, blocks and separators: light, heavy, double and rounded box-drawing figures with junctions, dashes, block elements, shades, sextants, and Powerline separators forming segment bars.
Box drawing, blocks and separators that tile without seams.

Sized text, ligatures and mathematics on macOS and Linux.

Plate I in Noir on macOS: double-height and double-width lines, sized text, weights, assembled mathematics and ligatures.
Sized text, ligatures and mathematics on macOS.
Plate I in Noir on Linux: the same double-size lines, text sizes, weights and mathematics as the macOS plate.
Sized text, ligatures and mathematics on Linux.