The evidence

Eight frameworks. Three machines. The bad numbers too.

The same three apps - an empty window, a notepad, and a small analytics client - built eight ways and measured on three desktops on 27 August 2026. Download size, memory at idle, in use and at its peak, CPU, time to first window and process count. Every bar, rank and charted table cell is computed from that run rather than typed in. The prose around the charts is written by hand, and it is the part to check.

Machine
Scale

RayClay - the subject of this page, not a category Drawn by a browser engine Drawn by a native renderer Every table below names each framework's renderer in words, so the colours are never the only thing carrying it.

Every chart below is showing the blended, linear view. The per-machine readings need JavaScript to swap into the bars, so with it switched off they live in the table under each chart instead, where they are plain text.

Download and disk

The two figures a user can feel before the app has done anything: the bytes that come down the wire, and the bytes that stay on the disk afterwards. Both count borrowed runtime, which means every byte of engine or toolkit the artefact itself does not contain - a system webview is only the most familiar case. RayClay's own Linux notepad bar is borrowed to the tune of 72%, and its Windows bar 94%.

What the user downloads

Notepad · bytes in the artefact plus any runtime it borrows from the OS · lower is better

Linear axis 0 to 130.9× the best framework on the same machine

macOS charges no borrowed webview, and it changes everything here. WebKit is part of macOS, so a framework that renders in the system webview downloads none of it. Tauri's notepad is 262.6 MiB shipped-plus-borrowed on Linux and 0.3 MiB on macOS - the same application, with the engine already installed by Apple. Read the macOS column as "what is left to download on a machine that already has a browser engine", not as "this framework is small".

It does not follow that the macOS column is all artefact. Qt is the counterexample on this very chart: its macOS notepad bar is 65.0 MiB, of which 64.8 MiB - 99.7% - is Qt 6 runtime that sits outside the 0.18 MiB application. Only the webview is free on macOS, because only the webview ships with the OS. Read a macOS bar as "engine plus app, minus whatever Apple already installed", and if you want the app on its own, that is the next chart.

Three different computers: each bar is a multiple of the best framework on its own machine. Compare bars within a machine, never across.

  1. RayClay #1 of 8 1.29×
    1. Linux 1.00× · 3.2 MiB
    2. macOS 2.12× · 602.1 KiB
    3. Windows 1.02× · 11.1 MiB
  2. Tauri 5.60×
    1. Linux 82.62× · 262.6 MiB
    2. macOS 1.00× · 284.5 KiB
    3. Windows 2.12× · 23.0 MiB
  3. Wails 13.22×
    1. Linux 83.12× · 264.2 MiB
    2. macOS 27.82× · 7.7 MiB
    3. Windows 1.00× · 10.8 MiB
  4. Flutter 18.75×
    1. Linux 15.75× · 50.1 MiB
    2. macOS 140.45× · 39.0 MiB
    3. Windows 2.98× · 32.3 MiB
  5. Qt 27.98×
    1. Linux 25.60× · 81.4 MiB
    2. macOS 233.83× · 65.0 MiB
    3. Windows 3.66× · 39.6 MiB
  6. Bun 62.39×
    1. Linux 111.51× · 354.4 MiB
    2. macOS 211.17× · 58.7 MiB
    3. Windows 10.31× · 111.8 MiB
  7. Electron 67.83×
    1. Linux 55.39× · 176.1 MiB
    2. macOS 410.27× · 114.0 MiB
    3. Windows 13.73× · 148.8 MiB
  8. NW.js 130.94×
    1. Linux 162.02× · 515.0 MiB
    2. macOS 632.09× · 175.6 MiB
    3. Windows 21.92× · 237.6 MiB
Show the numbers as a table for What the user downloads

What the user downloads - every reading, as text. metric shipped_plus_borrowed_bytes · app notepad · arm -

FrameworkLinuxmacOSWindowsBlended, × best on the same machine
RayClaynative renderer3.2 MiB602.1 KiB11.1 MiB1.29×
Tauribrowser engine262.6 MiB284.5 KiB23.0 MiB5.60×
Wailsbrowser engine264.2 MiB7.7 MiB10.8 MiB13.22×
Flutternative renderer50.1 MiB39.0 MiB32.3 MiB18.75×
Qtnative renderer81.4 MiB65.0 MiB39.6 MiB27.98×
Bunbrowser engine354.4 MiB58.7 MiB111.8 MiB62.39×
Electronbrowser engine176.1 MiB114.0 MiB148.8 MiB67.83×
NW.jsbrowser engine515.0 MiB175.6 MiB237.6 MiB130.94×

The application on its own

Notepad · bytes in the artefact, with no borrowed runtime counted · lower is better

Linear axis 0 to 2991.3× the best framework on the same machine

This is the size axis where RayClay does not lead, and it is here because leaving it out would have been the flattering choice. Strip the borrowed runtime and compare only the file each project actually builds, and RayClay places second of eight on Windows and third of eight on Linux and macOS. A framework that renders through a runtime the machine already has can ship almost nothing and still need all of it to run, which is why the two charts around this one count what is borrowed. Both views are true, and this is the one that flatters RayClay least.

Three different computers: each bar is a multiple of the best framework on its own machine. Compare bars within a machine, never across.

  1. Flutter 6.06×
    1. Linux 1.00× · 19.2 KiB
    2. macOS 222.77× · 39.0 MiB
    3. Windows 1.00× · 88.5 KiB
  2. RayClay #2 of 8 10.56×
    1. Linux 46.69× · 898.1 KiB
    2. macOS 3.36× · 602.1 KiB
    3. Windows 7.50× · 664.0 KiB
  3. Qt 14.71×
    1. Linux 8.59× · 165.1 KiB
    2. macOS 1.00× · 179.4 KiB
    3. Windows 370.98× · 32.1 MiB
  4. Tauri 37.80×
    1. Linux 355.41× · 6.7 MiB
    2. macOS 1.59× · 284.5 KiB
    3. Windows 95.78× · 8.3 MiB
  5. Wails 134.67×
    1. Linux 441.38× · 8.3 MiB
    2. macOS 44.13× · 7.7 MiB
    3. Windows 125.40× · 10.8 MiB
  6. Bun 1196.75×
    1. Linux 4709.22× · 88.5 MiB
    2. macOS 334.93× · 58.7 MiB
    3. Windows 1086.69× · 93.9 MiB
  7. Electron 1662.61×
    1. Linux 6435.71× · 120.9 MiB
    2. macOS 650.73× · 114.0 MiB
    3. Windows 1097.44× · 94.8 MiB
  8. NW.js 2991.31×
    1. Linux 10472.53× · 196.7 MiB
    2. macOS 1002.56× · 175.6 MiB
    3. Windows 2549.30× · 220.3 MiB
Show the numbers as a table for The application on its own

The application on its own - every reading, as text. metric artifact_bytes · app notepad · arm -

FrameworkLinuxmacOSWindowsBlended, × best on the same machine
Flutternative renderer19.2 KiB39.0 MiB88.5 KiB6.06×
RayClaynative renderer898.1 KiB602.1 KiB664.0 KiB10.56×
Qtnative renderer165.1 KiB179.4 KiB32.1 MiB14.71×
Tauribrowser engine6.7 MiB284.5 KiB8.3 MiB37.80×
Wailsbrowser engine8.3 MiB7.7 MiB10.8 MiB134.67×
Bunbrowser engine88.5 MiB58.7 MiB93.9 MiB1196.75×
Electronbrowser engine120.9 MiB114.0 MiB94.8 MiB1662.61×
NW.jsbrowser engine196.7 MiB175.6 MiB220.3 MiB2991.31×

