Appearance
Performance
How Otty stays fast, what to measure, and what to tune.
Render pipeline
- macOS: native Metal renderer, one GPU layer per pane.
- Windows (planned): native DirectX 12 renderer.
- Subpixel-aware glyph caching, so a repeated glyph is rendered once and reused.
- Inactive tabs can release their renderer resources entirely — see
freeze-inactive-tabbelow.
Memory
- Sparse-row grid storage — only cells that have ever been written are allocated. Empty scrollback rows are free.
- Scrollback capped per pane:
scrollback-rows = 10000 # default- Inline images use a small atlas with eviction; very large or rare images bypass.
Benchmarks
Throughput measured with vtebench — each test streams a fixed ~1 MiB of escape sequences and records how long the terminal takes to parse and render it. Lower is faster, and each row's fastest result is bold.
Take these numbers with a grain of salt
This is a sample benchmark to show Otty is fast enough — not a claim that Otty is definitively faster than Ghostty.
- It was run on my personal MacBook with other apps open in the background. This is not a controlled test environment.
- The absolute results don't mean much. The first debug build of Otty I ran this on was ~100× slower than Ghostty, yet I never felt any lag using Otty for real work.
- The benchmark is very different from real usage. The
unicodetest, for instance, hammers the terminal with Chinese characters I can't even read — you'll never see that density of CJK in one screen during actual work. - A terminal can also look fast here because it has bugs or hasn't implemented a feature yet. Fewer things to do is not the same as doing them better.
Treat this as a rough sanity check, not a leaderboard.
Test environment
- Machine — MacBook Pro, Apple M5 Max (18-core), 64 GB RAM
- OS — macOS 26.5.1 (build 25F80)
- Terminals — Otty 1.0.2 · Ghostty 1.3.1 · Terminal.app 2.15 (470.2)
- Date — 2026-06-11
- Release builds, identical window size, run back-to-back in one sitting.
Warm (steady state)
Caches and glyph atlas warmed up — representative of day-to-day use.
| Benchmark | Otty | Ghostty | Terminal.app |
|---|---|---|---|
dense_cells | 7.2 ms | 23.6 ms | 24.4 ms |
medium_cells | 22.8 ms | 24.8 ms | 34.9 ms |
sync_medium_cells | 23.0 ms | 29.5 ms | 38.9 ms |
unicode | 23.1 ms | 23.3 ms | 27.3 ms |
scrolling | 21.1 ms | 39.3 ms | 140.2 ms |
scrolling_fullscreen | 21.0 ms | 48.3 ms | 143.6 ms |
scrolling_top_region | 41.0 ms | 39.6 ms | 117.3 ms |
scrolling_top_small_region | 19.4 ms | 39.2 ms | 117.1 ms |
scrolling_bottom_region | 19.7 ms | 39.1 ms | 116.3 ms |
scrolling_bottom_small_region | 19.8 ms | 39.1 ms | 116.5 ms |
At steady state Otty is fastest on 9 of 10 tests — about 3× faster than both rivals on dense_cells, and 2–6× faster on scrolling, where Terminal.app falls to ~120–140 ms while Otty holds ~20 ms. Otty and Ghostty are within a millisecond on unicode and scrolling_top_region (the one test Ghostty edges out).
Cold start (first run)
First pass right after launch, before any caches warm up.
| Benchmark | Otty | Ghostty | Terminal.app |
|---|---|---|---|
dense_cells | 23.8 ms | 62.3 ms | 70.1 ms |
medium_cells | 32.8 ms | 64.8 ms | 67.9 ms |
sync_medium_cells | 32.4 ms | 55.2 ms | 60.9 ms |
unicode | 30.0 ms | 57.7 ms | 51.3 ms |
scrolling | 53.7 ms | 130.5 ms | 168.2 ms |
scrolling_fullscreen | 56.7 ms | 147.7 ms | 178.9 ms |
scrolling_top_region | 68.3 ms | 136.3 ms | 159.2 ms |
scrolling_top_small_region | 42.6 ms | 127.3 ms | 150.8 ms |
scrolling_bottom_region | 41.7 ms | 125.4 ms | 153.2 ms |
scrolling_bottom_small_region | 41.9 ms | 126.4 ms | 155.6 ms |
Reproduce it
bash
git clone https://github.com/alacritty/vtebench
cd vtebench && cargo build --release
# Run inside the terminal you want to measure, then compare:
./target/release/vtebench --bench-path ./benchmarks -o results.txtNumbers vary by machine, GPU, and font — what matters is running all terminals on the same setup in one sitting.
Profiling and reports
bash
otty config get memory-reportIn-app, Window → Memory Report breaks down per-window / per-tab memory, atlas size, and grid allocations.
Crash and performance reports under ~/Library/Application Support/Otty/Crash/.