Configuration Reference¶
haven.toml¶
The top-level configuration file at the repo root. All sections are optional.
# haven.toml
[profile.default]
modules = ["shell", "git", "packages"]
[profile.work]
extends = "default"
modules = ["work", "secrets"]
[data]
work_email = "alice@corp.example"
kanata_path = "/usr/local/bin/kanata"
[security]
allow = [
"~/.config/gh/hosts.yml",
]
[vcs]
backend = "git" # or "jj"
[telemetry]
enabled = false
[profile.<name>]¶
Declares a profile — a named set of modules to apply.
| Field | Type | Description |
|---|---|---|
modules |
string array | Module names to activate for this profile. |
extends |
string | Parent profile name. Parent's modules are applied first. |
[data]¶
Custom variables available in all .tmpl files as {{ data.<key> }}.
Only flat string values are supported. Arrays and nested tables are not.
[security]¶
| Field | Type | Description |
|---|---|---|
allow |
string array | Glob patterns for files to skip in security scanning. Same syntax as config/ignore. |
[vcs]¶
| Field | Type | Description |
|---|---|---|
backend |
"git" or "jj" |
VCS backend for clone and init operations. |
[telemetry]¶
| Field | Type | Description |
|---|---|---|
enabled |
bool | Enable local telemetry logging to ~/.haven/telemetry.jsonl. Default: false. |
modules/<name>.toml¶
Per-module configuration. All sections are optional.
# modules/shell.toml
[homebrew]
brewfile = "brew/Brewfile.shell"
[mise]
config = "source/mise.toml"
requires_op = false
| Field | Type | Description |
|---|---|---|
[homebrew] brewfile |
string | Path to Brewfile, relative to repo root. |
[mise] config |
string | Path to mise config file, relative to repo root. |
requires_op |
bool | If true, skip brew/mise if op CLI is unavailable or not signed in. Default: false. |
ai/platforms.toml¶
Declares which AI agent platforms are active on this machine.
active = ["claude-code"]
[platform.claude-code]
skills_dir = "~/.claude/skills"
| Field | Description |
|---|---|
active |
Array of platform IDs to activate. |
[platform.<id>] skills_dir |
Directory where skills for this platform are deployed. |
Run haven ai discover to auto-generate this file by scanning installed platforms.
ai/config.toml¶
Optional file that configures the AI skill backend. All fields have defaults; the file can be omitted entirely.
# ai/config.toml
[skills]
backend = "native" # "native" | "agent-skills" | "akm"
runner = "skills" # binary name, path, or array (agent-skills backend only)
timeout_secs = 120 # subprocess timeout in seconds (agent-skills backend only)
| Field | Type | Default | Description |
|---|---|---|---|
backend |
string | "native" |
Skill backend to use. |
runner |
string or array | "skills" |
Binary (or program + args array) used to invoke agent-skills-cli. |
timeout_secs |
integer | 120 |
Timeout for agent-skills-cli subprocesses. |
Runner examples¶
# Global install (default)
runner = "skills"
# Custom path
runner = "/usr/local/bin/skills"
# Via bunx — no global install required
runner = ["bunx", "agent-skills-cli"]
# Via npx
runner = ["npx", "agent-skills-cli"]
Run haven ai backends to see which backends are available and which is active.
ai/skills/<name>/skill.toml¶
Declares a single AI skill.
source = "gh:anthropics/skills/pdf-processing@v1.0"
platforms = "all"
deploy = "symlink"
| Field | Type | Description |
|---|---|---|
source |
string | Skill source: gh:owner/repo[/subpath][@ref] or dir:~/path. |
platforms |
string or array | "all", "cross-client", or array of platform IDs. |
deploy |
"symlink" or "copy" |
Deploy method. Default: "symlink". |
config/ignore¶
gitignore-style patterns for files to exclude from apply, status, and diff.
# config/ignore
{% if os == "macos" %}
.DS_Store
{% endif %}
.ssh/id_*
.config/*/history
.local/share/some-app/**
!.local/share/some-app/keep-this
This file is a Tera template — evaluated at runtime on every command that loads it. If the template fails to render, haven warns and falls back to ignoring nothing.
Pattern rules¶
| Syntax | Matches |
|---|---|
# at start |
Comment (ignored) |
* |
Any non-/ characters |
** |
Any characters including / |
? |
Any single non-/ character |
! prefix |
Negate — un-ignores a previously matched path |
Pattern with no / |
Basename only |
Pattern with / |
Full path from home root |
haven.lock¶
Auto-generated. Records SHA256 hashes of all fetched external sources.
# haven.lock — auto-generated, do not edit by hand
[skill."gh:anthropics/skills/pdf-processing@v1.0"]
sha = "abc123def456..."
fetched_at = "2026-03-21T10:00:00Z"
Commit this file alongside your config. Run haven ai update to intentionally upgrade a skill and refresh its SHA.