What it occupies once installed

Notepad · bytes on disk after install, plus borrowed runtime · lower is better

Linear axis 0 to 203.8× the best framework on the same machine

The same macOS accounting applies here, and it is the reason Tauri looks tiny. WebKit is installed with macOS, so an app that renders in the system webview occupies none of it. Tauri's notepad installs at 262.6 MiB on Linux and 6.5 MiB on macOS - the same application. Read the macOS column as "what this app adds to a disk that already has a browser engine", not as "this framework is small".

The Windows column is not uniform either, and that is a limit of the data rather than a property of the frameworks. Tauri is credited 14.7 MiB of borrowed WebView2 on that machine; Wails, which also renders in WebView2, is credited none - its artefact and its installed-plus-borrowed figures are the same 10.8 MiB to the byte. So Wails appears near the bottom of the Windows column partly because a runtime it uses was not counted against it. Compare within a column with that in mind.

Three different computers: each bar is a multiple of the best framework on its own machine. Compare bars within a machine, never across.

  1. RayClay #1 of 8 1.01×
    1. Linux 1.00× · 3.2 MiB
    2. macOS 1.00× · 602.1 KiB
    3. Windows 1.02× · 11.1 MiB
  2. Wails 10.30×
    1. Linux 83.12× · 264.2 MiB
    2. macOS 13.15× · 7.7 MiB
    3. Windows 1.00× · 10.8 MiB
  3. Tauri 12.46×
    1. Linux 82.62× · 262.6 MiB
    2. macOS 11.03× · 6.5 MiB
    3. Windows 2.12× · 23.0 MiB
  4. Flutter 15.97×
    1. Linux 17.53× · 55.7 MiB
    2. macOS 66.36× · 39.0 MiB
    3. Windows 3.50× · 37.9 MiB
  5. Qt 28.36×
    1. Linux 25.60× · 81.4 MiB
    2. macOS 110.48× · 65.0 MiB
    3. Windows 8.07× · 87.4 MiB
  6. Bun 48.83×
    1. Linux 111.67× · 354.9 MiB
    2. macOS 100.62× · 59.2 MiB
    3. Windows 10.36× · 112.3 MiB
  7. Electron 98.63×
    1. Linux 55.39× · 176.1 MiB
    2. macOS 467.84× · 275.1 MiB
    3. Windows 37.03× · 401.3 MiB
  8. NW.js 203.84×
    1. Linux 254.24× · 808.1 MiB
    2. macOS 664.34× · 390.6 MiB
    3. Windows 50.15× · 543.5 MiB
Show the numbers as a table for What it occupies once installed

What it occupies once installed - every reading, as text. metric installed_plus_borrowed_bytes · app notepad · arm -

FrameworkLinuxmacOSWindowsBlended, × best on the same machine
RayClaynative renderer3.2 MiB602.1 KiB11.1 MiB1.01×
Wailsbrowser engine264.2 MiB7.7 MiB10.8 MiB10.30×
Tauribrowser engine262.6 MiB6.5 MiB23.0 MiB12.46×
Flutternative renderer55.7 MiB39.0 MiB37.9 MiB15.97×
Qtnative renderer81.4 MiB65.0 MiB87.4 MiB28.36×
Bunbrowser engine354.9 MiB59.2 MiB112.3 MiB48.83×
Electronbrowser engine176.1 MiB275.1 MiB401.3 MiB98.63×
NW.jsbrowser engine808.1 MiB390.6 MiB543.5 MiB203.84×

Memory

Resident memory in three states: an empty window doing nothing, a notepad being typed into, and the worst moment of the whole run. Qt is the framework to watch here, not Electron.

Memory, sitting there doing nothing

Empty window · resident memory at idle · lower is better

Linear axis 0 to 13.2× the best framework on the same machine

macOS memory counts something the other two machines do not. macOS charges accelerator-backed pages inside phys_footprint; Linux cgroup v2 and the Windows job object both exclude GPU memory. On the empty window, 73% of RayClay's 135.1 MiB macOS footprint is GPU-backed (98.3 MiB of it). Take that share out and it reads 36.8 MiB and moves from #7 of 8 to #2 of 7. That is not "RayClay is lean on macOS after all". It is that the three machines are measuring three different quantities, and each one draws the line in a different place. The Linux column runs the same way, against RayClay's opponents rather than for them. cgroup accounting covers host memory only, and RayClay reaches the screen through a real GL context, so its graphics allocations fall outside every Linux figure on this page: its Linux memory ranks are UNDER-reported beside a toolkit or a web engine. On the one machine that meters graphics memory separately, Windows, RayClay holds more of it than any framework in the set. And the obvious way out of this has been tested and closed. If the web-engine frameworks were simply pushing the same pixels into the window server, their own figures would be low because somebody else was paying. We launched all eight, three times each, and watched the window server's own memory: it moves by a couple of megabytes whichever framework starts, and the correlation with each framework's own graphics share came out positive where that explanation needed it strongly negative. So the pages are real and RayClay allocates them. What the accounting difference changes is which machine's number includes them, not whether they exist.

Three different computers: each bar is a multiple of the best framework on its own machine. Compare bars within a machine, never across.

  1. Qt 1.06×
    1. Linux 1.00× · 11.2 MiB
    2. macOS 1.20× · 45.6 MiB
    3. Windows 1.00× · 6.4 MiB
  2. RayClay #2 of 8 3.42×
    1. Linux 1.37× · 15.3 MiB
    2. macOS 3.55× · 135.1 MiB
    3. Windows 8.27× · 52.7 MiB
  3. Flutter 3.56×
    1. Linux 3.60× · 40.2 MiB
    2. macOS 1.00× · 38.0 MiB
    3. Windows 12.53× · 79.8 MiB
  4. Tauri 6.74×
    1. Linux 7.82× · 87.3 MiB
    2. macOS 1.74× · 66.3 MiB
    3. Windows 22.48× · 143.1 MiB
  5. Wails 7.25×
    1. Linux 7.32× · 81.7 MiB
    2. macOS 1.78× · 67.8 MiB
    3. Windows 29.26× · 186.3 MiB
  6. Electron 7.71×
    1. Linux 10.69× · 119.4 MiB
    2. macOS 1.89× · 71.7 MiB
    3. Windows 22.71× · 144.6 MiB
  7. Bun 10.41×
    1. Linux 9.76× · 108.9 MiB
    2. macOS 1.91× · 72.8 MiB
    3. Windows 60.40× · 384.6 MiB
  8. NW.js 13.21×
    1. Linux 19.53× · 218.1 MiB
    2. macOS 4.21× · 160.1 MiB
    3. Windows 28.04× · 178.5 MiB
Show the numbers as a table for Memory, sitting there doing nothing

Memory, sitting there doing nothing - every reading, as text. metric mem_idle_bytes · app floor · arm phase=idle

FrameworkLinuxmacOSWindowsBlended, × best on the same machine
Qtnative renderer11.2 MiB45.6 MiB6.4 MiB1.06×
RayClaynative renderer15.3 MiB135.1 MiB52.7 MiB3.42×
Flutternative renderer40.2 MiB38.0 MiB79.8 MiB3.56×
Tauribrowser engine87.3 MiB66.3 MiB143.1 MiB6.74×
Wailsbrowser engine81.7 MiB67.8 MiB186.3 MiB7.25×
Electronbrowser engine119.4 MiB71.7 MiB144.6 MiB7.71×
Bunbrowser engine108.9 MiB72.8 MiB384.6 MiB10.41×
NW.jsbrowser engine218.1 MiB160.1 MiB178.5 MiB13.21×

