Both mount the same backend API. Neither command falls back to the other when its
runtime is missing or fails.
npm run build:distribution invokes fetch:moor, which consumes the committed
four-target Moor release-asset pin and installs the selected host binary. The
runtime resolves explicit DESK_MOOR_BIN, then an attested same-release
libexec/moor, then an attested absolute moor found on PATH.Binary-only installation
- detects macOS or Linux, x64 or arm64, and rejects unsupported libc;
- checks its fixed shell prerequisites before creating a work directory;
- downloads and authenticates the target-native bootstrap using receipts embedded in the version-bound installer;
- validates canonical manifest schema 3 and the exact release inventory;
- downloads only the selected prebuilt application, Node, and Moor assets;
- safely extracts each archive into an empty staging directory;
- verifies the application, native loader graph, platform floor, Node ABI, raw Moor receipt, and final release namespace;
- probes the staged runtime, activates atomically, and smokes the public launcher.
${XDG_DATA_HOME:-$HOME/.local/share}/desk. DESK_HOME overrides that root.
DESK_BIN_DIR overrides the launcher directory only when that canonical, safe
directory is already on PATH and no earlier command shadows it.
desk launcher resolves current, verifies that the release remains
under the managed root, and executes the release-bound Node runtime and CLI.
Install lifecycle
- A first install does not expose a launcher until staging and smoke checks pass.
- An upgrade or explicit downgrade preserves the active instance until the new instance is verified.
- A same-version reinstall creates a new install ID; it never mutates the active directory.
- After successful activation, Desk retains the current and immediately previous valid instances and their referenced toolchains.
- Each installer is bound to one release. Downloading an older release’s
install.shis therefore the explicit downgrade action. - Any activation failure restores the previous
currenttarget and launcher.
Release assets
Tagged releases publish exactly:desk-vX.Y.Z-source.tar.gzdesk-install-manifest.jsoninstall.shSHA256SUMSdesk-vX.Y.Z-install-bootstrap-linux-x64desk-vX.Y.Z-install-bootstrap-linux-arm64desk-vX.Y.Z-install-bootstrap-darwin-x64desk-vX.Y.Z-install-bootstrap-darwin-arm64desk-vX.Y.Z-application-linux-x64.tar.gzdesk-vX.Y.Z-application-linux-arm64.tar.gzdesk-vX.Y.Z-application-darwin-x64.tar.gzdesk-vX.Y.Z-application-darwin-arm64.tar.gz
install.sh is generated from the authenticated bootstrap receipts for that
release, so releases/latest/download/install.sh serves an installer of the same
generation as the release it installs.
The install manifest declares the independent source receipt plus exact
target-qualified bootstrap, application, Node, Moor, ABI, loader, and platform
authorities. It contains no caller-controlled URLs.
The source archive remains available for source access but is not an installer
input. Installation neither downloads nor observes it.
There is no separately installable server executable. The compiled runtime is a
private release component at libexec/desk-standalone.
Build ordering
Contributors and CI pin Node 22.23.1, npm 10.9.8, and Bun 1.3.14.npm run build:distribution runs fetch:moor against the committed four-target
pin, runs the compiled-runtime build next, and runs the TypeScript CLI build
last. This order matters because Vite clears dist/. Run npm run build after
any later UI build to restore the Node CLI.
npm run build:moor is a separate source-build entrypoint. It validates
vendor/moor/PROVENANCE.json and the vendored snapshot digest before compiling
libexec/moor; the core/native CI workflow invokes this path.
The real smoke script proves:
- the default root responds without a Vite client route;
serve --devexposes the Vite client route;- SIGINT and SIGTERM stop each supervised process group;
- an occupied port fails without an alternate listener or fallback;
- a controlled private-runtime exit status propagates through the CLI.
Server options
Both modes accept flags:DESK_HOST / DESK_PORT, then
127.0.0.1:5173.
Container contract
The Docker image uses Node 22.23.1 in both build and runtime stages, builds the full application at/opt/desk, and exposes the same CLI:
0.0.0.0 because port publication is controlled by Docker.
Publish it only on a trusted host interface. Desk has no built-in authentication.
The image packages and probes the pinned release asset installed as
libexec/moor during its npm run build:distribution builder step.
DESK_MOOR_BIN remains available as an explicit operator override.
Host integrations
The installer owns the Desk build/runtime toolchains and bundled Moor component. The following integrations remain optional and use the host user’s credentials:codex,claude, andopencodefor agentsghfor GitHub and Projectsrgfor fast search- GPU telemetry commands