KRATE Download Studio

Reports

The measurements.

Every chart here is drawn from a number we measured, not one we chose. The script that builds this page reads the app files directly and re-runs the apps to time them, so a chart cannot show something the repository does not contain. Where a number cannot be re-measured automatically, the method is written underneath it.

Generated 2026-09-03. Anyone can reproduce it: python3 scripts/build-reports-page.py.

Size

13 KB

A complete 2D game.

A Breakout you play: a paddle steered by arrow keys or a gamepad, bricks, lives, a score, a win. One file that opens on Mac, Windows and Linux. It is that small because nothing is bundled inside it that your computer already has: no browser, no framework, no runtime copy.

grex52.8 KB envelope19 KB mdview18.5 KB journal17.7 KB rssfwd17.7 KB eo217.6 KB ddh17.4 KB nova16.5 KB notes15.2 KB savings14.9 KB fetch14.8 KB hexyl14.5 KB contacts14.2 KB clip14.1 KB pulse13.8 KB checklist13.4 KB clocks12.9 KB bounce12.7 KB cubes12.6 KB focus12.5 KB weather11.8 KB chart11.2 KB keyvault11 KB paint10.9 KB

All 24 apps together come to 388 KB.

Sizes read from the packaged .krate files in the public repository. Each one contains the whole app for all three operating systems.

The same job, done differently

118,165×

Smaller than the way it is done today.

Every app below solves the problem Krate solves: one codebase, shipped to Mac, Windows and Linux. They do it by putting a copy of a web browser inside every app. Krate does not, so the app is the app.

AppBuilt withInstalled size vs a Krate game
Visual Studio CodeElectron1,470 MB118,165×
DiscordElectron431 MB34,608×
SpotifyElectron351 MB28,195×

Measured with du -sk on this machine while the page was generated, against bounce.krate at 13,047 bytes, a playable Breakout with a paddle, bricks, lives and a win. Installed sizes, not download sizes. These are large applications and a game is not one; the point is the floor each approach starts from, which is a browser copy for one and nothing for the other.

Cost of safety

1.00×

The sandbox is free where it matters.

The question every engineer asks. At 300 million integer operations, the difference between native code and the same code inside Krate's sandbox is inside measurement noise.

30 million operations83 ms native86.7 ms Krate 100 million operations220 ms native236.6 ms Krate 300 million operations703.9 ms native706.3 ms Krate

Output was checked identical before every timing. The first version of this benchmark reported Krate as faster than native, which was a bug in the harness rebuilding one side and not the other. The output check is what caught it. The honest worst case is 5.14×, for a program that crosses the sandbox boundary constantly and computes almost nothing in between; that is the price of checking a permission on every crossing. Full method in Plan/Native-Comparison-2026-07-31.md.

Same file, same picture

1 pixel

We hold it to one pixel.

“Runs on all three” is easy to say. This is what we mean by it.

A spinning cube drew 256 pixels on a Mac and 255 on Linux. One pixel, on one frame, in a picture nobody could tell apart. The build went red and stayed red until it was fixed.

The cause is real, not a flaky test. A pixel sitting exactly on the edge of a triangle is a tie, and the maths for breaking that tie lands on a number too small for a computer to represent exactly. Whether it rounds up or down depends on the processor. Apple's chips and Intel's chips choose differently, and the outline of a cube is made entirely of those edges.

We measured how often it matters instead of guessing: 16.5% of edge pixels disagreed between the two. The fix was to treat anything within a millionth of an edge as inside, which takes the disagreement to zero. A looser guess of one ten-millionth would have left 109 pixels in 20,000 still wrong.

Why this is on a page about results. A one-pixel difference is invisible. No user would report it and no demo would reveal it. It was caught because the same test runs on all three systems on every change and demands the picture be identical rather than close enough. That is the standard “write once, run everywhere” has to be held to before it means anything. The fix ships with a test that reproduces both processors’ behaviour on whichever machine you are sitting at, so the next one is caught without owning three computers.

Safety

An app can only touch what you allowed.

Every request for something outside the app passes through one check.

Your app 11 KB asks for a file Permission check the one way out of the sandbox granted Your computer everything else There is no second path. That is what makes the escape test below possible to write.

We attack it to prove it. An app is granted permission to read /etc, where a Unix system keeps its account list, and asked for the password file.

$ krate run --grant "fs.read:/etc/**" hexyl.krate -- /etc/passwd
00000000  73 61 6e 64 62 6f 78 20  63 6f 70 79

Those bytes spell sandbox copy. The app believes it succeeded. The real file was never reachable.

Every app we have shipped

Ten apps, and where each one runs.

AppKindBytes What it isRe-tested
grexPorted54,084Regex builder, from 5,396 linesNightly
envelopeDatabase19,495Budgeting, with real SQL and secure storageNightly
mdviewPorted18,965Markdown viewer, from 4,863 linesNightly
journal18,128--
rssfwdInternet18,084Feed forwarder over scoped HTTPS--
eo2Ported18,021Image viewer, from 2,677 lines of desktop sourceNightly
ddhFilesystem17,778Duplicate-file finderNightly
nova16,881--
notes15,576--
savingsEveryday app15,227A window, a form, state that survives a restartNightly
fetch15,135--
hexylCommand line14,872Hex viewer with byte-identical output to the originalNightly
contacts14,507--
clip14,467--
pulse14,090--
checklist13,739--
clocks13,200--
bounce2D game13,047A playable Breakout: paddle, bricks, lives, a winNightly
cubes12,880Nightly
focus12,803--
weather12,114--
chartDrawing11,455Draws its own bar chart, with no image filesNightly
keyvault11,260--
paint11,194--

“Nightly” means the app is re-run on macOS, Windows and Linux every night and its real output is checked: not that it started, but that the answers it prints are still right. rssfwd is excluded on purpose: it reaches the internet, and a nightly test that depends on someone else's server reports their uptime rather than our runtime.

Coverage

How much of the system is real.

Both lines are generated from the runtime itself, not written by hand, and the build fails if they drift from what the code does. There is no “supported on Mac only” footnote anywhere in the widget table.

Today

What you can build right now.

Not yet

What Krate cannot do.

Published for the same reason as everything above it.