Skip to content
โ—‡ AirawatOS Developer
๐Ÿšง Under development โ€” this portal is being built track by track. Content will keep growing, and some sections are still placeholders.

Deep Dives

Zero-Trust Architecture

How the platform runs other people's code without trusting it.

The problem

An organization โ€” a city, a health department, a court, a statistics office โ€” installs a piece of software (a "component") from a marketplace. Some developer, maybe on the other side of the world, wrote and published that component. Once installed, it runs inside that organization's own workspace, next to its own data.

Normally you would have to trust that code: trust that it only does what it claims, trust that it won't quietly copy data somewhere, trust that it won't reach a system it shouldn't. That kind of trust does not scale, and it is exactly how things go wrong.

AirawatOS takes a different stance: it never trusts the component's code at all. Instead it trusts two things it can actually check โ€” a certificate and the host.

The two things we trust instead

1. The certificate. Before any component can be sold or run, it is checked and cryptographically signed. The signature covers a fingerprint (a "digest") of the exact code. When the platform is about to run a component, it re-computes that fingerprint and compares it to the certificate. If they don't match โ€” if even one line of the code was swapped after signing โ€” it refuses to run. So the platform isn't trusting the developer's promise; it is checking the code is exactly the certified code.

2. The host. The component runs inside a host that is built so the component has no way to do anything it wasn't granted. This is the key idea, and it's stronger than a rule that says "you're not allowed to." The forbidden things are simply not there:

As the design puts it: there is no socket to try. Anything the component didn't ask for isn't merely denied โ€” it is absent.

Two tiers of confinement โ€” be precise about which you're reading. The strongest form โ€” a component
with literally no socket, every secret used only inside the kernel โ€” is real today for **light,
in-process components that reach the outside through the broker's fetch path. Heavier components** (a
satellite-imagery driver, an ML trainer) run in a locked, certified container: their code is mounted
read-only and signature-checked, they may act only within their declared reads / writes / outside-hosts
/ secrets, and every write is attributed โ€” but the container runs its own process, receives its declared
secrets in its environment, and makes its own outbound calls to its declared hosts. So read the absolutes
above as the confinement contract; the fully socket-less clean room is the target tier, still being built.

The single door: the broker

If a component has no direct access to anything, how does it do useful work โ€” read data, call an outside website, use a secret?

Through one guarded channel called the broker. The broker is the component's only door to the outside world. And the broker only lets through exactly what the component declared up front in its description file:

The broker holds the real credentials; the component never sees them. And every time the component writes something, the broker stamps it with the component's true, un-fakeable identity (component://<name>). So no action inside the platform is anonymous โ€” every value can be traced back to the exact component and version that produced it. (This traceability idea runs through the whole platform โ€” see The Shared Vocabulary.)

A worked example. Take a driver that fetches hourly air-quality readings from an outside sensor network's website. Its description declares exactly three things: it may call that one website (and no other), it may write the "sensor reading" data type (and nothing else), and it needs one secret โ€” the API key for that website. When it runs:

If a later version of the driver quietly tried to also call a data-broker website to sell what it collected, that call would simply fail โ€” the door was never opened. And because the code's fingerprint would no longer match its certificate, the tampered version wouldn't run at all.

Where that one door leads: the kernel fans out

A component has exactly one door โ€” the broker โ€” and the broker is the run-token-authenticated face of the kernel. So a fair question is: if the component can only talk to the broker, how does it ever use a secret, read a file, or call an AI model? The answer is that it doesn't โ€” the kernel does, on its behalf. The component asks the broker for a result; the kernel is the hub that reaches out to the supporting services and brings the result back. The component never names those services and never holds a connection to any of them:

So those services are indeed reached "through the kernel" โ€” but it's the kernel calling them, triggered by a component that only ever spoke to its one door.

Two services act on components, not called by them

Two supporting services are the exception that proves the rule โ€” a component never calls them, because they are the control plane that runs the component in the first place:

A component can't call these โ€” they call it into existence. (Workflow and Decision are similar: they orchestrate cases from the outside and persist their own state through the kernel registry, like everyone else.)

Two lanes, one identity

There is a second door in the platform, and it's important not to confuse it with the broker. Apps โ€” the screens a person clicks โ€” don't run confined with a run-token; they act as the logged-in user. Their door is the app host's /bridge/* channel, a user-session door that mediates to the kernel, network, and file store on the person's behalf. So the whole platform reduces to two lanes:

  Lane A โ€” a component acts (confined, run-token)
    component โ”€โ”€โ–บ broker โ”€โ”€โ–บ kernel โ”€โ”€โ–บ { secrets ยท file store ยท model gateway
                (the only door)   (fans out)    ยท network ยท event dispatcher }

  Lane B โ€” a person acts (session token)
    browser / app โ”€โ”€โ–บ app-host  /bridge/*  โ”€โ”€โ–บ { kernel ยท network ยท file store }

  underneath both:  identity โ€” mints the tokens every service checks

Every path a component or app can take crosses a door the platform controls.

Underneath both lanes sits Identity โ€” it issues the verified tokens (run-tokens for components, session tokens for users) that every service checks before it trusts a caller. That's what lets two doors stay safe: neither the component nor the app is trusted, only the token it carries and the service that minted it.

Least privilege, by construction

When a component is installed, the kernel mints it a run-token that carries precisely the permissions it declared โ€” no more โ€” and every run executes under that token. And those declared permissions must be a subset of what the certificate approved. So there are two independent checks agreeing on what the component may do: the certificate (at publish time) and the run-token (at run time).

This is what lets an organization read a component's permissions before installing it and know that list is the complete and enforced truth of what the software can touch.

Why "absent, not denied" matters

A firewall rule that says "block this" can be misconfigured, bypassed, or forgotten. An ability that doesn't exist can't be any of those things. AirawatOS leans on this everywhere: the safest permission is the one that was never wired up. The strength of the sandbox around a component (how strong the walls are) can be dialed up over time โ€” from a simple isolated process to heavier isolation โ€” without the component ever knowing or needing to change. The contract it runs under stays the same.

Two separate ideas people mix up

Where this stands today

Working now: the broker as the data door โ€” declared-only reads and writes with un-fakeable attribution on every write, enforced in the kernel for every component; broker-mediated outside-calls with the key injected server-side (the light, in-process path); the "refuse to run if the code doesn't match its certificate" check; and the run-token carrying only declared permissions.

Being built: the strongest isolation tier โ€” a clean room where a component has literally no socket and even the operator can't see the data it processes โ€” is designed but not yet built. Today's heavier components run in a locked, certified container with their declared capabilities, but they hold their declared secrets in-environment and make their own outbound calls to their declared hosts; pulling those onto the broker-mediated path (so the declared host-list is network-enforced too) is part of this work. Operator certification is an early capability, with the full signed lifecycle still to come.