‹04-deployment-targets

04-deployment-targets

all docs

04 — Deployment Targets

Where Zero runs today, what is shipping, built, framed, or aspirational. The same engine library (zero_serve()) is everywhere; only the shell and the capability profile differ. Honesty markers match [../roadmap/consolidation.md](../roadmap/consolidation.md).

The principle: one engine, many doors

The engine is a single library. A platform is a thin native shell — a window, a view surface, and the engine — plus a door (the trust model) and a capability profile (what this device is). Desktop shells *spawn* the engine as a child; mobile, where child processes are forbidden, calls zero_serve() in-process on a worker thread. Same call, same store, same DSL, everywhere. (kernel/embed.h, ../mobile/ARCHITECTURE.md)

int zero_serve(const char* cls, int port, const char* door, const char* home);

Status by target

Tier

Target

Status

Evidence

Desktop

macOS (universal: Intel + Apple Silicon)

shipping

desktop/main.mm; Zero-0.0.x-macos.dmg; make/desktop.mk

Linux (GTK / WebKitGTK)

built

desktop/main_gtk.c; tarball dist

Windows (Win32 + WinHTTP)

built

desktop/main_win.cpp; MinGW cross → zero.exe

Mobile

Android (Kotlin + NDK; phone/tablet/TV/Fire TV/handheld)

shipping

mobile/android/; zero_jni.cpp; CI mobile.yml (AAB+APK)

iOS (Swift + WKWebView; iPhone/iPad)

built

mobile/ios/; simulator-tested; distribution deferred

tvOS

planned

no WKWebView on tvOS; living-room carried by Android TV / Fire TV today (../mobile/ARCHITECTURE.md:44–48)

Server / edge

Linux x86_64

shipping

release.yml; servers, desktops

Linux aarch64 (64-bit Raspberry Pi, ARM servers)

shipping

native ubuntu-24.04-arm CI

Linux armv7 (32-bit Pi: Zero/1/2)

CI written, awaits first tag build

armhf cross job; *not locally compiled — see caveat*

Docker / mesh

shipping

Dockerfile, docker-compose.yml, release.yml

Custom hardware

Handhelds (scanner, payment terminal, kiosk)

framework built, integrations deferred

capability profile + native primitives, 3-gate permissioning (../VISION.md)

Bare metal

Microcontrollers / RTOS / boot-up OS

aspirational

no build target or device code yet; library is link-able and small, so the path exists

armv7 caveat (verbatim from the roadmap): the linux-armv7 cross-compile and its CI job are written to the standard armhf-multiarch pattern but were not locally compiled — the dev box has no ARM cross toolchain. The Makefile expansion and the platform-key canonicalization are verified; the first tag build confirms the link. The aarch64 / x86_64 / darwin / windows paths are unchanged.

On "boot-up OS to app" and microcontrollers

The vision is one engine spanning boot-up OS → app, across desktop, mobile, server, microcontroller, and custom hardware. Be precise about where that is today:

• App-to-server is real and shipping across desktop, mobile (Android), and Linux

(incl. ARM/Pi).

• Custom-hardware surfaces (scanner, payment terminal) are *framed and gated* — the

capability-profile + native-primitive pattern exists; specific hardware integrations are future work, not shipped.

• Microcontroller / bare-metal / "boot-up OS" is aspirational: there is no

embedded target, RTOS port, or boot path in the codebase. What makes it *credible* rather than hand-waving is that the engine is ~2,400 LOC, dependency-light (libcurl + system crypto), and already links as a static library with a static dispatch table (no dlsym) — i.e. the same property that let it into a sandboxed mobile app is the property a microcontroller port would need. Treat it as a roadmap destination with an honest runway, not a current capability.

State it this way in any external setting: "runs today from edge devices to servers; designed to scale down to microcontrollers and up to a boot OS."

Runtime auto-assembly — why every target stays slim

An app never ships fat. The engine binary is the tiny floor; behavior (store classes) and speed (compiled-view libs) arrive on demand:

1. A class the machine lacks is hydrated (fetch_dir) — its .action/.data and,

if published, only this platform's compiled-view lib.

2. loadchain dlopens the lib (POSIX desktop/server); run() prefers the compiled

view live.

3. The engine itself auto-updates in place (zero update / shell first-launch fetch);

store content refreshes silently.

So each target gets new behavior, new speed, and a new engine on independent channels, none forcing a reinstall. (../roadmap/consolidation.md, "Runtime auto-assembly")

Mobile/Windows caveat: dynamic-loading of compiled views is POSIX desktop/server only; static-dispatch builds keep the in-binary/interpreted path (notarization forbids dlopen/-rdynamic). They still auto-update the engine and hydrate store content — they just don't dynamic-load compiled libs.

Release model — three components, three tag namespaces

One repo, three independent release cadences sharing one contract (manifest + store):

Tag

Component

Targets

v*

engine / CLI

linux x86_64/aarch64/armv7, darwin universal, windows, mesh, docker

desktop-v*

desktop apps

macOS .dmg, Linux .tar.gz, Windows installer

app-v*

mobile apps

Android AAB+APK, iOS

A component rebuilds only when its tag is pushed — "no update where none is needed." (../roadmap/consolidation.md, "Release model")