New

Starling Terminal

A cross-platform terminal, built for speed and efficiency.

Linux, Windows and macOS — iOS coming soon. Measured faster than ghostty on Linux and macOS, and Windows Terminal on Windows, at about half the CPU. Below: each pair on one machine, matched grids, three tests, one take.

Windows Linux macOS
Starling vs Windows Terminal, head to head a 2 GB ascii cat, a 1 GB unicode cat, DOOM-Fire for 6,000 frames, both at a verified 50×100 on real hardware — Starling finishes all three in 39.4 s, Windows Terminal in 52.4 s
LinuxWindowsmacOSiOS — soon

Runs where you work

Wayland or X11 on Linux, a native Win32 window on Windows, a Cocoa window on macOS — the same terminal, and the same speed, on each. iOS is next.

1.28–1.41×

Faster on all three

Ten workloads at steady state: 1.41× Windows Terminal on Windows, 1.38× ghostty on Linux, 1.28× ghostty on macOS — matched grid and font, at about half the CPU each time.

0 vs 40

Text done properly

Zero ucs-detect errors in 107k+ measurements — wide characters, emoji families, 118 languages of conjuncts — where the ghostty nightly logs 40.

Install

Get it on your machine.

Linux

x86_64 · GNOME, KDE or any desktop · Wayland or X11
curl -LO https://github.com/starling-build/starling/releases/download/terminal-v0.1.0/starling-terminal_0.1.0_amd64.deb
sudo apt install ./starling-terminal_0.1.0_amd64.deb

Everything the terminal loads — engine, Swift runtime, fonts — rides inside the package under /usr/lib/starling-terminal; apt resolves the few system libraries. It opens from the app grid as Starling Terminal, or as starling-terminal from any prompt. On the Starling desktop there is nothing to install — the terminal is part of the desktop.

macOS

Apple Silicon · macOS 14 or newer
curl -LO https://github.com/starling-build/starling/releases/download/terminal-v0.1.0/starling-terminal-0.1.0-macos-arm64.zip
ditto -xk starling-terminal-0.1.0-macos-arm64.zip /Applications

Or unzip it and drag Starling Terminal.app into Applications yourself. The bundle is signed but not notarized, so macOS holds the first launch: approve it under System Settings → Privacy & Security → Open Anyway, or clear the quarantine bit with xattr -dr com.apple.quarantine "/Applications/Starling Terminal.app".

Windows

x86_64 · Windows 10 or 11
curl.exe -LO https://github.com/starling-build/starling/releases/download/terminal-v0.1.0/starling-terminal-0.1.0-windows-x86_64.zip
Expand-Archive starling-terminal-0.1.0-windows-x86_64.zip -DestinationPath StarlingTerminal
.\StarlingTerminal\TerminalApp.exe

A native Win32 window, no installer and nothing to put on PATH. Give it a folder of its own: the archive extracts flat, and all 52 files have to stay together — Windows resolves imports from the executable's own directory, and the bundled ConPTY console host sits beside it.

Performance

Measured against ghostty on Linux and macOS, Windows Terminal on Windows.

Thirteen tests — ten workloads, two 500 MB cats, DOOM-Fire — against the fastest terminal on each platform. Matched fonts, grids verified on both sides, every test at steady state. Amber, rightward — Starling is ahead; grey, leftward — the other terminal is. The setup and every raw number are below the charts.

Speed — thirteen tests at steady state, three platforms

Starling ahead the other terminal ahead 1× = the other terminal's pace · log scale · ghostty on Linux and macOS, Windows Terminal on Windows
Linux
macOS
Windowsvs Windows Terminal
Light cells
1.01×
1.80×
1.19×
Dense cells
0.99×
1.05×
1.33×
Coloured text
3.19×
1.46×
1.05×
Truecolour
2.27×
1.31×
1.32×
Unicode
1.10×
1.20×
1.51×
Cursor motion
1.49×
1.01×
1.14×
Alt screen
1.06×
1.00×
1.87×
Scroll region
0.98×
1.07×
1.33×
Long lines
0.99×
1.04×
1.32×
Binary dump
4.12×
3.46×
4.34×
Cats and DOOM-Fire — 500 MB, 150,000 frames
ascii cat
0.94×
1.11×
1.37×
unicode cat
1.79×
1.39×
1.47×
DOOM-Fire
1.94×
1.05×
1.24×
All ten workloads
1.38×
1.28×
1.41×
0.75×1.5×
0.75×1.5×
0.75×1.5×

Hover any row for the raw seconds. Sustained is the regime that matters, and it is not always the flattering one — the two workloads ghostty wins in ten-second bursts (light and dense cells, 0.85× and 0.69× short-range) converge to parity here, but ghostty also gains nothing back: its Linux unicode throughput halves at scale (184 to 97 MB/s) while ours sheds only a quarter (228 to 173 MB/s). Across all three platforms and all thirty-nine cells above, the one test the other side keeps by more than noise is the Linux ascii cat, by ~6% — ghostty's io_uring read path gets under the read(2) floor ours sits on. macOS has no io_uring, and the cat flips to us; on Windows every test is a win.

