"WhereZenZoo('味儿真足')- your Windows 11 dev environment, seasoned just right. PowerShell meets dotfiles swagger, no more clicking 'Next' like a peasant. 100% less mouse and 100% more 良子 energy."
WhereZenZoo is a small, winget-based Windows 11 bootstrapper for a lean git + Neovim/LazyVim workflow. No bloat: it installs only what LazyVim needs and symlinks your Neovim and PowerShell configuration.
- Developer Mode enabled — required so symlinks are created without admin. This
applies to both PowerShell editions: PowerShell 7 honors Developer Mode directly,
and under Windows PowerShell 5.1 the setup delegates symlink creation to
pwsh. Without it (and without an elevated shell) the symlink step fails. Turn it on at Settings → System → For developers → Developer Mode. - winget (App Installer) — ships with Windows 11; otherwise install "App Installer" from the Microsoft Store.
The scripts run under both Windows PowerShell 5.1 and PowerShell 7 — launch the
one-liner from either. PowerShell 7 (pwsh) is installed as one of the packages, and
on the 5.1 path it is what actually creates the symlinks: Windows PowerShell 5.1's own
New-Item -SymbolicLink ignores Developer Mode (it needs admin), so setup routes
symlink creation through pwsh.
Open Windows PowerShell and run the one-liner:
irm https://raw.githubusercontent.com/user3301/WhereZenZoo/main/install.ps1 | iexIt will:
- Ensure winget and Git are available (installing Git via winget if missing).
- Clone this repo (with the
dotfilessubmodule) to~\dotfiles. - Run
bootstrap.ps1→setup.ps1.
One-liner to revert the setup:
irm https://raw.githubusercontent.com/user3301/WhereZenZoo/main/uninstall.ps1 | iexThis removes the symlinks (restoring any legacy .bak backups from older releases)
and uninstalls only the packages this setup installed. Tools you already had are
left alone. Add -Purge (when run from a clone) to also delete LazyVim runtime data
and the ~\dotfiles clone:
powershell -ExecutionPolicy Bypass -File ~\dotfiles\uninstall.ps1 -PurgeEverything is declared in config/packages.json (standard winget export schema):
| Package | winget id | Why |
|---|---|---|
| Git | Git.Git |
version control + LazyVim |
| PowerShell 7 | Microsoft.PowerShell |
daily shell (pwsh) |
| Neovim | Neovim.Neovim |
the editor |
| fd | sharkdp.fd |
LazyVim file finding |
| ripgrep | BurntSushi.ripgrep.MSVC |
LazyVim grep |
| lazygit | JesseDuffield.lazygit |
git TUI in Neovim |
| GNU Make | ezwinports.make |
task runner (this repo's Makefile) |
| zoxide | ajeetdsouza.zoxide |
frecency-based directory navigation |
| GitHub CLI | GitHub.cli |
gh for PRs/issues from the terminal |
| GitHub Copilot CLI | GitHub.Copilot |
copilot for AI-powered coding assistance in the terminal |
| MSVC Build Tools | Microsoft.VisualStudio.2022.BuildTools |
C/C++ toolchain nvim-treesitter (main branch) needs to build parsers |
Your Neovim config comes from the dotfiles submodule (submodules\dotfiles\nvim\.config\nvim) and is symlinked to %LOCALAPPDATA%\nvim. The repository's powershell directory is exposed as %USERPROFILE%\powershell, and the PowerShell 7 $PROFILE.CurrentUserCurrentHost path is resolved by pwsh (so OneDrive Known Folder redirection is honored) and symlinked to %USERPROFILE%\powershell\profile.ps1. That profile initializes zoxide's z command and loads aliases.ps1, including the copilot alias that forwards to agency copilot. The git identity/config (submodules\dotfiles\git\.config\git) is symlinked to %USERPROFILE%\.config\git, so user.name, user.email, and other git settings are identical on every machine this setup runs on.
- Re-runnable. Run the setup as often as you like — installed packages and correct symlinks are skipped, so nothing is done twice.
- Picks up changes. Add a package id to
config/packages.jsonand re-run; only the new one is installed. - Never overwrites your tools. A package already present (on PATH or known to winget) is skipped. Uninstall only removes packages recorded as installed by this setup.
- Existing configs are never replaced. Missing symlinks are created and existing symlinks with stale targets are repaired. A real file or directory at a managed path causes setup to stop with a clear conflict error so you can move it manually.
make setup # install packages + create symlinks
make packages # install winget packages only
make symlinks # create Neovim + PowerShell + git config symlinks only
make check # validate .ps1 and .json files parse
make uninstall # revert setup (symlinks + packages we installed)
makeis installed by the first bootstrap, so use the install one-liner on a fresh machine before reaching formake.
git clone --recurse-submodules https://github.com/user3301/WhereZenZoo.git $env:USERPROFILE\dotfiles
powershell -ExecutionPolicy Bypass -File $env:USERPROFILE\dotfiles\bootstrap.ps1- The bootstrap runs under Windows PowerShell 5.1 (so it works before PowerShell 7 is
installed); PowerShell 7 is then installed as a package and its
$PROFILE.CurrentUserCurrentHostprofile is linked. - winget shims live in
%LOCALAPPDATA%\Microsoft\WinGet\Links; the scripts refresh the current session PATH after installs, but open a fresh terminal to pick up all changes.
