One command brings up any computer — and keeps it that way.
Set up and maintain desktops, laptops, servers, and headless boxes from one place: desktop.tools.
Status: Desktop Tools is evolving from the Install Doctor chezmoi-and-shell provisioner into a configurable system for setting up and maintaining computers. The provisioning machinery (chezmoi +
software.yml+ the ZXinstallxinstaller) is preserved; a Cloudflare-native control plane and the canonicaldesktop-toolsclient layer configuration, a browser dashboard, lazy CLI installation, per-host recovery, and bounded improvement cycles on top. This README describes what actually ships today — see Honest status for what is live vs. still in progress.
Describe the environment you want once; make each authorized machine a verified, cooperating part of it. Selected desktop applications install now; optional command-line tools install the first time you run them. Every host stays reconciled to its desired state, observable, and recoverable.
The intended browser-first product lives at desktop.tools. The
OpenCode-derived desktop-tools supervisor is still pre-production; deterministic provisioning
and recovery must remain usable without a desktop, GUI, or paid inference. See the generated
capability status for evidence-backed truth.
On macOS or Linux, run the minimal bootstrap, then pair the machine from any browser:
curl -fsSL https://example.desktop.tools | bash- Desktop (with a browser):
desktop-tools-pairwill open the approval page automatically. - Headless / server:
desktop-tools-pairprints a short code + URL you approve from any other browser — no GUI required. Approval is an explicit, authenticated action (visiting the URL does not approve the device); the approver sees the machine's identity before granting.
A native Windows PowerShell bootstrap entrypoint is not shipped yet (the lazy command-not-found installer already has a PowerShell adapter — see below).
Desktop Tools is the only product. Install Doctor remains the repository name and historical
provisioning lineage; aid, aid-pair, app.install.doctor, and old state paths are bounded
compatibility surfaces. Read the operating boundary before changing
naming, hosted routing, state ownership, or migration behavior.
A server-rendered dashboard (CF Worker + Hono). Live sections — each reads observed state, never optimistic success:
| Section | Route | What it shows |
|---|---|---|
| Machines | /machines |
Enrolled devices: identity, enrolled-at, last activity (fresh / stale / never), and drift (last-applied revision vs the tenant's desired revision). |
| App Store | /apps |
The full installable catalog (1,068 tools generated from software.yml), searchable, each with the exact per-manager install command. |
| Recommendations | /recommendations |
Actionable rule-based recs from observed state (drifted / never-reported / stale machines). AI enrichment is pending the provider connection. |
| History | /history |
The fleet's reported events (apply / plan / report) across devices. |
Supporting JSON APIs (admin-gated where they expose fleet data; the catalog is public):
GET /health · GET /api/catalog + /api/catalog/:name · GET /api/devices ·
GET /api/recommendations · GET /api/history · GET /api/environment/current ·
pairing POST /api/devices/pair/{start,approve} + GET /api/devices/pair/{info,poll} ·
devices POST /api/devices/{enroll,:id/revoke} + GET /api/devices/me ·
device-scoped GET /api/device/{current,current.md,history} + POST /api/device/{apply,report}.
desktop-tools is the canonical machine-side client. It reads the device token stored by
desktop-tools-pair and talks to the
control plane as that device (headless-safe, dependency-light):
| Command | What it does |
|---|---|
desktop-tools-pair |
Pair this machine (print code → approve in browser → claim a revocable device token). |
desktop-tools status |
Pairing + desired-state summary (tenant / revision / digest). |
desktop-tools pull |
Fetch this device's desired ENVIRONMENT.md. |
desktop-tools plan |
Reconcile desired vs installed, offline/local (present / missing / to-install). |
desktop-tools apply |
Install missing packages; dry-run by default and mutation requires explicit consent. |
desktop-tools up |
One command: pull + plan (read-only; records a History event). |
desktop-tools exec <cmd> |
Run a command, installing it first if missing (authorized install-on-demand). |
desktop-tools prewarm <cmd…> |
Install tools now without running them. |
desktop-tools installs |
Summarize lazy-install telemetry. |
desktop-tools migrate --preview |
Report legacy state mappings without copying, moving, or deleting data. |
Desktop Tools installs two ways, on purpose:
-
Eager — selected desktop applications and the few dependencies needed to bootstrap and recover are installed up front during provisioning (via
installx+software.yml+home/dot_local/bin/post-installx/*). Example: pairing on a desktop installs your chosen GUI apps now. -
Lazy — optional command-line tools install the first time you run them. Type a CLI that isn't present and the
command-not-foundhook looks it up in the catalog index, installs it via the OS package manager, and transparently runs the command you typed:$ rg "needle" . ⟳ 'rg' not found — resolving via install.doctor… ↻ installing 'rg' → brew: ripgrep (first run)… # …then your search runs, and `rg` is there for every future call.
The lazy installer (
home/dot_config/shell/not-found-hook.sh) works across bash, zsh, fish, and PowerShell over one resolver, is safe-by-default (no unauthorized installs in CI / non-interactive shells), serializes concurrent installs to exactly one, never consumes a command's stdin/stdout, and records per-install telemetry (desktop-tools installs). Mise-managed runtimes are deferred to mise, not duplicated.
Responsibilities are separated (Cloudflare-first: Workers/Hono + D1 + schema-validated contracts):
- Desktop Tools control plane (
packages/control-plane) — accounts, machines, desired state, catalog, plans, jobs, history, and recovery. The current legacy deployment atapp.install.doctorremains a compatibility implementation; productiondesktop.toolsrouting is not yet activated. - Desktop Tools core and client (
packages/aid-core+home/dot_local/bin/executable_desktop-tools) — interpretation, recommendations, typed contracts; routes model calls through the shared ProjectSites/OnePrompt inference service + Cloudflare AI Gateway (DeepSeek-first). - Deterministic executor — typed install / configure / inspect / verify operations on the host.
- Installer layer — chezmoi (dotfiles + per-host templates) +
software.yml(the single authoritative catalog) + the ZXinstallxinstaller. Preserved, not replaced.
One schema-validated desired-state manifest per host, updated through one revisioned write path;
the portable ENVIRONMENT.md is the authoritative human-facing contract. Observed inventory and
health are kept separate and cannot silently authorize changes.
Secrets stay backend-side — Infisical Cloud is authoritative for machine/app secrets, Bitwarden for selected interactive credentials; secret values never enter Git, logs, or recordings.
Implemented in the legacy compatibility control plane and covered by local tests; this is not evidence that the Desktop Tools production profile flow is live:
- ✅ Landing + onboarding, browser-first device pairing (admin-approved, revocable device tokens).
- ✅ Machines / App Store / Recommendations / History dashboard (4 of 5 nav sections).
- ✅ Lazy CLI install across bash / zsh / fish / PowerShell + the
desktop-toolsCLI + install telemetry. - ✅ Per-device freshness + drift, rule-based recommendations, the 1,068-tool catalog.
In progress / blocked on external configuration (tracked honestly in docs/aid/):
- ⛔ Better Auth sign-in (GitHub / Google / magic-link) — needs OAuth apps + an email sender
provisioned; today admin actions use an
AID_ADMIN_TOKENbearer, not a user session. - ⛔ The real AI provider call — the routing policy + cost guard are live; the call is pending a CF AI Gateway + token + the shared orchestrator contract.
- ⛔ The full Figma-approved SaaS redesign — the current UI is an honest, functional dashboard; the cinematic redesign is awaiting design approval.
- ◐ Per-host private Git repos + encrypted backups (restic) — designed; not yet wired end-to-end.
The intended Desktop Tools bootstrap is shown below. It remains gated until the signed release, profile routing, device authorization, and canary tasks in the generated status are verified.
# interactive
curl -fsSL https://example.desktop.tools | bash
# fully unattended (privileged work requires explicit consent)
# First pass validates and persists the normalized plan, then prints its digest.
curl -fsSL https://example.desktop.tools | HEADLESS_INSTALL=true INSTALL_DOCTOR_CONSENT_PRIVILEGED=true bash
# After reviewing the persisted plan, approve that exact digest (never a moving "latest" plan).
curl -fsSL https://example.desktop.tools | HEADLESS_INSTALL=true INSTALL_DOCTOR_CONSENT_PRIVILEGED=true INSTALL_DOCTOR_APPROVED_PLAN_DIGEST=<sha256> bashKey environment variables in the existing installer compatibility layer (canonical
DESKTOP_TOOLS_* replacements land through explicit migrations rather than undocumented aliases):
| Variable | Description | Default |
|---|---|---|
START_REPO (or REPO) |
Git repo URL or GitHub user/repo to provision from |
heymegabyte/install.doctor |
HEADLESS_INSTALL |
Skip interactive prompts, use defaults | unset |
INSTALL_DOCTOR_CONSENT_PRIVILEGED |
Explicitly approve reviewed privileged plan nodes | false |
SOFTWARE_GROUP |
Basic / Server / Standard / Full |
Full |
SUDO_PASSWORD |
Password for automated passwordless-sudo setup | unset (30s prompt) |
CI / TEST_INSTALL |
CI mode with predefined test defaults | unset |
FULL_NAME / PRIMARY_EMAIL |
Identity for git config + tools | unset |
AGE_PASSWORD |
Passphrase to decrypt Age-encrypted secrets | unset |
DEBUG_MODE / KEEP_GOING / NO_RESTART |
Verbose / continue-on-error / no auto-reboot | unset |
The provisioner admits only exact tuples from the machine-readable
platform evidence matrix, which currently contains no
verified full-lifecycle cell. Some exact macOS, Ubuntu, Debian x64, Fedora, and Arch tuples are
consent-gated best-effort; this is not a promise for their wider OS families. Alpine, generic
Linux containers, Debian ARM64, Qubes, Silverblue, Proxmox, Coolify, WSL, and native Windows are
explicitly unsupported until each matrix remediation is satisfied. Reset a
broken chezmoi state with rm -rf ~/.config/chezmoi ~/.cache/chezmoi then re-run the bootstrap. See
the project CLAUDE.md for the full fleet/roles model.
| Path | What |
|---|---|
packages/control-plane/ |
Desktop Tools CF Worker foundation and compatibility routes. |
packages/aid-core/ |
Desktop Tools shared typed contracts. |
home/dot_config/shell/not-found-hook.sh |
The canonical lazy command-not-found installer. |
home/dot_local/bin/executable_desktop-tools · executable_desktop-tools-pair |
Canonical Desktop Tools client and pairing bootstrap. |
home/dot_local/bin/executable_aid · executable_aid-pair |
Deprecated behavior-free compatibility aliases. |
home/dot_local/bin/executable_cnf-build-index |
Builds the catalog index from software.yml. |
home/dot_local/bin/executable_installx |
The ZX software installer. |
software.yml |
The authoritative software catalog. |
home/.chezmoiscripts/ · home/dot_local/bin/post-installx/ |
Provisioning + first-run hooks. |
scripts/test-*.sh |
Test suites for the control plane, clients, installer, platform contracts, and docs. |
docs/desktop-tools/ |
Current product boundary and generated capability status. |
docs/aid/ |
Historical implementation research and compatibility-era ledgers. |
- Control plane:
cd packages/control-plane && npm ci && npm run deploy --(build check:npm run check). - Tests:
bash scripts/test-control-plane.sh(an explicit compatibility endpoint may be supplied for legacy live gates) ·bash scripts/test-command-not-found.sh·bash scripts/test-aid-client.sh·bash scripts/test-readme.sh. - Historical bounded-loop evidence remains under
docs/aid/; current product truth lives underdocs/desktop-tools/and the active OpenSpec change.
Contributions welcome via the issues page.
MIT licensed — see LICENSE. Copyright © 2020–2026
Megabyte LLC; maintained by Brian Zalewski.