Sorting knows its units:350 µs, 12 ms, 1.2 s,
1m 30s and 6 days sort as the durations they are, 1,440 as a
number and €420 as money. In a long table, the header row stays on screen
as it scrolls.
s sort by a column C-←C-→ another table t auto, grid, records
Prose rewraps and tables re-lay out the moment the terminal changes size. A table too wide to fit
turns into records, a card per row; widen the terminal and the grid comes back.
Relative paths, [[wiki links]], anchors and src/main.rs#L42. Back
returns to the same spot, with the same link focused.
Links that survive moves: a wiki link is found by name anywhere in the vault, as in
Obsidian. An Obsidian vault needs no setup; any other folder of notes, one line in
config.toml.
Tab focus Enter follow BS back L forward
o outline l links
A gantt chart in a ```mermaid block draws its tasks as bars on a date axis that
fits the width, colored by their tags: done, active, critical, milestones.
after, durations and excluded days work as in Mermaid.
png, jpeg and gif (its first frame), right in the note, over kitty, sixel or iTerm2, with half-blocks as the
fallback, and inside tmux. A link to an image opens it full screen.
Piped straight in: ada tells an image by its first bytes, so
curl -s …/cat.png | ada --print draws it right in the terminal, no format to name.
One tool in place of bat and kitten icat.ada --print fills the pane at its size: notes rendered, tables and all, code, logs and JSON
highlighted, and images, in kitty's graphics protocol in kitty and Ghostty and in half-blocks elsewhere.
The ten dark ones are below; the light ones are gruvbox-light,
catppuccin-latte, tokyonight-day and rose-pine-dawn.
T previews each as you move through the list, and C-←C-→ switch between dark
and light. Your own start from any of them and change only what they need.
Code, config and other text files open whole and highlighted, in some 200
languages, and logs and JSON through parsers of ada's own (JSON colored however long its lines); main.rs#L24 lands on line 24. w
wraps code or scrolls it sideways, # shows line numbers.
Reads the file again the moment it changes, keeping its place, or with live_reload = "notify" marks the change until r. e opens
$EDITOR at the line on screen.
ada against other terminal markdown viewers on the same machine, documents and terminal. Lower is better;
bars are on a log scale. The times are of two kinds:
wall
How long you wait: time on the clock, from launch, a
key or a resize until the screen shows the result.
CPU
How hard the machine works: processor time the viewer
spends on it, summed over its threads, idle work included, until the screen holds still. It's what a
laptop's battery and fans notice, and it isn't a wait: with several threads busy at once it can exceed the
wall time.
Measured on the 238 KB note, the largest in the vault:
5.7 ms
first paint wall
next: leaf, 21.4 ms (3.8×)
0.03 ms
CPU per line scrolled CPU
next: leaf, 0.28 ms (9.7×)
1.8 ms
re-layout after a resize wall
next: treemd, 18.2 ms (10.1×)
14.7 MiB
peak memory
next: treemd, 22.5 MiB (1.5×)
In a 120×40 terminal
first paint mswallfrom launch until the document's first line is on screen
ada2.9
leaf4.8 1.7×
treemd7.3 2.5×
md-tui21.9 7.6×
glow35.6 12×
mdfried102 35×
CPU per line scrolled msCPUfor one line down, from the key until the screen holds still; the median
ada0.02
leaf0.29 12×
mdfried0.70 28×
glow0.86 34×
treemd0.90 36×
md-tui1.00 40×
search mswallfrom the term and Enter until the match is on screen
ada0.31
md-tui1.1 3.7×
leaf1.6 5.3×
treemd12.0 39×
mdfried102 331×
glowhas no search
re-layout after a resize mswallfrom the first resize until the screen stops changing
ada0.20
treemd1.6 8.0×
md-tui20.7 105×
mdfried100 510×
leaf122 620×
glowblank after a resize
CPU over a held page-down msCPUfor 60 page-downs at 30 a second, until the screen catches up
ada1.2
mdfried9.6 8.0×
leaf10.3 8.6×
md-tui18.5 15×
treemd20.5 17×
glow27.5 23×
peak memory MiBthe most resident at once, over the whole session
ada8.1
md-tui8.5 1.0×
leaf10.6 1.3×
treemd13.5 1.7×
mdfried16.1 2.0×
glow35.8 4.4×
Printing, --print and the other printers
print to a pipe mswallto print the whole document to a pipe
lowdown no highlighting0.62 0.3×
ada2.3
leaf3.2 1.4×
mdcat5.2 2.3×
mcat5.9 2.6×
glow17.0 7.4×
bat source, not rendered60.8 26×
rich64.9 28×
peak memory, printing MiBthe most resident at once while printing
lowdown no highlighting4.9 0.8×
ada6.1
leaf8.8 1.4×
bat source, not rendered15.8 2.6×
mcat17.3 2.8×
mdcat20.7 3.4×
glow25.6 4.2×
rich26.0 4.3×
In a 120×40 terminal
first paint mswallfrom launch until the document's first line is on screen
ada4.2
leaf13.2 3.2×
treemd17.8 4.3×
mdfried102 24×
glow111 27×
md-tui685 164×
CPU per line scrolled msCPUfor one line down, from the key until the screen holds still; the median
ada0.03
leaf0.29 12×
mdfried0.73 29×
glow0.93 37×
md-tui0.99 39×
treemd1.0 40×
search mswallfrom the term and Enter until the match is on screen
ada0.38
leaf3.0 7.9×
md-tui3.7 9.7×
treemd65.6 171×
mdfried108 281×
glowhas no search
re-layout after a resize mswallfrom the first resize until the screen stops changing
ada0.83
treemd9.3 11×
mdfried101 121×
leaf126 152×
md-tuire-parses for seconds
glowblank after a resize
CPU over a held page-down msCPUfor 60 page-downs at 30 a second, until the screen catches up
ada2.1
mdfried13.7 6.4×
leaf20.3 9.5×
md-tui29.3 14×
treemd30.4 14×
glow40.7 19×
peak memory MiBthe most resident at once, over the whole session
ada11.7
md-tui14.0 1.2×
leaf16.8 1.4×
treemd17.4 1.5×
mdfried22.0 1.9×
glow57.8 4.9×
Printing, --print and the other printers
print to a pipe mswallto print the whole document to a pipe
ada3.1
lowdown no highlighting3.2 1.0×
mdcat8.1 2.6×
leaf8.3 2.7×
mcat17.0 5.5×
bat source, not rendered30.0 9.7×
glow67.6 22×
rich128 41×
peak memory, printing MiBthe most resident at once while printing
lowdown no highlighting6.1 0.8×
ada7.5
leaf10.3 1.4×
bat source, not rendered16.1 2.1×
mcat20.1 2.7×
mdcat21.2 2.8×
rich29.7 4.0×
glow34.0 4.5×
In a 120×40 terminal
first paint mswallfrom launch until the document's first line is on screen
ada5.7
leaf21.4 3.8×
treemd30.5 5.4×
mdfried102 18×
glow293 51×
md-tui4,007 703×
CPU per line scrolled msCPUfor one line down, from the key until the screen holds still; the median
ada0.03
leaf0.28 9.7×
mdfried0.76 26×
md-tui0.98 34×
treemd1.0 35×
glow1.1 37×
search mswallfrom the term and Enter until the match is on screen
ada0.55
leaf1.8 3.2×
md-tui5.1 9.2×
treemd96.7 175×
mdfried107 194×
glowhas no search
re-layout after a resize mswallfrom the first resize until the screen stops changing
ada1.8
treemd18.2 10×
leaf131 73×
mdfried201 112×
md-tuire-parses for seconds
glowblank after a resize
CPU over a held page-down msCPUfor 60 page-downs at 30 a second, until the screen catches up
ada3.1
mdfried15.9 5.2×
leaf17.8 5.8×
md-tui31.6 10×
treemd33.4 11×
glow62.0 20×
peak memory MiBthe most resident at once, over the whole session
ada14.7
treemd22.5 1.5×
leaf24.2 1.6×
md-tui30.7 2.1×
mdfried79.0 5.4×
glow96.5 6.6×
Printing, --print and the other printers
print to a pipe mswallto print the whole document to a pipe
ada4.6
lowdown no highlighting6.1 1.3×
leaf11.6 2.5×
mdcat11.9 2.6×
mcat35.9 7.8×
bat source, not rendered66.0 14×
glow138 30×
rich283 62×
peak memory, printing MiBthe most resident at once while printing
lowdown no highlighting8.2 0.9×
ada8.8
leaf11.0 1.2×
bat source, not rendered15.8 1.8×
mdcat21.5 2.4×
mcat24.8 2.8×
rich40.0 4.5×
glow46.2 5.2×
In a 120×40 terminal
first paint mswallfrom launch until the document's first line is on screen
ada57.0
leaf361 6.3×
mdfried403 7.1×
glow3,197 56×
md-tuinever finished parsing
treemdshows one section at a time
CPU per line scrolled msCPUfor one line down, from the key until the screen holds still; the median
ada0.03
leaf0.36 13×
mdfried0.78 27×
glow0.90 31×
md-tuinever finished parsing
treemdshows one section at a time
search mswallfrom the term and Enter until the match is on screen
ada1.7
leaf6.6 4.0×
mdfriedmatch off-screen
md-tuinever finished parsing
treemdshows one section at a time
glowhas no search
re-layout after a resize mswallfrom the first resize until the screen stops changing
ada19.3
leaf98.5 5.1×
mdfried2,207 114×
md-tuinever finished parsing
treemdshows one section at a time
glowblank after a resize
CPU over a held page-down msCPUfor 60 page-downs at 30 a second, until the screen catches up
ada3.0
mdfried18.7 6.2×
leaf20.3 6.7×
glow71.8 24×
md-tuinever finished parsing
treemdshows one section at a time
peak memory MiBthe most resident at once, over the whole session
ada91.1
leaf197 2.2×
mdfried454 5.0×
glow1,187 13×
md-tuinever finished parsing
treemdshows one section at a time
Printing, --print and the other printers
print to a pipe mswallto print the whole document to a pipe
ada47.8
lowdown no highlighting70.7 1.5×
mdcat129 2.7×
leaf231 4.8×
mcat781 16×
glow2,409 50×
rich2,544 53×
bat source, not rendered2,977 62×
peak memory, printing MiBthe most resident at once while printing
What fzf's preview pane shows besides markdown, against the tools ada replaces there: bat, rich and mcat. A preview stops at a budget; the whole file is printed, all of it, to a pipe.
a preview mswallthe first 2,000 rows (bat and rich: 2,000 source lines), to a pipe
ada5.5
bat8.7 1.6×
rich139 25×
the whole file mswallall of it, to a pipe at 100 columns
ada5.5
mcat8.1 1.5×
bat8.7 1.6×
rich138 25×
peak memory, a preview MiBthe most resident at once, for a preview
ada6.8
bat15.2 2.2×
rich42.9 6.3×
peak memory, the whole file MiBthe most resident at once, for the whole file
ada6.6
bat15.1 2.3×
mcat17.5 2.6×
rich42.8 6.5×
a preview mswallthe first 2,000 rows (bat and rich: 2,000 source lines), to a pipe
ada23.3
bat33.2 1.4×
rich218 9.4×
the whole file mswallall of it, to a pipe at 100 columns
ada23.2
mcat30.4 1.3×
bat33.3 1.4×
rich217 9.4×
peak memory, a preview MiBthe most resident at once, for a preview
ada7.7
bat15.5 2.0×
rich48.1 6.2×
peak memory, the whole file MiBthe most resident at once, for the whole file
ada7.6
bat15.6 2.1×
mcat18.8 2.5×
rich48.3 6.3×
a preview mswallthe first 2,000 rows (bat and rich: 2,000 source lines), to a pipe
ada22.8
bat30.2 1.3×
rich196 8.6×
the whole file mswallall of it, to a pipe at 100 columns
mcat most of it as markdown38.4 0.3×
ada113
bat146 1.3×
rich522 4.6×
peak memory, a preview MiBthe most resident at once, for a preview
ada7.7
bat15.3 2.0×
rich46.8 6.1×
peak memory, the whole file MiBthe most resident at once, for the whole file
ada11.1
bat15.5 1.4×
mcat most of it as markdown21.3 1.9×
rich63.8 5.7×
a preview mswallthe first 2,000 rows (bat and rich: 2,000 source lines), to a pipe
ada4.0
rich no color238 60×
bat1,049 265×
the whole file mswallall of it, to a pipe at 100 columns
ada9.1
rich no color398 44×
mcat3,236 356×
bat3,264 359×
peak memory, a preview MiBthe most resident at once, for a preview
ada7.7
bat14.2 1.8×
rich no color48.4 6.3×
peak memory, the whole file MiBthe most resident at once, for the whole file
ada13.5
bat14.2 1.0×
mcat34.8 2.6×
rich no color53.9 4.0×
a preview mswallthe first 2,000 rows (bat and rich: 2,000 source lines), to a pipe
ada6.1
bat no color on lines over 16 KB27.7 4.6×
rich4,368 719×
the whole file mswallall of it, to a pipe at 100 columns
ada25.4
bat no color on lines over 16 KB27.1 1.1×
rich4,281 169×
mcatstopped after 60 s
peak memory, a preview MiBthe most resident at once, for a preview
ada15.7
bat no color on lines over 16 KB25.2 1.6×
rich580 37×
peak memory, the whole file MiBthe most resident at once, for the whole file
bat no color on lines over 16 KB25.6 0.5×
ada52.1
rich580 11×
mcatstopped after 60 s
a preview mswallthe first 2,000 rows (bat and rich: 2,000 source lines), to a pipe
ada4.2
bat1,049 250×
rich no color9,103 2,171×
the whole file mswallall of it, to a pipe at 100 columns
ada302
rich no color24,638 82×
batstopped after 60 s
mcatstopped after 60 s
peak memory, a preview MiBthe most resident at once, for a preview
ada7.7
bat14.1 1.8×
rich no color348 45×
peak memory, the whole file MiBthe most resident at once, for the whole file
A 100×50-cell preview of each image, printed to a pipe, against kitten icat, chafa, mcat and viu: in kitty's graphics protocol, and drawn in characters for any other terminal. A GIF is its first frame, the others told to stop there.
kitty graphics mswalla 100×50-cell preview in kitty's graphics protocol, to a pipe
ada1.3
mcat15.8 12×
kitten icat shared memory22.5 17×
kitten icat streamed, as ada22.9 18×
chafa24.1 19×
half-blocks and symbols mswallthe same preview drawn in characters, for any terminal
ada5.2
viu6.8 1.3×
chafa-vhalf half-blocks only19.7 3.8×
chafa20.3 3.9×
CPU, kitty graphics msCPUuser and system time for the kitty preview, over all threads
ada1.3
mcat15.7 12×
kitten icat shared memory24.8 20×
kitten icat streamed, as ada25.9 21×
chafa26.2 21×
CPU, half-blocks and symbols msCPUuser and system time for the preview in characters, over all threads
ada5.2
viu6.7 1.3×
chafa-vhalf half-blocks only23.8 4.6×
chafa25.4 4.9×
peak memory, kitty graphics MiBthe most resident at once, kitty graphics
ada6.1
mcat28.1 4.6×
kitten icat shared memory32.9 5.4×
kitten icat streamed, as ada34.7 5.7×
chafa37.6 6.2×
peak memory, half-blocks and symbols MiBthe most resident at once, in characters
ada6.1
viu7.5 1.2×
chafa-vhalf half-blocks only28.9 4.8×
chafa28.9 4.8×
kitty graphics mswalla 100×50-cell preview in kitty's graphics protocol, to a pipe
ada7.3
mcat12.3 1.7×
chafa33.9 4.6×
kitten icat shared memory46.6 6.4×
kitten icat streamed, as ada51.8 7.1×
half-blocks and symbols mswallthe same preview drawn in characters, for any terminal
ada4.5
viu20.6 4.6×
chafa-vhalf half-blocks only30.5 6.8×
chafa30.9 6.9×
CPU, kitty graphics msCPUuser and system time for the kitty preview, over all threads
ada7.3
mcat12.2 1.7×
chafa41.6 5.7×
kitten icat shared memory118 16×
kitten icat streamed, as ada125 17×
CPU, half-blocks and symbols msCPUuser and system time for the preview in characters, over all threads
ada4.4
viu20.5 4.6×
chafa-vhalf half-blocks only39.9 9.0×
chafa40.6 9.1×
peak memory, kitty graphics MiBthe most resident at once, kitty graphics
ada7.9
mcat35.3 4.4×
chafa53.5 6.7×
kitten icat shared memory67.4 8.5×
kitten icat streamed, as ada68.2 8.6×
peak memory, half-blocks and symbols MiBthe most resident at once, in characters
ada6.1
viu20.9 3.4×
chafa-vhalf half-blocks only53.3 8.8×
chafa53.3 8.8×
kitty graphics mswalla 100×50-cell preview in kitty's graphics protocol, to a pipe
ada89.2
mcat101 1.1×
chafa154 1.7×
kitten icat shared memory293 3.3×
kitten icat streamed, as ada323 3.6×
half-blocks and symbols mswallthe same preview drawn in characters, for any terminal
ada82.5
viu143 1.7×
chafa-vhalf half-blocks only152 1.8×
chafa153 1.8×
CPU, kitty graphics msCPUuser and system time for the kitty preview, over all threads
ada88.9
mcat101 1.1×
chafa172 1.9×
kitten icat shared memory451 5.1×
kitten icat streamed, as ada481 5.4×
CPU, half-blocks and symbols msCPUuser and system time for the preview in characters, over all threads
ada82.2
viu143 1.7×
chafa-vhalf half-blocks only176 2.1×
chafa178 2.2×
peak memory, kitty graphics MiBthe most resident at once, kitty graphics
ada8.1
mcat68.9 8.5×
kitten icat shared memory107 13×
kitten icat streamed, as ada109 13×
chafa112 14×
peak memory, half-blocks and symbols MiBthe most resident at once, in characters
ada6.0
viu43.4 7.2×
chafa112 19×
chafa-vhalf half-blocks only112 19×
kitty graphics mswalla 100×50-cell preview in kitty's graphics protocol, to a pipe
ada13.3
mcat16.3 1.2×
chafa20.8 1.6×
kitten icat shared memory43.2 3.3×
kitten icat streamed, as ada68.5 5.2×
half-blocks and symbols mswallthe same preview drawn in characters, for any terminal
ada6.8
viu16.7 2.5×
chafa-vhalf half-blocks only17.2 2.5×
chafa18.2 2.7×
CPU, kitty graphics msCPUuser and system time for the kitty preview, over all threads
ada13.2
mcat16.2 1.2×
chafa25.3 1.9×
kitten icat shared memory81.0 6.2×
kitten icat streamed, as ada106 8.0×
CPU, half-blocks and symbols msCPUuser and system time for the preview in characters, over all threads
ada6.7
viu16.6 2.5×
chafa-vhalf half-blocks only24.9 3.7×
chafa26.6 4.0×
peak memory, kitty graphics MiBthe most resident at once, kitty graphics
ada16.9
mcat30.5 1.8×
chafa41.0 2.4×
kitten icat shared memory47.7 2.8×
kitten icat streamed, as ada51.6 3.1×
peak memory, half-blocks and symbols MiBthe most resident at once, in characters
ada14.8
viu15.6 1.1×
chafa-vhalf half-blocks only34.9 2.4×
chafa35.2 2.4×
kitty graphics mswalla 100×50-cell preview in kitty's graphics protocol, to a pipe
ada30.0
chafa38.8 1.3×
mcat39.4 1.3×
kitten icat shared memory116 3.9×
kitten icat streamed, as ada144 4.8×
half-blocks and symbols mswallthe same preview drawn in characters, for any terminal
ada22.7
chafa-vhalf half-blocks only35.7 1.6×
chafa36.4 1.6×
viu80.0 3.5×
CPU, kitty graphics msCPUuser and system time for the kitty preview, over all threads
ada29.8
mcat39.2 1.3×
chafa53.8 1.8×
kitten icat shared memory221 7.4×
kitten icat streamed, as ada248 8.3×
CPU, half-blocks and symbols msCPUuser and system time for the preview in characters, over all threads
ada22.5
chafa-vhalf half-blocks only56.6 2.5×
chafa58.1 2.6×
viu79.8 3.5×
peak memory, kitty graphics MiBthe most resident at once, kitty graphics
ada43.8
mcat61.7 1.4×
chafa67.5 1.5×
kitten icat shared memory67.7 1.5×
kitten icat streamed, as ada69.9 1.6×
peak memory, half-blocks and symbols MiBthe most resident at once, in characters
ada41.6
viu43.3 1.0×
chafa-vhalf half-blocks only61.7 1.5×
chafa61.7 1.5×
kitty graphics mswalla 100×50-cell preview in kitty's graphics protocol, to a pipe
ada48.0
chafa59.1 1.2×
mcat59.8 1.2×
kitten icat shared memory203 4.2×
kitten icat streamed, as ada227 4.7×
half-blocks and symbols mswallthe same preview drawn in characters, for any terminal
ada41.5
chafa-vhalf half-blocks only56.6 1.4×
chafa57.4 1.4×
viu135 3.3×
CPU, kitty graphics msCPUuser and system time for the kitty preview, over all threads
ada47.7
mcat59.5 1.2×
chafa89.6 1.9×
kitten icat shared memory386 8.1×
kitten icat streamed, as ada410 8.6×
CPU, half-blocks and symbols msCPUuser and system time for the preview in characters, over all threads
ada41.2
chafa-vhalf half-blocks only90.8 2.2×
chafa91.9 2.2×
viu135 3.3×
peak memory, kitty graphics MiBthe most resident at once, kitty graphics
ada77.2
kitten icat shared memory93.9 1.2×
kitten icat streamed, as ada97.9 1.3×
mcat98.8 1.3×
chafa102 1.3×
peak memory, half-blocks and symbols MiBthe most resident at once, in characters
ada77.3
viu79.3 1.0×
chafa96.5 1.2×
chafa-vhalf half-blocks only96.5 1.2×
kitty graphics mswalla 100×50-cell preview in kitty's graphics protocol, to a pipe
ada3.2
chafa12.9 4.0×
kitten icat shared memory102 31×
kitten icat streamed, as ada253 78×
mcatplays a GIF as a video, without end
half-blocks and symbols mswallthe same preview drawn in characters, for any terminal
ada1.3
chafa-vhalf half-blocks only9.7 7.5×
chafa9.8 7.6×
viu2,307 1,782×
CPU, kitty graphics msCPUuser and system time for the kitty preview, over all threads
ada3.2
chafa13.1 4.1×
kitten icat shared memory128 40×
kitten icat streamed, as ada283 89×
mcatplays a GIF as a video, without end
CPU, half-blocks and symbols msCPUuser and system time for the preview in characters, over all threads
ada1.3
chafa-vhalf half-blocks only12.6 10×
chafa13.0 10×
viu2,301 1,829×
peak memory, kitty graphics MiBthe most resident at once, kitty graphics
ada8.1
chafa34.3 4.3×
kitten icat shared memory145 18×
kitten icat streamed, as ada201 25×
mcatplays a GIF as a video, without end
peak memory, half-blocks and symbols MiBthe most resident at once, in characters
ada5.8
chafa-vhalf half-blocks only29.1 5.0×
chafa29.2 5.1×
viu1,957 339×
kitty graphics mswalla 100×50-cell preview in kitty's graphics protocol, to a pipe
ada27.9
chafa33.1 1.2×
kitten icat shared memory41.5 1.5×
kitten icat streamed, as ada62.7 2.2×
mcatplays a GIF as a video, without end
half-blocks and symbols mswallthe same preview drawn in characters, for any terminal
ada18.1
viu29.0 1.6×
chafa-vhalf half-blocks only30.0 1.7×
chafa30.9 1.7×
CPU, kitty graphics msCPUuser and system time for the kitty preview, over all threads
ada27.8
chafa38.1 1.4×
kitten icat shared memory75.5 2.7×
kitten icat streamed, as ada98.5 3.5×
mcatplays a GIF as a video, without end
CPU, half-blocks and symbols msCPUuser and system time for the preview in characters, over all threads
ada18.0
viu28.9 1.6×
chafa-vhalf half-blocks only38.4 2.1×
chafa40.4 2.2×
peak memory, kitty graphics MiBthe most resident at once, kitty graphics
ada8.6
chafa45.1 5.2×
kitten icat shared memory45.8 5.3×
kitten icat streamed, as ada50.9 5.9×
mcatplays a GIF as a video, without end
peak memory, half-blocks and symbols MiBthe most resident at once, in characters
ada5.6
viu29.8 5.3×
chafa39.1 7.0×
chafa-vhalf half-blocks only39.2 7.0×
kitty graphics mswalla 100×50-cell preview in kitty's graphics protocol, to a pipe
ada66.6
kitten icat shared memory106 1.6×
kitten icat streamed, as ada134 2.0×
chafadraws nothing
mcatplays a GIF as a video, without end
half-blocks and symbols mswallthe same preview drawn in characters, for any terminal
ada56.9
viu107 1.9×
chafadraws nothing
chafa-vhalf half-blocks onlydraws nothing
CPU, kitty graphics msCPUuser and system time for the kitty preview, over all threads
ada66.3
kitten icat shared memory196 3.0×
kitten icat streamed, as ada225 3.4×
chafadraws nothing
mcatplays a GIF as a video, without end
CPU, half-blocks and symbols msCPUuser and system time for the preview in characters, over all threads
ada56.7
viu107 1.9×
chafadraws nothing
chafa-vhalf half-blocks onlydraws nothing
peak memory, kitty graphics MiBthe most resident at once, kitty graphics
ada8.6
kitten icat shared memory65.5 7.6×
kitten icat streamed, as ada68.1 7.9×
chafadraws nothing
mcatplays a GIF as a video, without end
peak memory, half-blocks and symbols MiBthe most resident at once, in characters
ada5.6
viu107 19×
chafadraws nothing
chafa-vhalf half-blocks onlydraws nothing
kitty graphics mswalla 100×50-cell preview in kitty's graphics protocol, to a pipe
ada70.8
kitten icat shared memory107 1.5×
kitten icat streamed, as ada135 1.9×
chafadraws nothing
mcatplays a GIF as a video, without end
half-blocks and symbols mswallthe same preview drawn in characters, for any terminal
ada61.4
viu107 1.7×
chafadraws nothing
chafa-vhalf half-blocks onlydraws nothing
CPU, kitty graphics msCPUuser and system time for the kitty preview, over all threads
ada70.5
kitten icat shared memory198 2.8×
kitten icat streamed, as ada227 3.2×
chafadraws nothing
mcatplays a GIF as a video, without end
CPU, half-blocks and symbols msCPUuser and system time for the preview in characters, over all threads
ada61.1
viu106 1.7×
chafadraws nothing
chafa-vhalf half-blocks onlydraws nothing
peak memory, kitty graphics MiBthe most resident at once, kitty graphics
ada53.9
kitten icat shared memory77.7 1.4×
kitten icat streamed, as ada79.7 1.5×
chafadraws nothing
mcatplays a GIF as a video, without end
peak memory, half-blocks and symbols MiBthe most resident at once, in characters
A ```mermaid block parsed and drawn, against the crates two of the viewers above draw with: mermaid-text in md-tui and mmdflux in leaf, called as they call them. ada draws to the cells it paints from, the crates to a string; in process, the best of repeated runs on one core.
sequence diagrams µswalltwo at 100 columns, added up; mermaid-text leaves the one with long messages 357 wide
ada16.2
mermaid-text md-tui's30.9 1.9×
mmdflux leaf's41.2 2.6×
flowcharts µswallseven, from a vault and Mermaid's docs, at 100 columns; added up
ada227
mmdflux leaf's1,700 7.5×
mermaid-text md-tui's6,354 28×
state diagrams µswalltwo, at 100 columns; added up
ada23.5
mmdflux leaf's222 9.4×
mermaid-text md-tui's337 14×
gantt charts µswallMermaid's example and another, at 100 columns; added up
ada4.3
mermaid-text md-tui's5.5 1.3×
mmdflux leaf'sdraws no gantt charts
class diagrams µswallMermaid's example and two from a vault, at 100 columns; added up
ada59.9
mmdflux leaf's579 9.7×
mermaid-text md-tui'sfails on two of the three
a 120-node flowchart mswallgenerated: a chain, each node with an edge further on
ada5.7
mmdflux leaf's6,387 1,118×
mermaid-text md-tui's16,846 2,949×
B2 at ada cde85ff, 2026-10-25; images at ada 2b604ad, 2026-10-29; the other tools from the full run at ada 2f5fa5e, 2026-10-24
ada is fuzzed as whole sessions, not one function at a time: a document, then up to
64 things a reader, the file system, git or the terminal can do, in any order.
45.8 M
fuzzed sessions
whole scripted sessions, plus 1.5 B runs of the printer, scanners, highlighting lexers, image codecs, terminal probe, link lookup and diagrams; over 43 h in eighteen runs
12
bugs found, all fixed
an overflow on an impossible git hunk; five frame bugs with wide glyphs or a popup over an image; a parser blow-up and a highlighter loop, now bounded; three malformed images that took it down; a wiki link that lost its folder
0
crashes, hangs or OOMs
in every run since the fixes
8
unsafe blocks
two set glibc's malloc arena count, before the threads that use it start; two give back the binary's read-only pages once the syntax set has loaded; one reads a row of screen cells as bytes, to compare rows in wide loads; three find a document's newlines with AVX2 on x86_64, once the CPU is known to have it. Plus 17 for Windows interop, in the Windows build only: calls into the Win32 console, file-watch and shell APIs
Any document
Markdown, code, config, plain text and images, built from random bytes and a
dictionary of the parts markdown parsers find hardest. Other targets fuzz --print, whole
and streamed (which must match byte for byte), the log and JSON scanners, the Makefile and shell lexers (checked against syntect line for line), image decoding, mermaid diagrams at
any width, the sixel encoder, and the terminal's replies to ada's probe.
Any input
Every action, through the real keymap or directly: scrolling, links, search, sorting,
the outline, themes, the settings popup, saving the config, the mouse (wheel, clicks, selecting text by
dragging or double and triple clicks), and resizes at any size.
A world that answers badly
Links to missing or corrupt files, wiki links looked up by name in trees whose names collide by case
and folder, fuzzed git hunks, images that
report zero or huge sizes, and results that arrive late, out of order, or after their document is gone.
Every frame checked
Each step paints through ada's real diff and encoder into a vt100 terminal
emulator, which must show exactly what ada meant to draw, cell by cell: glyphs, colors, attributes, and
the numbering of kitty image cells.
So must the screen ada leaves in the terminal when it quits.
Every interaction is a message, so a recorded session replays to identical frames: --record
makes a bug report that reproduces. A deterministic stand-in for the fuzzer runs with every
cargo test.
Binaries for Linux (x86_64 and aarch64: gnu for glibc 2.34 or newer, musl static for
any Linux, Alpine included, printing large files in up to 1.4× the time) and macOS (Apple silicon and Intel) are on the
releases page: unpack one and put ada on
your PATH. The macOS binaries aren't signed, so if the archive came through a browser, run
xattr -d com.apple.quarantine ada first. Or build it from
crates.io:
cargo install --locked ada-md
or the latest from git: cargo install --locked --git https://github.com/junkdog/ada-md ada-md.
The release binaries are linked with the code a typical run needs first, so a run takes up to about 1 MiB less
memory on Linux, and less than half that on macOS. That takes two links, which cargo install can't
do. To build ada the way the releases are, on Linux (x86_64 and aarch64) and macOS, from a clone:
cargo ordered --locked # target/release/ada, as released
Rust 1.88 or newer, and a C compiler: highlighting runs on Oniguruma, built from source. For a pure-Rust
build, add --no-default-features. Git integration runs the git command.
Windows is mostly untested: ada builds and runs there but doesn't follow Windows' conventions yet. The
README lists what's missing; support is planned for 1.1.
# read a note
ada notes/today.md
# from a pipe: ada tells markdown, code, JSON, YAML, diffs and logs apart
git show HEAD~3:README.md | ada
journalctl -b -u sshd | ada
# code, config and images too
ada src/main.rs
ada plot.png
# as an fzf preview
fzf --preview 'ada --print {}'
Press ? in ada for the keys. The
README has every key and option.