Beetl reads two configs: a project config committed under .beetl/, and a
user config in your home directory that holds identity and never leaves your
machine. Every key is optional and has a default, so a fresh beetl init writes
a minimal file and everything below falls back to the values shown here.
Lives at .beetl/config.json or .beetl/config.toml.
beetl init asks which format to write; beetl adopt writes one into a
config-less (legacy) store. Exactly one config file may exist — Beetl never
resolves multiple by silent precedence, and a missing config is an error rather
than a silent revert to committed-mode defaults (both would be surprising for a
project that had chosen privacy). See Formats & discovery.
Controls what sensitive data is written and where. See the Privacy page
for the classification and scrub model.
Key
Type / values
Default
Meaning
mode
committed | private-split | local-only
committed
committed: sessions committed as-is. private-split: sensitive artifacts split into a gitignored *.private.json. local-only: the whole .beetl/ is gitignored.
redactPatterns
string[] (regex)
[]
Extra regexes redacted from session text, on top of the built-in secret detectors.
scrubPaths
boolean
false
Rewrite absolute filesystem paths to repo-relative before writing.
Opt into the cross-project global layer. Set by the beetl init prompt; non-interactive init leaves it false so nothing leaves a repo without a human choice.
Human identity lives in the user-level config at ~/.beetl/config.json, not
the project config — so it’s consistent across every repo and never committed.
beetl init establishes it on first run: it defaults username from
git config user.name and records your git emails so store entries can be
matched to commits.
{
"identity": {
"username": "mike",
"gitEmails": ["mikeweberbusiness@gmail.com"],
},
}
Key
Type
Default
Meaning
identity.username
string
—
Your handle, used in human:<username> actors. Optional.
identity.gitEmails
string[]
[]
Git author emails you commit under, used to attribute sessions to commits.
Beetl looks for config.json, then config.toml, under .beetl/. Both
formats parse to the same schema. YAML was accepted through v0.1 and dropped
in ADR-0011 — the parser was 39% of the shipped bundle, and TOML covers the
same ground.
Exactly one config must exist. Two or more is an error
(CONFIG_AMBIGUOUS) — Beetl will not pick one by precedence. Zero is an
error (CONFIG_MISSING) rather than a silent fallback to defaults; run
beetl adopt to write one explicitly.
A config.* file in an unsupported format (e.g. config.ini, or a
config.yaml left over from v0.1) is reported, with
beetl adopt --format <fmt> suggested to write a supported one. It is never
silently ignored — that would revert a local-only store to committed
defaults.