GNU stow dotfiles for all machines, organized into per-scope packages:
| Machine | OS | Managed by | Stow packages |
|---|---|---|---|
| Work Mac | macOS | Homebrew | common mac work |
| Odin (home Mac) | macOS | nix-darwin via everything-nix | common mac personal |
| Thor (home PC) | NixOS | NixOS via everything-nix | common linux personal |
| Ivaldi (server) | NixOS | NixOS via everything-nix | common linux personal (optional) |
System-level config (packages, fonts, services) for the nix machines lives in
~/everything-nix — this repo only manages $HOME dotfiles.
common/ stowed everywhere — shell, starship, ghostty, nvim, btop,
fastfetch, wezterm, zed, pnpm, git ignore, herdr
mac/ stowed on both Macs — gnupg (pinentry-mac), .zshrc.darwin
linux/ stowed on Linux — niri, .zshrc.linux
personal/ stowed on non-work machines — personal pi agent-system
work/ stowed only on the work Mac — work pi agent-system, aws login,
.zshrc.work
The shell reads machine extras at the end of .zshrc — whichever of
~/.zshrc.darwin, ~/.zshrc.linux, ~/.zshrc.work exists gets sourced, so
the stowed packages decide the machine's behavior.
Odin and Thor: git, zsh, stow. Ivaldi's user package set is deferred
until its server role is designed.
Work Mac (brew):
brew install stow starship zoxide fzf lsd bat fnm pipx awscli aws-sso-util awsume k9s
brew install --cask font-iosevka-term-nerd-font ghostty wezterm zed obsidian raycast docker-desktopOdin / Thor: CLI tools (stow, starship, zoxide, fzf, lsd, ghostty, pnpm, …) are installed by everything-nix. Thor's Wayland desktop packages (Waybar, Fuzzel, and Swaylock) are installed by its host configuration. Ivaldi's package set is intentionally deferred. Two gaps to be aware of:
- everything-nix currently ships only JetBrains Mono — add
nerd-fonts.iosevka-termtomodules/fonts.nixfor the ghostty font neovimandbatare not in everything-nix yet; the nvim config here is inert and thecatalias degrades gracefully until you add them
~/.gitconfig is machine-local so the work Mac can use a work identity:
git config --global user.name "Andrei Kukharau"
git config --global user.email "contact@druce.dev" # use work email on the work Mac
git config --global init.defaultBranch main
git config --global core.excludesFile ~/.config/git/ignoregit clone git@github.com:drucedev/dotfiles.git ~/dotfiles
cd ~/dotfiles
stow --no-folding common mac work # adjust per machine, see table above--no-folding makes stow create real directories and link only files, so
apps that write state into ~/.config/... never write into this repo. Use
the same flag if you ever unstow (stow -D --no-folding ...).
The work and personal Pi agent-system directories are self-contained because
Pi treats the real directory containing definitions.json as a trust boundary.
Keep the developer and senior tier prose shared by both systems in sync.
Then open a new shell. zinit clones itself and its plugins on first run.
Machine-local secrets go in ~/.secrets (never tracked).
Restow after pulling this layout so the moved Pi links are replaced:
stow --no-folding -R common mac work # work Mac
stow --no-folding -R common mac personal # home Mac
stow --no-folding -R common linux personal # LinuxDo the unstow + restow in one terminal session — already-open shells keep working, but new shells have no config between the steps.
Old symlinks in $HOME point into the repo, so unstow before pulling:
cd ~/dotfiles # wherever the old clone lives
stow -D . # remove all old symlinks (old layout used folding — no flag)
git pull # fetch the restructured layout
stow --no-folding common mac workAfterwards:
- Prompt:
brew install starship; optionallybrew uninstall oh-my-poshandrm -rf ~/.config/ohmyposh. - Font: ghostty now wants IosevkaTerm Nerd Font —
brew install --cask font-iosevka-term-nerd-font. - zsh history moved to the XDG state dir (optional but recommended):
mkdir -p ~/.local/state/zsh && mv ~/.zsh_history ~/.local/state/zsh/history - zoxide now replaces
cd(zoxide init --cmd cd) — muscle memory still works, directories are learned as you go. - git identity:
~/.gitconfigwas never tracked by this repo, so it is untouched — nothing to do.
cd ~/dots
stow -D . # remove old symlinks — this also removes ~/.gitconfig!dots tracked ~/.gitconfig, so unstowing deletes the symlink. Recreate your
identity before using git (see Git setup above), then:
git clone git@github.com:drucedev/dotfiles.git ~/dotfiles
cd ~/dotfiles
stow --no-folding common linux personalAfterwards:
- bun is no longer managed — remove it if you don't need it:
rm -rf ~/.bun(also drop the bun lines from any leftover local rc files). - zsh history moved, same as above:
mkdir -p ~/.local/state/zsh && mv ~/.zsh_history ~/.local/state/zsh/history - niri and starship configs come right back via the new packages — no action needed.
- The old
dotsclone can be archived once everything works.
CLI tools come from everything-nix. After the first boot:
git clone git@github.com:drucedev/dotfiles.git ~/dotfiles
cd ~/dotfiles && stow --no-folding common linux personalNo migration — just Requirements → Git setup → Install, using
stow --no-folding common mac personal.
fastfetchexpects an optional logo at~/Pictures/logo.png; missing file just means no logo.maximize = truein the ghostty config originates from the Mac config — if ghostty on Linux complains about it, that line can go per-machine.- The
uualias upgrades the whole machine and differs per package manager: brew (work), nix-darwin rebuild (Macs), NixOS rebuild (Linux).