Configuration Reference
This page is a field-level reference for Homeboy configuration structures. For the higher-level system model and core/extension boundary, see Architecture Overview.
Configuration
ScopedExtensionConfig
version— Version constraint string (e.g., ">=2.0.0", "^1.0").settings— Settings passed to the extension at runtime.
GitDeployConfig
remotebranchpost_pull— Commands to run after git pull (e.g., "composer install", "npm run build")tag_pattern— Pull a specific tag instead of branch HEAD (e.g., "v{{version}}")
TestConfig
namedescriptiontagsextensions
HomeboyConfig
defaults— Built-in install, version-discovery, deploy, and permission defaults.bench— Benchmark execution policy.lab— Preferred runner and runner workspace retention policy.triage— Triage priority-label configuration.agent_task— Default backend, secret sources, provider rotation policy, and optional independently signed acceptance verification for agent-task dispatch.acceptance_verifieruses controller-ownedtrust: { kind: hmac_sha256, key_id, key_env }; Homeboy removeskey_envfrom the verifier subprocess, verifies its base64 HMAC-SHA-256 over the canonical verdict binding, and stores the signature plus key ID with the durable run record.notifications— Notification delivery policy for route-less completed operations.worktree_providers— External worktree lifecycle providers keyed by provider ID. A command provider that setscommands.listmust also setlist_result_mapping: JSONPath selectors foritems,handle,path,branch,dirty,unpushed, andprimary.itemsmust resolve to one array; each item selector must resolve to exactly one value of its required type (strings for handle/path/branch, booleans for safety values). Homeboy does not infer response envelopes or safety values. Purpose-owned callers requireenabled,apply_enabled,commands.ensure, andsettings.worktree_provider_lifecycle.<provider-id>.finalize. They can use argv-onlycommands.ensureplaceholders{purpose},{owner_run_ref}, and{cleanup_policy}; the lifecycle finalizer expands{handle},{purpose},{owner_run_ref},{cleanup_policy},{disposition}, and stable{idempotency_key}. Providers must deduplicate finalization effects by that key because a stale lease may retry the invocation; this is not process-level exactly-once fencing.github_hosts— Host-scoped environment forghsubprocesses, keyed by GitHub hostname. Component-levelgithub.hostsentries override these global defaults.settings— Generic extension and executor settings, addressed through/settings/....release_gate— Routing safety policy for release-gate hot commands.artifact_root— Optional directory where persisted run artifacts are copied. Override per command withhomeboy --artifact-root <dir>or per process withHOMEBOY_ARTIFACT_ROOT.cargo_target_root— Optional dedicated directory for reconstructable shared Cargo targets.HOMEBOY_CARGO_TARGET_ROOToverrides it for one process; the compatibility default is<HOMEBOY_DATA_DIR>/cargo-targets.retention— Bounded cleanup policy shared by terminal-run evidence and runtime resources.update_check— Enable automatic update check on startup (default: true). Disable withhomeboy config set /update_check falseor setHOMEBOY_NO_UPDATE_CHECK=1.resident_services— Long-running services to restart afterhomeboy upgradeswaps the on-disk binary.
Notification caller context can be supplied per process with
HOMEBOY_NOTIFICATION_TRANSPORT and HOMEBOY_NOTIFICATION_ROUTE; both are
required together. Explicit --notification-transport and
--notification-route CLI values take precedence over these environment
variables.
Storage Locations
Homeboy writes to two base directories, and three of its largest stores can be
relocated independently. An operator moving Homeboy onto a larger volume needs
all of these, not just the first — see homeboy cleanup retained-storage, which
probes every root listed here.
| Root | Default | Override | Holds |
|---|---|---|---|
| Config root | ~/.config/homeboy (%APPDATA%homeboy on Windows) | HOME / APPDATA only | homeboy.json, component/project/server/extension declarations, daemon/, rigs/, runner-sessions/, backups/, agent-runtimes/, preview-ingress/routes/ |
| Data root | $XDG_DATA_HOME/homeboy, else ~/.local/share/homeboy (%LOCALAPPDATA%homeboy on Windows) | HOMEBOY_DATA_DIR | homeboy.sqlite, artifacts/, cargo-targets/, controller-runtimes/, controller-scratch/, runtime/tmp/ |
| Artifact root | <data root>/artifacts | homeboy --artifact-root <dir>, HOMEBOY_ARTIFACT_ROOT, or config artifact_root | Persisted run artifacts |
| Shared Cargo target root | <data root>/cargo-targets | HOMEBOY_CARGO_TARGET_ROOT or config cargo_target_root | Reconstructable shared Cargo target directories |
| Runtime temp root | <data root>/runtime/tmp | HOMEBOY_RUNTIME_TMPDIR | Per-workload scratch, exported to every child process as TMPDIR/TMP/TEMP |
HOMEBOY_RUNTIME_TMPDIR is the highest-precedence runtime-temp setting and is
worth knowing about: the runtime temp root is what Homeboy exports as TMPDIR,
TMP, and TEMP to every child process it launches, so it absorbs build
intermediates from workloads such as cargo build. It is the fastest-growing
store on a busy controller. Before Homeboy 0.328 this root defaulted under the
config root, so HOMEBOY_DATA_DIR did not move it; it now defaults under
the data root, matching the resolution Homeboy has always used for remote
shell workloads. A runtime temp root left behind under the config root by an
older binary is drained automatically by homeboy cleanup --include runtime-tmp
(and by the aggregate homeboy cleanup) using the same ownership and retention
protocol as the active root — no flag required. That automatic drain is scoped
to default resolution: if HOMEBOY_RUNTIME_TMPDIR is set, that root is the only
one swept, and any residue under the config root is reported by
homeboy cleanup retained-storage.
BenchConfig
local_execution— Local benchmark execution policy:allowed(default) ordenied.
LabConfig
preferred_runner— Default Lab runner ID.runner_workspace_ttl— Optional workspace retention duration for runner materialization.
RetentionConfig
Every cleanup entry point — the aggregate homeboy cleanup --include <category>
and each category specialist — resolves these values through one shared policy
(homeboy_core::cleanup::resolve_cleanup_policy). A widened window here applies
everywhere; no command carries its own default. An unset command flag means
"use the configured value", and a negative window or non-positive limit is
rejected on every entry point rather than only on the ones that re-check their
own arguments.
terminal_run_days— Age threshold before terminal persisted-run artifacts are eligible for cleanup (default: 30). Active and unknown run states remain protected.runtime_tmp_days— Age threshold for Homeboy runtime temporary entries (default: 7).runtime_run_max_bytes— Maximum aggregate failed runtime-run evidence retained (default: 1 GiB).runtime_run_max_count— Maximum failed runtime-run directories retained (default: 100).limit— Maximum records inspected per cleanup invocation (default: 1000).controller_runtime_days— Age threshold before an unreferenced controller runtime identity is eligible (default: 30).controller_runtime_max_bytes— Byte budget above which unreferenced controller runtime identities are reclaimed regardless of age.shared_store_days— Age threshold for shared Cargo target stores.shared_store_max_bytes— Byte budget for shared Cargo target stores.shared_store_lease_seconds— Lease TTL that keeps an in-use shared Cargo target store alive.shared_store_reserve_bytes— Free bytes required on the shared Cargo target filesystem before a build starts (default: 5 GiB).shared_store_reserve_inodes— Free inodes required on the shared Cargo target filesystem before a build starts (default: 100000).reconstructable_artifact_days— Idle age required before automatic retention reclaims reconstructable per-worktree build artifacts (default: 7). Active task worktrees remain protected.reconstructable_artifact_reserve_bytes— Free-space reserve that enables early reconstructable-artifact retention under pressure;0disables pressure cleanup (default).automatic_retention_max_run_seconds— Cooperative wall-clock budget for one automatic pass (default: 60). The executor yields between stores; a category never interrupts an in-progress safe mutation.
Runner-side age floors are deliberately not configuration keys. Both the
runner Lab-workspace and managed-binary-cache floors live on a remote host whose
clock and in-flight uploads the controller cannot fully observe, so lowering
them stays an explicit per-invocation --min-age-hours argument instead of a
persisted default that would silently apply to every future sweep.
TriageConfig
priority_labels— Optional labels treated as priority during triage.
AgentTaskConfig
default_backend— Optional default agent-task backend.secrets— Secret sources keyed by secret name.rotation— Global provider rotation policy. Per-planoptions.rotationand per-taskmetadata.provider_rotationtake precedence.
AgentTaskSecretSource
source— Secret source kind; defaults toenv.env_varpathscopenamefieldvalue
NotificationConfig
default_transport— Optional installed extension transport used only when a completed operation has no persisted route.
ResidentServiceConfig
id— Stable service identifier used in upgrade result reporting.systemd_unit— Unit restarted withsystemctl restart <unit>when no explicit command is set.restart_command— Explicit restart command, overriding the systemd default.
WorktreeProviderConfig
enabled— Whether the provider is available; defaults totrue.kind— Provider kind. Current supported value:command.apply_enabled— Whether mutating provider operations are enabled.commands— Provider command argv arrays.list_result_mapping— Required projection contract whencommands.listis configured.
WorktreeProviderCommands
resolve— Targeted handle lookup. Configureresolve_not_found_exit_codeswhen the provider signals an absent handle with a non-zero status; all statuses not listed remain hard lookup failures.resolve_not_found_exit_codes— Provider-native statuses that meanresolvefound no matching handle.listensure— Atomic create-or-return-existing argv template. Homeboy invokes it only after an explicit typed provider no-match, expands{handle},{repo},{base},{head},{task_url}, and{idempotency_key}, and requiresapply_enabled: true.cleanup_previewcleanup_applyartifacts_previewartifacts_apply
WorktreeProviderListResultMapping
itemshandlepathbranchdirtyunpushedprimary
ReleaseGateConfig
local_hot— Policy for force-local or stale-runner fallback of release-gate hot commands:fail_closed(default) orallowed.HOMEBOY_RELEASE_GATE_LOCAL_HOToverrides this value for one process.
InstallMethodsConfig
homebrewcargosourcebinary
InstallMethodConfig
path_patternsupgrade_commandlist_command
VersionCandidateConfig
filepattern
DeployConfig
scp_flagsartifact_prefixdefault_ssh_port
PermissionsConfig
localremote
ProvidesConfig
file_extensions— File extensions this extension can process (e.g., ["php", "inc"]).capabilities— Capabilities this extension supports (e.g., ["fingerprint", "refactor"]).
ScriptsConfig
fingerprint— Script that extracts structural fingerprints from source files. Receives file content on stdin, outputs FileFingerprint JSON on stdout.refactor— Script that applies refactoring edits to source files. Receives edit instructions on stdin, outputs transformed content on stdout.
RequirementsConfig
extensionscomponents
DatabaseConfig
cli
DatabaseCliConfig
tables_commanddescribe_commandquery_command
CliHelpConfig
project_id_helpargs_helpexamples
CliConfig
tooldisplay_namecommand_templatedefault_cli_pathworking_dir_templatesettings_flagshelp
DiscoveryConfig
find_commandbase_path_transformdisplay_name_command
VersionPatternConfig
extensionpattern
SinceTagConfig
extensions— File extensions to scan (e.g., [".php"]).placeholder_pattern— Regex pattern matching placeholder versions in@sincetags. Default:0.0.0|NEXT|TBD|TODO|UNRELEASED|x.x.x
BuildConfig
artifact_extensionsscript_namescommand_templateextension_scriptpre_build_scriptartifact_pattern— Default artifact path pattern with template support. Supports: {component_id}, {local_path}cleanup_paths— Paths to clean up after successful deploy (e.g., node_modules, vendor, target)
ArtifactCleanupConfig
Extension manifest key: artifact_cleanup. Declares the reconstructable
install/build trees the extension owns so canonical homeboy cleanup artifacts
can inventory and reclaim them across managed worktrees. The extension declares
what is reconstructable and how to rehydrate it; Homeboy owns dry-run/apply,
path containment, age and liveness gating, Git safety, limits, and byte
accounting.
declarations— List ofArtifactCleanupDeclaration.
ArtifactCleanupDeclaration
id— Stable identifier, unique within the extension. Reported as the candidatekind.category— One ofdependencies,build_output,build_cache,release_asset. Only the first three are removal candidates;release_assetis inventoried and always preserved.path— Artifact path relative to each resolved install scope.scopes— List ofArtifactCleanupScope. Defaults to the worktree root.rehydrate_command— Operator-facing command that reinstalls or regenerates the artifact. Reported per worktree.min_age_days— Age floor before removal is allowed. Composes with--min-age-days; the stricter one wins.description— Retention/readiness tradeoff for this declaration.
ArtifactCleanupScope
manifest_files— Files that must all exist in a directory for it to count as an install scope. Empty resolves the worktree root unconditionally.nested— Resolve nested install scopes below the worktree root, not just the root.max_depth— Depth bound for nested discovery, relative to the worktree root. Defaults to6.
Nested discovery never descends into a directory that is itself a declared artifact path, so a nested scope rule cannot degrade into a recursive deletion glob.
LintConfig
extension_script
RuntimeConfig
runtime_type— Legacy UI/runtime hint (python/shell/cli). CLI ignores this field.run_command— Shell command to execute when running the extension. Template variables: {{entrypoint}}, {{args}}, {{extensionPath}}, plus project context vars.setup_command— Shell command to set up the extension (e.g., create venv, install deps).ready_check— Shell command to check if extension is ready. Exit 0 = ready.env— Environment variables to set when running the extension.entrypoint— Entry point file (used in template substitution).args— Default args template (used in template substitution).default_site— Default site for this extension (used by some CLI extensions).dependencies— Legacy UI/runtime hint for Python dependencies to install.playwright_browsers— Legacy UI/runtime hint for Playwright browsers to install.
InputConfig
idinput_typelabelplaceholderdefaultminmaxoptionsarg
OutputConfig
schemadisplayselectable
ActionConfig
idlabelaction_typeendpointmethodrequires_authpayloadcommandbuiltin— Legacy UI action type. CLI parses but does not execute.column— Column identifier for copy-column builtin action.
SettingConfig
idsetting_typelabelplaceholderdefault
RemoteFileConfig
pinned_files
RemoteLogConfig
pinned_logs
ApiConfig
enabledbase_urlauth
AuthConfig
headervariablesloginrefresh
AuthFlowConfig
endpointmethodbodystore
Manifests
ExtensionManifest
idnameversionprovidesscriptsicondescriptionauthorhomepagesource_urldeployauditexecutableplatformclibuildlinttestbenchactionshookssettingsrequiresextraextension_path