Brewfile: say why bash is here, correctly
The reason given named bin/open, which does not need it: on macOS it execs
/usr/bin/open on line 13, before anything 3.2 cannot parse. What does need it
is szecret's age bootstrap -- `${os,,}` in secrets/common.sh, reached only when
age is absent, which is precisely the state a machine is in before this file
has been applied.
Igor Soarez igor@soarez.org
Mon, 21 Sep 2026 14:38:57 +0300
install.sh: install Homebrew, add bash, and seed the colour files
Three things a machine set up from this repo alone hit on its first run:
Homebrew was a dead end -- install.sh printed the command and exited, leaving
the one prerequisite everything else needs to be run by hand. It installs it
now, NONINTERACTIVE so it does not wait on a RETURN; the sudo password is still
asked for, which is why this script is run by hand.
bash was missing from the Brewfile, so bin/open and secrets/ ran under the
3.2 macOS ships and failed on `${v,,}`; config/bashrc also looks for the
bash-completion 2.x that wants 4.2.
Ghostty refused to start -- "error opening config-file ... error.FileNotFound"
-- because config-file pointed at the colour file bin/theme writes, which does
not exist until theme has run. The include is optional now (`?`), and this
script seeds the colour files when a machine has none, leaving a machine that
already has a theme alone.
Igor Soarez igor@soarez.org
Mon, 21 Sep 2026 14:37:35 +0300
link: a part named in ~/.config/dot/skip does nothing on that machine A machine may need one of the parts left out: on a laptop it does not own, ~/.claude/settings.json is the owner's, holding their environment and plugins, and linking this account's over it is wrong in both directions -- theirs is lost, and anything of theirs worth keeping would have to be carried here, in the repo every machine shares. The file is hand-written and in no repo, like ~/.localenv, so the exception stays on the machine that needs it. The check is in link/lib.sh, as each part starts, rather than in link.sh's loop, so `link/claude.sh yes` obeys it too; link.sh and other repos' link.sh source that file as well, and sit outside link/, so their names can never be read as a part's.
Igor Soarez igor@soarez.org
Mon, 21 Sep 2026 14:09:58 +0300
link/claude: secrets in MCP specs, and a separate spec for Desktop
Two things a spec in ~/.config/claude/mcp-servers.d/ may now carry beyond
what Claude Code takes, both resolved at link time:
- "${szecret:NAME}" in any string value, replaced with `szecret get NAME`
when the server is registered with Claude Code. For a remote server's
Authorization header: Claude Code's own headersHelper is not run in a
workspace without persisted trust, which includes $HOME, so a token
fetched that way is simply missing. A secret that cannot be read skips
that server, loudly.
- "desktop", a whole spec given to Claude Desktop instead. Desktop only
starts local stdio servers, so a layer that moves a server to HTTP for
Claude Code can keep Desktop on a local copy.
Igor Soarez igor@soarez.org
Fri, 18 Sep 2026 13:03:16 +0100
dotfiles Shell, editor and terminal configuration, the tools that go with them, and szecret, an age-based secret manager whose store lives elsewhere. History restarts here. What came before was not written to be read by anyone else, and carried machine names, addresses and an encrypted secret store; it is kept privately instead. What is left is meant to be safe on any machine, including one whose owner is not me: see CLAUDE.md for the rule it is written to.
Igor Soarez igor@soarez.org
Thu, 17 Sep 2026 19:45:23 +0100