The same macOS reading with GPU-backed pages taken out

Empty window · macOS only · idle footprint minus its accelerator share · lower is better

Linear axis 0 to 159.3 MiB

This chart does not move with the controls above: it exists on one machine only, because only macOS reports this decomposition. Two things about it run in RayClay's favour and neither is small. First, Flutter publishes no GPU share on this machine and is absent, seven frameworks rather than eight, and Flutter is the framework with the lowest total macOS footprint of the eight at 38.0 MiB - its remainder cannot exceed that, so any accelerator share above about 1.3 MiB would place it ahead of RayClay - and five of the seven shares on this chart clear that bar, while Electron and NW.js do not. Flutter's own share is the one number that would settle it and it is not measured, so read the rank here as excluding the likeliest framework to beat it. Second, Electron and NW.js report an accelerator share of only 752.0 KiB each, and this page publishes that term as unverified rather than small: it has not established where the Chromium pair's compositing surfaces are charged, and if they belong to a system process they sit outside every per-process figure here. That would understate their share, overstate their remainder, and flatter this chart's subject against them.

  1. Qt 30.6 MiB
  2. RayClay #2 of 7 36.8 MiB
  3. Tauri 55.9 MiB
  4. Wails 58.2 MiB
  5. Bun 60.6 MiB
  6. Electron 71.0 MiB
  7. NW.js 159.3 MiB
Show the numbers as a table for the macOS GPU decomposition

macOS, empty window, idle memory split by what backs it. metrics mem_idle_bytes and mem_idle_gpu_share_bytes · app floor · arm phase=idle

FrameworkIdle footprintGPU-backedGPU shareEverything else
Qtnative renderer45.6 MiB14.9 MiB33%30.6 MiB
RayClaynative renderer135.1 MiB98.3 MiB73%36.8 MiB
Tauribrowser engine66.3 MiB10.4 MiB16%55.9 MiB
Wailsbrowser engine67.8 MiB9.5 MiB14%58.2 MiB
Bunbrowser engine72.8 MiB12.2 MiB17%60.6 MiB
Electronbrowser engine71.7 MiB752.0 KiB1%71.0 MiB
NW.jsbrowser engine160.1 MiB752.0 KiB0%159.3 MiB

Memory, while you use it

Notepad · resident memory during the driven active-use window · lower is better

Linear axis 0 to 14.0× the best framework on the same machine

The same macOS accounting applies to this chart, and it is not disclosed in the macOS column itself. phys_footprint still counts accelerator-backed pages here: 75% of RayClay's 212.0 MiB macOS reading is GPU-backed (159.2 MiB). Take that share out, exactly as the chart above does for the empty window, and RayClay reads 52.8 MiB and moves from #7 of 8 to #2 of 7 - behind Qt at 40.9 MiB. As on the empty window, that is not "RayClay is lean on macOS after all": it is three machines measuring three different quantities, and each one draws the line in a different place. The Linux column runs the same way, against RayClay's opponents rather than for them. cgroup accounting covers host memory only, and RayClay reaches the screen through a real GL context, so its graphics allocations fall outside every Linux figure on this page: its Linux memory ranks are UNDER-reported beside a toolkit or a web engine. On the one machine that meters graphics memory separately, Windows, RayClay holds more of it than any framework in the set.

Three different computers: each bar is a multiple of the best framework on its own machine. Compare bars within a machine, never across.

  1. Qt 1.00×
    1. Linux 1.00× · 13.5 MiB
    2. macOS 1.00× · 53.9 MiB
    3. Windows 1.00× · 8.6 MiB
  2. RayClay #2 of 8 3.25×
    1. Linux 1.18× · 16.0 MiB
    2. macOS 3.93× · 212.0 MiB
    3. Windows 7.34× · 63.3 MiB
  3. Flutter 6.07×
    1. Linux 7.42× · 100.3 MiB
    2. macOS 2.35× · 126.8 MiB
    3. Windows 12.85× · 110.8 MiB
  4. Tauri 7.57×
    1. Linux 6.75× · 91.3 MiB
    2. macOS 3.19× · 171.9 MiB
    3. Windows 20.17× · 173.9 MiB
  5. Wails 7.96×
    1. Linux 6.18× · 83.6 MiB
    2. macOS 3.23× · 174.3 MiB
    3. Windows 25.24× · 217.6 MiB
  6. Electron 9.53×
    1. Linux 12.05× · 163.0 MiB
    2. macOS 3.02× · 162.6 MiB
    3. Windows 23.83× · 205.4 MiB
  7. Bun 11.24×
    1. Linux 8.64× · 116.8 MiB
    2. macOS 3.35× · 180.7 MiB
    3. Windows 48.97× · 422.2 MiB
  8. NW.js 13.95×
    1. Linux 20.62× · 278.9 MiB
    2. macOS 4.87× · 262.5 MiB
    3. Windows 27.04× · 233.1 MiB
Show the numbers as a table for Memory, while you use it

Memory, while you use it - every reading, as text. metric mem_w1_bytes · app notepad · arm seq=w1.1

FrameworkLinuxmacOSWindowsBlended, × best on the same machine
Qtnative renderer13.5 MiB53.9 MiB8.6 MiB1.00×
RayClaynative renderer16.0 MiB212.0 MiB63.3 MiB3.25×
Flutternative renderer100.3 MiB126.8 MiB110.8 MiB6.07×
Tauribrowser engine91.3 MiB171.9 MiB173.9 MiB7.57×
Wailsbrowser engine83.6 MiB174.3 MiB217.6 MiB7.96×
Electronbrowser engine163.0 MiB162.6 MiB205.4 MiB9.53×
Bunbrowser engine116.8 MiB180.7 MiB422.2 MiB11.24×
NW.jsbrowser engine278.9 MiB262.5 MiB233.1 MiB13.95×

Memory, at its peak while you use it

Notepad · highest reading across the driven active-use window · lower is better

Linear axis 0 to 15.3× the best framework on the same machine

Two things qualify this chart, and the second one favours RayClay. First, it has no GPU decomposition: the extract ships an accelerator share for idle memory and for the workload, but none for peak, so the subtraction the two charts above perform cannot be performed here. macOS phys_footprint counts accelerator-backed pages all the same, which means the macOS peak column is not comparable with the Linux and Windows peak columns, and no number on this page can tell you by how much.

Second, the macOS measurement window is shorter than the other two, and a shorter window can only push a peak DOWN. A peak is the highest reading taken; observe for less time and you get fewer chances to catch the maximum. The driven window averages 18.7 s on macOS against 20.8 s on Linux and 20.9 s on Windows, because the macOS run spends part of its first step inside the GPU decomposition's own vmmap call. That is a known defect of the instrument, reproduced on two consecutive runs with both other machines flat. So macOS peaks here are under-observed by roughly 10%, RayClay's included, and this caveat runs in RayClay's favour rather than against it. The window is not identical inside the macOS column either. On this app it runs from 18.2 s to 19.8 s, a 9% spread against about 1% on the other two machines, and RayClay's is the second longest of the eight. More observing time is more chances to catch a peak, so RayClay's macOS peak is better observed than most of the field it is ranked against, and its place in this column is if anything harsher than like-for-like. The benchmark's own report says ranks within one machine are unaffected because every framework loses the same window; the rows this page ships say the window differs by 9%, and the rows are what you can check.

