Development environment managed with symlinks and a single install script. Primarily macOS, with Linux support (see below).
git clone https://github.com/xeaser/dotfiles.git ~/dotfiles && cd ~/dotfiles && ./install.sh~/dotfiles/
├── zsh/ # Zsh config + Powerlevel10k prompt
│ ├── .zshrc
│ └── .p10k.zsh
├── tmux/ # oh-my-tmux config + scripts
│ ├── .tmux.conf.local
│ ├── .gitmux.conf
│ └── scripts/
│ └── spotify.sh
├── nvim/ # LazyVim-based Neovim config
│ ├── init.lua
│ ├── lazy-lock.json # Plugin version lockfile
│ ├── cheatsheet.md # Keybinding reference
│ └── lua/
│ ├── config/
│ │ ├── lazy.lua # Plugin manager + 21 LazyVim extras
│ │ └── options.lua # exrc, session options
│ └── plugins/
│ ├── avante.lua # AI assistant (Claude)
│ ├── coffebar.lua # Project manager (fzf-lua)
│ ├── colorscheme.lua # Gruvbox-material + 4 themes
│ ├── dap.lua # Debug adapter UI layout
│ ├── neotest.lua # Test runner (Go, Python, Jest)
│ ├── noice.lua # Command line position
│ ├── opencode.lua # opencode.nvim integration
│ ├── treesitter.lua # Syntax + incremental selection
│ └── vim-tmux-navigator.lua
├── kitty/ # Kitty terminal config
│ └── kitty.conf
├── git/ # Git config
│ └── .gitconfig
├── k9s/ # k9s Kubernetes terminal UI
│ ├── config.yaml # Global settings, UI, logger, thresholds
│ ├── aliases.yaml # Resource navigation shortcuts
│ ├── views.yaml # Custom column layouts for pods
│ └── clusters/
│ └── example-cluster.yaml # Template
├── opencode/ # opencode AI coding assistant
│ ├── opencode.jsonc # Main config: plugins, MCP servers, providers
│ ├── ocx.jsonc # OCX extension manager config
│ ├── oh-my-opencode.json # Agent model routing
│ ├── dcp.jsonc # Dynamic context pruning config
│ ├── package.json # Plugin dependencies
│ ├── commands/ # Slash commands (/ci, /pr)
│ ├── skills/ # Reusable agent skills
│ │ ├── aws-sso-reauth/
│ │ ├── ci-status/
│ │ └── pr-status/
│ └── profiles/default/ # Default profile overrides
├── examples/ # Project-local config examples
│ ├── .nvim.lua # Per-project Neovim DAP config
│ ├── .envrc # Per-project direnv env vars
│ └── README.md
├── Brewfile # Homebrew packages
├── install.sh # Idempotent setup script
├── .secrets.example # Template for secrets
└── .gitignore
Check what needs to be installed or linked without making any changes:
./install.sh --dry-runShows a color-coded report: green = installed, red = missing, blue = needs linking, yellow = wrong symlink target. Includes a summary count at the end.
| Tool | Description |
|---|---|
| zsh | Oh My Zsh + Powerlevel10k with fzf-tab, autosuggestions, fast-syntax-highlighting, atuin, zoxide, direnv |
| tmux | oh-my-tmux with gruvbox theme, gitmux status, spotify, session management via sesh |
| nvim | LazyVim with 21 extras: gruvbox-material theme, NeoTree, DAP debugging, neotest, illuminate, aerial, navic, indent-blankline, avante (AI), opencode.nvim, project manager. See cheatsheet |
| kitty | Gruvbox dark theme, Nerd Fonts, powerline tabs |
| k9s | Kubernetes terminal UI with custom aliases (dp, sec, jo), pod column layouts with image versions and resource usage |
| opencode | AI coding assistant with oh-my-opencode model routing, MCP servers (postgres, GitHub, Atlassian, JetBrains, Obsidian), custom skills (AWS SSO, CI status, PR status), slash commands |
| brew | All packages captured in Brewfile |
Secrets are never committed. The install script creates ~/.secrets from .secrets.example on first run.
# After install, edit:
vim ~/.secrets
chmod 600 ~/.secretsSourced automatically by .zshrc.
| Shortcut | Action |
|---|---|
vim / vi |
Opens Neovim |
viz |
Edit .zshrc |
soz |
Source .zshrc |
k |
kubectl |
tdaily |
Attach to tmux "daily" session |
| Shortcut | Action |
|---|---|
prefix + T |
sesh session picker (fzf) |
prefix + Z |
tmux-fzf launcher |
prefix + Space |
tmux-thumbs (copy hints) |
F12 |
Suspend tmux (nested sessions) |
Ctrl+h/j/k/l |
Navigate panes (vim-aware) |
| Shortcut | Action |
|---|---|
leader + aa |
Avante AI assistant |
leader + gg |
LazyGit |
leader + tt |
Run nearest test |
leader + td |
Debug nearest test |
leader + pp |
Browse projects |
leader + ph |
Project history |
leader + oo |
Toggle opencode |
leader + z |
Project debug configs (per-project .nvim.lua) |
leader + db |
Toggle breakpoint |
leader + dc |
Start/continue debugging |
leader + e |
Toggle NeoTree file explorer |
leader + cs |
Toggle aerial symbols sidebar |
leader + rs |
Refactoring picker |
leader + uC |
Colorscheme picker |
Ctrl+h/j/k/l |
Navigate splits (tmux-aware) |
Full keybinding reference: nvim/cheatsheet.md
The setup is primarily macOS but works on Linux with --skip-brew:
./install.sh --skip-brewThis skips Homebrew and installs all symlinks, clones oh-my-zsh, plugins, oh-my-tmux, and powerlevel10k.
Install packages manually on Linux using your distro's package manager before running the script:
# Debian/Ubuntu
sudo apt install zsh tmux neovim fzf kitty git curl
# Arch
sudo pacman -S zsh tmux neovim fzf kitty git curlThen install tools not in distro repos (zoxide, atuin, sesh, gitmux, lazygit, direnv) via their official install instructions or Homebrew for Linux.
macOS-only features (skipped automatically on Linux):
toggleNotch,volUpaliases (osascript)- Spotify status in tmux (requires osascript)
macos_option_as_altin kitty- Homebrew casks (GUI apps)
