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
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
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
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
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.
- The screens are OpenUI's own seven samples, updated to its current syntax, with matching GistUI versions; both parse with no errors. The eighth puts all seven in one long answer.
- The stream grows by 4 characters every 10 ms, about 100 tokens a second, on a fixed clock: a busy page receives several chunks at once, as it would from the network.
- Each number is the median of 3 runs, each in a fresh page.
Main-thread time, normal CPU
| Screen | OpenUI | GistUI | GistUI needs | First content, OpenUI / GistUI |
|---|---|---|---|---|
| Simple table | 69 ms | 52 ms | 1.3× less | 122 / 102 ms |
| Dashboard | 2,204 ms | 492 ms | 4.5× less | 362 / 261 ms |
| Pricing page | 2,252 ms | 911 ms | 2.5× less | 429 / 93 ms |
| All seven in one answer | 22,096 ms | 3,667 ms | 6.0× less | 397 / 341 ms |
Main-thread time, CPU slowed 4× (a mid-range phone)
| Screen | OpenUI | GistUI | GistUI needs | First content, OpenUI / GistUI |
|---|---|---|---|---|
| Simple table | 205 ms | 154 ms | 1.3× less | 131 / 106 ms |
| Dashboard | 4,712 ms | 612 ms | 7.7× less | 362 / 265 ms |
| Pricing page | 1,516 ms | 639 ms | 2.4× less | 435 / 97 ms |
| All seven in one answer | 39,399 ms | 2,310 ms | 17.1× less | 397 / 344 ms |
A fast model, about 1,000 tokens a second, normal CPU
| Screen | OpenUI | GistUI | GistUI needs | First content, OpenUI / GistUI |
|---|---|---|---|---|
| Simple table | 60 ms | 62 ms | same | 21 / 13 ms |
| Chart with data | 124 ms | 78 ms | 1.6× less | 27 / 15 ms |
| Contact form | 126 ms | 103 ms | 1.2× less | 27 / 14 ms |
| Settings panel | 226 ms | 102 ms | 2.2× less | 25 / 15 ms |
| Dashboard | 535 ms | 213 ms | 2.5× less | 40 / 29 ms |
| Product page | 393 ms | 183 ms | 2.1× less | 37 / 19 ms |
| Pricing page | 396 ms | 208 ms | 1.9× less | 52 / 13 ms |
| All seven in one answer | 3,917 ms | 695 ms | 5.6× less | 51 / 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.
| Screen | Size, OpenUI / GistUI | Whole answer at once | Streamed, 4-character chunks | 10-character chunks | 40-character chunks |
|---|---|---|---|---|---|
| Simple table | 406 / 294 | 0.1 / 0.1 ms 1.2× slower | 1.2 / 0.4 ms 3.4× faster | 0.5 / 0.1 ms 4.3× faster | 0.1 / 0.1 ms 2.2× faster |
| Chart with data | 795 / 514 | 0.1 / 0.1 ms 1.4× slower | 2.1 / 0.4 ms 5.2× faster | 0.8 / 0.3 ms 3.2× faster | 0.2 / 0.1 ms 2.4× faster |
| Contact form | 1,163 / 641 | 0.1 / 0.1 ms 1.6× faster | 4.8 / 1.0 ms 4.9× faster | 2.0 / 0.6 ms 3.2× faster | 0.5 / 0.2 ms 2.4× faster |
| Settings panel | 2,324 / 1,131 | 0.1 / 0.1 ms 1.3× faster | 13 / 0.6 ms 23.6× faster | 4.9 / 0.5 ms 10.1× faster | 1.4 / 0.2 ms 7.6× faster |
| Dashboard | 3,303 / 2,158 | 0.1 / 0.1 ms 1.1× faster | 26 / 0.8 ms 34.0× faster | 11 / 0.7 ms 14.9× faster | 2.7 / 0.3 ms 9.4× faster |
| Product page | 4,178 / 2,543 | 0.2 / 0.1 ms 1.8× faster | 52 / 2.6 ms 20.4× faster | 21 / 1.3 ms 16.2× faster | 5.3 / 0.4 ms 12.4× faster |
| Pricing page | 4,726 / 3,076 | 0.2 / 0.1 ms 1.8× faster | 53 / 0.9 ms 56.1× faster | 21 / 0.7 ms 31.3× faster | 5.6 / 0.4 ms 13.9× faster |
| All seven in one answer | 17,983 / 10,738 | 0.8 / 0.5 ms 1.6× faster | 1,034 / 6.0 ms 172.3× faster | 423 / 4.1 ms 103.4× faster | 107 / 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
gpt-5-nano
View data
| Model | Answers | OpenUI | GistUI, as written | GistUI, after repair |
|---|---|---|---|---|
| gpt-oss-120b | 182 | 84.6% | 87.9% | 100.0% |
| gpt-5-nano | 184 | 22.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 callTokens per screen
21% fewer4,461 vs 5,618Blank screens
0OpenUI 0 of 182Structural validity
182 answers per format · higher is better
View data
| Format | Validity | Blank screens |
|---|---|---|
| OpenUI | 84.6% | 0 |
| GistUI, as written | 87.9% | 0 |
| GistUI, after repair | 100.0% | 0 |
Token consumption
Per screen: system prompt + answer · lower is better
- System prompt
- Answer
View data
| Format | System prompt | Mean answer | Total |
|---|---|---|---|
| OpenUI | 5,017 | 601 | 5,618 |
| GistUI | 3,874 | 587 | 4,461 |
Time to stream a screen
Mean answer at 50 tokens a second · lower is better
View data
| Format | Mean answer | Decode rate | Seconds |
|---|---|---|---|
| OpenUI | 601 tokens | 50 tokens/s | 12.0 |
| GistUI | 587 tokens | 50 tokens/s | 11.7 |
Validity by screen complexity
Components the brief asks for · higher is better
- OpenUI
- GistUI, as written
- GistUI, after repair
View data
| Components | Runs | OpenUI | GistUI, as written | GistUI, after repair |
|---|---|---|---|---|
| 2–3 | 40 | 95.0% | 97.5% | 100.0% |
| 4–6 | 38 | 97.4% | 97.4% | 100.0% |
| 7–9 | 40 | 90.0% | 80.0% | 100.0% |
| 11–13 | 32 | 59.4% | 87.5% | 100.0% |
| 16–18 | 32 | 75.0% | 75.0% | 100.0% |
Cost of 46 screens
At list price, $0.10 / $0.50 per million input / output tokens · lower is better
View data
| Format | One 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
- The model test covers two models, gpt-oss-120b and gpt-5-nano; more will follow.
- Each model figure is one run at temperature 0.7, so a few points are noise. With gpt-oss-120b, three GistUI runs with slightly different prompts scored 86.7% to 87.9% (the best is reported) against 84.6% for OpenUI's one run: read it as slightly ahead, not settled.
- The rendering test compares each library with its own components, which is what you get by default. A different component library changes the numbers.
- Run it yourself:
bench/render(rendering and parsers) andbench/genui(the model test) in the repository.