Files
Panama/user
Gabriel Brown 44124d72fa Take one machine's fingerprints off everyone's desktop
The audit's second tier: values that were measurements of the author's
desktop, shipped to every machine as if they were defaults.

Settings greeted every human as Gabriel; it now greets whoever
accountsservice says is signed in, and nobody when it says nothing. The
weather shipped his home coordinates and confidently reported his forecast
anywhere on earth; it now ships unset, fetches nothing until a location is
chosen, and the location row says so. The GTK bookmarks carried seven
/home/gib paths and his file server into every file dialog; they are now
generated per machine from a template and gitignored -- Nautilus edits the
instance freely, the way settings.ini already worked one file over. Web
search routed through his personal bang redirector; the engine is now the
webSearchUrl preference with a DuckDuckGo default, read by both the script
command and the suggestions extension, which the launcher-search contract
already pins to one another. The GPU vitals path defaulted to his card1 and
lost the readout on any machine enumerated differently; a machine with
exactly one GPU now adopts it. And the Containers and Snapshots pages hide
once a scan proves their backing stack absent, instead of rendering
permanently empty on machines that never had podman or snapper.

Lesser residue swept in the same pass: the DP-2 hyprpaper block one machine
needed, the author's username-typo expansions (moved to his personal seed in
user/, where personal content belongs), a capture fallback into /home/gib,
and a parity table asserting one machine's hardware as fact.

Claude-Session: https://claude.ai/code/session_01Epx9ZC1gwm81K3jm9x9CKh
2026-08-23 11:55:43 -04:00
..

Personal content

Everything else in Panama is the desktop. This directory is the person using it.

The problem it solves is small and annoying: an agent skill, an SSH host alias or a set of expansion triggers is worth having on every machine you own, but none of it belongs in the shared configuration, and keeping it in a second repository means remembering to update two things. So it lives here, tracked, and one file says where each piece goes.

What is in here

Path Goes to Why
agents/AGENTS.md ~/.claude/CLAUDE.md, ~/.codex/AGENTS.md Two tools, two names, one file. These were byte-identical copies before this, waiting to disagree.
agents/skills/ ~/.agents/skills, ~/.claude/skills Linked as a directory, so a skill installed on any machine lands in the checkout.
agents/rules/ ~/.claude/rules
ssh/config ~/.ssh/config Host aliases only. Keys are per-machine and are never tracked.
espanso/identity.yml ~/.config/espanso/match/identity.yml Copied, not linked, because a machine may add its own triggers.

manifest is the authority; this table is a summary of it.

It is off unless you say yes

The installer asks, naming the destinations, and the default is no. Nothing here is linked on a machine that did not answer yes, and the answer is remembered in $XDG_STATE_HOME/panama/user-content so upgrades do not re-ask.

That gating is the whole reason this can be tracked in a repository other people clone. If you are that other person: delete what is in here, put your own in its place, and answer yes. The mechanism is yours, the contents are not.

Adding something

Put the file under user/, add a line to manifest, run:

./setup/scripts/link-user

Anything already at the destination is moved to config/old/ rather than deleted, under a name that says where it came from.

What does not go in here

Anything secret. This repository is readable by anyone who finds it, and the contract test refuses private keys, tokens and credentials outright. That means no ~/.ssh/id_*, no .credentials.json, no API keys, and no settings.json carrying the names of hosts or people you would rather not publish. Machine state that a tool rewrites on its own does not belong here either; it will churn the git history for no benefit.