Three different computers: each bar is a multiple of the best framework on its own machine. Compare bars within a machine, never across.

  1. Qt 1.00×
    1. Linux 1.00× · 13.7 MiB
    2. macOS 1.00× · 56.1 MiB
    3. Windows 1.00× · 8.9 MiB
  2. RayClay #2 of 8 3.73×
    1. Linux 1.18× · 16.2 MiB
    2. macOS 5.89× · 330.1 MiB
    3. Windows 7.46× · 66.7 MiB
  3. Flutter 6.54×
    1. Linux 7.34× · 100.8 MiB
    2. macOS 2.96× · 165.8 MiB
    3. Windows 12.89× · 115.3 MiB
  4. Tauri 7.61×
    1. Linux 6.67× · 91.6 MiB
    2. macOS 3.37× · 189.2 MiB
    3. Windows 19.58× · 175.2 MiB
  5. Wails 8.09×
    1. Linux 6.26× · 86.0 MiB
    2. macOS 3.42× · 191.6 MiB
    3. Windows 24.71× · 221.1 MiB
  6. Electron 11.27×
    1. Linux 11.95× · 164.1 MiB
    2. macOS 5.16× · 289.1 MiB
    3. Windows 23.23× · 207.8 MiB
  7. Bun 11.29×
    1. Linux 8.54× · 117.2 MiB
    2. macOS 3.53× · 198.2 MiB
    3. Windows 47.73× · 427.0 MiB
  8. NW.js 15.28×
    1. Linux 20.47× · 281.2 MiB
    2. macOS 6.63× · 372.0 MiB
    3. Windows 26.29× · 235.2 MiB
Show the numbers as a table for Memory, at its peak while you use it

Memory, at its peak while you use it - every reading, as text. metric mem_w1_peak_bytes · app notepad · arm seq=w1.1

FrameworkLinuxmacOSWindowsBlended, × best on the same machine
Qtnative renderer13.7 MiB56.1 MiB8.9 MiB1.00×
RayClaynative renderer16.2 MiB330.1 MiB66.7 MiB3.73×
Flutternative renderer100.8 MiB165.8 MiB115.3 MiB6.54×
Tauribrowser engine91.6 MiB189.2 MiB175.2 MiB7.61×
Wailsbrowser engine86.0 MiB191.6 MiB221.1 MiB8.09×
Electronbrowser engine164.1 MiB289.1 MiB207.8 MiB11.27×
Bunbrowser engine117.2 MiB198.2 MiB427.0 MiB11.29×
NW.jsbrowser engine281.2 MiB372.0 MiB235.2 MiB15.28×

Memory it holds on the graphics adapter

Empty window · per-process GPU memory while the app is driven · lower is better

Linear axis 0 to 2.3× the best framework on the same machine

Two machines, and the one where RayClay is last of every framework that reports the metric. macOS has no comparable per-process counter, so this chart is Linux and Windows only and its blend is over two machines rather than three. The two disagree sharply and the disagreement is the point: on the Linux machine, with a discrete card, RayClay sits mid-field; on the Windows machine, whose adapter is integrated and whose graphics memory is therefore ordinary system RAM, RayClay holds more than any of the seven frameworks that report the metric, in all 15 of the cells the extract carries. How much more depends on the app: about twice the next framework on the empty window (1.91 to 1.99 times), and 1.34 to 1.57 times on the notepad and the analytics app. Qt appears on neither: Qt Widgets rasterises on the CPU and asks the adapter for nothing. Read the Linux column knowing the other memory charts on this page do NOT contain these bytes on that machine.

Three different computers: each bar is a multiple of the best framework on its own machine. Compare bars within a machine, never across.

  1. Wails 1 of 3 machines no bar 1.00×
    1. Linux not measured -
    2. macOS not measured -
    3. Windows 1.00× · 19.0 MiB
  2. Electron 2 of 3 machines no bar 1.03×
    1. Linux 1.00× · 12.1 MiB
    2. macOS not measured -
    3. Windows 1.07× · 20.3 MiB
  3. Tauri 2 of 3 machines no bar 1.12×
    1. Linux 1.25× · 15.2 MiB
    2. macOS not measured -
    3. Windows 1.00× · 19.0 MiB
  4. NW.js 2 of 3 machines no bar 1.21×
    1. Linux 1.02× · 12.3 MiB
    2. macOS not measured -
    3. Windows 1.45× · 27.6 MiB
  5. Bun 2 of 3 machines no bar 1.87×
    1. Linux 3.23× · 39.2 MiB
    2. macOS not measured -
    3. Windows 1.08× · 20.6 MiB
  6. RayClay #6 of 7 2 of 3 machines no bar 2.13×
    1. Linux 1.57× · 19.0 MiB
    2. macOS not measured -
    3. Windows 2.89× · 54.9 MiB
  7. Flutter 2 of 3 machines no bar 2.27×
    1. Linux 4.05× · 49.1 MiB
    2. macOS not measured -
    3. Windows 1.27× · 24.2 MiB
  8. Qt no reading on any machine no bar -
    1. Linux not measured -
    2. macOS not measured -
    3. Windows not measured -
Show the numbers as a table for Memory it holds on the graphics adapter

Memory it holds on the graphics adapter - every reading, as text. metric gpu_mem_w1_bytes · app floor · arm seq=w1.1

FrameworkLinuxmacOSWindowsBlended, × best on the same machine
Wailsbrowser engine--19.0 MiB1.00× (1 machine)
Electronbrowser engine12.1 MiB-20.3 MiB1.03× (2 machines)
Tauribrowser engine15.2 MiB-19.0 MiB1.12× (2 machines)
NW.jsbrowser engine12.3 MiB-27.6 MiB1.21× (2 machines)
Bunbrowser engine39.2 MiB-20.6 MiB1.87× (2 machines)
RayClaynative renderer19.0 MiB-54.9 MiB2.13× (2 machines)
Flutternative renderer49.1 MiB-24.2 MiB2.27× (2 machines)
Qtnative renderer----

CPU

CPU seconds burned per wall-clock minute, shown as milliseconds. The unfocused figure is the one that decides what your laptop battery does while the app is in the background - and it is also the metric with the most caveats on this page.

CPU, while you use it

Notepad · CPU milliseconds burned per wall-clock minute during the driven active-use window · lower is better

Linear axis 0 to 8.5× the best framework on the same machine

Three different computers: each bar is a multiple of the best framework on its own machine. Compare bars within a machine, never across.

  1. Qt 1.00×
    1. Linux 1.00× · 17.14 ms/min
    2. macOS 1.00× · 761.66 ms/min
    3. Windows 1.00× · 45.11 ms/min
  2. RayClay #2 of 8 2.29×
    1. Linux 1.79× · 30.68 ms/min
    2. macOS 1.35× · 1026.37 ms/min
    3. Windows 4.98× · 224.77 ms/min
  3. Tauri 3.67×
    1. Linux 3.32× · 56.85 ms/min
    2. macOS 1.67× · 1270.88 ms/min
    3. Windows 8.96× · 404.33 ms/min
  4. Flutter 3.85×
    1. Linux 7.60× · 130.16 ms/min
    2. macOS 1.26× · 961.09 ms/min
    3. Windows 5.97× · 269.38 ms/min
  5. Wails 4.47×
    1. Linux 6.99× · 119.80 ms/min
    2. macOS 1.60× · 1222.07 ms/min
    3. Windows 7.97× · 359.43 ms/min
  6. Bun 6.74×
    1. Linux 21.25× · 364.13 ms/min
    2. macOS 1.61× · 1226.39 ms/min
    3. Windows 8.96× · 404.03 ms/min
  7. Electron 7.87×
    1. Linux 30.84× · 528.49 ms/min
    2. macOS 1.76× · 1340.08 ms/min
    3. Windows 8.97× · 404.49 ms/min
  8. NW.js 8.54×
    1. Linux 31.24× · 535.40 ms/min
    2. macOS 1.82× · 1386.46 ms/min
    3. Windows 10.94× · 493.41 ms/min
