Personal dotfiles for macOS, managed with automated setup scripts.
- Organized structure - Configs separated by type (shell, git, config, scripts)
- Automated setup - Bootstrap script for fresh machine setup
- Safe installation - Automatic backup of existing configs
- Git config split - Public settings in repo, private details in local file
- Sensitive data protection - Templates for configs with secrets
- Zsh - Main shell with oh-my-zsh, syntax highlighting, autosuggestions
- Starship - Modern prompt for interactive shells, including Ghostty and Warp
- Bash - Compatibility configs
- Git - Config with GPG signing, LFS support
- GitHub CLI - Authentication and host config
- SSH - Config for multiple GitHub accounts (personal, work)
- Package Managers - npm, yarn, pnpm configs
- Zed - Editor settings with LSP, formatter, agent config
- OpenCode - AI agent config with custom instructions and skills
- Claude Code - AI agent config with shared instructions
- Warp - Terminal emulator with keybindings, launch configs, and custom themes
- Ghostty - Terminal emulator config
- Pi - Custom light/dark themes, extensions, and skills for the Pi coding agent
- Amp - Remote thread creation settings
- Brewfile - 67+ packages, casks, and VSCode extensions
- macOS (tested on Apple Silicon)
- Xcode Command Line Tools (bootstrap script will install)
For setting up a brand new Mac:
# Clone this repo
git clone https://github.com/YOUR_USERNAME/dotfiles.git ~/.dotfiles
cd ~/.dotfiles
# Run bootstrap script (installs everything)
./scripts/bootstrap.shThe bootstrap script will:
- Install Xcode Command Line Tools (if needed)
- Install Homebrew (if needed)
- Install all packages from Brewfile
- Install oh-my-zsh and plugins
- Create symlinks for all configs
- Provide post-installation instructions
If you already have dependencies installed and just want to symlink configs:
cd ~/.dotfiles
./scripts/install.shThis is idempotent - safe to run multiple times.
cp git/.gitconfig.local.example ~/.gitconfig.localThen edit ~/.gitconfig.local with your details:
[user]
email = your.email@example.com
name = Your Name
signingkey = YOUR_GPG_KEY_IDcp config/.npmrc.example ~/.npmrcAdd your auth tokens if publishing packages.
# Generate new key
ssh-keygen -t ed25519 -C "your.email@example.com"
# Add to GitHub
cat ~/.ssh/id_ed25519.pub
# Copy and add to https://github.com/settings/keysGPG commit signing is enabled by default. The gpg-agent oh-my-zsh plugin handles GPG_TTY setup automatically.
# Verify your GPG key is available
gpg --list-secret-keys --keyid-format=long
# Test signing (should prompt for passphrase)
echo "test" | gpg --clearsignIf you don't have a GPG key, you can disable signing in ~/.gitconfig.local:
[commit]
gpgsign = falsegh auth loginsource ~/.zshrc
# Or restart your terminal.dotfiles/
├── shell/ # Shell configs (.zshrc, .zshenv, .bashrc, etc.)
│ └── zsh/ # Modular zsh config (exports, prompt, completions, aliases, local overrides)
├── git/ # Git config (public + template for private)
├── config/ # XDG configs
│ ├── zed/ # Zed editor settings
│ ├── opencode/ # OpenCode AI agent config
│ ├── claude/ # Claude Code config
│ ├── warp/ # Warp terminal config (keybindings, launch configs, themes)
│ ├── ghostty/ # Ghostty terminal config
│ ├── gh/ # GitHub CLI config
│ ├── pi/ # Pi coding agent config (themes/extensions)
│ ├── amp/ # Amp configuration
│ ├── agents/ # Canonical shared agent skills
│ ├── starship.toml # Starship prompt config
│ ├── ssh_config # SSH config (no private keys)
│ └── .yarnrc # Yarn config
├── scripts/
│ ├── bootstrap.sh # Fresh machine setup
│ ├── install.sh # Create symlinks
│ ├── update-brewfile.sh # Regenerate Brewfile
│ └── lib/utils.sh # Shared functions
├── Brewfile # Homebrew packages
└── README.md
After installing new packages with Homebrew:
./scripts/update-brewfile.sh
git add Brewfile
git commit -m "Update Brewfile"cd ~/.dotfiles
git pullChanges to symlinked files take effect immediately.
- Add file to the appropriate directory in the repo (
config/pi/for Pi themes/extensions,config/agents/skills/for shared skills,config/for XDG apps, etc.) - Update
scripts/install.shto create the symlink - Commit and push changes
Edit shell/zsh/aliases.zsh.
Keep one-off or private shell tweaks in shell/zsh/local.zsh.
cp shell/zsh/local.zsh.example shell/zsh/local.zshThat file is ignored by git and loaded automatically if present.
Personal settings go in ~/.gitconfig.local (not tracked).
Global settings go in git/.gitconfig (tracked).
Shared instructions live in the root AGENTS.md. Harness-specific files link to this master file:
- Amp:
~/.config/amp/AGENTS.md - Claude Code:
~/.claude/CLAUDE.md - Codex:
~/.codex/AGENTS.md - OpenCode:
~/.config/opencode/AGENTS.md - Pi:
~/.pi/agent/AGENTS.md
config/agents/skills/ is the single source of truth for globally installed skills.
~/.agentslinks toconfig/agents/, which is discovered by Amp, Codex, Cursor, OpenCode, and Pi~/.claude/skillslinks toconfig/agents/skills/for compatibility- Amp's User Skills repository mirrors
config/agents/skills/so the same skills are available in orbs
- Extensions live in
config/pi/agent/extensions/and are linked to~/.pi/agent/extensions/
- Add zsh session PATH / tooling config to
shell/zsh/exports.zsh - Add zsh-wide minimal environment variables to
shell/.zshenv - Add POSIX login-shell environment variables to
shell/.profile - Add zsh login-shell setup to
shell/.zprofile
The following files are excluded from git:
~/.gitconfig.local- User email, name, GPG key~/.npmrc- NPM auth tokens~/.aws/- AWS credentials~/.ssh/id_*- SSH private keysconfig/zed/conversations/- Personal AI chatsconfig/zed/embeddings/- Generated data
Templates are provided in the repo (.example files).
- Shell: zsh with oh-my-zsh (git, zsh-syntax-highlighting, zsh-autosuggestions, gpg-agent)
- Prompt: Starship
- Terminal: Ghostty and Warp
- Editor: Zed
- AI Agent: OpenCode, Claude Code
- Package Manager: Homebrew, pnpm
- Version Control: Git with GPG signing via pinentry-mac
Personal dotfiles - use at your own discretion.