Rendered on a single horizontal line of height 24px, padded to a multiple of 24px. Hover a patch or character below to highlight its window.
Patch size (
pixels_per_patch)
24 × 24 px
Controls line height and square patch width (
window = pixels_per_patch).
Sliding window stride (
stride)
24 px (continuous)
Font size & DPI
10pt @ 120 DPI (16.7px)
scaled_px = (dpi / 72) * font_size with 2px horizontal pad.
Font family
Noto Sans
Includes automatic Unicode script & symbol fallbacks.
Choose or type an example
Includes examples fromminimal-renderer.ipynb and the EMNLP playground
From
minimal-renderer.ipynb:
From
tokenization-tutorial:
Engine: PangoCairo (GoNotoCurrent.ttf)
Edit the text above to render live in your browser
1. Rendered sentence strip
image_generator.get_image(sentence)
(24, 144)px (H × W)
6 patch widths
2. Sliced image patches (visual tokens)
image_generator.get_images(sentence)
6patches
1.2 chars / patch
Sliding a 24×24 window with stride 24px across the rendered sentence strip. Click any patch to pin it in the pixel inspector below.
Patch #1 · Pixels x = 0..24
Covers characters [0:2] · Click any patch above to lock selection.
Patch shape
(24, 24) uint8
Horizontal slice
[:, 0:24]
Covered text
"𒁹"
Ink coverage
18.4% non-white
3. Byte-level BPE (cl100k_base approximation / UTF-8 subwords)
Discrete vocabulary lookup
0tokens
0.0 bytes/token
Subword tokenizers split rare scripts, decomposed diacritics, or styled Unicode into multiple UTF-8 byte fallback tokens, whereas visual patches slice uniformly in pixel space.
4. Raw UTF-8 bytes
TextEncoder().encode(sentence)
0bytes
0 code points
Each multi-byte character (3 bytes for Devanagari/CJK, 4 bytes for Cuneiform/Emoji/Fraktur) expands the byte sequence length relative to visual width.
Compare rendered examples side by side
Both columns share the renderer settings above. Compare how visual patch counts behave on accents, spacing, or scripts.
Start with: