One source tree → Windows, macOS, and Debian-based Linux. No WSL. Colemak-DH. Personal and work.
My personal, cross-platform machine setup, managed with chezmoi.
The repo is the source of truth; chezmoi apply renders it into $HOME on every machine I
touch, so a fresh laptop is one command away from feeling like home.
- One source tree → three OSes. Windows, macOS, and Debian-based Linux render from the same repo — no WSL, no per-machine forks — giving one unified set of apps, tools, and aliases everywhere.
- Idempotent & convention-driven. Built on chezmoi templates,
.chezmoidata, andrun_onchange_scripts;chezmoi applyis safe to run twice and CI verifies there's no drift. - A cohesive terminal stack. WezTerm, oh-my-posh, Neovim, fzf, ripgrep,
zoxide, and a
pyenv+uv+ruffPython toolchain. - Home and work aware. An
install_host = home | workprompt at init time switches package sets and config from the same source. - Colemak-DH first. Keymaps tuned for the Colemak-DH layout.
The platforms I've actually verified chezmoi apply on:
| OS | Tested on |
|---|---|
| Debian-based Linux | Pop!_OS 22.04 LTS, Ubuntu 22.04 LTS |
| macOS | macOS 15 Sequoia |
| Windows | Windows 10, 11 — no WSL support |
chezmoi init will prompt for a few values the first time (git username, git email,
work/home install type, and — on Windows — the Git install path), then render and apply
everything.
cd ~
sh -c "$(curl -fsLS get.chezmoi.io)"
export PATH="$PATH:$HOME/bin"
export GITHUB_USERNAME="StephenGemin"
chezmoi init --apply -v https://github.com/$GITHUB_USERNAME/dotfiles.gitFor Apple Silicon, confirm
brew configshowsarm64and NOTx86_64.
# Install Homebrew first if you don't have it:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install chezmoi
export GITHUB_USERNAME="StephenGemin"
chezmoi init --apply -v https://github.com/$GITHUB_USERNAME/dotfiles.gitExpand Windows install steps
-
Run the prerequisite installs in Windows PowerShell 5.1 (the
powershellthat ships with Windows) — pwsh might not be installed by this point.- run as non-admin (for scoop)
- may need to change the execution policy(ies):
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUserSet-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine
-
Install prerequisite dependencies:
get-Command winget # check winget installed # if missing: # 1. download winget from MS store # 2. If MS store is blocked (typically work env) then install from .msixbundle # - https://github.com/microsoft/winget-cli/releases/latest # - double click downloaded file to install # - if this is also blocked, can install from powershell command `Add-AppxPackage -Path "PATH_TO_FILE"` # - may need to install missing deps for winget based on errors. # - i.e. Github microsoft/winget-cli issue 4916 winget install -e --id Git.Git winget install Microsoft.PowerShell winget install twpayne.chezmoi $GITHUB_USERNAME = "StephenGemin" chezmoi init --apply https://github.com/$GITHUB_USERNAME/dotfiles.git
-
May need to install MSYS2 manually
-
Neovim
- Do not start Neovim until the reqs below are installed!
- Install build dependencies (use MSYS2)
pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchainpacman -S make gcc
-
To install fonts go to
~\.local\share\fonts; find ttf files, right-click desired files, and select install -
Install WhatsApp from MS store (unavailable from winget)
- Ref microsoft/winget-pkgs issue 156231
-
Add to PATH (if not there):
%USERPROFILE%\.pyenv\pyenv-win\shimsC:\Program Files\Git\cmdC:\Program Files\Neovim\bin
Manual setup steps for individual tools / apps:
- PyCharm — Import settings from
~\.config
Legend: ✅ supported · ❓ may work (untested / unused) · 🚫 not supported
| Deb | Win | Mac | |
|---|---|---|---|
| WezTerm | ✅ | ✅ | ✅ |
| Windows Terminal | 🚫 | ✅ | 🚫 |
| Deb | Win | Mac | Notes | |
|---|---|---|---|---|
| Zsh | ✅ | 🚫 | ✅ | Slow on Windows, see Notes |
| Bash | ✅ | ✅ | ❓ | Slow on Windows |
| PowerShell | 🚫 | ✅ | 🚫 |
Language-agnostic managers, per OS:
Full package lists are the source of truth in
.chezmoidata/brew.yaml(macOS / Linux brew),scripts/install_debian.sh(apt / snap / cargo), and.chezmoitemplates/winget_packages_home.json(Windows).
| Deb | Win | Mac | Notes | |
|---|---|---|---|---|
| Chezmoi | ✅ | ✅ | ✅ | |
| Git | ✅ | ✅ | ✅ | git-lfs / git-extras |
| Neovim | ✅ | ✅ | ✅ | nvim-config |
| Vim | ✅ | ✅ | ✅ | |
| Nano | ✅ | 🚫 | ✅ | |
| Notepad++ | 🚫 | ✅ | 🚫 | |
| Visual Studio Code | ✅ | ✅ | ✅ | |
| JetBrains IDEs | ✅ | ✅ | ✅ | |
| Oh-My-Posh | ✅ | ✅ | ✅ | |
| Zinit | ✅ | 🚫 | ✅ | Zsh plugin manager |
| Oh-My-Zsh | ✅ | 🚫 | ✅ | Plugins loaded via Zinit |
| Ripgrep | ✅ | ✅ | ✅ | |
| fzf | ✅ | ✅ | ✅ | |
| zoxide | ✅ | ✅ | ✅ | |
| pyenv | ✅ | ✅ | ✅ | Windows uses pyenv-win |
| uv | ✅ | ✅ | ✅ | |
| Ruff | ✅ | ✅ | ✅ | |
| GitHub CLI | ✅ | ✅ | ✅ | |
| PlantUML / Graphviz | ✅ | ❓ | ✅ | |
| Double Commander | ✅ | ✅ | ✅ | |
| KeePassXC | ✅ | ✅ | ✅ | No chezmoi integration yet |
| VLC | ✅ | ✅ | ✅ | |
| Firefox | ✅ | ✅ | ✅ | |
| Opera | ✅ | ✅ | ✅ | |
| Chromium | ✅ | ❓ | ❓ | |
| Notion | ✅ | ✅ | ✅ | |
| ✅ | ✅ | ❓ | Windows: install from MS Store | |
| F.lux | ✅ | ✅ | ✅ | Linux uses Redshift |
| Wireshark | ❓ | ❓ | ✅ | |
| LibreOffice | ❓ | ❓ | ✅ | |
| MSYS2 | 🚫 | ✅ | 🚫 |
Platform-specific extras not listed above (e.g. JupyterLab, scrcpy, Java/Temurin, Zoom, 7-Zip, ShareX, Tesseract OCR, DB Browser for SQLite) live in the data files linked under Package managers.
- To get zsh working on Windows:
- Install MSYS2;
pacman -S zsh - Modify
C:\msys64\etc\nsswitch.conf(see below)
- Install MSYS2;
- Initial attempt to use zsh did not go well:
- terminal was very sluggish
- tried in MSYS2, MSYS (Git Bash) and Windows Terminal
- issues accessing Windows tooling
- difficult working with Windows paths
- Decided to use PowerShell on Windows
# Begin /etc/nsswitch.conf
passwd: files db
group: files db
db_enum: cache builtin
db_shell: /usr/bin/zsh
db_home: /c/Users/USERNAME
db_env: windows
#db_home: cygwin desc
#db_shell: cygwin desc
#db_gecos: cygwin desc
# End /etc/nsswitch.conf
Released into the public domain under The Unlicense. Copy, adapt, and reuse freely.