Personal dotfiles for a complete development environment across macOS, Linux, and Windows. Focused on terminal-based tools, modal (vim) editing, and tiling window managers.
- Cross-Platform Support: Optimized deployment for Windows, macOS, and Linux
- Modern XDG Compliance: Configurations organized in
.config/directory - Unified Theme: Catppuccin Frappe across all tools (Neovim, Wezterm, Tmux, Yazi, Komorebi)
- Modal Editing: Neovim with LazyVim + IdeaVim for JetBrains IDEs
- Seamless Navigation: Ctrl+hjkl works across terminal multiplexer panes and vim splits
- Tiling Window Managers: Yabai (macOS) and Komorebi (Windows)
Choose the deployment script for your platform:
.\deploy_windows.ps1 # Full setup: packages, symlinks, env vars
.\deploy_windows.ps1 -SkipPackages # Symlinks only
.\deploy_windows.ps1 -DryRun # Preview changes without executing./setup_mac.sh # Installs Homebrew packages, creates symlinks, starts services./deploy.sh # Installs dependencies, oh-my-zsh, creates symlinksConfigs are symlinked into this repo, so most updates need only a pull:
cd ~/dotfiles && git pullThis instantly updates every symlinked config (Neovim, Wezterm, Tmux, Zsh, Claude Code, etc.) — no re-deploy needed. Re-run a script only for the non-symlink bits:
| When | Run |
|---|---|
| AI configs / MCP / secrets changed | ./scripts/sync-ai-configs.sh (Linux/macOS) · .\deploy_windows.ps1 -SkipPackages (Windows) |
| New tool or package added | ./deploy.sh (Linux/macOS) · ./setup_mac.sh (macOS) · .\deploy_windows.ps1 -SkipPackages (Windows) |
| Neovim plugins out of date | open nvim → :Lazy sync |
| Tmux plugins out of date | Prefix + I (Prefix = Ctrl+Space) |
First sync on a new machine creates
~/.config/dotfiles/secrets.envfrom the template — edit it and fill inCONTEXT7_API_KEY.
- Terminal: Wezterm with workspaces (replaces tmux)
- Navigation: vim-smart-splits for pane/split navigation
- Window Manager: Komorebi with per-monitor status bars
- Leader Key:
Ctrl+Space(1 second timeout)
- Terminal: Wezterm or Alacritty
- Multiplexer: Tmux with TPM plugin manager
- Navigation: vim-tmux-navigator for pane/split navigation
- Window Manager: Yabai (macOS) with SKHD hotkeys and SketchyBar
The MacBook built-in keyboard is remapped with Kanata to mirror the ZSA Voyager layout (config: .config/kanata/kanata.kbd, single source). The external Voyager is never touched — its firmware does its own remapping.
- Caps Lock → tap
Esc/ holdCtrl(fixes Karabiner's tap-Esc misfires under Alfred) - Home-row mods (C-S-A-G):
A/S/D/F= Ctrl/Shift/Alt/Cmd,J/K/L/;mirrored, with opposite-hand resolution so same-hand rolls stay letters. For same-hand combos (e.g. Cmd+Q), use the opposite hand's mod. - Z/X/./? → Hyper/Meh; Right Option → Hyper.
- Hold Space → nav layer:
hjkl= arrows,Y/U/I/O= Home/PgDn/PgUp/End; combine with the live left-hand mods for select / word / line motions. - Panic exit:
LCtrl+Space+Esc.
One-time setup (macOS): install the pqrs Karabiner-DriverKit-VirtualHIDDevice driver (v6.2.0, pinned in kanata's setup-macos.md), then activate it via the hidden Manager app — sudo "/Applications/.Karabiner-VirtualHIDDevice-Manager.app/Contents/MacOS/Karabiner-VirtualHIDDevice-Manager" forceActivate (note the leading dot in .Karabiner…) — and enable it under System Settings → General → Login Items & Extensions → Driver Extensions. Grant Input Monitoring + Accessibility to /opt/homebrew/bin/kanata. Two root LaunchDaemons must be installed (commands in setup_mac.sh): org.pqrs.Karabiner-VirtualHIDDevice-Daemon (the driver daemon kanata connects to — required; Karabiner-Elements used to run it implicitly, so don't skip it once KE is gone) and dev.kanata.kanata (kanata itself). Reload after edits with scripts/kanata-reload.sh.
- Git (all platforms)
- Windows: PowerShell 7+, Admin privileges
- macOS: Xcode Command Line Tools
- Linux: curl, zsh
- Font: JetBrains Mono Nerd Font (installed by deployment scripts)
-
Restart your shell or source the new configuration:
- Zsh:
source ~/.zshrc - PowerShell:
. $PROFILE
- Zsh:
-
Neovim: Launch nvim and run
:Lazy syncto install plugins -
Tmux (macOS/Linux): Press
Prefix + Ito install TPM plugins (Prefix =Ctrl+Space) -
Komorebi (Windows): Start with
komorebic startafter settingKOMOREBI_CONFIG_HOMEenv var
| Tool | Purpose | Config Location |
|---|---|---|
| Neovim | Editor | .config/nvim/ |
| Wezterm | Terminal | .config/wezterm/wezterm.lua |
| Tmux | Multiplexer | tmux/tmux.conf |
| Zsh | Shell | zsh/zshrc.sh |
| Komorebi | Window Manager (Windows) | .config/komorebi/ |
| Yabai | Window Manager (macOS) | .config/yabai/yabairc |
| Yazi | File Manager | .config/yazi/ |
| Starship | Prompt | .config/starship.toml |
| IdeaVim | Vim for JetBrains | .ideavimrc |
| Claude Code | AI agent config + skills | claude/ |
| Kanata | Keyboard remap (macOS built-in kbd) | .config/kanata/kanata.kbd |
Canonical store: claude/skills/<name>/ - one directory per skill, linked into ~/.claude/skills/:
- Windows (
deploy_windows.ps1): per-item symlinks, so plugin-managed junctions in~/.claude/skills/are never clobbered. New repo skills get linked on the next deploy; existing names are left as-is. - macOS/Linux (
scripts/sync-ai-configs.sh, called bydeploy.sh): whole-dir symlink~/.claude/skills -> claude/skills, so new repo skills are live immediately after pull.
Current skills: game-feel, game-marketing, gamedev-art, gamedev-audio, handoff, indie-production, level-design, unity-engineering, unity-shaders, unity-worktree-setup.
unity-worktree-setup is script-driven (designed to run on smaller/faster models) and dual-runtime: the same five worktree lifecycle verbs (preflight, list-worktrees, new-worktree, recycle-worktree, remove-worktree) exist as PowerShell (scripts/*.ps1, Windows) and bash 3.2 (scripts/*.sh, macOS/Linux - no PowerShell required). Both emit identical JSON and exit codes.
- DEPLOYMENT.md - Detailed comparison of deployment scripts
- STRUCTURE.md - Explanation of repository organization
- AGENTS.md - Complete architecture documentation for AI assistants (
CLAUDE.mdis a one-line@AGENTS.mdimport of it) - docs/CROSS_PLATFORM_CLAUDE_CONFIG.md - How the shared Claude Code config (vault path, hooks, agent-flow) stays portable across macOS/Windows
y- Yazi file manager with cd-on-exitz- Zoxide smart directory jumping (aliased tocd)ls,ll,la,lt- Eza variants (modern ls replacement)
Personal configuration files - use at your own discretion.