Getting started
Upgrade
devmachine has three things that can be out of date: the CLI on your computer, the packages release your configuration pins, and the skills that teach your coding agent the CLI. One command brings all three up to date:
devmachine update
Then it checks your machines and shows what a sync would change. Nothing on a server changes until you say yes.
What you see
$ devmachine update
==> 1/5 CLI
0.7.17 → v0.7.18
upgrading through Homebrew
...
starting the new version for the remaining steps
==> 1/5 CLI
updated: 0.7.17 → 0.7.18
==> 2/5 Packages
packages v16 → v17
updated: v16 → v17
==> 3/5 Skills
use-devmachine from packages v17 for claude
updated: 1 filesystem change(s)
==> 4/5 Doctor
machine main:
pass configuration machine "main", 1 address(es), admin root, port 22, 1 workspace(s)
pass host key SHA256:... at 203.0.113.10
pass connection connected through 203.0.113.10
...
ok: 1 machine(s)
==> 5/5 Sync check
main: 3 change(s) would be made
~ zsh : Install zsh
~ workspace : Create the account
~ workspace : Write the SSH keys
Apply these changes with sync? [y/N]: n
Nothing was applied. To apply it later:
devmachine sync
skipped: not applied; run `devmachine sync`
Summary
cli updated (0.7.17 → 0.7.18)
packages updated (v16 → v17)
skills updated (1 filesystem change(s))
doctor ok (1 machine(s))
sync skipped (not applied; run `devmachine sync`)
The five steps:
- The CLI. With Homebrew, through
brew upgrade; otherwise from the release archive, checked against its published checksum. The new version then runs the other steps. - The packages. Pins the newest release when yours is older — see the
releases page for
what changed. Only
config.ymlchanges. - The skills. Refreshes every skill your coding agents use, from the release just pinned. Skills only affect new sessions; one already running keeps what it loaded at the start.
- Doctor. Checks every machine. A problem is shown and does not stop the update; a machine it cannot reach skips the last step.
- Sync check. A dry run on every machine it reached, listing what would
change, then one question. Answer
yto apply it now.
With more than one machine, --machine <name> limits steps 4 and 5 to that
one. --skip-cli and --skip-packages leave those alone. --yes answers
the question for you — only for automation you trust to change servers.
--cli-only updates the CLI and stops there: nothing else is read or
changed. The Devmachine app’s “Update CLI” button runs it.
--no-machines updates the CLI, the packages pin and the skills, and stops
before doctor and the sync check: your computer only, no question.
Without a terminal (a cron job, a pipe) update never asks and never
applies: it prints the sync command to run later. How and why each step
works: Updating. Every flag:
update.
Knowing when to update
When you upgrade the CLI with brew upgrade or the app, the packages pin
stays where it was. After sync, doctor, machines list and
workspaces list, a line says when a newer packages release is out, at
most once a day:
packages v33 is out (you pin v32): run devmachine update
devmachine packages outdated answers the same question on demand.
DEVMACHINE_NO_UPDATE_HINT=1 turns the line off.
devmachine doctor warns when the CLI or the packages pin is behind:
warn cli this is 0.7.17, and v0.7.18 is out: run `devmachine update`
warn packages pin pinned v16, and v17 is out: run `devmachine update`
By hand
update only runs commands you can run yourself, one at a time:
brew update && brew upgrade mydevmachine/tap/devmachine # or: curl -fsSL https://mydevmachine.sh/install.sh | sh
devmachine packages pin
devmachine skills update
devmachine doctor
devmachine sync --check
devmachine sync
With more than one machine, add --machine <name> to sync; doctor checks
every machine unless you name one.
The lock file records exactly which package release each machine is running,
so sync --check always compares against what is really there, not against
what you last typed.
Adding the essentials to an older machine
A machine set up before the essentials package existed has none of it:
base, git, firewall, ssh_hardening, caddy, devmachine-app. Add it without
rebuilding anything — what is already installed stays as it is:
devmachine update
devmachine packages add essentials
devmachine sync
If you like, check the server’s identity first
devmachine machines trust <name> --check
compares the SSH host key devmachine expects against the one the server
presents, without writing anything. Read the status it prints
(matching, changed or missing); it exits 0 either way. Worth running before a sync you are
not fully expecting, on a server you have not touched in a while.
Nothing changes on a server until you run sync
update (when you answer no), packages pin, packages add, and
workspaces edit all edit config.yml only. The server keeps running
exactly what it was running until devmachine sync applies the change — so
pinning a new package release today and running sync next week is fine;
nothing happens in between.
Source: devmachine releases, packages releases