This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
A personal dotfiles repository managed via automated symlinks. Configs live here and are symlinked into $HOME or $HOME/.config/.
Prerequisites: oh-my-zsh and Homebrew must already be installed.
# Bootstrap a new machine (clones repo + runs setup.sh)
curl -fsSL https://raw.githubusercontent.com/mutecipher/dotfiles/main/install.sh | sh
# Or, if the repo is already cloned, create/update symlinks
sh ~/.dotfiles/setup.shsetup.sh is idempotent — safe to re-run. Existing files are backed up with a .bak suffix before being replaced; already-correct symlinks are skipped.
Only files explicitly listed in setup.sh are symlinked — Brewfile and ideas.org live in the repo but stay there. To add a new dotfile, add a link call in setup.sh.
Homebrew dependencies are tracked in Brewfile:
brew bundle --file=~/.dotfiles/Brewfile # install everything in Brewfile
brew bundle dump --file=~/.dotfiles/Brewfile --force # snapshot current state.zshrc,.zprofile,.gitconfig— root-level shell/git configs, symlinked to$HOMEconfig/— app configs symlinked into$HOME/.config/(emacs, nvim, ghostty)config/starship.toml— Starship prompt config (a file, not a directory like the others)bin/— custom scripts added to$PATHvia.zshrclib/— shell utility library (clipboard.sh,color.sh,date-time.sh,fs.sh,logger.sh). Scripts inbin/source them via$DOTFILES_LIB(exported in.zshrc), e.g.. "$DOTFILES_LIB/clipboard.sh"Brewfile— all macOS dependencies managed by Homebrew
The Emacs config uses literate programming via Org-mode:
- Entry points:
config/emacs/early-init.el(startup tuning),config/emacs/init.el(bootstraps org-babel tangle) - Source:
config/emacs/config.org - Generated:
config/emacs/config.el(excluded from git, built at load time) - Custom modules:
config/emacs/lisp/— naming conventionmutecipher-<feature>.el, each is a standaloneprovided feature - Custom themes:
config/emacs/themes/(liminal-dark-theme.el,liminal-light-theme.el) - Tests:
config/emacs/test/— ert tests. Run a single file with:emacs -Q --batch -L config/emacs/lisp -L config/emacs/test \ -l config/emacs/test/<name>-tests.el -f ert-run-tests-batch-and-exit
When modifying Emacs config, edit config.org — never edit config.el directly. The generated config.el is gitignored.
| Group | Modules |
|---|---|
| UI / appearance | mutecipher-appearance.el, mutecipher-modeline.el, mutecipher-icons.el, mutecipher-colorize.el |
| Editing / display | mutecipher-centered.el, mutecipher-ligatures.el, mutecipher-tidy.el, mutecipher-flymake-inline.el, mutecipher-hover.el, mutecipher-vc-gutter.el, mutecipher-org-table.el |
| Language / treesit | mutecipher-treesit.el |
| Content / modes | mutecipher-blog.el, mutecipher-markdown.el, mutecipher-todo-keywords.el, mutecipher-deck.el |
| Tools / integrations | mutecipher-containers.el, mutecipher-git-blame.el |
| ACP client | mutecipher-acp.el (entry point) + sub-modules: -model, -protocol, -rpc, -session, -ui, -ewoc, -composer, -completion, -changes, -persist, -tools, -markdown, -faces, -log. EWOC-based transcript rendering. |
Uses LazyVim distribution. Plugin specs live in config/nvim/lua/plugins/. The lazy-lock.json is gitignored.
dotfiles— cd to this repovim— aliased tonvimk/kn— kubectl shortcutsdcu/dce— dev container commands using Podman
All scripts on $PATH (via .zshrc):
git-amend,git-nuke,git-uncommit— Git workflow helpersgpg-copy-key,ssh-copy-key— key export utilitiesdither— image dithering utilitytoken-estimate— token count estimation+x— shorthand forchmod +x
Use conventional commits (e.g. feat(emacs):, fix(zsh):, chore:).