Show the numbers as a table for CPU, while you use it

CPU, while you use it - every reading, as text. metric cpu_w1_s_per_min · app notepad · arm seq=w1.1

FrameworkLinuxmacOSWindowsBlended, × best on the same machine
Qtnative renderer17.14 ms/min761.66 ms/min45.11 ms/min1.00×
RayClaynative renderer30.68 ms/min1026.37 ms/min224.77 ms/min2.29×
Tauribrowser engine56.85 ms/min1270.88 ms/min404.33 ms/min3.67×
Flutternative renderer130.16 ms/min961.09 ms/min269.38 ms/min3.85×
Wailsbrowser engine119.80 ms/min1222.07 ms/min359.43 ms/min4.47×
Bunbrowser engine364.13 ms/min1226.39 ms/min404.03 ms/min6.74×
Electronbrowser engine528.49 ms/min1340.08 ms/min404.49 ms/min7.87×
NW.jsbrowser engine535.40 ms/min1386.46 ms/min493.41 ms/min8.54×

CPU, with the window not even focused

Empty window · CPU milliseconds per minute while unfocused · lower is better

Linear axis 0 to 8.1× the best framework on the same machine

The lowest readings here are below what the instrument can resolve, so they are shown as a tie and not ranked against each other. The suite records CPU per minute to a floor of 0.001 s/min, and its own report is explicit that anything under that "would be a ranking invented inside rounding noise" and that a framework which genuinely idles at zero is indistinguishable from one spending a third of a microsecond per second. On Linux both RayClay and Qt sit under that floor, so they share first place rather than RayClay beating Qt. Qt is under the floor on Windows too. "× the best on the same machine" has no value when the best is zero, so the blended bar on this chart is the macOS ratio alone - one machine of three. Nothing is floored, rounded up or dropped in the numbers themselves: the table and the per-machine rows print each reading as the extract records it, and the collapse acts on the ranking alone. In the three-machine view Linux and Windows therefore draw no bar: a ratio that does not exist cannot have a length, and a zero-length bar beside 222.87 ms/min, which is what Bun on Linux reads, would say the opposite of the number printed next to it. Those rows carry the framework's rank on that machine instead, because rank is the thing that survives a change of hardware.

Three different computers: each bar is a multiple of the best framework on its own machine. Compare bars within a machine, never across.

  1. Flutter 1 of 3 machines 1.00×
    1. Linux no ratio on this machine 22.73 ms/min · #7 of 8
    2. macOS 1.00× · 11.06 ms/min
    3. Windows no ratio on this machine 171.76 ms/min · #3 of 8
  2. Qt 1 of 3 machines 1.05×
    1. Linux no ratio on this machine 0.53 ms/min · joint #1 of 8
    2. macOS 1.05× · 11.58 ms/min
    3. Windows no ratio on this machine 0.00 ms/min · #1 of 8
  3. RayClay #3 of 8 1 of 3 machines 1.43×
    1. Linux no ratio on this machine 0.00 ms/min · joint #1 of 8
    2. macOS 1.43× · 15.82 ms/min
    3. Windows no ratio on this machine 78.16 ms/min · #2 of 8
  4. Bun 1 of 3 machines 4.52×
    1. Linux no ratio on this machine 222.87 ms/min · #8 of 8
    2. macOS 4.52× · 49.96 ms/min
    3. Windows no ratio on this machine 203.02 ms/min · #6 of 8
  5. Wails 1 of 3 machines 4.61×
    1. Linux no ratio on this machine 15.97 ms/min · #5 of 8
    2. macOS 4.61× · 50.96 ms/min
    3. Windows no ratio on this machine 218.43 ms/min · #7 of 8
  6. Electron 1 of 3 machines 4.63×
    1. Linux no ratio on this machine 9.24 ms/min · #3 of 8
    2. macOS 4.63× · 51.18 ms/min
    3. Windows no ratio on this machine 171.95 ms/min · #4 of 8
  7. Tauri 1 of 3 machines 4.83×
    1. Linux no ratio on this machine 21.87 ms/min · #6 of 8
    2. macOS 4.83× · 53.37 ms/min
    3. Windows no ratio on this machine 203.00 ms/min · #5 of 8
  8. NW.js 1 of 3 machines 8.06×
    1. Linux no ratio on this machine 13.27 ms/min · #4 of 8
    2. macOS 8.06× · 89.09 ms/min
    3. Windows no ratio on this machine 218.48 ms/min · #8 of 8
Show the numbers as a table for CPU, with the window not even focused

CPU, with the window not even focused - every reading, as text. metric cpu_unfocused_s_per_min · app floor · arm -

FrameworkLinuxmacOSWindowsBlended, × best on the same machine
Flutternative renderer22.73 ms/min11.06 ms/min171.76 ms/min1.00× (1 machine)
Qtnative renderer0.53 ms/min11.58 ms/min0.00 ms/min1.05× (1 machine)
RayClaynative renderer0.00 ms/min15.82 ms/min78.16 ms/min1.43× (1 machine)
Bunbrowser engine222.87 ms/min49.96 ms/min203.02 ms/min4.52× (1 machine)
Wailsbrowser engine15.97 ms/min50.96 ms/min218.43 ms/min4.61× (1 machine)
Electronbrowser engine9.24 ms/min51.18 ms/min171.95 ms/min4.63× (1 machine)
Tauribrowser engine21.87 ms/min53.37 ms/min203.00 ms/min4.83× (1 machine)
NW.jsbrowser engine13.27 ms/min89.09 ms/min218.48 ms/min8.06× (1 machine)

Getting a window on screen

Wall-clock time from launching an empty window to that window existing on screen. The measurements also carry a fixed observation window, the same length for every framework on every machine. It is a setting rather than a result, so nothing on this page charts it.

Time to the first window, from cold

Empty window · wall-clock time from launch to a window on screen · lower is better

Linear axis 0 to 6.5× the best framework on the same machine

Three different computers: each bar is a multiple of the best framework on its own machine. Compare bars within a machine, never across.

  1. Tauri 1.22×
    1. Linux 1.46× · 133.2 ms
    2. macOS 1.26× · 183.9 ms
    3. Windows 1.00× · 60.1 ms
  2. Qt 1.30×
    1. Linux 1.00× · 91.3 ms
    2. macOS 1.13× · 165.5 ms
    3. Windows 1.93× · 116.2 ms
  3. Flutter 2.23×
    1. Linux 4.52× · 412.3 ms
    2. macOS 1.00× · 146.5 ms
    3. Windows 2.46× · 148.0 ms
  4. RayClay #4 of 8 2.24×
    1. Linux 2.38× · 217.5 ms
    2. macOS 1.28× · 187.3 ms
    3. Windows 3.69× · 221.7 ms
  5. Electron 2.51×
    1. Linux 3.37× · 307.2 ms
    2. macOS 1.72× · 252.1 ms
    3. Windows 2.73× · 163.8 ms
  6. Bun 3.15×
    1. Linux 2.85× · 260.5 ms
    2. macOS 1.36× · 199.7 ms
    3. Windows 8.06× · 483.9 ms
  7. Wails 3.69×
    1. Linux 3.16× · 288.1 ms
    2. macOS 1.58× · 232.1 ms
    3. Windows 10.04× · 603.0 ms
  8. NW.js 6.47×
    1. Linux 6.02× · 549.2 ms
    2. macOS 3.68× · 539.6 ms
    3. Windows 12.20× · 733.0 ms
