ada

The fastest terminal markdown viewer, for one file or a whole vault of notes.

First in 80 of 84 measurements against five other terminal viewers, on time, CPU and memory.

Follow links and come back to where you were, see what git says changed, read wide tables at any width, and look at the pictures.

Download ada

Binaries for Linux and macOS, or build it with cargo.

Ada, a fluffy grey mixed-breed cat, lying on a shelf and looking at the camera
Named after Ada, regal matriarch, at her behest.
ada index.md
ada jumping to a heading from the outline, searching, following a link from the link list, picking a theme in the settings, sorting the second of two tables by how long things take, going back, and following a link to a mermaid sequence diagram whose cast stays on top as it scrolls

Tables you can work with #

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

ada feeding.md
a table of durations in µs, ms, s, minutes and days, sorted ascending, then descending, then back to the source order
Ascending, descending, and back to the source order.
ada feeding.md
a long table scrolling with its header row kept at the top
A month of the feeder's log; the header stays.

At any width #

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.

ada shenanigans.md
a seven-column table re-laid out as the terminal narrows, turning into records, then back into a grid
A real resize: ada in a tmux pane, the border moving.

A git gutter #

The gutter marks what git says changed in the rendered note: added and modified lines, staged and unstaged, each in its own color.

]c [c next, previous change

ada index.md
a note with change marks in the left gutter beside a staged new task, an unstaged edited task and an unstaged new task

Mermaid gantt charts #

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.

ada week.md
a gantt chart of a cat's week in two sections, with done, active and critical tasks and a milestone
ada ada.md
a note with a photo of Ada shown inline, in kitty
In kitty.

Images #

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 previewer for fzf #

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.

A preview stops 2,000 rows in, so an 80 MB log previews as fast as a small file: 4.0 ms, where bat takes a second.

fzf --preview 'ada --print {}'
# from rg matches: the matched line lands mid-pane
rg -n . | fzf -d : --preview-window '+{2}-/2' \
  --preview 'ada --print --line {2} {1}'
fzf --preview 'ada --print {}'
fzf with ada as its previewer, moving from a note with two tables to one with a seven-column table, then a Rust file and a highlighted log
Two notes with tables, the feeder's code, and its log.

Fourteen themes, and yours #

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.

Also #

  • Not only markdown #

    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.

  • Callouts, footnotes, task lists #

    GitHub's five callout kinds, footnotes you can follow, and checkboxes.

  • Live reload #

    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.

  • From a pipe #

    ada tells markdown, code, JSON, YAML, diffs and logs apart by what they hold: journalctl -b | ada. -l json names the language when the guess is wrong.

  • Your keys #

    Remap any action, including two-key sequences like "g g", in config.toml.

  • Record and replay #

    --record a session and --replay it to the same frames: a bug report that reproduces.

Fast, and lean #

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 ms wallfrom launch until the document's first line is on screen
  1. ada2.9
  2. leaf4.8 1.7×
  3. treemd7.3 2.5×
  4. md-tui21.9 7.6×
  5. glow35.6 12×
  6. mdfried102 35×
CPU per line scrolled ms CPUfor one line down, from the key until the screen holds still; the median
  1. ada0.02
  2. leaf0.29 12×
  3. mdfried0.70 28×
  4. glow0.86 34×
  5. treemd0.90 36×
  6. md-tui1.00 40×
search ms wallfrom the term and Enter until the match is on screen
  1. ada0.31
  2. md-tui1.1 3.7×
  3. leaf1.6 5.3×
  4. treemd12.0 39×
  5. mdfried102 331×
  6. glowhas no search
re-layout after a resize ms wallfrom the first resize until the screen stops changing
  1. ada0.20
  2. treemd1.6 8.0×
  3. md-tui20.7 105×
  4. mdfried100 510×
  5. leaf122 620×
  6. glowblank after a resize
CPU over a held page-down ms CPUfor 60 page-downs at 30 a second, until the screen catches up
  1. ada1.2
  2. mdfried9.6 8.0×
  3. leaf10.3 8.6×
  4. md-tui18.5 15×
  5. treemd20.5 17×
  6. glow27.5 23×
peak memory MiBthe most resident at once, over the whole session
  1. ada8.1
  2. md-tui8.5 1.0×
  3. leaf10.6 1.3×
  4. treemd13.5 1.7×
  5. mdfried16.1 2.0×
  6. glow35.8 4.4×

Printing, --print and the other printers

print to a pipe ms wallto print the whole document to a pipe
  1. lowdown no highlighting0.62 0.3×
  2. ada2.3
  3. leaf3.2 1.4×
  4. mdcat5.2 2.3×
  5. mcat5.9 2.6×
  6. glow17.0 7.4×
  7. bat source, not rendered60.8 26×
  8. rich64.9 28×
peak memory, printing MiBthe most resident at once while printing
  1. lowdown no highlighting4.9 0.8×
  2. ada6.1
  3. leaf8.8 1.4×
  4. bat source, not rendered15.8 2.6×
  5. mcat17.3 2.8×
  6. mdcat20.7 3.4×
  7. glow25.6 4.2×
  8. rich26.0 4.3×

In a 120×40 terminal

first paint ms wallfrom launch until the document's first line is on screen
  1. ada4.2
  2. leaf13.2 3.2×
  3. treemd17.8 4.3×
  4. mdfried102 24×
  5. glow111 27×
  6. md-tui685 164×
CPU per line scrolled ms CPUfor one line down, from the key until the screen holds still; the median
  1. ada0.03
  2. leaf0.29 12×
  3. mdfried0.73 29×
  4. glow0.93 37×
  5. md-tui0.99 39×
  6. treemd1.0 40×
search ms wallfrom the term and Enter until the match is on screen
  1. ada0.38
  2. leaf3.0 7.9×
  3. md-tui3.7 9.7×
  4. treemd65.6 171×
  5. mdfried108 281×
  6. glowhas no search
re-layout after a resize ms wallfrom the first resize until the screen stops changing
  1. ada0.83
  2. treemd9.3 11×
  3. mdfried101 121×
  4. leaf126 152×
  5. md-tuire-parses for seconds
  6. glowblank after a resize
CPU over a held page-down ms CPUfor 60 page-downs at 30 a second, until the screen catches up
  1. ada2.1
  2. mdfried13.7 6.4×
  3. leaf20.3 9.5×
  4. md-tui29.3 14×
  5. treemd30.4 14×
  6. glow40.7 19×
peak memory MiBthe most resident at once, over the whole session
  1. ada11.7
  2. md-tui14.0 1.2×
  3. leaf16.8 1.4×
  4. treemd17.4 1.5×
  5. mdfried22.0 1.9×
  6. glow57.8 4.9×

Printing, --print and the other printers

print to a pipe ms wallto print the whole document to a pipe
  1. ada3.1
  2. lowdown no highlighting3.2 1.0×
  3. mdcat8.1 2.6×
  4. leaf8.3 2.7×
  5. mcat17.0 5.5×
  6. bat source, not rendered30.0 9.7×
  7. glow67.6 22×
  8. rich128 41×
peak memory, printing MiBthe most resident at once while printing
  1. lowdown no highlighting6.1 0.8×
  2. ada7.5
  3. leaf10.3 1.4×
  4. bat source, not rendered16.1 2.1×
  5. mcat20.1 2.7×
  6. mdcat21.2 2.8×
  7. rich29.7 4.0×
  8. glow34.0 4.5×

In a 120×40 terminal

first paint ms wallfrom launch until the document's first line is on screen
  1. ada5.7
  2. leaf21.4 3.8×
  3. treemd30.5 5.4×
  4. mdfried102 18×
  5. glow293 51×
  6. md-tui4,007 703×
CPU per line scrolled ms CPUfor one line down, from the key until the screen holds still; the median
  1. ada0.03
  2. leaf0.28 9.7×
  3. mdfried0.76 26×
  4. md-tui0.98 34×
  5. treemd1.0 35×
  6. glow1.1 37×
search ms wallfrom the term and Enter until the match is on screen
  1. ada0.55
  2. leaf1.8 3.2×
  3. md-tui5.1 9.2×
  4. treemd96.7 175×
  5. mdfried107 194×
  6. glowhas no search
re-layout after a resize ms wallfrom the first resize until the screen stops changing
  1. ada1.8
  2. treemd18.2 10×
  3. leaf131 73×
  4. mdfried201 112×
  5. md-tuire-parses for seconds
  6. glowblank after a resize
CPU over a held page-down ms CPUfor 60 page-downs at 30 a second, until the screen catches up
  1. ada3.1
  2. mdfried15.9 5.2×
  3. leaf17.8 5.8×
  4. md-tui31.6 10×
  5. treemd33.4 11×
  6. glow62.0 20×
peak memory MiBthe most resident at once, over the whole session
  1. ada14.7
  2. treemd22.5 1.5×
  3. leaf24.2 1.6×
  4. md-tui30.7 2.1×
  5. mdfried79.0 5.4×
  6. glow96.5 6.6×

Printing, --print and the other printers

print to a pipe ms wallto print the whole document to a pipe
  1. ada4.6
  2. lowdown no highlighting6.1 1.3×
  3. leaf11.6 2.5×
  4. mdcat11.9 2.6×
  5. mcat35.9 7.8×
  6. bat source, not rendered66.0 14×
  7. glow138 30×
  8. rich283 62×
peak memory, printing MiBthe most resident at once while printing
  1. lowdown no highlighting8.2 0.9×
  2. ada8.8
  3. leaf11.0 1.2×
  4. bat source, not rendered15.8 1.8×
  5. mdcat21.5 2.4×
  6. mcat24.8 2.8×
  7. rich40.0 4.5×
  8. glow46.2 5.2×

In a 120×40 terminal

first paint ms wallfrom launch until the document's first line is on screen
  1. ada57.0
  2. leaf361 6.3×
  3. mdfried403 7.1×
  4. glow3,197 56×
  5. md-tuinever finished parsing
  6. treemdshows one section at a time
CPU per line scrolled ms CPUfor one line down, from the key until the screen holds still; the median
  1. ada0.03
  2. leaf0.36 13×
  3. mdfried0.78 27×
  4. glow0.90 31×
  5. md-tuinever finished parsing
  6. treemdshows one section at a time
search ms wallfrom the term and Enter until the match is on screen
  1. ada1.7
  2. leaf6.6 4.0×
  3. mdfriedmatch off-screen
  4. md-tuinever finished parsing
  5. treemdshows one section at a time
  6. glowhas no search
re-layout after a resize ms wallfrom the first resize until the screen stops changing
  1. ada19.3
  2. leaf98.5 5.1×
  3. mdfried2,207 114×
  4. md-tuinever finished parsing
  5. treemdshows one section at a time
  6. glowblank after a resize
CPU over a held page-down ms CPUfor 60 page-downs at 30 a second, until the screen catches up
  1. ada3.0
  2. mdfried18.7 6.2×
  3. leaf20.3 6.7×
  4. glow71.8 24×
  5. md-tuinever finished parsing
  6. treemdshows one section at a time
peak memory MiBthe most resident at once, over the whole session
  1. ada91.1
  2. leaf197 2.2×
  3. mdfried454 5.0×
  4. glow1,187 13×
  5. md-tuinever finished parsing
  6. treemdshows one section at a time

Printing, --print and the other printers

print to a pipe ms wallto print the whole document to a pipe
  1. ada47.8
  2. lowdown no highlighting70.7 1.5×
  3. mdcat129 2.7×
  4. leaf231 4.8×
  5. mcat781 16×
  6. glow2,409 50×
  7. rich2,544 53×
  8. bat source, not rendered2,977 62×
peak memory, printing MiBthe most resident at once while printing
  1. bat source, not rendered22.2 0.5×
  2. lowdown no highlighting42.1 1.0×
  3. ada42.9
  4. mdcat43.1 1.0×
  5. leaf76.5 1.8×
  6. mcat98.2 2.3×
  7. rich140 3.3×
  8. glow303 7.1×

As a previewer: code, logs and JSON #

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 ms wallthe first 2,000 rows (bat and rich: 2,000 source lines), to a pipe
  1. ada5.5
  2. bat8.7 1.6×
  3. rich139 25×
the whole file ms wallall of it, to a pipe at 100 columns
  1. ada5.5
  2. mcat8.1 1.5×
  3. bat8.7 1.6×
  4. rich138 25×
peak memory, a preview MiBthe most resident at once, for a preview
  1. ada6.8
  2. bat15.2 2.2×
  3. rich42.9 6.3×
peak memory, the whole file MiBthe most resident at once, for the whole file
  1. ada6.6
  2. bat15.1 2.3×
  3. mcat17.5 2.6×
  4. rich42.8 6.5×
a preview ms wallthe first 2,000 rows (bat and rich: 2,000 source lines), to a pipe
  1. ada23.3
  2. bat33.2 1.4×
  3. rich218 9.4×
the whole file ms wallall of it, to a pipe at 100 columns
  1. ada23.2
  2. mcat30.4 1.3×
  3. bat33.3 1.4×
  4. rich217 9.4×
peak memory, a preview MiBthe most resident at once, for a preview
  1. ada7.7
  2. bat15.5 2.0×
  3. rich48.1 6.2×
peak memory, the whole file MiBthe most resident at once, for the whole file
  1. ada7.6
  2. bat15.6 2.1×
  3. mcat18.8 2.5×
  4. rich48.3 6.3×
a preview ms wallthe first 2,000 rows (bat and rich: 2,000 source lines), to a pipe
  1. ada22.8
  2. bat30.2 1.3×
  3. rich196 8.6×
the whole file ms wallall of it, to a pipe at 100 columns
  1. mcat most of it as markdown38.4 0.3×
  2. ada113
  3. bat146 1.3×
  4. rich522 4.6×
peak memory, a preview MiBthe most resident at once, for a preview
  1. ada7.7
  2. bat15.3 2.0×
  3. rich46.8 6.1×
peak memory, the whole file MiBthe most resident at once, for the whole file
  1. ada11.1
  2. bat15.5 1.4×
  3. mcat most of it as markdown21.3 1.9×
  4. rich63.8 5.7×
a preview ms wallthe first 2,000 rows (bat and rich: 2,000 source lines), to a pipe
  1. ada4.0
  2. rich no color238 60×
  3. bat1,049 265×
the whole file ms wallall of it, to a pipe at 100 columns
  1. ada9.1
  2. rich no color398 44×
  3. mcat3,236 356×
  4. bat3,264 359×
peak memory, a preview MiBthe most resident at once, for a preview
  1. ada7.7
  2. bat14.2 1.8×
  3. rich no color48.4 6.3×
peak memory, the whole file MiBthe most resident at once, for the whole file
  1. ada13.5
  2. bat14.2 1.0×
  3. mcat34.8 2.6×
  4. rich no color53.9 4.0×
a preview ms wallthe first 2,000 rows (bat and rich: 2,000 source lines), to a pipe
  1. ada6.1
  2. bat no color on lines over 16 KB27.7 4.6×
  3. rich4,368 719×
the whole file ms wallall of it, to a pipe at 100 columns
  1. ada25.4
  2. bat no color on lines over 16 KB27.1 1.1×
  3. rich4,281 169×
  4. mcatstopped after 60 s
peak memory, a preview MiBthe most resident at once, for a preview
  1. ada15.7
  2. bat no color on lines over 16 KB25.2 1.6×
  3. rich580 37×
peak memory, the whole file MiBthe most resident at once, for the whole file
  1. bat no color on lines over 16 KB25.6 0.5×
  2. ada52.1
  3. rich580 11×
  4. mcatstopped after 60 s
a preview ms wallthe first 2,000 rows (bat and rich: 2,000 source lines), to a pipe
  1. ada4.2
  2. bat1,049 250×
  3. rich no color9,103 2,171×
the whole file ms wallall of it, to a pipe at 100 columns
  1. ada302
  2. rich no color24,638 82×
  3. batstopped after 60 s
  4. mcatstopped after 60 s
peak memory, a preview MiBthe most resident at once, for a preview
  1. ada7.7
  2. bat14.1 1.8×
  3. rich no color348 45×
peak memory, the whole file MiBthe most resident at once, for the whole file
  1. ada14.8
  2. rich no color898 61×
  3. batstopped after 60 s
  4. mcatstopped after 60 s

Image previews #

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 ms walla 100×50-cell preview in kitty's graphics protocol, to a pipe
  1. ada1.3
  2. mcat15.8 12×
  3. kitten icat shared memory22.5 17×
  4. kitten icat streamed, as ada22.9 18×
  5. chafa24.1 19×
half-blocks and symbols ms wallthe same preview drawn in characters, for any terminal
  1. ada5.2
  2. viu6.8 1.3×
  3. chafa-vhalf half-blocks only19.7 3.8×
  4. chafa20.3 3.9×
CPU, kitty graphics ms CPUuser and system time for the kitty preview, over all threads
  1. ada1.3
  2. mcat15.7 12×
  3. kitten icat shared memory24.8 20×
  4. kitten icat streamed, as ada25.9 21×
  5. chafa26.2 21×
CPU, half-blocks and symbols ms CPUuser and system time for the preview in characters, over all threads
  1. ada5.2
  2. viu6.7 1.3×
  3. chafa-vhalf half-blocks only23.8 4.6×
  4. chafa25.4 4.9×
peak memory, kitty graphics MiBthe most resident at once, kitty graphics
  1. ada6.1
  2. mcat28.1 4.6×
  3. kitten icat shared memory32.9 5.4×
  4. kitten icat streamed, as ada34.7 5.7×
  5. chafa37.6 6.2×
peak memory, half-blocks and symbols MiBthe most resident at once, in characters
  1. ada6.1
  2. viu7.5 1.2×
  3. chafa-vhalf half-blocks only28.9 4.8×
  4. chafa28.9 4.8×
kitty graphics ms walla 100×50-cell preview in kitty's graphics protocol, to a pipe
  1. ada7.3
  2. mcat12.3 1.7×
  3. chafa33.9 4.6×
  4. kitten icat shared memory46.6 6.4×
  5. kitten icat streamed, as ada51.8 7.1×
half-blocks and symbols ms wallthe same preview drawn in characters, for any terminal
  1. ada4.5
  2. viu20.6 4.6×
  3. chafa-vhalf half-blocks only30.5 6.8×
  4. chafa30.9 6.9×
CPU, kitty graphics ms CPUuser and system time for the kitty preview, over all threads
  1. ada7.3
  2. mcat12.2 1.7×
  3. chafa41.6 5.7×
  4. kitten icat shared memory118 16×
  5. kitten icat streamed, as ada125 17×
CPU, half-blocks and symbols ms CPUuser and system time for the preview in characters, over all threads
  1. ada4.4
  2. viu20.5 4.6×
  3. chafa-vhalf half-blocks only39.9 9.0×
  4. chafa40.6 9.1×
peak memory, kitty graphics MiBthe most resident at once, kitty graphics
  1. ada7.9
  2. mcat35.3 4.4×
  3. chafa53.5 6.7×
  4. kitten icat shared memory67.4 8.5×
  5. kitten icat streamed, as ada68.2 8.6×
peak memory, half-blocks and symbols MiBthe most resident at once, in characters
  1. ada6.1
  2. viu20.9 3.4×
  3. chafa-vhalf half-blocks only53.3 8.8×
  4. chafa53.3 8.8×
kitty graphics ms walla 100×50-cell preview in kitty's graphics protocol, to a pipe
  1. ada89.2
  2. mcat101 1.1×
  3. chafa154 1.7×
  4. kitten icat shared memory293 3.3×
  5. kitten icat streamed, as ada323 3.6×
half-blocks and symbols ms wallthe same preview drawn in characters, for any terminal
  1. ada82.5
  2. viu143 1.7×
  3. chafa-vhalf half-blocks only152 1.8×
  4. chafa153 1.8×
CPU, kitty graphics ms CPUuser and system time for the kitty preview, over all threads
  1. ada88.9
  2. mcat101 1.1×
  3. chafa172 1.9×
  4. kitten icat shared memory451 5.1×
  5. kitten icat streamed, as ada481 5.4×
CPU, half-blocks and symbols ms CPUuser and system time for the preview in characters, over all threads
  1. ada82.2
  2. viu143 1.7×
  3. chafa-vhalf half-blocks only176 2.1×
  4. chafa178 2.2×
peak memory, kitty graphics MiBthe most resident at once, kitty graphics
  1. ada8.1
  2. mcat68.9 8.5×
  3. kitten icat shared memory107 13×
  4. kitten icat streamed, as ada109 13×
  5. chafa112 14×
peak memory, half-blocks and symbols MiBthe most resident at once, in characters
  1. ada6.0
  2. viu43.4 7.2×
  3. chafa112 19×
  4. chafa-vhalf half-blocks only112 19×
kitty graphics ms walla 100×50-cell preview in kitty's graphics protocol, to a pipe
  1. ada13.3
  2. mcat16.3 1.2×
  3. chafa20.8 1.6×
  4. kitten icat shared memory43.2 3.3×
  5. kitten icat streamed, as ada68.5 5.2×
half-blocks and symbols ms wallthe same preview drawn in characters, for any terminal
  1. ada6.8
  2. viu16.7 2.5×
  3. chafa-vhalf half-blocks only17.2 2.5×
  4. chafa18.2 2.7×
CPU, kitty graphics ms CPUuser and system time for the kitty preview, over all threads
  1. ada13.2
  2. mcat16.2 1.2×
  3. chafa25.3 1.9×
  4. kitten icat shared memory81.0 6.2×
  5. kitten icat streamed, as ada106 8.0×
CPU, half-blocks and symbols ms CPUuser and system time for the preview in characters, over all threads
  1. ada6.7
  2. viu16.6 2.5×
  3. chafa-vhalf half-blocks only24.9 3.7×
  4. chafa26.6 4.0×
peak memory, kitty graphics MiBthe most resident at once, kitty graphics
  1. ada16.9
  2. mcat30.5 1.8×
  3. chafa41.0 2.4×
  4. kitten icat shared memory47.7 2.8×
  5. kitten icat streamed, as ada51.6 3.1×
peak memory, half-blocks and symbols MiBthe most resident at once, in characters
  1. ada14.8
  2. viu15.6 1.1×
  3. chafa-vhalf half-blocks only34.9 2.4×
  4. chafa35.2 2.4×
kitty graphics ms walla 100×50-cell preview in kitty's graphics protocol, to a pipe
  1. ada30.0
  2. chafa38.8 1.3×
  3. mcat39.4 1.3×
  4. kitten icat shared memory116 3.9×
  5. kitten icat streamed, as ada144 4.8×
half-blocks and symbols ms wallthe same preview drawn in characters, for any terminal
  1. ada22.7
  2. chafa-vhalf half-blocks only35.7 1.6×
  3. chafa36.4 1.6×
  4. viu80.0 3.5×
CPU, kitty graphics ms CPUuser and system time for the kitty preview, over all threads
  1. ada29.8
  2. mcat39.2 1.3×
  3. chafa53.8 1.8×
  4. kitten icat shared memory221 7.4×
  5. kitten icat streamed, as ada248 8.3×
CPU, half-blocks and symbols ms CPUuser and system time for the preview in characters, over all threads
  1. ada22.5
  2. chafa-vhalf half-blocks only56.6 2.5×
  3. chafa58.1 2.6×
  4. viu79.8 3.5×
peak memory, kitty graphics MiBthe most resident at once, kitty graphics
  1. ada43.8
  2. mcat61.7 1.4×
  3. chafa67.5 1.5×
  4. kitten icat shared memory67.7 1.5×
  5. kitten icat streamed, as ada69.9 1.6×
peak memory, half-blocks and symbols MiBthe most resident at once, in characters
  1. ada41.6
  2. viu43.3 1.0×
  3. chafa-vhalf half-blocks only61.7 1.5×
  4. chafa61.7 1.5×
kitty graphics ms walla 100×50-cell preview in kitty's graphics protocol, to a pipe
  1. ada48.0
  2. chafa59.1 1.2×
  3. mcat59.8 1.2×
  4. kitten icat shared memory203 4.2×
  5. kitten icat streamed, as ada227 4.7×
half-blocks and symbols ms wallthe same preview drawn in characters, for any terminal
  1. ada41.5
  2. chafa-vhalf half-blocks only56.6 1.4×
  3. chafa57.4 1.4×
  4. viu135 3.3×
CPU, kitty graphics ms CPUuser and system time for the kitty preview, over all threads
  1. ada47.7
  2. mcat59.5 1.2×
  3. chafa89.6 1.9×
  4. kitten icat shared memory386 8.1×
  5. kitten icat streamed, as ada410 8.6×
CPU, half-blocks and symbols ms CPUuser and system time for the preview in characters, over all threads
  1. ada41.2
  2. chafa-vhalf half-blocks only90.8 2.2×
  3. chafa91.9 2.2×
  4. viu135 3.3×
peak memory, kitty graphics MiBthe most resident at once, kitty graphics
  1. ada77.2
  2. kitten icat shared memory93.9 1.2×
  3. kitten icat streamed, as ada97.9 1.3×
  4. mcat98.8 1.3×
  5. chafa102 1.3×
peak memory, half-blocks and symbols MiBthe most resident at once, in characters
  1. ada77.3
  2. viu79.3 1.0×
  3. chafa96.5 1.2×
  4. chafa-vhalf half-blocks only96.5 1.2×
kitty graphics ms walla 100×50-cell preview in kitty's graphics protocol, to a pipe
  1. ada3.2
  2. chafa12.9 4.0×
  3. kitten icat shared memory102 31×
  4. kitten icat streamed, as ada253 78×
  5. mcatplays a GIF as a video, without end
half-blocks and symbols ms wallthe same preview drawn in characters, for any terminal
  1. ada1.3
  2. chafa-vhalf half-blocks only9.7 7.5×
  3. chafa9.8 7.6×
  4. viu2,307 1,782×
CPU, kitty graphics ms CPUuser and system time for the kitty preview, over all threads
  1. ada3.2
  2. chafa13.1 4.1×
  3. kitten icat shared memory128 40×
  4. kitten icat streamed, as ada283 89×
  5. mcatplays a GIF as a video, without end
CPU, half-blocks and symbols ms CPUuser and system time for the preview in characters, over all threads
  1. ada1.3
  2. chafa-vhalf half-blocks only12.6 10×
  3. chafa13.0 10×
  4. viu2,301 1,829×
peak memory, kitty graphics MiBthe most resident at once, kitty graphics
  1. ada8.1
  2. chafa34.3 4.3×
  3. kitten icat shared memory145 18×
  4. kitten icat streamed, as ada201 25×
  5. mcatplays a GIF as a video, without end
peak memory, half-blocks and symbols MiBthe most resident at once, in characters
  1. ada5.8
  2. chafa-vhalf half-blocks only29.1 5.0×
  3. chafa29.2 5.1×
  4. viu1,957 339×
kitty graphics ms walla 100×50-cell preview in kitty's graphics protocol, to a pipe
  1. ada27.9
  2. chafa33.1 1.2×
  3. kitten icat shared memory41.5 1.5×
  4. kitten icat streamed, as ada62.7 2.2×
  5. mcatplays a GIF as a video, without end
half-blocks and symbols ms wallthe same preview drawn in characters, for any terminal
  1. ada18.1
  2. viu29.0 1.6×
  3. chafa-vhalf half-blocks only30.0 1.7×
  4. chafa30.9 1.7×
CPU, kitty graphics ms CPUuser and system time for the kitty preview, over all threads
  1. ada27.8
  2. chafa38.1 1.4×
  3. kitten icat shared memory75.5 2.7×
  4. kitten icat streamed, as ada98.5 3.5×
  5. mcatplays a GIF as a video, without end
CPU, half-blocks and symbols ms CPUuser and system time for the preview in characters, over all threads
  1. ada18.0
  2. viu28.9 1.6×
  3. chafa-vhalf half-blocks only38.4 2.1×
  4. chafa40.4 2.2×
peak memory, kitty graphics MiBthe most resident at once, kitty graphics
  1. ada8.6
  2. chafa45.1 5.2×
  3. kitten icat shared memory45.8 5.3×
  4. kitten icat streamed, as ada50.9 5.9×
  5. mcatplays a GIF as a video, without end
peak memory, half-blocks and symbols MiBthe most resident at once, in characters
  1. ada5.6
  2. viu29.8 5.3×
  3. chafa39.1 7.0×
  4. chafa-vhalf half-blocks only39.2 7.0×
kitty graphics ms walla 100×50-cell preview in kitty's graphics protocol, to a pipe
  1. ada66.6
  2. kitten icat shared memory106 1.6×
  3. kitten icat streamed, as ada134 2.0×
  4. chafadraws nothing
  5. mcatplays a GIF as a video, without end
half-blocks and symbols ms wallthe same preview drawn in characters, for any terminal
  1. ada56.9
  2. viu107 1.9×
  3. chafadraws nothing
  4. chafa-vhalf half-blocks onlydraws nothing
CPU, kitty graphics ms CPUuser and system time for the kitty preview, over all threads
  1. ada66.3
  2. kitten icat shared memory196 3.0×
  3. kitten icat streamed, as ada225 3.4×
  4. chafadraws nothing
  5. mcatplays a GIF as a video, without end
CPU, half-blocks and symbols ms CPUuser and system time for the preview in characters, over all threads
  1. ada56.7
  2. viu107 1.9×
  3. chafadraws nothing
  4. chafa-vhalf half-blocks onlydraws nothing
peak memory, kitty graphics MiBthe most resident at once, kitty graphics
  1. ada8.6
  2. kitten icat shared memory65.5 7.6×
  3. kitten icat streamed, as ada68.1 7.9×
  4. chafadraws nothing
  5. mcatplays a GIF as a video, without end
peak memory, half-blocks and symbols MiBthe most resident at once, in characters
  1. ada5.6
  2. viu107 19×
  3. chafadraws nothing
  4. chafa-vhalf half-blocks onlydraws nothing
kitty graphics ms walla 100×50-cell preview in kitty's graphics protocol, to a pipe
  1. ada70.8
  2. kitten icat shared memory107 1.5×
  3. kitten icat streamed, as ada135 1.9×
  4. chafadraws nothing
  5. mcatplays a GIF as a video, without end
half-blocks and symbols ms wallthe same preview drawn in characters, for any terminal
  1. ada61.4
  2. viu107 1.7×
  3. chafadraws nothing
  4. chafa-vhalf half-blocks onlydraws nothing
CPU, kitty graphics ms CPUuser and system time for the kitty preview, over all threads
  1. ada70.5
  2. kitten icat shared memory198 2.8×
  3. kitten icat streamed, as ada227 3.2×
  4. chafadraws nothing
  5. mcatplays a GIF as a video, without end
CPU, half-blocks and symbols ms CPUuser and system time for the preview in characters, over all threads
  1. ada61.1
  2. viu106 1.7×
  3. chafadraws nothing
  4. chafa-vhalf half-blocks onlydraws nothing
peak memory, kitty graphics MiBthe most resident at once, kitty graphics
  1. ada53.9
  2. kitten icat shared memory77.7 1.4×
  3. kitten icat streamed, as ada79.7 1.5×
  4. chafadraws nothing
  5. mcatplays a GIF as a video, without end
peak memory, half-blocks and symbols MiBthe most resident at once, in characters
  1. ada51.1
  2. viu95.6 1.9×
  3. chafadraws nothing
  4. chafa-vhalf half-blocks onlydraws nothing

Mermaid diagrams #

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 µs walltwo at 100 columns, added up; mermaid-text leaves the one with long messages 357 wide
  1. ada16.2
  2. mermaid-text md-tui's30.9 1.9×
  3. mmdflux leaf's41.2 2.6×
flowcharts µs wallseven, from a vault and Mermaid's docs, at 100 columns; added up
  1. ada227
  2. mmdflux leaf's1,700 7.5×
  3. mermaid-text md-tui's6,354 28×
state diagrams µs walltwo, at 100 columns; added up
  1. ada23.5
  2. mmdflux leaf's222 9.4×
  3. mermaid-text md-tui's337 14×
gantt charts µs wallMermaid's example and another, at 100 columns; added up
  1. ada4.3
  2. mermaid-text md-tui's5.5 1.3×
  3. mmdflux leaf'sdraws no gantt charts
class diagrams µs wallMermaid's example and two from a vault, at 100 columns; added up
  1. ada59.9
  2. mmdflux leaf's579 9.7×
  3. mermaid-text md-tui'sfails on two of the three
a 120-node flowchart ms wallgenerated: a chain, each node with an edge further on
  1. ada5.7
  2. mmdflux leaf's6,387 1,118×
  3. 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

No crashes, on any input #

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

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.

Install #

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.