Skip to main contentSkip to navigation

Distribution

Web is canonical. PWA, Tauri and Electron are the same contract with capabilities added.

Capabilities by target

Produced by building each adapter and asking it — not a written-down claim.

Platform capabilities
TargetSecure storageNative notificationsFile systemUpdaterDeep-link schemeAuth transport
Webnonononosame-origin-redirect
PWAnonononosame-origin-redirect
Tauri (packaged)yesyesyesyesottili-codersystem-browser-deeplink
Tauri (no host bridge)nonononoottili-codersystem-browser-deeplink
Electron (packaged)yesyesyesyesottili-codersystem-browser-deeplink

Why the two Tauri rows differ

The same bundle is served to a packaged app and to a browser tab.

  • Foundation is a browser bundle and must not carry a desktop SDK, so both desktop adapters talk to whatever the host injected as window.ottiliDesktop.
  • With no bridge, every native capability reports unsupported and every native call refuses with a reason — rather than throwing an undefined-property error on first use.
  • secureStorage is the one that matters most. On web it reports unavailable and refuses to write, instead of falling back to localStorage and quietly turning an OS-keychain guarantee into a value any script on the page can read.
  • Desktop detection runs before PWA detection: a Tauri window also reports display-mode: standalone, and mistaking it for an installed PWA would leave it with no keychain, no updater and no deep links.

Offline cache policy

SoT §29.6. Caching company data on a device is a decision a product makes deliberately.

Offline mode
The default. Nothing is cached.
App shell and static assets only.
Everything, opted into explicitly.
What a service worker would cache
RouteCached
/yes
/signinyes
/assets/app.cssyes
/c/acme/dashboardno
/c/acme/settings/brandingno
/api/v1/foundation/bootstrapno

A /c/ route carries tenant data by construction, so it never qualifies as safe metadata — only an explicit approved-cache reaches it. An /api/path is refused under every policy: a cached API response is an authorization decision frozen at fetch time, and §12 makes the server the only authority on those.

The Lab is itself a PWA

Both artefacts below are generated from one PwaProductConfig, so they cannot disagree.

This browser, right now

Not what an adapter would answer — what actually happened when the Lab registered its worker.

Live PWA state
Service workerpending Registering…
Offline policysafe-metadata
Installabilityunsupported This browser does not offer installation
Manifest/manifest.webmanifest · /sw.js
The browser has not offered an install prompt for this origin.