Show the numbers as a table for Time to the first window, from cold

Time to the first window, from cold - every reading, as text. metric time_to_window_cold_s · app floor · arm -

FrameworkLinuxmacOSWindowsBlended, × best on the same machine
Tauribrowser engine133.2 ms183.9 ms60.1 ms1.22×
Qtnative renderer91.3 ms165.5 ms116.2 ms1.30×
Flutternative renderer412.3 ms146.5 ms148.0 ms2.23×
RayClaynative renderer217.5 ms187.3 ms221.7 ms2.24×
Electronbrowser engine307.2 ms252.1 ms163.8 ms2.51×
Bunbrowser engine260.5 ms199.7 ms483.9 ms3.15×
Wailsbrowser engine288.1 ms232.1 ms603.0 ms3.69×
NW.jsbrowser engine549.2 ms539.6 ms733.0 ms6.47×

Process model

How many processes and threads the framework has running while an empty window sits there.

Processes it runs

Empty window · peak process count at idle · lower is better

Linear axis 0 to 8.1× the best framework on the same machine

Three different computers: each bar is a multiple of the best framework on its own machine. Compare bars within a machine, never across.

  1. Flutter 1.00×
    1. Linux 1.00× · 1
    2. macOS 1.00× · 1
    3. Windows 1.00× · 1
  2. Qt 1.26×
    1. Linux 1.00× · 1
    2. macOS 2.00× · 2
    3. Windows 1.00× · 1
  3. RayClay joint #2 of 8 1.26×
    1. Linux 1.00× · 1
    2. macOS 2.00× · 2
    3. Windows 1.00× · 1
  4. Tauri 4.72×
    1. Linux 3.00× · 3
    2. macOS 5.00× · 5
    3. Windows 7.00× · 7
  5. Wails 4.72×
    1. Linux 3.00× · 3
    2. macOS 5.00× · 5
    3. Windows 7.00× · 7
  6. Electron 5.04×
    1. Linux 8.00× · 8
    2. macOS 4.00× · 4
    3. Windows 4.00× · 4
  7. Bun 6.54×
    1. Linux 8.00× · 8
    2. macOS 5.00× · 5
    3. Windows 7.00× · 7
  8. NW.js 8.14×
    1. Linux 12.00× · 12
    2. macOS 5.00× · 5
    3. Windows 9.00× · 9
Show the numbers as a table for Processes it runs

Processes it runs - every reading, as text. metric procs_max · app floor · arm phase=idle

FrameworkLinuxmacOSWindowsBlended, × best on the same machine
Flutternative renderer1111.00×
Qtnative renderer1211.26×
RayClaynative renderer1211.26×
Tauribrowser engine3574.72×
Wailsbrowser engine3574.72×
Electronbrowser engine8445.04×
Bunbrowser engine8576.54×
NW.jsbrowser engine12598.14×

Threads it runs

Empty window · peak thread count at idle · lower is better

Linear axis 0 to 21.4× the best framework on the same machine

Three different computers: each bar is a multiple of the best framework on its own machine. Compare bars within a machine, never across.

  1. RayClay #1 of 8 1.28×
    1. Linux 1.00× · 1
    2. macOS 1.46× · 19
    3. Windows 1.44× · 13
  2. Qt 2.17×
    1. Linux 7.00× · 7
    2. macOS 1.46× · 19
    3. Windows 1.00× · 9
  3. Flutter 3.39×
    1. Linux 14.00× · 14
    2. macOS 1.00× · 13
    3. Windows 2.78× · 25
  4. Electron 12.38×
    1. Linux 29.00× · 29
    2. macOS 6.08× · 79
    3. Windows 10.78× · 97
  5. Wails 14.87×
    1. Linux 50.00× · 50
    2. macOS 3.77× · 49
    3. Windows 17.44× · 157
  6. Bun 16.69×
    1. Linux 67.00× · 67
    2. macOS 4.00× · 52
    3. Windows 17.33× · 156
  7. Tauri 17.61×
    1. Linux 72.00× · 72
    2. macOS 4.46× · 58
    3. Windows 17.00× · 153
  8. NW.js 21.43×
    1. Linux 70.00× · 70
    2. macOS 8.38× · 109
    3. Windows 16.78× · 151
Show the numbers as a table for Threads it runs

Threads it runs - every reading, as text. metric pids_max · app floor · arm phase=idle

FrameworkLinuxmacOSWindowsBlended, × best on the same machine
RayClaynative renderer119131.28×
Qtnative renderer71992.17×
Flutternative renderer1413253.39×
Electronbrowser engine29799712.38×
Wailsbrowser engine504915714.87×
Bunbrowser engine675215616.69×
Tauribrowser engine725815317.61×
NW.jsbrowser engine7010915121.43×

Results that do not flatter us

Where RayClay loses.

