Benchmarks

GistUI vs OpenUI, measured

Rendering speed in a real browser, accuracy and tokens with a real model, and bundle size. Every screen, script and answer is in the repository, so you can run it yourself.

Rendering a streaming answer

Main-thread time in Chrome · lower is better

2–6× less work
OpenUI
2,204 ms
GistUI
492 ms

The dashboard from OpenUI's own samples, streamed at about 100 tokens a second: 2,204 ms of work for OpenUI, 492 ms for GistUI. Across all eight screens tested, GistUI needed 2 to 6 times less.

Screens a model gets right

Valid answers, gpt-oss-120b, as written · higher is better

87.9%
OpenUI
84.6%
GistUI
87.9%

182 answers per format on OpenUI's benchmark: 87.9% of GistUI answers were valid exactly as the model wrote them, against 84.6% for OpenUI.

Tokens per screen

System prompt + answer, gpt-oss-120b · lower is better

21% fewer
OpenUI
5,618
GistUI
4,461

The same 46 screens on OpenUI's benchmark: a 3,874-token prompt and 587-token answers for GistUI, 5,017 and 601 for OpenUI.

First-load JavaScript

KB gzip, default components · lower is better

9× smaller
OpenUI
699 KB
GistUI
74 KB

Renderer plus the default component library, minified and gzipped, React excluded. Measured the same way on both (@openuidev/react-ui 0.16.3).

1. Rendering a streaming answer

The question that matters to a person watching: how much work does the page do while the answer streams in? Both libraries ran in the same React 19 page in Chrome, production builds, each with its own default components. Each was fed the same screen at the same pace, and Chrome counted the main-thread time: parsing, rendering, layout and style.

Main-thread time, normal CPU

ScreenOpenUIGistUIGistUI needsFirst content, OpenUI / GistUI
Simple table69 ms52 ms1.3× less122 / 102 ms
Dashboard2,204 ms492 ms4.5× less362 / 261 ms
Pricing page2,252 ms911 ms2.5× less429 / 93 ms
All seven in one answer22,096 ms3,667 ms6.0× less397 / 341 ms

Main-thread time, CPU slowed 4× (a mid-range phone)

ScreenOpenUIGistUIGistUI needsFirst content, OpenUI / GistUI
Simple table205 ms154 ms1.3× less131 / 106 ms
Dashboard4,712 ms612 ms7.7× less362 / 265 ms
Pricing page1,516 ms639 ms2.4× less435 / 97 ms
All seven in one answer39,399 ms2,310 ms17.1× less397 / 344 ms

A fast model, about 1,000 tokens a second, normal CPU

ScreenOpenUIGistUIGistUI needsFirst content, OpenUI / GistUI
Simple table60 ms62 mssame21 / 13 ms
Chart with data124 ms78 ms1.6× less27 / 15 ms
Contact form126 ms103 ms1.2× less27 / 14 ms
Settings panel226 ms102 ms2.2× less25 / 15 ms
Dashboard535 ms213 ms2.5× less40 / 29 ms
Product page393 ms183 ms2.1× less37 / 19 ms
Pricing page396 ms208 ms1.9× less52 / 13 ms
All seven in one answer3,917 ms695 ms5.6× less51 / 36 ms

Result: 2–6× less work on these screens. The gap grows with the length of the answer: 6.0× less on the longest one. Both stayed smooth: no task blocked the page for more than a few milliseconds, and no frame took longer than 67 ms. GistUI shows the first content sooner on every screen. Part of the difference is the format itself: GistUI's version of each screen is about a third shorter, so there is less text to process.

2. The parsers alone

Inside that work, the parser. Here each parser read the same screens in chunks, and after every chunk produced an up-to-date result, as a renderer needs. OpenUI re-reads the whole answer on every chunk, so its time grows with the square of the answer's length; GistUI reads each new character once.