The cost — CPU and memory for the same work

CPU to run the suite
process CPU-seconds, ten workloads at steady state
Linuxghostty burns 1.87×
Starling
1030 s
ghostty
1930 s
macOSghostty burns 2.25×
Starling
1081 s
ghostty
2436 s
WindowsWindows Terminal burns 2.01×
Starling
1581 s
Windows Terminal
3182 s

The wall wins are not bought with cores. In ten-second bursts the gap is wider still: 2.17× and 3.37×.

Memory — Linux
resident set, MB, as load accumulates
Starling · 225 ghostty · 209 225 MB 256 MB after the suite after 159 GB after the cats
Memory — macOS
resident set, MB, as load accumulates
ghostty · 155 Starling · 121 121 MB 177 MB after 30 GB of suite after the cats

On Windows the CPU figures include the console host, which does a large share of the work there and would flatter us if left out; the memory gap is the widest of the three platforms — 73 MB against 1,026 MB after the same ten workloads, a figure Windows Terminal reproduces across machines. CPU-seconds are otherwise charged to the terminal's own process, read around each workload. Memory is flat on our side of all three platforms — the same resident set no matter how much has been drawn — while the other side's grows with load; only the light Linux legs leave ghostty below us.

The setup

Who: the ghostty nightly on Linux and macOS, configured onto our Roboto Mono at our cell metrics so both terminals raster the same pixels; Windows Terminal Preview 1.25 on Windows, in its own process (the stable build hands new windows to whatever Windows Terminal is already running). Where: Linux — Ryzen 7 8845HS, GNOME/Wayland; macOS — MacBook Pro on macOS 26.6.1; Windows — a Ryzen 7 8845HS laptop with a Radeon 780M, the first Windows round on real hardware rather than a VM. Grids verified on both sides before every leg: 47×201 on Linux and macOS, 40×120 on Windows. How: every test at steady state — each workload repeated until the slower side sustains one to two minutes (~159 GB of escape-sequence traffic per terminal on Linux, ~30 GB on macOS), the cats exact 500,000,000-byte corpora, DOOM-Fire run to 150,000 frames three times over. Both sides measured back to back on one machine; bars are multiples of the other terminal's pace on a log scale, so a 2× win and a 2× loss have equal length.

The rounds behind the numbers

The Linux and Windows legs ran on 30 Hz displays, so raw walls compare within a platform; the ratios carry. The macOS numbers are the rerun taken after the macOS 26.6.1 upgrade — which moved nothing beyond run noise against the same-day pre-upgrade round. The Windows round runs the console on the UTF-8 code page, so the unicode workloads draw real CJK text rather than the mojibake every earlier VM round was unknowingly measuring, and a fixed compute loop timed inside every leg proves both sides saw the machine in the same state; the archived VM rounds remain, but they measure the legacy code page. The raw runs are checked in at docs/perf (Windows: -windows-realgpu-2026-08-16; Linux: -2026-08-14-long; macOS: -macos-2026-08-14-postupgrade, confirmed against -macos-2026-08-14-long; short range: -2026-08-13-atlas and -macos-2026-08-13-samefont).

Every number behind the charts — the raw tables

Raw speed — seconds to drain each workload

LinuxmacOS
Workload StarlingghosttySpeedup StarlingghosttySpeedup
Light cells0.5860.4970.85×0.1110.1491.34×
Dense cells0.2490.1730.69×0.1290.1451.12×
Coloured text0.3871.0392.68×0.4380.6421.47×
Truecolour0.3900.7611.95×0.6190.7131.15×
Unicode0.3340.3160.95×0.3230.3050.94×
Cursor motion0.0220.0341.55×0.0310.0371.19×
Alt screen0.1170.1351.15×0.2070.1800.87×
Scroll region0.5100.4570.90×0.1810.2171.20×
Long lines0.1450.1471.01×0.1630.1811.11×
Binary dump0.4791.6243.39×0.1890.5452.88×
All ten workloads3.2195.1831.61×2.3913.1141.30×

Seconds compare within a platform, not across it: the Linux round ran on a 30 Hz display, which slows both terminals' absolute times equally. The ratios carry.

CPU — what the suite costs the machine

Ten workloadsStarlingghosttySpeedup
Linux4.46 s9.66 s2.17×
macOS2.38 s8.02 s3.37×

Memory — resident set

Sampled atStarlingghosttyDelta
Linux, after the suite225 MB209 MB+16 MB
Linux, after 159 GB of suite225 MB212 MB+13 MB
Linux, after two 500 MB cats225 MB256 MB−31 MB
macOS, after 30 GB of suite121 MB155 MB−34 MB
macOS, after two 500 MB cats121 MB177 MB−56 MB

The macOS rows are the 08-13 long round, the one macOS round that sampled RSS at both points. The current build measures 130 MB against ghostty's 155 after the suite — the paced reader's 8 MB ring and thread stacks — and stays flat the same way.

