homebot.yml
homebot.yml
At the repo root. Every key is optional; unknown keys are errors, so typos
don’t fail silently. ai is reserved for a later version: it is accepted and
ignored. Must be .yml; a homebot.yaml gets a rename hint.
persona chooses homebot’s voice. name chooses an optional command name;
the two settings are independent. See Personas and
Naming your homebot. See Persona files
for local voices. Before adding persona: or name:,
update every machine that reads this repo to a build that has the persona
commands. An older build either rejects one or both keys, and so does its
background helper, or ignores persona: and stays neutral.
update chooses what the background helper does about new releases. Set it
only after every machine that reads this repo runs v0.1.0 or later and has
rerun homebot setup. See Install and update.
profiles:
default: workstation # used when `homebot unpack` gets no name
hosts:
laptop: workstation # per-hostname override
nas: server
autosave:
commit: daily # off | hourly | daily
push: true
exports: # refreshed by the helper about once a day
- name: brew
out: manifests/{os}/Brewfile
run: brew bundle dump --force --file={out} # {out} in run: the command writes the file
- name: apt
on: linux
out: manifests/linux/apt.txt
run: apt-mark showmanual | sort # no {out}: stdout is saved
profiles: [workstation] # optional: only hosts whose default profile is listed
- name: apt-repos
on: linux
out: manifests/linux/apt-repos # a folder: the command made one at {out}
run: homebot action apt-repos --export {out}
- name: apt # same name, another profile: its own list
on: linux
out: manifests/server/apt.txt
run: apt-mark showmanual | sort
profiles: [server]
triage:
watch: ["~/.config/*", "~/.*"] # entries end in /* or /.*
limits:
maxFileMB: 50 # commits with bigger files are refused
update: off # off | notify | auto; anything else loads as off, with a warning
persona: neatpik # optional; none selects neutral wording
name: homebot # optional; homebot means no other command name
Keys
| Key | Default | Notes |
|---|---|---|
profiles.default |
none | profile unpack uses with no argument |
profiles.hosts.<hostname> |
none | wins over default |
autosave.commit |
off |
hourly = at most every 50 min, daily = every 20 h. This repo: daily |
autosave.push |
false |
push after each sync. This repo: true |
exports |
none | this repo: brew, apt-repos, apt, flatpak for workstation hosts; apt-repos and apt into manifests/server/ for server hosts |
exports[].name |
homebot export <name>. Two exports may share a name when no machine can run both: their profiles (or on) don’t overlap. homebot export apt then runs this machine’s one |
|
exports[].out |
{os}, {host}, {arch} filled in. A file, or a folder when the command writes one at {out}; a folder is compared and replaced whole. Must stay inside the repo, also through symlinks and once the placeholders are filled in. Must not be, in any case, the repo itself, manifests/ itself, private/, or anything homebot or git own: autolink/ and its layers, manifests/profiles/, manifests/actions/, furniture/, homebot/, .git/, homebot.yml, decisions.yml, .gitignore or .gitattributes, or a path inside one of them. manifests/<name> is fine. An export never deletes a folder to write a file in its place, or a file to write a folder; it fails and says so. A symlink at out is replaced by the export, not followed. |
|
exports[].run |
skipped (not failed) when the tool isn’t installed. Runs from the repo root; homebot works in it even when it isn’t on PATH |
|
exports[].on |
all | linux or macos |
exports[].profiles |
all | limit to hosts on these profiles |
triage.watch |
~/.config/*, ~/.* |
where new things are looked for |
limits.maxFileMB |
50 |
a number above 0 |
update |
off |
off, notify or auto: how the helper treats new releases. Any other value (a typo, a bool, a list, a map) loads as off and prints a warning on every command that reads homebot.yml, naming the file and line; the warning goes to the debug log instead under homebot tidy --quiet. An empty update: means off with no warning. off makes no release requests in the background. notify lets the hourly helper check for a newer release about once a day and puts an update-available item in the inbox when there is one. auto does the same check and upgrades on its own, but only Homebrew cask and install-script installs, and only once a release has been out for 48 hours; other install methods get the inbox item with the command to run. homebot version --check says whether this copy is current and, when it isn’t, what auto would do on this machine. See Updates. |
persona |
neatpik |
A built-in or local persona ID; none turns the voice off. The ID is a lowercase ASCII letter followed by lowercase letters, digits or hyphens, at most 32 characters. An ID with invalid syntax, or a value that is not a string, is a config error that stops every command that reads homebot.yml, homebot persona use, persona list and a bare persona validate included (the last two still print what they can, then report it and exit 1), so fix the line by hand; a well-formed ID whose file is missing or unusable falls back to embedded Neatpik and adds persona_broken to the inbox. HOMEBOT_PERSONA takes precedence when nonempty. |
name |
homebot |
The command name for this home. homebot disables the extra name; other values use the persona ID syntax, with at least two characters, and are checked for reserved names and conflicts on this machine. Use homebot name to manage it. |
Voice and display environment
| Variable | Effect |
|---|---|
HOMEBOT_PERSONA |
Nonempty ID overrides persona: for the process. none means neutral; an empty value is unset. A bad choice falls back to Neatpik and warns once on a terminal. |
HOMEBOT_PLAIN=1 |
Neutral wording in the process, including the nudge and notifications it writes. Any value other than empty or 0 counts. homebot --plain <command> applies it to one run. |
HOMEBOT_THEME=light or dark |
Selects the palette; an invalid value is ignored. It does not change wording. |
NO_COLOR=1 |
Suppresses colour but keeps the selected voice. Any nonempty value has the same effect. |
link: is goneOlder versions had a link: section listing folders to keep real. Now the
folder’s name says it: wrap it in (). A link: key is an error that tells
you so. See Linking rules.
decisions.yml
Written by homebot triage when you answer “ignore”. Hand edits are fine.
Globs work.
ignore:
- "~/.cache"
- "~/.config/google-chrome*"
- "~/.zcompdump*"
Snoozes are per machine and live in $XDG_STATE_HOME/homebot/snooze.json, not here.
Generated key index
The index below follows the loader’s config.Keys table. It records each
key’s type, default, allowed values, description and release.
| Path | Type | Default | Values | Description | Since |
|---|---|---|---|---|---|
profiles |
object | Choose which profile each machine unpacks. | 0.1.0 | ||
profiles.default |
string | Profile used when a host has no entry. | 0.1.0 | ||
profiles.hosts |
map | {} | Map each host name to its profile. | 0.1.0 | |
triage |
object | Choose files the inbox offers to pack. | 0.1.0 | ||
triage.watch |
list | [~/.config/, ~/.] | Home-relative glob patterns to watch. | 0.1.0 | |
autosave |
object | Set the background save cadence and push behavior. | 0.1.0 | ||
autosave.commit |
string | off | off, hourly, daily | Commit automatically: off, hourly or daily. | 0.1.0 |
autosave.push |
bool | false | Push background commits when enabled. | 0.1.0 | |
exports |
list | [] | Programs that write files into the home repo. | 0.1.0 | |
exports[].name |
string | Name used to select an export. | 0.1.0 | ||
exports[].on |
list | [linux, macos] | linux, macos | Operating systems that run this export. | 0.1.0 |
exports[].out |
string | Repo-relative output path for the export. | 0.1.0 | ||
exports[].run |
string | Shell command that produces the export. | 0.1.0 | ||
exports[].profiles |
list | Profiles allowed to run this export. | 0.1.0 | ||
limits |
object | Size limits enforced by the commit guard. | 0.1.0 | ||
limits.maxFileMB |
number | 50 | Maximum file size in megabytes. | 0.1.0 | |
name |
string | Optional command name for this homebot. | 0.1.0 | ||
persona |
string | Optional persona id, or none for a neutral voice. | 0.1.0 | ||
update |
string | off | off, notify, auto | Release behavior: off, notify or auto. Automatic updates use a signed build after a soak period. | 0.1.0 |
ai |
any | Reserved for a future release; currently ignored. | future | ||