Skip to content

Repository files navigation

.dotfiles

Overview

A starting point for setting up a development host (macOS / Windows / Linux) with my preferred tools and configuration.

Target environment

  • macOS (Apple Silicon)
  • Windows (10 / 11)
  • Linux (Ubuntu, including WSL; other Debian-family distros untested)

What it does

  • Installs packages, declaratively where possible:
    • macOS: Homebrew + a Brewfile (brew bundle); Brewfile.local for 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)
  • 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 in mise/config.toml, linked into mise's conf.d so mise use -g never dirties this repo.
  • Symlinks editor, tmux, Neovim and mise configs, and seeds a local ~/.zshrc and ~/.gitconfig that source / include the tracked configs — so tool installers and git config --global never 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

Included

  • 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) — so bat, man and friends page nicely everywhere; git keeps its own pager (git-delta)
  • keifu — colorful git commit-graph TUI (installed via mise); tig for 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 / .vimrc is retired
  • Powerline-style tmux theme
  • zsh niceties: autosuggestions, fast-syntax-highlighting, extra completions
  • A PowerShell profile mirroring the zsh setup

Layout

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

Usage

macOS / Linux

/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.sh

Windows

Enable 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:

  • tig is not packaged for winget; use it inside WSL (installed by setup.sh). On native Windows, keifu (installed via mise) covers colorful commit-graph browsing, and git log is paged through git-delta.
  • nvim-treesitter is on the main branch (a rewrite; needs nvim 0.11+). It builds parsers with the tree-sitter CLI (in the winget/Brewfile sets and mise on Linux), which in turn shells out to a C compiler — so one must be on PATH. On Windows, LLVM/clang works (winget install LLVM.LLVM); it isn't in windows/winget.json because it's a heavy dependency to force on every host. (The old master branch bundled pre-generated parser sources and needed only the C compiler; main requires the CLI as well.)
  • Rust is bootstrapped by Rustlang.Rustup in the winget set, but rustup self-manages after that: winget reports its version as "Unknown" and leaves it out of winget upgrade, so keep updating with rustup update. Its default x86_64-pc-windows-msvc toolchain needs the Visual Studio C++ build tools. (Linux/macOS install rust by hand — setup.sh no longer needs a toolchain now that the CLI tools come from mise as prebuilt binaries.)
  • setup.core.ps1 adds mise's shims (%LOCALAPPDATA%\mise\shims) to the user PATH. mise activate only 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.sh sets appendWindowsPath = false in /etc/wsl.conf so shells don't inherit the huge Windows PATH (command lookup / completion stay fast); only the handful of Windows tools actually used are re-added in zshrc.wsl.zsh. Clipboard routes through win32yank (zsh pbcopy/pbpaste, tmux-yank, Neovim), and open / start use wslview (from wslu). Run wsl --shutdown once from Windows after setup to apply the PATH change.
  • Windows Terminal settings are deliberately not tracked. Terminal rewrites settings.json on 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 — not profiles.defaults, actions or globals — so there is nothing worth splitting out. Set the font (HackGen Console NF, which setup.core.ps1 installs) and theme by hand.

Disclaimer

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.

About

dotfiles and setup scripts for Windows, WSL, and macOS

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Packages

Contributors

Languages