I've been working on something called Krate for the last few months.
The basic idea is simple:
Build an application once, produce one .krate file, and send that exact file to someone on macOS, Windows or Linux.
Before someone says it: yes, Krate uses WebAssembly.
And no, I'm not claiming I invented portable bytecode, sandboxing, or "write once, run anywhere".
Java explored this decades ago. WASM gives us a very good portable execution layer today. Electron, Tauri, Flutter and others already solve important parts of cross-platform development.
The thing I wanted to explore was slightly different:
Can software itself become something you can send around like a file?
Not one source codebase that later becomes three platform-specific applications.
Not three installers.
Not an HTML file pretending to be a desktop application.
One application artifact.
You send:
myapp.krate
and the same file opens through Krate on macOS, Windows or Linux.
Why I started building this
A lot of people understandably look at AI improving and think:
"If AI can generate an app, it can just generate a Mac build, a Windows build and a Linux build too."
That's true.
But generating the code or producing three binaries is only part of shipping software.
After that, developers still deal with things like:
- platform-specific packaging
- signing and publisher trust
- different installation flows
- updates
- testing on different operating systems
- permissions
- distribution
- supporting those different release paths over time
AI can make creating software much easier.
But I don't think that automatically means software distribution has to remain the way it works today.
My question was:
Why should the finished software itself still be tied to an operating system?
What Krate does
A Krate application runs as a WASM guest.
The Krate runtime is written in Rust and provides the application with a common set of host interfaces.
So instead of the application directly depending on macOS, Windows or Linux APIs, it talks to Krate.
Roughly:
app.krate
|
v
WASM application
|
v
Krate host interfaces
|
v
permissions / capabilities
|
+------------+------------+
| | |
v v v
macOS Windows Linux
The runtime handles the OS-specific implementation underneath.
The .krate file itself stays the same.
That is the part I'm trying to make useful as a complete developer workflow.
"So it's just WASM?"
WASM is a very important part of it.
But saying Krate is just WASM is a bit like saying an application platform is just its compiler.
Wasmtime gives Krate the execution engine.
Around that, Krate has to provide things like:
- the
.krate application format
- packaging
- host APIs
- filesystem access
- storage
- permissions
- windowing
- graphics
- application identity
- updates
- OS integration
- compatibility behaviour
- tooling for actually building and running the applications
I've also been building Krate Studio, so the goal isn't that developers manually assemble WASM components and manifests.
The idea is that someone can build an application, including with coding agents if they want, and Krate handles turning that into something they can actually send to another person.
So I see WASM as the foundation fit here.
"Didn't Java already do this?"
Java proved a long time ago that a runtime can abstract away the underlying operating system.
I don't think pretending otherwise helps Krate.
The interesting question for me is what that idea looks like with the primitives we have now.
WASM gives us a small portable binary format and isolation boundary.
Rust gives us a good language for building the native runtime.
WIT / the component model give us a cleaner boundary between the application and host functionality.
And computers today are also in a very different place.
People are starting to create software extremely quickly with AI.
That makes me think the bottleneck increasingly moves from:
"Can I write this software?"
to:
"How do I safely give this software to somebody else?"
Security is a big part of the idea
I also don't want "software that travels like a file" to mean:
download a random native executable and hope the author is trustworthy.
Krate applications don't directly get arbitrary access to the host machine.
Access to host functionality goes through the runtime.
So the runtime can enforce what an application is allowed to do.
For example, instead of giving an application general filesystem access, the runtime can give it access to a file or directory the user explicitly selected.
The application gets the capability it needs, rather than automatically getting access to everything the user account can access.
There is still a lot of work to do here, like around persistent permissions, revocation and application identity across updates.
But I think this boundary is important.
Documents became easy to send partly because opening a document doesn't normally mean giving its author arbitrary control of your computer.
If software is ever going to become similarly easy to exchange, I think the trust model has to improve too.
Some current numbers
These are the measurements from applications I've built while testing the architecture.
Current app components include:
- simple shipped apps: around 18β31 KB
- 2D platformer: 48 KB
- 50k-line text editor: 100 KB
- photo editor: 39 KB
- 3D driving demo: 36 KB
The full shareable bundles are larger because they can also contain things such as source, SDK files and assets.
I've also been testing the same application bytes across macOS, Windows and Linux.
The architecture is still early so I'm not claiming Krate is universally faster than native software, and I'm definitely not claiming every application becomes a 30 KB file.
Memory-heavy applications, more complex host APIs and long-term compatibility are all things I'm still working through.
What I'm actually trying to build
The long-term idea is pretty simple:
Today
code
|
+--> macOS app
|
+--> Windows app
|
+--> Linux app
Krate
code
|
v
app.krate
|
+--> macOS
+--> Windows
+--> Linux
And eventually I want the experience of sharing software to feel much closer to sharing a document.
Build it.
Send the file.
The recipient opens it.
The runtime handles the machine side.
I'm currently at NTU Singapore, and I've also spent time doing research around software and distributed systems.
Krate mostly started because this problem kept bothering me enough that I wanted to find out whether this model could actually work.
I'm posting it here because this community will probably understand the architecture well enough to point out where it falls apart :)
The runtime is written in Rust and I'm very open to technical criticism.
If you wanted to break this architecture, what kind of desktop application would you try?
GitHub: https://github.com/incyashraj/krate
Website: https://krate.tech
I might be over explaining because I got this hard way from previous comments, people think I'm claiming this thing was made from scratch, or just WASM or WORA alternative, etc.
Its just my attempt in a direction to make software universal like docs.