Numbers, not promises.
Reproducible head-to-head measurements between Relay and the main macOS terminals. Including the scenarios where Relay loses.
Results
Six scenarios, each measured across multiple runs. Tinted row = Relay.
Cold start
Time from app launch to a fully-rendered window. Warm-cache numbers — not the very first launch after install, but the typical day-to-day value.
| App | mean (ms) | min (ms) | max (ms) |
|---|---|---|---|
| Relay | — | — | — |
| iTerm2 | — | — | — |
| Ghostty | — | — | — |
| Terminal.app | — | — | — |
Measurement pending. This dashboard is re-run with every Relay release.
RAM at idle
Memory footprint of a single empty pane after 60 seconds of stabilization. Measures the baseline cost of each tool.
| App | RSS (MB) | processes |
|---|---|---|
| Relay | — | — |
| iTerm2 | — | — |
| Ghostty | — | — |
| Terminal.app | — | — |
Measurement pending. This dashboard is re-run with every Relay release.
RAM with 4 panes
Memory footprint in a workspace with four active panes. This is the scenario Relay was built for — the question is how efficiently other terminals scale.
| App | RSS (MB) | per pane (MB) |
|---|---|---|
| Relay | — | — |
| iTerm2 | — | — |
| Ghostty | — | — |
| Terminal.app | no native splits | — |
Measurement pending. This dashboard is re-run with every Relay release.
Throughput · 20 MB log dump
How long the terminal takes to render a 20 MB log file. Stress test for the text pipeline.
| App | time (s) | MB/s |
|---|---|---|
| Relay | — | — |
| iTerm2 | — | — |
| Ghostty | — | — |
| Terminal.app | — | — |
Measurement pending. This dashboard is re-run with every Relay release.
vtebench · VT-sequence processing
Industry-standard benchmark from the Alacritty project. Pure CPU work for the VT-sequence parser. We include it because honest comparison matters more than selective silence.
| App | dense_cells | light_cells | scrolling | unicode |
|---|---|---|---|---|
| Relay | — | — | — | — |
| iTerm2 | — | — | — | — |
| Ghostty | — | — | — | — |
| Terminal.app | — | — | — | — |
Measurement pending. This dashboard is re-run with every Relay release.
Where Relay loses
Three scenarios where other terminals objectively beat Relay. This section exists because a benchmark without an honest weakness list is worthless.
- Raw VT-throughput tests
Alacritty and Kitty render via GPU shaders and beat Relay on vtebench by 2-5×. If your workflow is dominated by piping huge logs through the terminal, those tools are objectively faster.
- Platform availability
Relay is macOS-only. Linux and Windows users can stop reading here.
- First-ever launch after install
AppKit + SwiftUI cold start is noticeably slower than a natively-compiled C/Rust binary on the very first launch after install or reboot. Warm-cache numbers are competitive.
Methodology
Four decisions that shape every number in the tables above.
Warm cache, not cold boot
Cold-start values are measured after a warmup pass. Reflects daily use, not the first launch after a reboot.
App selection
Relay vs. iTerm2 vs. Ghostty vs. Terminal.app. Alacritty and Kitty are deliberately not in the default set — they serve a different audience (Linux-leaning, config-file workflow). Add them yourself in benchmark.sh.
Real zsh config
Each terminal launches with the test user's default zsh — not a stripped-down test shell. Numbers reflect real workflows.
Fully reproducible
Every script lives in the public repo. Every table above has a run date. You can re-run the measurements on your own hardware and compare with ours.
Run it yourself
If you don't trust our numbers — clone the repo and run the suite on your own machine. Takes about 15 minutes.
git clone https://github.com/relayapp/relay-benchmarks
cd relay-benchmarks
./benchmark.sh --check
./benchmark.shPublished your own results? Send us the link and we'll link back. The more independent reproductions, the harder it is to accuse anyone of cherry-picking.