An opinionated macOS web dev environment, powered by a custom Claude Code config.
Covers how the agent investigates, edits, and asks, with each rule naming the failure it prevents.
- Pipe expensive command output to
/tmponce and grep locally. - Programmatic shell edits like
sed -irequire a clean git state and a dry-run first. - Lean on
AskUserQuestionat any hint of ambiguity, not free-form chat questions. - ... and more
rmcalls go to macOS Trash and stay recoverable.- Lockfile edits are blocked.
Every project picks up Chrome DevTools for Agents and SEED Design Figma/Docs integration.
Decisions, state changes, and findings move out of the private chat onto surfaces the team actually checks.
- Sessions anchor to a Linear issue and auto-transition its status (Todo → In Progress → In Review).
/commentposts decisions back to the issue thread./notionpromotes durable findings to a default Notion page.- Slack self-DMs are pre-approved for quick notes.
Fish abbreviations expand inline to the real xcrun / adb command, so the URL stays editable. Swap it for any deep link like myapp://route.
simsaf <PORT>openslocalhost:<PORT>in iOS Simulator Safari.emwv <PORT>opens10.0.2.2:<PORT>in Android Emulator's WebView Shell.
cmux runs coding agents in parallel tabs. The agent updates its own tab title whenever focus shifts, so you can find the right session at a glance.
material-darker-stone covers Ghostty(cmux), Fish, and Claude Code. One palette either side of the agent boundary.
Install with Homebrew and GNU Stow.
# 1. Install Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 2. Clone
git clone <this-repo> ~/Projects/dotfiles
cd ~/Projects/dotfiles
# 3. Install everything from Brewfile
brew bundle install
# 4. Stow every package into $HOME
cd packages && stow -t ~ */
# Or selectively
stow -t ~ fish git starship
# 5. (Optional) Enable brew autoupdate
brew autoupdate start --upgrade --immediate --cleanup --sudoAnything matching *.local.* or *.secret.* is gitignored, so machine-specific values live next to their checked-in counterpart.
packages/fish/.config/fish/conf.d/
├─ linear.fish.example # checked in template
└─ linear.local.fish # ignored, real values
When the filename itself is meaningful (e.g. Claude Code's commands/X.md, where the filename is the slash command), the per-machine file has to live outside the repo, directly under ~/.... But if stow has folded that directory into a single symlink back to the repo, new files inside it will land in the repo instead. Unfold once first.
rm ~/<path> && mkdir ~/<path>
cd ~/Projects/dotfiles/packages && stow -R -t ~ <package>cd ~/Projects/dotfiles/packages
stow -D -t ~ <package> # one package
stow -D -t ~ */ # everything~/.config/karabinermust be symlinked as a whole directory (Docs).