After the install
This page picks up where each install page ends. It shows what the install put where, how to move to a later release, and takes you to the steward and your first crew. It also covers backups.
What the install put where
This table is for reference, and you do not need to learn it. It tells you where to look when you want to read, edit or back up something Builder made.
| path | what it is |
|---|---|
~/builder |
everything Builder owns: one folder per crew |
~/builder/steward/CLAUDE.md |
the steward's charter, which is its instructions and yours to edit |
~/builder/knowledge |
your knowledge repository, which holds the Reference Room, starting with Builder's starter set: four agents, their instructions, a default profile and the agent policy |
~/.claude/CLAUDE.md |
the machine-wide instructions every session reads at start, placed only when you have none, since an existing one is never replaced |
~/.claude/skills |
the skills: new-crew, new-subcrew, take-upstream and write-bead, and the writing passes write-better and talk-better |
~/.claude/settings.json |
your Claude Code settings, to which the install adds one hook that tells a starting session when the backup is stale, and changes nothing else |
~/.local/deploy |
the installed copy of each repository, which is what runs |
~/.local/bin |
eleven commands, including co, which starts a crew's session, and builder-backup |
~/.local/state/builder-backup |
your backups: the latest, the one before it, and every blob either has held |
~/.config/systemd/user on Linux, ~/Library/LaunchAgents on a Mac |
the background services |
~/.local/state |
the services' logs |
~/.local/state/library |
the Library's database, and the two files listing the credentials it accepts |
~/.orient-control |
Orient's database, its two Library credentials, library-token and library-client-token, the work-queue tools' credential, ops-mcp-token, and the credential reviewers post their records with, agent-platform-token |
The four credential files are secrets, as are api-tokens.json, client-tokens.json and
bosun-client-token in ~/.local/state/library. Only your account and anyone with administrator
rights on the machine can read them; on a test Mac each was mode 600, a permission setting that
keeps other ordinary accounts out, in a folder other ordinary accounts cannot open. Check yours with
ls -l ~/.orient-control ~/.local/state/library: each credential file should read -rw-------.
Each of the four tokens in ~/.orient-control is one the install generated on this machine, and the
Library accepts it because the install also recorded it in ~/.local/state/library. Nothing copied
a credential from anywhere else.
To check that the Library accepts each one, run the four lines below. Each reads one credential file and asks the Library, at an address on this machine, whose credential it is:
printf 'Authorization: Bearer %s\n' "$(cat ~/.orient-control/library-token)" | curl -s -H "Library-Protocol: 1" -H @- http://127.0.0.1:8100/whoami
printf 'Authorization: Bearer %s\n' "$(cat ~/.orient-control/library-client-token)" | curl -s -H "Library-Protocol: 1" -H @- http://127.0.0.1:8100/whoami
printf 'Authorization: Bearer %s\n' "$(cat ~/.orient-control/ops-mcp-token)" | curl -s -H "Library-Protocol: 1" -H @- http://127.0.0.1:8100/whoami
printf 'Authorization: Bearer %s\n' "$(cat ~/.orient-control/agent-platform-token)" | curl -s -H "Library-Protocol: 1" -H @- http://127.0.0.1:8100/whoami
The token goes to curl on its input rather than as an argument, so it never appears in the
process list another account on the machine can read.
They answer with "actor":"orient","kind":"agent", "actor":"orient","kind":"approved_client",
"actor":"ops-mcp","kind":"agent" and "actor":"agent-platform","kind":"agent", each followed by
what that credential may do. The last one's list includes review_record.create. An answer of no
resolvable identity means the Library does not know that token; a missing credential
file shows how
to replace one.
Your clones in ~/src are separate from what runs. The install copies each repository from its
stable branch into ~/.local/deploy, since that is what you cloned, so you can edit or switch
branches in ~/src without changing what is running.
To see what is installed, and whether it is current:
python3 ~/src/shipwright/bin/stand-up-backend --shape single --status
Moving to a later release
Builder has no updater yet. To move to a later release, pull stable in each of the five released
clones first:
git -C ~/src/shipwright pull --ff-only origin stable
git -C ~/src/agent-platform pull --ff-only origin stable
git -C ~/src/library pull --ff-only origin stable
git -C ~/src/convivy-orient pull --ff-only origin stable
git -C ~/src/convivy-deck pull --ff-only origin stable
git -C ~/src/write-better pull --ff-only origin main
write-better has no stable branch, so the last line pulls its own main. Then run
install-payload and stand-up-backend again, as your install page gives them.
Running install-payload from a newer release also brings the starter set in your knowledge
repository up to that release, when the repository's remote is a folder on this machine, as the one
the install made is. A knowledge repository whose remote is hosted, on GitHub or elsewhere, is left
alone, and the install says so. The update leaves any document you changed as you have it and hands
Builder's version to the steward. Customizing
Builder says what it does to each document. To see
what an update would change before it changes anything, run install-payload with --dry-run
first.
Updating the rest of what runs, the backend and its services, has not been tested yet.
Meet the steward
With the server installed, open Deck on your Mac laptop and add the server to it. Install Deck with the same command, run on the laptop instead, if you have not already:
curl -fsSL https://convivybuilder.org/install.sh | sh -s -- --role laptop
In Deck, press ⌘, to open Settings, click the Hosts tab, then the + button. Fill in the server's Name:, User: and Address: — or pick it from Deck's list of machines on your Tailnet, if it offers one — then click Pair this Mac….
Deck shows the server's host key fingerprint, a line starting SHA256:. The server's install
printed the one to expect as it finished, after "When Deck asks you to trust the machine, check
that it shows exactly:", along with the address and user to fill in. If that output is gone, run
this on the server to print it again:
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
Click Trust once the two match.
On a Mac server, the file is the same. A fingerprint that does not match means Deck reached some other machine, so do not trust it. Click Cancel, check the server's Address: for a typo and that the laptop is on the network you expect, and pair again; cancelling and retrying is always safe. If the fingerprints still differ, stop and find out why before going further.
Once you click Trust, Deck asks for the account's password once, in a Password field, and sends it over the connection you just checked. Deck uses it to install the laptop's own key on the server's account, so a later connection needs no password. Enter it and click Install Key.
Back in the Add Host sheet, click Add. Once the server is reachable and holds no crew yet, Deck
creates the steward and shows it on the rail, with a note reading "Steward crew created on
"
These steps have not been rehearsed end to end — see What works and what does not yet.
If Deck cannot reach the server, meet the steward by hand instead. On the server:
cd ~/builder/steward
claude
The first line moves into the steward's folder, and the second starts Claude there; the conversation that opens is the steward.
Your first crew
When the steward creates a crew, three things appear:
- a folder,
~/builder/<crew>, where the crew's work lives, set up with the starter agents; - a
tmuxsession with the crew's name, where the crew's own Claude session runs as its crew orchestrator, started byco; - a file under
~/.config/convivy/deck/crews.d/that Deck reads. Deck is a Mac app, so on a Linux machine the file waits for a Mac to read it.
To watch or talk to the crew, attach to its session, putting the crew's name in place of <crew>:
tmux attach -t <crew>
You will see the crew's conversation with Claude, and you can type into it. To step away, press
Ctrl-b then d, which leaves the session running.
A new crew's session waits for you before it starts. Claude Code asks whether to trust the
crew's folder, once for each crew. On your first crew it also asks whether to accept
bypass-permissions mode, once for the account, because co starts every crew in that mode, where a
session runs commands without asking you first. These are yours to answer, and the steward leaves
them to you: attach to the crew's session and answer there.
The steward may tell you the crew's registration is incomplete. That check still looks for settings Builder no longer uses, and its fix is under way; the crew's session works regardless.
Backups
You do not have to set backups up. Every six hours, starting when it first runs, the install backs
up the Library's database, which holds the work queue; the Library's cold store,
~/.local/state/library/cold.db, where a job moves older signals every six hours; Orient's
database, ~/.orient-control/control.db; the Library's blobs, which are the files it keeps outside
its database; and your knowledge repository. It does not back up your crews' folders under
~/builder/<crew>, your projects registry or Deck's list of crews, so keep a copy of those
yourself, for example by pushing each crew's work to its own remote. Each backup is checked before
it counts. Each copied database has to pass SQLite's integrity check and hold the same number of
rows as the database it came from, before Orient's push subscriptions are removed from its copy, and
the copy of the knowledge repository has to pass git bundle verify. Credentials and TLS keys, the
keys that secure the backend's encrypted connections, are left out, because a new install makes its
own. So are Orient's web-push subscriptions, one for each browser you let Orient notify, because
none would work after a restore: a new install makes its own notification key.
The backups stay on this machine, in ~/.local/state/builder-backup. Your machine's own backups,
such as a VM snapshot, are what carry them off it.
To take one now, before a reboot for instance:
builder-backup
It prints what it copied and ends with bundle verified. To see when the last one succeeded:
builder-backup --status
That prints ok with the time, or STALE when no backup has succeeded in the last 24 hours, and
then exits 1. When a run fails, --status also prints the reason.
You will hear about a stale backup without asking. Each Claude Code session runs the same check as
it starts or resumes, through a hook the install added to ~/.claude/settings.json, and says
nothing while the backup is fresh. When it is stale, the session shows the STALE line and tells
you about it before anything else.
Restoring onto a new install
Use these steps when a machine is lost or replaced and you want the Library and your Reference Room back on a new one. Your crews' folders and your projects registry come back from wherever you kept them. In outline, you stop Builder's services, put the backed-up databases and knowledge repository in place, force-push the restored knowledge repository to its remote, and run the install again.
Run this only on a new install. It replaces the new machine's database and knowledge repository
with the backup's, and anything written on that machine since its install is gone. The force push
also replaces main on the knowledge repository's remote, so if that remote is hosted, for example
on GitHub, anything pushed there since the backup is gone too.
git -C ~/builder/knowledge remote -v shows which remote that is. On a fresh install it is
~/builder/.remotes/knowledge.git, and if it names anything else, stop and decide whether you mean
to replace that remote's main before you run the push.
These steps have been run on Linux only; on a Mac the services are launchd jobs, and systemctl
does not exist. Install Builder on the new machine as Installing Builder describes, then copy the backup's
latest folder to it, here as ~/restore. Copy the backup's blobs folder too: it sits beside
latest in ~/.local/state/builder-backup, not inside it, and holds the files the Library's
records point at. Then:
systemctl --user stop com.convivy.library.service com.convivy.orient.service com.convivy.knowledge-watcher.service
systemctl --user stop com.convivy.library.cold-tier.timer com.convivy.knowledge-autopull.timer com.convivy.builder-backup.timer
install -m 600 ~/restore/library.db ~/.local/state/library/library.db
rm -f ~/.local/state/library/library.db-wal ~/.local/state/library/library.db-shm
install -m 600 ~/restore/cold.db ~/.local/state/library/cold.db
rm -f ~/.local/state/library/cold.db-wal ~/.local/state/library/cold.db-shm
install -m 600 ~/restore/orient-control.db ~/.orient-control/control.db
rm -f ~/.orient-control/control.db-wal ~/.orient-control/control.db-shm
git -C ~/builder/knowledge fetch ~/restore/knowledge.bundle main:refs/remotes/backup/main
git -C ~/builder/knowledge reset --hard backup/main
git -C ~/builder/knowledge push --force origin main
python3 ~/src/shipwright/bin/stand-up-backend --shape single --seed-registry --activate
agentctl kb sync
The second line stops the three timed jobs that would otherwise open the database, pull into the
knowledge repository or start a backup partway through the restore. stand-up-backend starts them
again.
install -m 600 copies each database readable by your account alone, which cp does not
guarantee for a file it creates.
Copy the contents of the backup's blobs folder into ~/.local/state/library/blobs/ before the
stand-up-backend line. Without them, the restored Library's records point at files that are not
there. Put your saved projects registry back at
~/.local/deploy/agent-platform/config/projects.json before that line too: the install keeps the
registry it finds there, and without one it starts again from Builder's seed, which lists none of
your crews.
The restore brings back the knowledge repository's main branch, which is what the Reference Room
serves. stand-up-backend brings the restored database up to the installed Library's version and
starts the services again. agentctl kb sync ends with up to date at <commit>, naming the last commit in the
backup. In a rehearsal on two Debian machines, a backup taken on the first was restored onto a fresh
install on the second, and every line above exited 0 there. A document and a work item created before the backup, with a comment on the work
item, read back the same after the restore through a session's kb_get and issue_get, and
Builder's services were running again. The crew's folder came back from the copy kept in its own
remote, and its program ran.
Orient can stop once and start again during the stand-up-backend line, with preflight FAILED
in ~/.local/state/orient.log, because it starts while the Library is still starting. A later
preflight ok in that log means it recovered.
Removing Builder
This covers the single-account install this page describes. Builder has no uninstaller yet for the two- and three-account shapes.
python3 ~/src/shipwright/bin/uninstall-builder --dry-run
python3 ~/src/shipwright/bin/uninstall-builder
The first line lists what it would remove and changes nothing. The second stops and removes Builder's
background jobs, the deploy areas under ~/.local/deploy, the linked commands and skills, the MCP
registrations, the one hook it added to ~/.claude/settings.json, and the rest of Builder's state
under ~/.local/state. It removes only what an install placed; a file or link it did not make stays,
and the closing report names it and says why.
It asks before removing the Library's store and your backups, since they hold your work: the work
queue, the Library's own copy of what it has indexed, and every backup builder-backup has taken.
Answer no, or pass --keep-data, to keep them without being asked. Neither your crews under
~/builder, your knowledge repository, the steward's charter, nor the operator config under
~/.config/convivy are touched; they are yours, not the install's.
Next
Getting started describes a first week with the steward. What works and what does not yet lists what 0.6.0 has been seen doing, and what it cannot do yet.