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.
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.
| App | Built with | Installed size | vs a Krate game |
|---|---|---|---|
| Visual Studio Code | Electron | 1,470 MB | 118,165× |
| Discord | Electron | 431 MB | 34,608× |
| Spotify | Electron | 351 MB | 28,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.
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.
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.
- A file picker returns a token, not a path. The app can read the one file a person chose, and never learns where it lives or what sits beside it. The click is the permission.
- A token dies with the run. An app cannot store one and come back for the same file later.
- Image decoding happens inside the sandbox. A malformed photo attacks the app, not the operating system. Pixels cross the boundary; parsers do not.
Every app we have shipped
Ten apps, and where each one runs.
| App | Kind | Bytes | What it is | Re-tested |
|---|---|---|---|---|
grex | Ported | 54,084 | Regex builder, from 5,396 lines | Nightly |
envelope | Database | 19,495 | Budgeting, with real SQL and secure storage | Nightly |
mdview | Ported | 18,965 | Markdown viewer, from 4,863 lines | Nightly |
journal | 18,128 | -- | ||
rssfwd | Internet | 18,084 | Feed forwarder over scoped HTTPS | -- |
eo2 | Ported | 18,021 | Image viewer, from 2,677 lines of desktop source | Nightly |
ddh | Filesystem | 17,778 | Duplicate-file finder | Nightly |
nova | 16,881 | -- | ||
notes | 15,576 | -- | ||
savings | Everyday app | 15,227 | A window, a form, state that survives a restart | Nightly |
fetch | 15,135 | -- | ||
hexyl | Command line | 14,872 | Hex viewer with byte-identical output to the original | Nightly |
contacts | 14,507 | -- | ||
clip | 14,467 | -- | ||
pulse | 14,090 | -- | ||
checklist | 13,739 | -- | ||
clocks | 13,200 | -- | ||
bounce | 2D game | 13,047 | A playable Breakout: paddle, bricks, lives, a win | Nightly |
cubes | 12,880 | Nightly | ||
focus | 12,803 | -- | ||
weather | 12,114 | -- | ||
chart | Drawing | 11,455 | Draws its own bar chart, with no image files | Nightly |
keyvault | 11,260 | -- | ||
paint | 11,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.
- 12 of 15 declared interfaces are fully implemented. 1 are declared and do nothing yet.
- 17 of 17 declared widgets work on all three systems.
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.
- 2D games: a playable Breakout with a paddle you steer, collision, sprites, an app's own frame loop.
- Drawing: charts and graphics an app renders itself, through one rasterizer shared by all three systems.
- Sound: verified by a test that plays a tone through real hardware.
- Photo and document viewers: file dialogs, image decoding, scrolling text, search.
- Internet apps: HTTPS scoped to a single host and port, not “the internet”.
- 3D: textured triangles, depth, lighting and a camera you steer, rendered at 780 frames a second at 640×480, on the processor, with no graphics card involved at all. That is thirteen times a 60 fps budget, on hardware a GPU renderer would refuse to start on. Good for a stylised game today; a modern one wants the GPU path, which is designed and next.
- Gamepads: sticks, triggers and buttons named by position rather than letter, so an app asking for the button under your thumb gets it on an Xbox pad and a Nintendo one alike.
- Databases, secure storage, speech-to-text.
Not yet
What Krate cannot do.
Published for the same reason as everything above it.
- Open sign-ups. Krate runs today and every number here is reproducible from the public repository, but we are not pushing for users yet. The three-system test pass happens first. Software that people trust with their files earns that trust before it asks for it, not after.
- Heavy 3D. Software rendering carries a stylised game today. A modern one needs the GPU, which is a real graphics abstraction across three systems and is planned rather than written.
- Video. No decoder, no frame clock.
- Live connections. HTTPS works; streaming and WebSockets do not, so no multiplayer and no live feeds.
- System menu bars. Apps use in-window buttons.
- Judgment inside the sandbox. When an AI writes the app, Krate guarantees it cannot exceed the permissions you granted. It does not guarantee it chose well inside them. We caught our own generated password manager storing passwords in ordinary app data rather than the system keychain, and fixed the instructions that led it there.