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 pi coding agent is managed the same narrow way: config/pi/skills links to ~/.pi/agent/skills, so global pi skills are version-controlled while sibling runtime state in ~/.pi/agent (auth.json, sessions/, models.json) stays machine-local. Drop a SKILL.md-rooted directory under config/pi/skills/ and re-run scripts/link-config.sh; pi discovers it as /skill:<name>.
The installer configures npm's user prefix and a one-day dependency release
cooldown in ~/.npmrc:
prefix=${HOME}/.local
min-release-age=1That keeps npm install -g writable when npm comes from Nix, lets package
releases settle for 24 hours before install, 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 manages
dependency release-age settings for npm, Bun, and Deno:
- Bun: links
config/bunfig.tomlto global bunfig locations withminimumReleaseAge = 259200. - npm: manages
min-release-age=1in~/.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. Its dependency age is set to one day so package releases settle for 24 hours before install.
Bun exempts the @wcygan/* workspace scope from the cooldown. Deno keeps the
same exemption entries in its config for future nonzero cooldowns.
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 .
# Repair Rust editor components
make setup-rustup-components
# Uninstall (configs only, keeps Nix)
make uninstall
# Run tests
make test-pre
make test-local
# Start documentation dev server
make docs