Personal dotfiles config and packages to bootstrap my environment. Managed with chezmoi.
Supports macOS (Homebrew) and Arch Linux (pacman).
You need git and just before anything else. There is a chicken-and-egg situation here: the justfile manages setup, but just itself must be installed first.
macOS
# Install Homebrew (if not already installed)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# Install just
brew install justArch Linux
sudo pacman -S --needed git justgit clone https://github.com/gcaracuel/dotfiles.git ~/Projects/github/gcaracuel/dotfiles
cd ~/Projects/github/gcaracuel/dotfilesjust initThis will:
- Install Homebrew (macOS only, if missing)
- Install chezmoi
- Create the symlink:
~/.local/share/chezmoi → <this-repo>/home - Initialize chezmoi config (prompts for work mode)
You will be asked:
Include work packages?
To change the work mode later: chezmoi init again or chezmoi edit-config.
just apply| Step | What happens |
|---|---|
run_once_before_00 |
Installs Homebrew (macOS) or validates pacman (Arch) |
run_onchange_01 |
brew bundle — installs/uninstalls Homebrew packages |
run_onchange_02 |
pacman -S — installs/uninstalls Arch packages |
run_onchange_03 |
mise install — installs runtimes (node, python, rust, go, bun, ...) |
run_onchange_04-07 |
pnpm / pip / cargo / bun global packages |
run_onchange_08 |
VSCode extensions |
run_onchange_09 |
kubectl krew plugins |
run_once_10 |
Oh My Zsh |
run_once_11 |
LazyVim starter for Neovim |
run_once_99 |
Prints MANUAL_STEPS.md |
Dotfiles in home/ are symlinked to $HOME by chezmoi.
| What | File |
|---|---|
| Homebrew formulas/casks | packages/Brewfile |
| Homebrew work packages | packages/Brewfile.work |
| Arch/pacman packages | packages/packages.txt |
| Arch work packages | packages/packages.work.txt |
| Programming runtimes (node, python, rust...) | home/dot_config/mise/config.toml |
| pnpm global packages | packages/pnpm-packages.txt |
| pip packages | packages/pip-packages.txt |
| cargo packages | packages/cargo-packages.txt |
| bun packages | packages/bun-packages.txt |
| VSCode extensions | packages/vscode-extensions.txt |
| kubectl krew plugins | packages/krew-plugins.txt |
After editing any file, run just apply to sync.
Uninstall detection: removing a package from its list and running just apply will uninstall it.
- Homebrew / pacman — system CLI tools and GUI apps available on both platforms
- Mise — programming language runtimes (node, python, rust, go, bun, terraform...)
- npm / pip / cargo / bun via Mise — language-specific tooling not in brew/pacman; pnpm is used instead of npm
.tool-versions— kept in$HOMEfor asdf coworker compatibility (auto-linked by chezmoi)
just apply # Apply all changes
just update # git pull + apply
just diff # Preview pending changes
just add ~/.foo # Add a new dotfile to chezmoi
just edit ~/.foo # Edit a managed dotfilePackage install scripts only re-run when their source file changes (using run_onchange_ scripts). To force a re-run without editing files (useful for upgrading packages to latest versions or troubleshooting):
just reinstall-packages # Force re-run ALL package managers
just reinstall brew # Force re-run Homebrew only
just reinstall pacman # Force re-run pacman only
just reinstall npm # Force re-run npm globals only
just reinstall pip # Force re-run pip/uv packages only
just reinstall cargo # Force re-run cargo packages only
just reinstall bun # Force re-run bun globals only
just reinstall vscode # Force re-run VSCode extensions only
just reinstall krew # Force re-run kubectl krew plugins onlyThis bumps a # force-run: timestamp in the package file, triggering chezmoi to re-run the install script.
Tests run in isolated Docker containers — never on the host machine.
just test # Interactive: choose Arch or Homebrew
just test-arch # Arch Linux container
just test-brew # Homebrew container
just test-arch-shell # Interactive shell in Arch container
just test-brew-shell # Interactive shell in Brew container
just clean # Remove test imagesSome things can't be automated. After first setup, chezmoi prints MANUAL_STEPS.md.
You can also view it directly:
cat MANUAL_STEPS.mdThe Pi Agent extensions are currently pinned to upstream SHAs in home/dot_pi/agent/settings.json:
| Extension | Current upstream |
|---|---|
pi-btw |
github.com/dbachelder/pi-btw |
pi-guardrails |
github.com/aliou/pi-guardrails |
pi-rtk-optimizer |
github.com/MasuRii/pi-rtk-optimizer |
To own these extensions long-term (custom modifications, controlled updates, no dependency on upstream availability):
- Fork each repo into your own GitHub account (e.g.
github.com/gcaracuel/pi-btw) - Update the
packagesentries inhome/dot_pi/agent/settings.jsonto point at your forks - Pin to a commit SHA on your fork:
"git:github.com/gcaracuel/pi-btw@<sha>" - To update a pinned extension after making changes to a fork, get the new SHA and update the entry, then run
chezmoi apply
This approach gives you full control over extension behaviour and eliminates the risk of breaking upstream changes.