Steady state — every test run for minutes, not seconds

LinuxmacOSWindows
Test StarlingghosttySpeedup StarlingghosttySpeedup StarlingWin TerminalSpeedup
Light cells101.2 s102.0 s1.01×53.9 s96.9 s1.80×142.7 s170.1 s1.19×
Dense cells86.8 s86.2 s0.99×92.0 s96.7 s1.05×97.3 s129.6 s1.33×
Coloured text34.0 s108.3 s3.19×76.9 s112.4 s1.46×179.7 s188.8 s1.05×
Truecolour54.2 s122.8 s2.27×81.1 s106.5 s1.31×163.5 s215.4 s1.32×
Unicode97.1 s107.3 s1.10×81.9 s98.3 s1.20×96.6 s146.0 s1.51×
Cursor motion49.9 s74.3 s1.49×70.4 s71.2 s1.01×177.4 s203.0 s1.14×
Alt screen80.8 s85.9 s1.06×88.8 s88.4 s1.00×118.6 s222.3 s1.87×
Scroll region80.4 s78.5 s0.98×90.3 s96.6 s1.07×167.0 s222.7 s1.33×
Long lines85.0 s84.3 s0.99×93.7 s97.3 s1.04×102.7 s136.0 s1.32×
Binary dump26.7 s109.9 s4.12×31.8 s110.1 s3.46×40.9 s177.6 s4.34×
All ten workloads, wall696 s960 s1.38×761 s974 s1.28×1286 s1812 s1.41×
All ten workloads, CPU1030 s1930 s1.87×1081 s2436 s2.25×1581 s3182 s2.01×
ascii cat, 500 MB2.97 s2.79 s0.94×1.82 s2.01 s1.11×1.98 s2.71 s1.37×
unicode cat, 500 MB2.88 s5.15 s1.79×1.76 s2.45 s1.39×4.40 s6.46 s1.47×
DOOM-Fire, 150,000 frames1610 fps830 fps1.94×1119 fps1071 fps1.05×482 fps390 fps1.24×

Cats and DOOM-Fire at short range — 150 MB cats

LinuxmacOS
Test StarlingghosttySpeedup StarlingghosttySpeedup
ascii cat, 150 MB0.869 s0.829 s0.95×0.611 s0.692 s1.13×
unicode cat, 150 MB0.659 s0.815 s1.24×0.806 s0.826 s1.02×
DOOM-Fire1200 fps701 fps1.71×1058 fps960 fps1.10×

Raw values are seconds for the cats and frames per second for DOOM-Fire; the speedup is Starling's multiple either way. The fire rows run 600 frames on Linux and 6,000 on macOS — at 600 the macOS pair reads ~1025 vs ~845 fps (1.21×), but the longer run amortizes ghostty's warm-up and is the fairer number. CPU is ours on all six legs — ghostty spends 1.4–2.8× as much.

How it is built

From scratch, on a UI engine.

The emulator is about 2,000 lines of C we wrote — no libvte, no libvterm, nothing borrowed. The pixels come from the Flutter engine through the Starling SDK: a general-purpose UI engine, not a terminal-specific one.

That is the unusual part. Terminals this fast are normally built on a stack that can only ever draw a terminal. This one matches or beats them on their own benchmarks — and the engine underneath hands us the rest for free: the same code on every platform, and a real widget tree around the grid, which is where the splits, the floating frames and the cover flow come from.

Build your own

Build your own terminal app with the SDK.

The Starling SDK has a terminal widget — shell, escape sequences, fonts, scrollback and selection included — so you can write your own terminal app on top of it. Download one file, run it, and you have a terminal of your own, on Linux, macOS or Windows:

terminal
curl -fLO https://github.com/starling-build/starling/releases/download/sdk-v0.3.0/starling-create
chmod +x starling-create
./starling-create myterm
cd myterm && swift run -c release

Those four lines are the same on Linux, macOS and Windows — on Windows in Git bash, which is where a curl instruction lands anyway. starling-create is an asset on the release above, the same one the terminal itself ships from. It checks your toolchain, fetches the SDK bundle for the machine it is run on — the framework plus the engine binaries it links against, 14 MB on macOS, 17 MB on Windows, 23 MB on Linux — and writes the SwiftPM project around it. No repo to clone, no engine checkout, no Flutter install; a Swift toolchain is the only prerequisite. The SDK is cached once under ~/.starling/sdk and shared, so the second project costs no download; --template app scaffolds a plain window instead of a terminal, and --sdk takes a URL or a local archive when you want a bundle other than the release's. What it writes is this, and this is the whole app:

myterm/Sources/Myterm/main.swift — in full
import ExampleHost
import Flutter

let session = TerminalSession()
session.startShell()

runExampleApp(title: "Terminal", width: 940, height: 620) {
    TerminalView(session: session)
}

That is the same widget the films above run on, and the same one the shipped terminal is built from — the release archives are assembled against this SDK bundle, not against a private tree. The workspace is it with geometry around it — splits, frames and a cover flow, and no terminal code of its own.