# dotfiles nix flakes + home-manager. portable across mac and linux. ## bootstrap ```bash # 1. install nix (if not present) curl -L https://nixos.org/nix/install | sh # 2. clone (the repo path matters — nvim config uses mkOutOfStoreSymlink) git clone https://tangled.sh/@zzstoatzz/dotfiles ~/tangled.sh/@zzstoatzz/dotfiles cd ~/tangled.sh/@zzstoatzz/dotfiles # 3. apply (detects system automatically) SYSTEM=$(nix eval --raw nixpkgs#system) nix run home-manager -- switch --flake ".#nate@${SYSTEM}" # 4. set zsh as default shell chsh -s $(which zsh) ``` ## what's included **shell**: zsh, oh-my-posh (zen theme), tmux, neovim (kickstart.nvim) **search/nav**: ripgrep, fd, fzf, jq, bat, eza, autojump **dev**: git, gh, curl, wget, tree, dust **languages**: uv (python), rustup (rust), go, node 22, deno, bun **terminal**: wezterm (linux only — on mac install via .dmg) **fonts**: fira code nerd font ## how it works home-manager generates `~/.zshrc` and `~/.gitconfig` from nix declarations in `home.nix` — aliases, history, completions, git user/editor are all configured there. shell functions live in `config/zsh/utils` and get symlinked to `~/.utils`. neovim config uses `mkOutOfStoreSymlink` so `~/.config/nvim` points directly at this repo's `config/nvim/` — edits take effect immediately and lazy-lock.json stays writable. ## layout ``` flake.nix — nix entry point home.nix — programs.zsh, programs.git, packages, file symlinks config/ zsh/utils — shell functions (gbre, git_exclude, ghistory, etc.) nvim/ — kickstart.nvim config (mutable symlink) tmux/ — tmux.conf (prefix: ctrl-a) wezterm/ — wezterm.lua ohmyposh/ — zen.toml prompt theme atuin/ — shell history config bin/ disk-breakdown — disk usage visualizer (macOS) ``` ## updating edit config in this repo, then: ```bash home-manager switch --flake . ``` for changes to `config/nvim/` — no rebuild needed, it's a direct symlink.