Performance · Receipts
Every trading platform says it's fast. This is the measured version: the p95 frame times my release gate records on the shipping build, the budget a release has to beat before it's allowed to ship, and exactly how the numbers are produced — down to the harness and the machine — so you can re-run them and hold me to them.
p95 frame time panning a fully-loaded chart — every overlay on
release gate · budget 40 ms · CPU renderer
sustained tape repaint under a ~200 prints/sec storm
tick-storm scenario · 14.6 ms p95 frames
full workspace under load — the worst chart holds 7.5 ms p95
fleet gate · budget 40 ms/chart · 0 study recomputes
p95 = the frame time 95% of frames come in under. Measured 2026-07-13 by reproducing the release gate on the shipping build.
A loaded ES chart — candles, the liquidity heatmap and the volume profile all drawing — driven through the exact inputs a hand produces at the desk. Each row is a p95 from the shipping build next to the budget the release gate enforces. Anything over budget and the build does not ship.
| Interaction | p95 | Budget | Verdict |
|---|---|---|---|
| Idle — no input | 0.5 ms | 140 ms | PASS |
| Crosshair move | 7.6 ms | 40 ms | PASS |
| Mouse-wheel zoom | 12.8 ms | 40 ms | PASS |
| Price-scale zoom (Ctrl + wheel) | 12.8 ms | 40 ms | PASS |
| Price-gutter drag | 13.2 ms | 40 ms | PASS |
| Pan drag | 12.8 ms | 40 ms | PASS |
| Tick storm (~200 prints/sec) | 14.6 ms | 40 ms | PASS |
The budget sits at roughly 3× the measured number on purpose — it is a tripwire, not a target. A regression back toward the old 70–180 ms class trips it instantly, long before you'd feel it.
The fast numbers above aren't from a bare chart with your tools switched off. Here are the same interactions with a six-study basket loaded — two overlays, Bollinger bands, and RSI, MACD and Volume in their own panes — measured against a 56 ms budget. Your studies never recompute while you pan, zoom or move the crosshair; that work stays off the render path.
| Interaction | p95 · 6 studies on | Budget |
|---|---|---|
| Crosshair move | 10.5 ms | 56 ms |
| Mouse-wheel zoom | 29.9 ms | 56 ms |
| Price-scale zoom (Ctrl + wheel) | 33.8 ms | 56 ms |
| Price-gutter drag | 38.0 ms | 56 ms |
| Pan drag | 27.5 ms | 56 ms |
| Tick storm (~200 prints/sec) | 31.6 ms | 56 ms |
Desktop 1.9.0 (2026-07-08) was the chart performance release — the work is in the public release notes. These are the before/after frame times with the liquidity heatmap and volume profile enabled:
| Interaction | Before 1.9.0 | Since 1.9.0 |
|---|---|---|
| Pan / zoom / price-scale drag | ~150–180 ms per frame | ~13 ms p95 (≈8 ms typical) |
| Tick frame on a fast stream | ~86 ms (≈11 fps) | ~15 ms p95 (≈60 fps) |
The speed doesn't come from hiding your overlays. During an active drag or zoom the heavy layers step aside and snap back the instant motion settles, overlay refreshes repaint only their own cached layer, and the tape keeps painting through it all.
I ship releases weekly, sometimes daily. The only way that cadence stays safe is a gate every build must pass before it reaches you:
The 20-chart fleet scenario
Two execution charts plus eighteen wall charts, replaying recorded market data at roughly 200 prints per second fanned to every chart. The budget is 40 ms p95 per chart; the shipping build's worst chart measures 7.5 ms, and no chart recomputes a study on a tick. If any chart blows the budget, the release does not ship.
The interaction storm
Rapid same-spot clicks, jittered clicks, a double-click landing mid-glide — the abuse a real hand produces mid-trade. The chart must keep its candles through all of it, or the release does not ship. Added to the gate in 1.9.18.
Pixel-exact snapshots
Rendered chart output is compared against blessed golden images — a performance change that alters a single pixel of the chart fails the build until the change is explicitly reviewed and re-blessed.
The leak soak
Charts are repainted, resized, and constructed-and-destroyed in a loop while memory is watched. Repaint/resize and build/teardown show no upward memory trend, and a deliberately-leaky control is correctly flagged — so the check has teeth, it isn't just always-green.
The measurements come from the terminal's own offscreen harness: deterministic interaction scenarios driven against real recorded market data, on the exact binary that ships. Every number on this page was produced by reproducing the release gate on 2026-07-13. I quote p95 — the frame time 95% of frames beat — because averages hide the stutter you actually feel; a chart that averages 8 ms but spikes to 100 ms on every bar close is a slow chart.
Hardware: the gate runs on my build machine — an AMD Ryzen 9 5950X on Windows Server 2022 — using the terminal's CPU renderer, rendering offscreen. There is no GPU requirement hiding in these numbers; rendering is single-core bound, so per-core speed and background load move the absolute figures. Expect run-to-run drift of a few milliseconds and a different baseline on your box — the shape (interactions in the single-digit-to-low-teens milliseconds, tape near 60 fps, studies work kept off the render path) is what travels.
These figures update when the gate's numbers change, in the same commit. If you ever measure something wildly different on your machine, email me — that's a bug report I want.
The full history of what shipped and when is on the changelog. The terminal these numbers describe is the one you download — there is no demo build.