Settings reference
Every configuration key, where it lives, and what it does. For the friendly tour see settings; the design rationale is in plan/0005.
Files and precedence
| layer | file | committed? |
|---|---|---|
| repo | env.toml (env repo root) |
yes |
| user | ~/.config/gripsack/config.toml |
no |
Precedence, later wins: built-in defaults < user config < repo
env.toml < environment variables < CLI flags. Configuration is pure
data and is always read before module evaluation.
[env] — env.toml only
| key | type | default | what |
|---|---|---|---|
name |
string | — | human name for the env (used in output) |
default_host |
string | — | the host entrypoint when no --host is given and the machine's hostname matches nothing in hosts/ — role-named host files for ephemeral containers with random hostnames. An unmatched host with a non-empty hosts/ is an error, not silently-empty tags |
frontend is gone (0013): TypeScript is the only frontend and needs
no declaration — hosts/*.ts and modules/*.ts are it. A stale
frontend = "python" fails with a migration hint, not a mystery.
[eval] — env.toml only
| key | type | default | what |
|---|---|---|---|
env |
string map | {} |
build-time environment injected into the apply process for the run's duration — build steps, fetchers, and plugins inherit it (SSL_CERT_FILE is the canonical case). The sandboxed eval sees none of it |
[fetchers.<name>] — env.toml or user config
| key | type | default | what |
|---|---|---|---|
plugin |
string | — | fetcher plugin for this source; default discovery is gripfetch-<name> on PATH |
package |
string | — | provision the fetcher from a GitHub release: owner/repo@tag. grip manages the lifecycle — downloaded at eval, sha256-verified against the mandatory sidecar asset, receipted into $GRIPSACK_HOME/plugins/; the tag is the pin. Mutually exclusive with plugin |
The same form works for linter plugins: [linters.<name>] package =
"owner/repo@tag" provisions an executable griplint-<name> —
sha256-verified, receipted, exactly like a fetcher. A fresh install
prints its source — a new plugin runs with your user rights.
Repo entries override user entries of the same name.
[throttle] — env.toml only
Rate budgets per domain, as "domain" = "N/unit" (units: s, min,
hr). The engine runs a token bucket per domain and blocks until a
token is available; bucket state persists in
$GRIPSACK_HOME/throttle.json, so back-to-back applies share one
budget.
[throttle]
"api.github.com" = "30/min"
Precedence: built-in defaults for the internal fetchers' registries
(api.github.com, ghcr.io, formulae.brew.sh) < budgets declared
by a fetcher via the capabilities op < [throttle] here. Downloads
from release CDNs are not throttled — rate limits live on API
endpoints.
[settings] — env.toml or user config
| key | type | default | what |
|---|---|---|---|
keep_generations |
integer | ∞ | generations retained before grip gc reclaims store paths |
Environment variables
| var | what |
|---|---|
GRIPSACK_HOME |
base directory for store, generations, and the current symlink (default: $XDG_DATA_HOME/gripsack or ~/.local/share/gripsack) |
GRIPSACK_BIN |
path to the grip binary (used by the e2e harness) |
GRIPSACK_DENO |
bring-your-own eval runtime: a deno binary — wins over a deno on PATH and the pinned provisioned download |
GRIPSACK_TRUST_ALL |
=1 skips the repo trust prompt before eval — the CI escape hatch |
SSL_CERT_FILE |
the corporate CA bundle — grip's rustls-based fetching honors it and the tools grip spawns inherit it, so TLS-intercepting proxies verify; set it before invoking grip |
HTTPS_PROXY / NO_PROXY |
corporate proxy support; the system CA roots are trusted |
XDG_DATA_HOME |
honored for the default GRIPSACK_HOME |
CLI surface
grip init [DIR] # scaffold an env repo from the embedded template
grip adopt <path> # interview-style adoption of an existing config — records priors, reversible
grip apply [--host H] [MODULE...] # fetch, build, deploy — one new generation
grip plan [--host H] [MODULE...] # show what apply would change
grip check # eval + sema + linters; exit code = validity
grip update [MODULE] # re-resolve pins into the lockfile
grip rollback [N] # flip current back to generation N
grip generations # list generations and their status
grip gc # collect unreferenced store paths
grip gc --dry-run # show what gc would reclaim
grip why-owns <path> # which module owns a deployed path
grip doctor # check config, deno, the embedded frontend
grip trust list/add/remove # the repo trust list — the gate before any eval
grip store verify [--repair] # re-hash store paths against expectations
grip self-update # update grip itself from the latest core release
All shipped; the config schema on this page is their stable contract.