Modern developer configuration with safe installation and Nix package management.
git clone https://github.com/wcygan/dotfiles.git
cd dotfiles
./install.shFull documentation available at: https://wcygan.github.io/dotfiles/
- 🚀 Modern CLI tools: ripgrep, fd, bat, eza, fzf, delta, and more
- 🐟 Fish shell: Full configuration with functions and abbreviations
- ⭐ Starship prompt: Beautiful, fast, and informative
- 📦 Nix packages: Reproducible across macOS, Ubuntu, and Fedora
- 🔗 Safe symlinks: Automatic backups before any changes
dotfiles/
├── config/ # Configuration files
│ ├── fish/ # Fish shell config
│ ├── claude/ # Claude Code config and skills
│ ├── codex/ # Codex config, global instructions, and skills
│ ├── zed/ # Zed config
│ ├── ghostty/ # Ghostty config
│ ├── starship.toml # Starship prompt
│ └── shell-nix.sh # Bash/zsh compatibility
├── scripts/ # Installation scripts
├── flake.nix # Nix package definitions
├── install.sh # One-command installer
└── docs/ # Documentation site
Peon Ping plays Warcraft-style sound cues when Claude Code needs attention. Not managed by Nix — install separately via Homebrew:
brew install PeonPing/tap/peon-ping && peon-ping-setupThis adds hooks and skills to your local ~/.claude/ config. These files are gitignored and will need to be reinstalled on new machines.
Claude Code config is linked from config/claude to ~/.claude. Codex is managed narrowly: config/codex/config.toml is a portable template copied to ${CODEX_HOME:-~/.codex}/config.toml only when missing, config/codex/AGENTS.md points to ${CODEX_HOME:-~/.codex}/AGENTS.md, and config/codex/skills points to ${CODEX_HOME:-~/.codex}/skills, while the rest of CODEX_HOME remains machine-local runtime state. Codex may write machine-specific [projects] trust entries into the local config; keep those out of the tracked template.
The installer configures npm's user prefix and a 3-day dependency release
cooldown in ~/.npmrc:
prefix=${HOME}/.local
min-release-age=3That keeps npm install -g writable when npm comes from Nix, and exposes global binaries through ~/.local/bin, which the shell config already adds to PATH behind Nix-managed tools.
Example:
npm install -g @playwright/cli@latest
playwright-cli --helpThe repo's docs site uses npm (docs/package-lock.json). The installer also
sets equivalent 3-day cooldowns for Bun and Deno:
- Bun: links
config/bunfig.tomlto global bunfig locations withminimumReleaseAge = 259200. - npm: manages
min-release-age=3in~/.npmrc. npm does not currently expose a documented package or scope exemption key for this setting. - Deno: links
config/deno/deno.jsoncand shell wrappers apply it todeno install,deno add,deno update,deno outdated, anddeno xwhen no projectdeno.jsonordeno.jsoncis already active.
Bun and Deno exempt the @wcygan/* workspace scope from the cooldown.
For reproducible per-project tool versions, use nix-direnv.
- Ensure
direnvis inflake.nixpackages - Fish hook is preconfigured at
config/fish/conf.d/20-direnv.fish - Global direnv config allows nix-direnv
-
Create
.envrc:use flake
-
Create
flake.nixwith a dev shell:{ inputs.nixpkgs.url = "github:NixOS/nixpkgs"; outputs = { self, nixpkgs }: { devShells.x86_64-darwin.default = nixpkgs.legacyPackages.x86_64-darwin.mkShell { packages = [ /* project-specific tools */ ]; }; }; }
-
direnv allowto trust the environment.
Commit .envrc and flake.nix; gitignore .direnv/. Use cases: language toolchains (Node 20 vs 18), pinned database clients, exact build tool versions, locked cloud CLIs.
For troubleshooting concurrent direnv rebuilds and Nix daemon issues, the agent has a dedicated nix-direnv-perf skill.
Use the Determinate Systems macOS Installer rather than the shell script. Download it from docs.determinate.systems, run the installer, then ./install.sh to set up dotfiles. The installer handles macOS integration, automatic updates, and Apple Silicon optimization.
# Update packages
nix flake update
nix profile upgrade '.*'
# Add new packages
# Edit flake.nix, then:
nix profile install .
# Uninstall (configs only, keeps Nix)
make uninstall
# Run tests
make test-pre
make test-local
# Start documentation dev server
make docs