Personal dotfiles for a modular macOS dev setup, managed with Stow + Homebrew.
This repo uses GNU Stow to symlink configs into $HOME and Homebrew as the package source of truth (brew/Brewfile).
- Shell: Zsh + Oh My Zsh.
- Prompt: Powerlevel10k (
.p10k.zsh), loaded fromzsh/.zshrc. - Node.js: fnm with automatic version switching (
fnm env --use-on-cd). - Terminal: Ghostty config included.
- Navigation/tools:
zoxide,eza,bat,fzf, etc. - Editors: layered sync flow for VSCode/Cursor + Copilot integration via
scripts/sync-ides.sh. - AI tooling: canonical OpenCode + symlinked consumers (Claude/Gemini/Codex).
git clone https://github.com/mralexsaavedra/dotfiles
cd dotfiles
chmod u+x ./setup.sh
./setup.shsetup.sh runs macOS defaults + Homebrew bootstrap, then stows the managed folders and syncs IDE configs.
Useful commands:
| Command | Description |
|---|---|
make update |
Runs maintenance + IDE sync (scripts/maintenance.sh + scripts/sync-ides.sh). |
make install |
Installs dependencies from brew/Brewfile. |
make dump |
Rebuilds brew/Brewfile from current brew state (removes vscode lines). |
make clean |
Homebrew cleanup. |
make sync-ides |
Syncs settings/extensions to VSCode and Cursor. |
scripts/maintenance.shdoes not auto-commit or auto-push. If changes are detected, it only prints suggested git commands. Review and commit manually.
The shell config is intentionally split by responsibility:
.zshenv→ minimal env for all zsh instances (locale, editor,DOTFILES_DIR, lightweight PATH, secrets hook)..zprofile→ login/session setup (toolchain PATH additions, Java/Android/Python/Bun env)..zshrc→ interactive shell behavior (plugins, history, completions, fnm auto-switch, Powerlevel10k)..aliases/.functions→ shared user commands loaded by.zshrc..zshrc.custom→ tracked personal interactive customizations, sourced near the end.*.localfiles (optional, machine-specific) loaded last as overrides.
Local/secrets files are ignored via *.local in .gitignore.
zsh/.zshenv.local.exampleis the template.- Recommended local files:
~/.zshenv.local(tokens/secrets)~/.zprofile.local(machine login/session overrides)~/.zshrc.local(interactive shell overrides)
Suggested split for interactive config:
- Keep portable baseline in
zsh/.zshrc(safe to update from upstream). - Keep tracked personal tweaks in
zsh/.zshrc.custom. - Keep machine-only overrides in
~/.zshrc.local.
Prefer keeping shared defaults in tracked files and machine-specific values in *.local.
brew/— Homebrew bundle (Brewfile).zsh/— split shell config and local override templates.scripts/— setup/maintenance automation.ides/— layered editor config (base+ per-editor deltas +ai/copilot).git/,gh/,ghostty/,vim/,raycast/— tool-specific configs.opencode/— canonical AI source (AGENTS.md,rules/,skills/, templates).claude-code/—~/.claudepackage consuming OpenCode via symlinks.gemini-cli/—~/.geminipackage consuming OpenCode via symlinks.
Built with ❤️ by Alexander Saavedra.