vX.Y.Z tag on the main branch. The updater hard-syncs the code to the release and rebuilds in place.
How the device decides an update exists
- Fetch tags from origin.
- Consider only tags matching
vX.Y.Z, newest first. - Offer the newest tag whose history contains the device’s current commit (a fast-forward). A device whose code has diverged from the release line sees no offer — see Divergence below.
- The “Installed” version is read from
package.json; OpenClaw’s target version comes from the pin fileconfig/openclaw-target.txt.
The update pipeline
Started from the System Update app (or Settings). Steps, in order — each privileged step runs as aclawbox-root-update@<step> systemd unit:
Key properties:
git clean -fd(no-x) — gitignored paths are never touched, which is what preservesdata/,.env,node_modules, and your state. See what survives.- The final step reboots the box. Expect ~1–2 minutes of unreachability; the UI reconnects and resumes progress reporting afterwards.
- After reboot, completion is only reported if the build fingerprint (
.next/BUILD_ID) actually changed and the rebuild unit succeeded — a failed rebuild surfaces as a failed step, not a silent “complete”.
Update channels
The channel is a one-line file:/home/clawbox/clawbox/.update-branch (absent = main).
main— stable releases. Default.beta— the integration branch, for early adopters and testing fixes ahead of release.
echo beta > /home/clawbox/clawbox/.update-branch. The pin survives updates and factory resets; clear it from the same UI or by deleting the file. All update mechanisms (UI, installer, recovery script) honor it.
Ways to update
Divergence (“Updates paused”)
If the device’s git history gains local commits (an on-box agent committing, manual edits), its HEAD is no longer an ancestor of any release tag → the updater has nothing safe to fast-forward to, and on stable releases the device silently reports “up to date” forever. On the beta channel (and the next stable release), this state is detected explicitly (ahead > 0 && behind > 0 vs the channel) and surfaced in the System Update app as:
Updates paused — this device is on a non-release branch with local changes (N commits ahead of main). Reset to main to resume updates.…with a one-click Reset to
<channel> & update button (confirmation-gated — it discards local code commits, keeps all data) that pins the channel and runs the normal update. The equivalent manual fix is the hard-sync in Recovery → Safe reinstall.

