Moving over from Heinzel
Hostwarden is a new clone, not an update of your Heinzel checkout. Your state moves with the backup script, which both projects share:
cd /path/to/heinzel && bin/heinzel-backup
cd /path/to/hostwarden && \
bin/hostwarden-backup --restore /path/to/heinzel-backup-<host>-<ts>.tar.gz
bin/hostwarden-migrate
The migration renames skill overrides in memory/custom-rules/ from
heinzel-<skill>.md to hostwarden-<skill>.md.
What changed
- Environment variables are now
HOSTWARDEN_*.HEINZEL_NO_UPDATEstill works; the guard only honoursHOSTWARDEN_GUARD_DISABLE. - New journal entries on your servers use the tag
hostwarden. The activity check readsheinzelentries as well, so earlier work stays visible. - SSH sockets live in
~/.cache/hostwarden. - Heinzel's version tags are not carried over.
--pinonly knows Hostwarden releases.
Taking over your memory
❯ My Heinzel is in ~/heinzel, take it over.
Point Hostwarden at your old checkout, or run
/hostwarden-heinzel-takeover ~/heinzel in Claude Code. The copy
itself is a script — bin/hostwarden-heinzel-takeover <path> moves
access lists, overrides, the host keys in memory/known_hosts and
every server's memory across and renames what is found by name.
Heinzel's memory of a host arrives as heinzel-memory.md, unchanged,
until the host's onboarding splits it up; the workspace's history
keeps the original. A user.md you already have gains the lines it
lacks, and a value the two set differently is shown to you, not
chosen. Whatever else your old memory/ holds — Claude's
auto-memory from Heinzel sessions, notes — is sorted item by item
into overrides, decisions, the network notes or a host's memory,
with one question. The skill then reads it and the changelogs into a
per-host list of leads: the scripts, configs, units and cron jobs
your sessions improvised, and asks whether those should get
Hostwarden's names on the servers too: rename, keep, or decide per
host. None of that contacts a server.
Host keys come from memory/known_hosts
(Host keys).
bin/hostwarden-heinzel-takeover copies the host keys your Heinzel
checkout kept there. Without them, each host's key is imported from
the known_hosts files your own ssh reads, such as
~/.ssh/known_hosts, on its first connection.
Files your sessions wrote
The copies your Heinzel sessions kept of the files they wrote onto
servers — a scripts/ directory under a host, a tool at the top of
memory/, wherever they ended up — are always rebuilt into
masters: each file at its
host path under the host's files/, one deployed to several hosts
under memory/fleet/, workstation scripts in memory/tools/, open
plans in memory/plans/, evidence in the host's notes/. A file
with credentials stays in the old checkout. Each master is recorded
as unverified until the host's first connection compares it; where
the host's file differs, the host's version becomes the master and
Heinzel's copy is kept in the host's notes/.
Onboarding each host
Then, unless you choose "only copy", the skill onboards each host the
way a first connection would have: read-only, host by host. It
writes the host's memory in Hostwarden's form from what it finds,
with your notes carried over, offers your earlier decisions as
decision records, runs the network profile, checks the leads, and on
a hypervisor inventories and registers the guests — and takes over
the guests still in your Heinzel checkout together with it, if you
say so. It ends with what each host lacks against the baseline and
asks which to take on first. With "only copy", the first connection
to each host does the same later, or /hostwarden-onboard <host>
when you choose.
Keeping Heinzel around
Keeping Heinzel around during the switch?
contrib/heinzel-coexistence/ holds three overrides for your
Heinzel checkout so it reads both journal tags, treats its server
memory as a lead rather than a fact, and leaves Hostwarden's files
alone. Hostwarden warns in the other direction when a Heinzel
journal entry is minutes old, and leaves a host alone that Heinzel
still uses. A script your Heinzel sessions left that logs under
heinzel counts as neither: it is reported as a watcher and offered
a tag of its own.
What Heinzel left on your servers
On the first connection to a host, Hostwarden reports what Heinzel
left there — config backups, scratch directories, and the scripts,
units, cron files and config directories your sessions created — and
offers to move it under the new name. It asks first, and it says
which old backups the retention cleanup would then delete. On a
hypervisor whose guests it registers, it asks once for the host and
the guests together; a guest answered with "take over" is moved on
its next connection that may change it, after one more question. New
config backups go to /var/backups/hostwarden/, or the directory an
appliance's rules name.
Renaming a script or unit also rewrites every reference to it on that host. Hostwarden keeps a rename map and backups to go back by, and checks on a later connection that each job ran under its new name.
Scheduled runs and headless Heinzel
Scheduled runs (cron, systemd timers) need the new path and script names.
Heinzel running headless on a machine of its own, reading your servers through a forced-command wrapper, is reported as such and left running. Hostwarden offers to set up its own operations host and fleet read beside it, one asked step at a time; you stop Heinzel's timers and remove its key lines when the new run has proved itself, and only then is the old wrapper removed from your servers.