Agent-readable docs index: /llms.txt. Full docs in one file: /llms-full.txt. Download /docs.zip to grep all markdown files locally.

Update the daemon or turn auto-update off

/v1/daemon/updatePOST
Without a body: reads the latest release from ghosthand.dev now and installs it in ~/Applications/Ghosthand.app when it is a newer build, even with auto-update off. It installs only while no lease is active, and the daemon restarts on it once idle. With auto: only saves the setting. Only over the unix socket; tunnel clients get 403.
Authorizationoptional
bearerAuth?Bearer <token>
Required on the tunnel. An API token of the account, from ghosthand tunnel url --new-token. The unix socket needs no token
Request Bodyapplication/json
auto?boolean
Turn auto-update on or off. Saved in the macOS defaults com.remorses.ghosthand AutoUpdate.
Response
200 · Update state after the check
auto *boolean
The daemon installs new releases by itself (default on)
latest?string
Build id of the latest release on ghosthand.dev. Absent before the first answer.
checkedAt?string (date-time)
When the latest release was last asked for
message *string
The update state in one line, e.g. up to date, downloaded, installed, or why it failed
Default · Error (RFC 9457 problem details). `code` is stable; switch on it, not on `title` or `detail`.
code *"invalid-request" | "unauthorized" | "not-found" | "device-not-found" | "no-device" | "multiple-devices" | "permission-denied" | "bluetooth-unavailable" | "bluetooth-disconnected" | "no-frame" | "device-locked" | "lock-failed" | "pairing-timeout" | "pointer-not-found" | "lock-state-unavailable" | "lockdown-unavailable" | "unlock-failed" | "mute-unconfirmed" | "text-not-found" | "wait-text-timeout" | "cancelled" | "lease-invalid" | "device-leased" | "recording-active" | "no-recording" | "recording-failed" | "daemon-busy" | "tunnel-offline" | "login-required" | "subscription-required" | "unsupported-in-mode" | "xctest-unavailable" | "task-failed" | "internal-error"
Stable error code. Switch on it; title and detail are for people.
title *string
Short summary of the code, the same for every error with this code
status *integer
HTTP status of the error. In stream mode the response status stays 200.
detail *string
What happened and what to do next. Agents should read it.
Request example
curl -X POST "https://ghosthand.dev/macs/studio/v1/daemon/update" \ -H "Authorization: Bearer <token>" \ -H "Content-Type: application/json" \ -d '{ "auto": true }'
Response example
{ "auto": true, "latest": "0.13.2+20261028101500", "checkedAt": "2026-10-28T10:20:00.000Z", "message": "0.13.2+20261028101500 installed; the daemon restarts on it once no lease is active" }