ScreenSize, OpenUI / GistUIWhole answer at onceStreamed, 4-character chunks10-character chunks40-character chunks
Simple table406 / 2940.1 / 0.1 ms 1.2× slower1.2 / 0.4 ms 3.4× faster0.5 / 0.1 ms 4.3× faster0.1 / 0.1 ms 2.2× faster
Chart with data795 / 5140.1 / 0.1 ms 1.4× slower2.1 / 0.4 ms 5.2× faster0.8 / 0.3 ms 3.2× faster0.2 / 0.1 ms 2.4× faster
Contact form1,163 / 6410.1 / 0.1 ms 1.6× faster4.8 / 1.0 ms 4.9× faster2.0 / 0.6 ms 3.2× faster0.5 / 0.2 ms 2.4× faster
Settings panel2,324 / 1,1310.1 / 0.1 ms 1.3× faster13 / 0.6 ms 23.6× faster4.9 / 0.5 ms 10.1× faster1.4 / 0.2 ms 7.6× faster
Dashboard3,303 / 2,1580.1 / 0.1 ms 1.1× faster26 / 0.8 ms 34.0× faster11 / 0.7 ms 14.9× faster2.7 / 0.3 ms 9.4× faster
Product page4,178 / 2,5430.2 / 0.1 ms 1.8× faster52 / 2.6 ms 20.4× faster21 / 1.3 ms 16.2× faster5.3 / 0.4 ms 12.4× faster
Pricing page4,726 / 3,0760.2 / 0.1 ms 1.8× faster53 / 0.9 ms 56.1× faster21 / 0.7 ms 31.3× faster5.6 / 0.4 ms 13.9× faster
All seven in one answer17,983 / 10,7380.8 / 0.5 ms 1.6× faster1,034 / 6.0 ms 172.3× faster423 / 4.1 ms 103.4× faster107 / 2.0 ms 53.3× faster

Times are OpenUI / GistUI, in milliseconds, for the whole screen. Read all at once, the two are about as fast. Streamed, the difference is large on long answers, but it is a small part of the total: rendering the components, above, costs much more than parsing.

3. Accuracy and tokens with real models

On generative-ui-bench, the benchmark OpenUI publishes: 46 screens, 4 runs each, the same 70-component catalog, examples and settings for both formats. Only the language differs. A screen counts as valid when it parses, every component and prop is valid, nothing is left dangling, and it has the components the brief asks for.

Structural validity by model

Valid answers on OpenUI's benchmark · higher is better

  • OpenUI
  • GistUI, as written
  • GistUI, after repair

gpt-oss-120b

OpenUI
84.6%
GistUI
87.9%
Repaired
100.0%

gpt-5-nano

OpenUI
22.3%
GistUI
22.8%
Repaired
99.5%
View data
ModelAnswersOpenUIGistUI, as writtenGistUI, after repair
gpt-oss-120b18284.6%87.9%100.0%
gpt-5-nano18422.3%22.8%99.5%

Valid as written

87.9%OpenUI 84.6%

Valid after repair

100.0%in code, about 1–2 ms, no model call

Tokens per screen

21% fewer4,461 vs 5,618

Blank screens

0OpenUI 0 of 182

Structural validity

182 answers per format · higher is better

+3.3 pts as written
OpenUI
84.6%
GistUI, as written
87.9%
GistUI, after repair
100.0%
View data
FormatValidityBlank screens
OpenUI84.6%0
GistUI, as written87.9%0
GistUI, after repair100.0%0

Token consumption

Per screen: system prompt + answer · lower is better

21% fewer
  • System prompt
  • Answer
OpenUI
5,618↑1.3×
GistUI
4,461
View data
FormatSystem promptMean answerTotal
OpenUI5,0176015,618
GistUI3,8745874,461

Time to stream a screen

Mean answer at 50 tokens a second · lower is better

OpenUI
12.0 s
GistUI
11.7 s
View data
FormatMean answerDecode rateSeconds
OpenUI601 tokens50 tokens/s12.0
GistUI587 tokens50 tokens/s11.7

Validity by screen complexity

Components the brief asks for · higher is better

  • OpenUI
  • GistUI, as written
  • GistUI, after repair
0%25%50%75%100%2–34–67–911–1316–18GistUI, after repairGistUI, as writtenOpenUI
View data
ComponentsRunsOpenUIGistUI, as writtenGistUI, after repair
2–34095.0%97.5%100.0%
4–63897.4%97.4%100.0%
7–94090.0%80.0%100.0%
11–133259.4%87.5%100.0%
16–183275.0%75.0%100.0%

Cost of 46 screens

At list price, $0.10 / $0.50 per million input / output tokens · lower is better

OpenUI
$0.038↑1.2×
GistUI
$0.032
View data
FormatOne pass, 46 screens
OpenUI$0.038
GistUI$0.032

The repair

GistUI's repair is plain code in the library: no second model call, nothing to pay for, and it runs once when the stream ends, in about a millisecond. It fixes each mistake where it points, keeps everything the model wrote that can be kept, and lists every change. OpenUI repairs with a second model call in OpenUI Cloud, which its benchmark does not include; the OpenUI numbers here are as the model wrote them, like GistUI's “as written”.

A small model shows why the repair matters: gpt-5-nano writes few screens that are valid as written in either format, about 22%, and GistUI's repair takes it to 99.5%. What the repair cannot fix is an answer the model never finished: code cannot add what was never written.

4. What the browser downloads

The renderer plus the default component library, minified and gzipped, React excluded: 74 KB for GistUI and 699 KB for OpenUI (@openuidev/react-ui 0.16.3). GistUI loads charts, tables, slides and other heavy parts only when an answer uses them.

Limits