grithdocs

Configuration overview

Where grith reads config from, the file format, and the top-level sections.

grith is configured by TOML. The shipping defaults live in config/default.toml inside the grith repo, and that file is the source of truth for this reference.

Precedence

When grith starts, configuration values are layered from highest priority to lowest:

  1. CLI flags (--config, --log-level, --project, etc.)
  2. Environment variables prefixed GRITH_ (e.g. GRITH_LOG_LEVEL=debug)
  3. Project-local config at .grith/config.toml
  4. User config at ~/.config/grith/config.toml
  5. Built-in defaults from config/default.toml

A value set at a higher layer fully overrides the same key at a lower one. There is no deep-merge for arrays: an array reassignment replaces the whole array.

Top-level sections

[general]

KeyTypeDefaultDescription
audit_dirstring"~/.local/share/grith/audit"-
audit_syncbooleantrueset to false to keep audit records local-only; license checks still use grith.ai
log_levelstring"info"-
plan_tierstring"community""community", "pro", or "enterprise"

[proxy]

KeyTypeDefaultDescription
auto_allow_thresholdfloat3-
auto_deny_thresholdfloat8-
review_timeout_secondsinteger300auto-deny queued calls after 5 minutes

[reputation]

KeyTypeDefaultDescription
auto_allow_min_observationsinteger8-
auto_allow_trustfloat0.92-
ceiling_filter_thresholdfloat5-
decay_lambdafloat0.98-
deny_weightfloat3-
enabledbooleantrue-
max_auto_allow_raw_scorefloat7-
max_score_reductionfloat4-
save_interval_secondsinteger300-

[digest]

KeyTypeDefaultDescription
deliverystring"cli"-
interval_activestring"30m"-
interval_idlestring"24h"-
max_queue_sizeinteger100-

[supervisor]

KeyTypeDefaultDescription
attach_modestring"traceme"Linux attach mechanism: "traceme" (shipped) | "seize" (work in progress — selecting it currently aborts with a clear error). See work/futurework/ptrace-seize-migration.md.
authority_lost_terminate_after_secondsinteger0Seconds to keep running after the daemon stops accounting for this session (it answered a heartbeat with "I am not tracking you" — usually because it restarted while at its session cap). 0 = never terminate: the session keeps running with a loud warning and you decide. Terminating by default would destroy in-progress agent work over a daemon-side event you did not cause. Set a positive value in CI, where nobody is watching the warning.
default_profilestring"generic"-
enabledbooleantrue-
freeze_timeout_secondsinteger300-
max_concurrent_sessionsinteger4-
pty_forwardingbooleantrue-
pty_ownership_enforcebooleanfalseH2 Option 1 (IPC-delegated authority): enforce PTY ownership. When false (default), writes to a /dev/pts/N that is NOT the supervised tool's own controlling terminal are detected and forensically logged (event = "foreign_pts_write") but still allowed — audit-only, to measure the false-positive budget. Set true to DENY them (the `echo cmd > /dev/pts/<other pane>` IPC-injection vector). See work/futurework/ipc-delegated-authority-escape.md.
require_sandboxbooleanfalse-

[server]

KeyTypeDefaultDescription
auto_open_dashboardbooleantrueOpen the dashboard in your browser on startup, handing off the auth token via the URL fragment (never printed to the terminal). Auto-skipped on headless/SSH sessions. When false or unavailable, the CLI prints a single-use pairing URL instead. Override per-run with GRITH_AUTO_OPEN_DASHBOARD=0.
dashboard_dirstring"dashboard/dist"-
enabledbooleantrue-
hoststring"127.0.0.1"-
portinteger3141-

Each section above has further nested sub-sections (e.g. [proxy.filters.reputation], [supervisor.platform], [server.rate_limit]). Browse the per-section pages from the sidebar for the full nested tree.

Reloading

[server] enabled = true exposes PUT /config over the local API. The dashboard, the CLI's grith config set, and direct curl all route through that endpoint. Most config changes apply on the next call; some (e.g. server port) require a daemon restart.

See also

Last updated: 2026-05-14Edit this page on GitHub →