A page that only shows wins is not evidence, it is advertising. These are the results in the same run where RayClay is beaten worst, taken from the same data as every bar above. Its rank on every chart is on the chart.

  1. Windows GPU memory: last of 7, on an empty window

    Driving the empty window on the i5-1135G7, RayClay holds 54.9 MiB of GPU memory. The next heaviest framework is NW.js at 27.6 MiB, and the rest of the field runs from 19.0 MiB up to that. In the background it is 51.2 MiB against 26.8 MiB. Roughly 2.0 times the next framework, for a window with nothing in it, on the app whose whole purpose is to show what the framework costs before your code exists. It is not confined to the empty window either: RayClay is last of the 7 in every one of the 15 Windows GPU-memory readings this run took, idle, background and in use, on the notepad and the analytics app as well as the empty window.

    Two things this is not. It is not a verdict on every machine: the same measurement on the Linux machine, which has a discrete card, puts RayClay #4 of 6 rather than last. And it is not free memory on this one, because the Iris Xe is an integrated adapter, so those bytes are system RAM. Qt is absent from both columns because Qt Widgets rasterises on the CPU and asks the GPU for nothing, which is a real architectural answer to this problem and not a gap in the data.

  2. macOS analytics idle memory: 8th of 8

    On the analytics app at the medium data tier, RayClay idles at 244.1 MiB. Qt, on the same machine and the same app, idles at 86.5 MiB, which is 2.8 times less. That is last of eight, and on the number macOS actually reports it stays last of eight.

    The honest complication, which cuts the other way: 82% of that figure is GPU-backed. Do the same subtraction this page does on the empty window above and RayClay reads 43.9 MiB - #1 of 7 among the frameworks that report a GPU share, ahead of Qt at 55.0 MiB. Both numbers are real and they are not interchangeable: one is what the operating system charges the process, the other is what is left when the accelerator's pages come out. This item stays in the losses because the first number is the one a user's activity monitor shows.

  3. macOS peak memory in use: 8th of 8 on the empty window

    Across the driven active-use window on the M3 Pro, RayClay's highest reading is 250.4 MiB for an empty window - rank #8 of 8. On the notepad it is 330.1 MiB, rank #7 of 8. Both figures are the same metric on the same window, and both are under-observed by roughly 10% for the reason given beside the chart - so the real numbers are, if anything, slightly worse than these.

  4. Windows disk: Wails now takes the column

    Installed plus borrowed on the i5-1135G7, RayClay's notepad occupies 11.1 MiB against Wails' 10.8 MiB. Disk is the column this page leans on hardest, and on this machine RayClay does not win it. It is worth being precise about why: the extract credits Wails no borrowed WebView2 on Windows while crediting Tauri 14.7 MiB of it, so part of this gap is an accounting asymmetry rather than a difference in what the two frameworks put on the disk. Part of it is not. Both readings are in the data file linked below.

  5. And RayClay now leads the download column on one machine of three

    On what a user downloads, RayClay is #1 of 8 on Linux at 3.2 MiB, and #2 on macOS behind Tauri at 284.5 KiB, against RayClay's 602.1 KiB. The macOS column is the one to read carefully rather than the one to quote: WebKit ships with the operating system, so a framework that renders in the system webview downloads almost nothing there, which is what puts Tauri ahead. That is a real cost a real user does not pay, and it is also the reason the number is not a statement about how much code each project wrote. Both readings are in the extract, and the chart above the fold counts borrowed runtime precisely so this is visible rather than hidden.

  6. Qt beats RayClay on memory in every cell this page can compare

    Idle, empty window: Qt 11.2 MiB against 15.3 MiB on Linux; 45.6 MiB against 135.1 MiB on macOS; 6.4 MiB against 52.7 MiB on Windows. In use, on the notepad: Qt 13.5 MiB against 16.0 MiB on Linux; 53.9 MiB against 212.0 MiB on macOS; 8.6 MiB against 63.3 MiB on Windows. At its peak in use, on the notepad: Qt 13.7 MiB against 16.2 MiB on Linux; 56.1 MiB against 330.1 MiB on macOS; 8.9 MiB against 66.7 MiB on Windows. Nine cells out of nine. A C++ toolkit that has been tuned for thirty years is still the one to beat on memory, and this run does not beat it.

If you are choosing a framework on idle memory alone, the honest answer from this data is Qt. The download column is where the argument lives: 3.2 MiB against 515.0 MiB is not a tuning difference.

Method and limits

How these numbers were made, and what they cannot tell you.

When each machine was measured

One run each: Linux, macOS and Windows on 27 August 2026. They are very different hardware, which is the reason this page never puts a magnitude from one beside a magnitude from another.

The three machines. Host, run id and the date in it are fields in the extract. The processor column expands the host name and is not itself a reading.

MachineHostProcessor, from the host nameRun idMeasured
Linuxlinux-ryzen9-7900AMD Ryzen 9 790020260827T003115Z27 August 2026
macOSmacos-m3proApple M3 Pro20260827T003145Z27 August 2026
Windowswindows-i5-1135g7Intel Core i5-1135G720260827T003211Z27 August 2026

The blend, exactly as implemented

For one metric, on one machine, take the lowest reading any framework achieved. Divide every framework's reading by it. That gives a multiple whose meaning does not depend on the hardware. Combine those multiples across the machines where the framework has a reading, using the geometric mean, because multiples compose by multiplying and an arithmetic average of them is dominated by the largest one:

ratio(f, machine) = value(f, machine) / min(value(*, machine))
blend(f)          = geometric_mean(ratio(f, machine) for machine in machines if f in machine and min(machine) > 0)
Where a framework is missing on a machine, the blend is taken over fewer machines and the table says how many. Where the best reading on a machine is exactly zero the ratio has no value, so that machine is left out of the blend for that metric - see the CPU section, where two of the three machines are.

The logarithmic option

A logarithmic axis makes a bar's length stop being proportional to its value, which is exactly why bar charts default to linear here. It is offered because several of these metrics span three decades and the small end is unreadable otherwise. On that scale the axis runs from one decade below the smallest reading to the decade above the largest, and it is labelled with both bounds. A reading of exactly zero cannot be placed on a logarithmic axis at all; it is drawn at zero length with its real value written beside it.

Every caveat that qualifies a chart above

