The normal problem
Today, an app is usually married to the operating system it was built for. A Windows app expects Windows APIs. A macOS app expects macOS APIs. A mobile app expects a completely different world.
That means developers often rewrite the same idea several times, or carry a complicated build matrix forever.
Krate asks a different question: what if the app talked to one common layer, and that layer translated to the host underneath?
Krate is not saying apps are as simple as PDFs. It is saying software should have a portability layer that makes the app less tied to one host.
The Krate idea in one picture
Example: how `krate-clock` becomes terminal output
This is a small example, but it shows the complete shape: portable app artifact, Krate runtime, common APIs, capability checks, host adapter, and final output.
After Phase 2: what Phase 3 should unlock
Phase 2 proves the runtime path with CLI apps. Phase 3 should prove that the same model can power a real desktop app with a native window, user interaction, and explicit host permissions.
From CLI proof
To desktop app proof
One WebAssembly app, native host window, explicit permissions.
In simple terms: Phase 3 should move Krate from "a safe portable CLI app can run" to "a safe portable desktop app can open a real window and respond to users."
Current progress: the macOS prototype can create an opt-in AppKit window, attach a first draw view, collect native window callbacks, and process one non-blocking event-loop tick. The runtime can request that AppKit path by name, and there is a local smoke command that opens the native path, pumps one tick, checks the report, and closes it. Linux and Windows now have guarded Winit prototype boundaries, a session owner scaffold, and a callback collector bridge, which means future Winit handlers have a tested inbox for resize, focus, scale, redraw, and close callbacks. Real Linux and Windows windows are still next. The normal path still stays headless for safety.
What is Krate able to do today?
Krate is pre-alpha, but the current Phase 2 proof is real. The CLI can run WebAssembly components that call Krate for time, locale, files, terminal output, and a first local HTTP path.
The most important proof is not just "it runs." The important proof is that host access can be declared, granted, denied, and tested.
Technical terms, translated
What happens when an app reads a file?
The app asks
The WebAssembly component calls the Krate file API.
Krate checks
UCap checks whether this run granted `fs.read` for that path.
The host acts
If allowed, the adapter reads the file through the native OS. If not, the app gets permission denied.
Where the roadmap goes next
The honest status
Krate is not a finished universal app platform yet. It does not have production GUI, mobile, app bundles, marketplace, or hardened third-party sandboxing.
What it does have is a credible pre-alpha runtime proof: portable components, a real UAPI slice, explicit permissions, denial behavior, sample apps, and evidence tracking.
Krate is building the runtime layer that lets software run more like portable files: one artifact, explicit permissions, host adapters underneath.