A starting point for setting up a development host (macOS / Windows / Linux) with my preferred tools and configuration.
- macOS (Apple Silicon)
- Windows (10 / 11)
- Linux (Ubuntu, including WSL; other Debian-family distros untested)
- Installs packages, declaratively where possible:
- macOS: Homebrew + a
Brewfile(brew bundle);Brewfile.localfor machine-specific extras - Windows: winget only, from a declarative
windows/winget.json(winget import). Chocolatey has been retired. - Linux: apt for system packages + mise for CLI tools (eza, bat, delta, zoxide, starship, atuin, gh, fzf, ov, tree-sitter) as prebuilt binaries — no rust toolchain required (install rust/cargo manually only where you build Rust)
- macOS: Homebrew + a
- Prompt is starship everywhere — zsh and PowerShell
share the one
starship.toml - Sets up zsh via zinit; the PowerShell profile mirrors it (starship + zoxide + atuin + mise + PSReadLine predictions)
- Installs mise to manage language runtimes
(node / python / ruby / …), honoring per-project
.tool-versions/.node-version. Extra tracked tools (e.g. keifu) live inmise/config.toml, linked into mise'sconf.dsomise use -gnever dirties this repo. - Symlinks editor, tmux, Neovim and mise configs, and seeds a local
~/.zshrcand~/.gitconfigthat source / include the tracked configs — so tool installers andgit config --globalnever dirty this repo - Installs fzf, tmux plugins (tpm) and the HackGen Nerd Font
- Configures the Codex CLI footer with model/reasoning, remaining context, directory and Git branch; its terminal title shows project and branch
- starship prompt (cross-shell: zsh + PowerShell)
- mise for runtimes (replaces asdf + nvm)
- Modern CLI: eza, bat, fd, ripgrep, zoxide, git-delta, fzf, atuin, jq, bottom
- ov as the
$PAGER(less-style keybinds via a tracked config) — sobat,manand friends page nicely everywhere; git keeps its own pager (git-delta) - keifu — colorful git commit-graph TUI
(installed via mise);
tigfor log browsing on macOS / Linux / WSL - neovim as a Lua + lazy.nvim config
(tokyonight, treesitter, telescope, neo-tree, lualine, gitsigns, fugitive,
LSP via mason) — the old vim-plug /
.vimrcis retired - Powerline-style tmux theme
- zsh niceties: autosuggestions, fast-syntax-highlighting, extra completions
- A PowerShell profile mirroring the zsh setup
| File | Purpose |
|---|---|
zshrc.core.zsh |
Tracked zsh config (sourced by the local ~/.zshrc) |
zshrc.template |
Seed for the local ~/.zshrc |
Microsoft.PowerShell_profile.ps1 |
PowerShell profile (symlinked into $PROFILE) |
gitconfig |
Tracked git config (included by the local ~/.gitconfig) |
starship.toml |
Prompt config (shared by zsh + PowerShell) |
Brewfile / Brewfile.local |
macOS packages (tracked base / untracked machine extras) |
windows/winget.json |
Windows package set (winget import) |
nvim/ |
Neovim config (Lua + lazy.nvim; dir symlinked into place) |
mise/config.toml |
Tracked mise tools (linked into mise conf.d) |
atuin/ |
Tracked atuin config |
ov/config.yaml |
Tracked ov pager config (less-style keybinds; symlinked to ~/.config/ov/) |
claude-statusline.ps1 / .sh |
Two-row custom Claude Code status line (Windows / macOS/Linux) |
.tmux.conf |
tmux config |
install.ps1 / install.sh |
One-line bootstrap (clone + run the installer) |
setup.sh / setup.ps1 / setup.core.ps1 |
Installers |
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/kt81/.dotfiles/HEAD/install.sh)"or
git clone https://github.com/kt81/.dotfiles.git ~/.dotfiles
~/.dotfiles/setup.shEnable Developer Mode first (Settings → For developers) so symlinks work
without an elevated shell. Then, in powershell.exe:
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/kt81/.dotfiles/HEAD/install.ps1'))install.ps1 installs git via winget, clones the repo to ~/.dotfiles, and runs
setup.ps1, which imports windows/winget.json and hands off to setup.core.ps1
for modules, fonts, and symlinks. winget self-elevates per package as needed, so
the shell itself need not be elevated.
Notes:
tigis not packaged for winget; use it inside WSL (installed bysetup.sh). On native Windows, keifu (installed via mise) covers colorful commit-graph browsing, andgit logis paged through git-delta.- nvim-treesitter is on the
mainbranch (a rewrite; needs nvim 0.11+). It builds parsers with thetree-sitterCLI (in the winget/Brewfile sets and mise on Linux), which in turn shells out to a C compiler — so one must be onPATH. On Windows, LLVM/clang works (winget install LLVM.LLVM); it isn't inwindows/winget.jsonbecause it's a heavy dependency to force on every host. (The oldmasterbranch bundled pre-generated parser sources and needed only the C compiler;mainrequires the CLI as well.) - Rust is bootstrapped by
Rustlang.Rustupin the winget set, but rustup self-manages after that: winget reports its version as "Unknown" and leaves it out ofwinget upgrade, so keep updating withrustup update. Its defaultx86_64-pc-windows-msvctoolchain needs the Visual Studio C++ build tools. (Linux/macOS install rust by hand —setup.shno longer needs a toolchain now that the CLI tools come from mise as prebuilt binaries.) setup.core.ps1adds mise's shims (%LOCALAPPDATA%\mise\shims) to the user PATH.mise activateonly covers shells that source the profile, so without the shims, mise-managed tools (node, keifu, …) are invisible to Windows PowerShell 5.1, IDEs, and anything launched from the GUI. Shims still resolve per-project versions; interactive pwsh keeps using the faster activate path.- WSL:
setup.shsetsappendWindowsPath = falsein/etc/wsl.confso shells don't inherit the huge WindowsPATH(command lookup / completion stay fast); only the handful of Windows tools actually used are re-added inzshrc.wsl.zsh. Clipboard routes throughwin32yank(zshpbcopy/pbpaste, tmux-yank, Neovim), andopen/startusewslview(fromwslu). Runwsl --shutdownonce from Windows after setup to apply the PATH change. - Windows Terminal settings are deliberately not tracked. Terminal rewrites
settings.jsonon its own (reordering keys, adding compat flags) and regenerates profiles from whatever WSL distros / apps are installed, so the file is inherently machine-specific. Its fragment mechanism only covers schemes and individual profiles — notprofiles.defaults,actionsor globals — so there is nothing worth splitting out. Set the font (HackGen Console NF, whichsetup.core.ps1installs) and theme by hand.
These scripts install packages and use sudo as needed. If you want to reuse this
repo, please make sure you understand what they do first.