macOS counts GPU memory; Linux and Windows do not.
phys_footprint includes accelerator-backed pages. cgroup v2 and the Windows job object exclude them. On the empty window this is 73% of RayClay's macOS figure.
macOS charges no borrowed webview - but it does charge borrowed runtime.
WebKit ships with the OS, so every framework that renders in the system webview is credited with zero downloaded engine on that machine and only on that machine. That is a statement about webviews, not about macOS: Qt borrows 64.8 MiB there (99.7% of its 65.0 MiB bar), because Qt 6 is not part of macOS. Borrowed means any runtime the artefact does not contain, on any machine - Flutter's Linux bar is 100% borrowed with no webview in sight, and so are 72% of RayClay's.
Every active-use repeat on all three machines was graded comparable, and this page withheld three charts on the opposite belief.
The suite grades its own active-use window, per cell: whether the app was observed holding focus for the whole sample, and how many repeats it could use. Each machine kept 152 of 152 repeats, with 0 recorded unfocused, across every app and every data tier, and those counters read the same on all three. On the Windows machine, the one this was ever in doubt for, every one of the 56 mid-window cells also reports "focus was OBSERVED and held throughout". The repeat counts are in the extract as w1_repeats, w1_repeats_comparable and three more; the per-cell focus verdict is in the suite's own run report for this sweep. The counts alone would not have caught the case this is about. An earlier run on this same Windows machine, taken while another window held its foreground for the whole run, reads the same 152 comparable and 0 unfocused; what separates the two is that its cells report focus lost rather than held. Until 2026-08-27 this page refused to rank the Windows column of three charts, on a caveat that read the machine's desktop rather than either record. That caveat was withdrawn in full the same day, and the charts came back, which handed RayClay three placements it had not been getting. That is the direction this page is least entitled to move in on its own authority, so the evidence is published rather than described.
The Windows CPU column is quantised to the scheduler tick.
Each of the 8 Windows unfocused readings lands within 0.15% of a whole multiple of 15.625 ms per minute - one sixty-fourth of a second, the tick Windows accounts CPU time in. Only one of them is exactly a whole multiple - Qt's true zero; the rest are rates scaled to a per-minute window, so they land near a tick rather than on one. At that resolution the readings fall into pairs that the instrument cannot separate: Electron and Flutter on 11 ticks, Bun and Tauri on 13 ticks and NW.js and Wails on 14 ticks. Within a pair the two are separated on this page only by rounding. Read adjacent Windows CPU ranks as a tie unless the gap is at least one tick.
All three runs failed some of their own equivalence checks, and each report says to treat its comparisons as suspect until they are resolved.
The suite audits whether the eight apps are really doing the same work before it compares them, and on this sweep it exited non-zero on every machine: 17 on Linux, 4 on macOS and 11 on Windows. None of the failures names RayClay as the failing app, on any of the three, and that is read from the scope of every failing row rather than from a text search - "ZERO failures on ANY rig name RayClay as the failing app - verified by reading the SCOPE column of every failure row, not by counting text matches". The sentence is worth stating carefully, because it stopped being true for one sweep: macOS then flagged five frameworks, RayClay among them, for having been built before that machine's system libraries moved. Rebuilding cleared it for four of the five. It did not clear for Electron, which is measured through a downloaded runtime no rebuild here can re-fingerprint, so 3 of that machine's 4 failures are still that check, and 9 of Linux's 17 are the same check against Electron, Bun and NW.js. Every one of those is a framework this page charts. The full inventory, by machine and check, is Linux (9 build-environment, 4 pixel-liveness, 2 peer-theme, 1 conform-run, 1 empty-window-liveness), macOS (3 build-environment, 1 conform-run) and Windows (5 client-area, 3 client-area-parity, 2 analytics-locale-format, 1 conform-run) - this page does not claim to have named the ones that matter, because that judgement is the suite's and its reports carry it. Two are worth singling out because they bear directly on bars above. Tauri's Linux window paints one flat colour over the client area, which trips three separate checks across seven of those rows: it drew no content, and the surface it therefore shows is the toolkit default rather than the theme the other seven paint. One cause, seven rows. NW.js on Windows realises a window about 1.05 times the declared pixel count on the notepad and the empty window, which gives it more to draw than the frameworks it is charted against, and that one cuts in RayClay's favour.
GPU memory is published; GPU time is not, on purpose.
The memory an app holds on the graphics adapter is measured on Linux and Windows, and it is where RayClay does worst, so it is charted. How much GPU time each app burns is not published anywhere on this page, because it cannot be measured comparably: macOS has no per-process GPU-time counter that works, three separate readers having been tested and refused; the Linux counter returned 11 of the 24 in-use readings it should have taken, from a poll slow enough to miss a quiet app, and it is blind to the second graphics adapter in that machine. Two machines, one of them 54% empty, is not a comparison. An absent GPU-time bar means the instrument failed, never that the app used none.
Tauri's Linux window figures are withdrawn by the people who measured them, and this page still draws them.
On the Linux machine Tauri's WebKitGTK window paints one flat colour over the whole client area, so every figure taken with that window on screen reads artificially cheap: its Linux memory, CPU, GPU memory and time-to-window bars are all weaker evidence, biased in Tauri's favour. Its Linux disk figures are unaffected and stand. They are drawn rather than dropped deliberately: removing them would move RayClay from third to second on Linux startup and from fourth to third on Linux GPU memory, and a page should not improve its own subject's rank by deleting a competitor's inconvenient row. Read those Tauri cells as a floor, not a reading.
Qt is not the same version on every machine.
6.10.3 on Linux and Windows and 6.11.1 on macOS. Every other framework is pinned to one version across all three. This one is not sloppiness and it is not fixable by pinning: Qt is linked dynamically, so the Qt on the machine is the Qt the app runs, and the system version is the honest number to record.
The RayClay row is a build, not a release number.
Every competitor names a released version; RayClay names 876ff4b9add9, the leading hex of the SHA-256 of the single header the three apps were compiled against, identical on all three machines. The site publishes RayClay as v0.8, and this says which build of it these numbers came from. Measuring a header-only library against the file itself is the only identifier that cannot drift from what was actually compiled.
One run per machine, and the launch-derived figures in it are already folded across repeats.
The extract carries one run_id per machine and no duplicated (os, framework, app, metric, arm) row, which is why there are no error bars here: the spread was folded away before the extract was cut rather than skipped. The suite launches each application once per repeat before starting the next, discards a warmup, and folds with a median rather than a mean, so one unlucky launch cannot carry a bar. That covers the memory, CPU and startup figures and not the disk ones, which are file sizes measured once and never launched; the extract's producer column is how you tell those two apart. What this page cannot show you either way is the spread, only its centre, because the fold happened upstream of the file it publishes.
Storage latency is measured and is deliberately not published.
The suite exercises a CRUD workload and the extract behind this page could carry it. It does not, because RayClay does not implement that storage layer - the application developer writes it. A CRUD number would compare eight app authors, not eight frameworks, and putting it on a framework comparison would be a category error however carefully the arithmetic was done. They are dropped from the data behind this page, not merely left off the charts.

Versions

One row per framework, one column per machine, read out of the extract. RayClay's is not a version string at all: it is the SHA-256 prefix of the exact rayclay.h that was compiled, because a version string can name two different builds and a hash cannot. All three machines carry the same one, which is what makes these three runs one sweep rather than three unrelated runs.

What was built, per machine.

FrameworkLinuxmacOSWindows
RayClay876ff4b9add9876ff4b9add9876ff4b9add9
Qt6.10.36.11.16.10.3
Flutter3.44.93.44.93.44.9
Wailsv2.14.0v2.14.0v2.14.0
Tauri2.11.52.11.52.11.5
Bun1.3.141.3.141.3.14
Electron43.1.143.1.143.1.1
NW.js0.114.00.114.00.114.0

Provenance, and the data itself

Every measurement charted on this page comes from one file, and you can download it: the full extract - 2,911 rows, 372.2 KiB, tab-separated, one reading per row with its machine, app, framework, metric and arm intact. It is served from this site rather than linked away, and the copy you get is written by the same build that drew the bars, from the same bytes, so it cannot drift from what you see above.

Nothing here asks you to take a chart on trust. To re-derive a bar, filter on four columns, not three: one metric, one app_type, one os and one arm. The arm is the one people leave out, and leaving it out is why a filter can come back with two rows for the same framework - a cold-start reading and an idle one, say. Every table on this page names the arm its chart used, in the caption. Match it and you get one value per framework.

Then divide each framework's value by the smallest in that group: that ratio is the bar. The blended bar is the geometric mean of those ratios across the machines a framework has a reading on - never an average of the raw magnitudes, which is the one operation this data does not support, and never an arithmetic average of the ratios either, which would let the single largest machine decide the bar. One chart needs a step before the division and says so beside itself: unfocused CPU has machines where the best reading is exactly zero, which makes a ratio undefined - those machines are dropped from that metric's blend rather than floored, and the chart names them.

It is a pinned extract of the RayClay competitor benchmark suite: the same rows every chart above is computed from, so any bar here can be checked against it.

Three machines, one run each, and a jester's job description: tell the king the number he did not want.

Who measured this, and on what

These numbers are ours, not an independent benchmark.

Everything here was produced by machines and scripts belonging to this project, and the eight applications being compared were written by us. It is not an industry-standard suite, it was not run by a third party, and nobody else has reproduced it. You are reading a measurement taken by the party with an interest in the result.

The apps are our idea of equivalent work rather than an agreed standard, and a framework could be disadvantaged by a decision we did not notice we were making. The suite audits itself for that and publishes the checks it fails.

The three machines

Specifications, declared rather than measured.

FieldLinuxmacOSWindows
ManufacturerMSIAppleLenovo
ModelMS-7E53Mac15,620WM003FMX
RAM30.2 GB18.0 GB15.7 GB
CPURyzen 9 7900Apple M3 Proi5-1135G7
GPURTX 3090 + AMD iGPUM3 Pro GPUIris Xe
OSFedora Linux 43 (Workstation)Tahoe 26.6.111, version 25H2 (build 26200.9168)

Please read these notes on the charts

Rank transfers between machines. Magnitudes do not.
Comparing frameworks on one machine is meaningful. Comparing a Linux megabyte with a macOS megabyte is not.
The blended view averages ratios, never magnitudes.
On each machine every framework is divided by the best one there, and those multiples are averaged. The axis reads × the best framework on the same machine, never megabytes and never milliseconds.
One run per machine.
A single reading per cell, with no error bar to plot. Treat a 5% gap as noise and a 10× gap as a finding.