Witbitz docs HomeTrustAll docs

Verifying the client — the code your browser runs

Everything a browser runs for a Space comes from a web origin, and an origin can be compromised: a hijacked hosting account, a bad deploy, a poisoned cache. Sealed storage and an attested server mean little if the page itself can be swapped. This page is how the client is pinned, how anyone can check it, and how the server checks it back.

How the app is put together inside the browser — the vault, the Kernel and Atlas — is the next page: the app as an operating system.


Every release is a reproducible, logged build

A release of the web app is not "whatever we deployed last". Each Official release is rebuilt from its source commit inside a separate build enclave, which signs its verdict with a key born inside it; the verdict — the release's hash (frontendSha256), commit and version — goes into an append-only release log and into Rekor, Sigstore's public transparency log. A deploy is refused unless the bytes rebuild to the logged hash, and never moves backwards to an older release.

Devices choose a channel: Official (the newest logged release) or Beta (the newest build, not rebuilt by the enclave). The service worker downloads a release completely before the app switches to it.

The page pins everything it loads

The shell names every file it will load by its hash, and the browser refuses anything else:

What How it is pinned
Every JavaScript module An import map carries a sha384 integrity for each module; the browser checks each module as it loads it (Chrome 127+, iOS Safari; older engines ignore it).
Script tags Subresource Integrity on each <script src>.
Inline scripts The Content Security Policy lists their hashes, the import map's included.
The key worker Bundled into a pinned module and started from it, so it is covered by the same pins.
Network The enforced CSP's connect-src lists the only hosts the page may reach — the published egress lock.

The vault (the hosted app's outer frame) is pinned the same way, under its own enforced CSP, and cannot be framed.

What this does not cover by itself: the pins live in the shell, and the shell is whatever the origin serves. A compromised origin could serve a different shell with different pins. Closing that needs a check outside the page — the signed certificate below, checked by a verifier you run, or a native app.

The signed certificate

Each deployed origin publishes a platform-signed /cert.json:

code
pinned platform key  →  signed /cert.json (frontendSha256)  →  /assets-manifest.json  →  every file's hash

Checking it yourself


The verifier extension

A page cannot vouch for itself: any check it runs, a swapped page can skip. The verifier is a small browser extension that runs outside the page, so the origin cannot opt out of it.

It covers the regular app, the hosted app and its vault, and tenants' apps. Status: Implemented — built and measured against production (the app and the vault boot with no violations; a tampered file fails closed), installed unpacked; not yet in an extension store.

Install the verifier

  1. Get the extension from the repository (docs/verified-client-real/extension/) and read its few files. config.json holds the origins it guards and the pinned keys — check them against Verify it yourself.
  2. In Chrome, open chrome://extensions, turn on Developer mode, choose Load unpacked and pick the folder.
  3. Open the app. It reloads in verified mode, boots normally and the badge turns green.
  4. To see it enforce: turn the extension off and reload — the badge is gone and the page's own policy applies again.

The one thing you take on faith is the extension itself, checked once. The strongest choice is a verifier written by someone other than the app's vendor.

The server checks the client

Verification above protects you from a swapped page. The server can also require that every member of a room runs a released client:

Requiring an attested client is a room setting, checked by the server — not a claim a client makes about itself.


Not built yet

The module list in the certificate

A signed list of the shell's modules in /cert.json, so a checker can match the whole module set the browser loaded — not only the files served — to the release log, without the extension.

A byte-level verifier

A Firefox extension that hashes the exact bytes the browser received and checks them against independent transparency logs, removing Witbitz from the trust base for one extra tool. Design.

Certified closed-source apps

A capability-confined app audited inside an enclave by several independent checkers against its declared privacy certificate, with a public verdict log — "this app is good" without publishing its source. Design.

Limits

Next

Machine-readable source: client-architecture.md · Generated 2026-10-27T07:05:42Z · build f301388c · every doc in one fetch: llms-full.txt (HTML)