My dotfiles and personal preferences managed using chezmoi.
bash -c "$(curl -fsLS https://raw.githubusercontent.com/cyrildewit/dotfiles/main/setup.sh)"irm https://raw.githubusercontent.com/cyrildewit/dotfiles/main/setup.ps1 | iexBoth scripts install a package manager (Homebrew on macOS, scoop on Windows),
install chezmoi with it, then run chezmoi init --apply, which clones this
repository, asks its questions and runs the install scripts. Running either on
a machine that is already set up changes nothing.
| Script | Installs | Personal | Work |
|---|---|---|---|
command_line_tools.sh |
Xcode Command Line Tools | ✓ | ✓ |
homebrew.sh |
Homebrew | ✓ | ✓ |
dependencies.sh |
chezmoi, gh, git, zsh |
✓ | ✓ |
oh_my_posh.sh |
oh-my-posh |
✓ | ✓ |
docker.sh |
docker-desktop |
✓ | ✓ |
tools.sh |
ccusage, eza, glow, herdr, htop, lazygit, zsh-autosuggestions |
✓ | ✓ |
applications.sh |
1password, 1password-cli, betterdisplay, brave-browser, claude, claude-code, ghostty, jetbrains-toolbox, logi-options+, macsyzones, obsidian, spotify, stats, todoist-app, visual-studio-code |
✓ | ✓ |
fonts.sh |
font-jetbrains-mono-nerd-font |
✓ | ✓ |
personal/applications.sh |
proton-drive, proton-mail, proton-pass, protonvpn |
✓ | — |
optional/dotnet.sh |
dotnet, aspire |
opt-in | opt-in |
Everything above is skipped when it is already installed, including apps that were installed by hand rather than through Homebrew.
herdr is also handed to brew services, so the server that owns its terminals
starts at login. Run brew services stop herdr to undo that. The script that
registers it runs once per machine, so a later chezmoi apply leaves the server
stopped.
The herdr hook that reports Claude Code sessions to that server is reinstalled on
every apply rather than once, because herdr versions the hook script and rewrites
it on update. Only that script is herdr's to write. The settings.json entry
calling it is templated with the rest of the Claude Code settings, because an
apply would otherwise revert what herdr wrote into that file. Windows is left
out. The hook is a shell script run through bash, and nothing here has checked
that it works there.
| Script | Installs | Personal | Work |
|---|---|---|---|
scoop.ps1 |
scoop | ✓ | ✓ |
dependencies.ps1 |
1password-cli, chezmoi, gh, git |
✓ | ✓ |
tools.ps1 |
claude-code, eza, glow, herdr, lazygit, nodejs-lts, vim |
✓ | ✓ |
npm-tools.ps1 |
@colbymchenry/codegraph, ccusage, through npm |
✓ | ✓ |
applications.ps1 |
brave, bruno, claude, jetbrains-toolbox, vscode |
✓ | ✓ |
onepassword.ps1 |
AgileBits.1Password, through winget |
✓ | ✓ |
fonts.ps1 |
JetBrainsMono-NF, JetBrainsMono-NF-Mono, JetBrainsMono-NF-Propo |
✓ | ✓ |
applications.ps1 cannot skip an application that was installed by hand, since
Windows has no equivalent of /Applications to check: an installer can land in
Program Files or under LOCALAPPDATA, per-machine or per-user. scoop installs
its own copy alongside, which for a browser means a second profile.
scoop has no brew services, so nothing registers the herdr server here. The
first herdr starts one, and its panes keep running once the client detaches.
Its config is written to %APPDATA%\herdr rather than ~/.config, from the
same template the macOS copy renders.
The repository layout and the conventions behind it are in docs/.