Configs for Neovim, Herdr, Ghostty, and portable Agent Skills.
nvim/ -> ~/.config/nvim (symlinked directory)
ghostty/ -> ~/.config/ghostty (symlinked directory)
herdr/ -> ~/.config/herdr/config.toml only
.agents/skills/
create-worktree-env/ personal worktree + env-linking skill
herdr/ Herdr v0.8.0 control skill
-> ~/.agents/skills/<name>
-> ~/.config/agents/skills/<name>
-> ${CLAUDE_CONFIG_DIR:-~/.claude}/skills/<name>
-> ${CODEX_HOME:-~/.codex}/skills/<name>
-> ~/.config/opencode/skills/<name>
git clone https://github.com/chtushar/dotfiles ~/dotfiles
~/dotfiles/install.shinstall.sh is idempotent — re-running it leaves correct symlinks in place and
backs up anything it would otherwise overwrite as <name>.backup.<timestamp>.
Only config.toml is symlinked for Herdr: the rest of ~/.config/herdr is
runtime state (sockets, logs, session.json, installed plugin checkouts) that
does not belong in version control.
Skills use the open Agent Skills SKILL.md format and live under the neutral
.agents/skills convention. They are linked individually, so built-in and
separately installed skills remain untouched. To expose them globally to every
client supported by the Skills CLI, run:
npx skills add ~/dotfiles --global --all| What | Why | Install |
|---|---|---|
| fzf | fzf-lua file/buffer search | brew install fzf |
| Herdr ≥ 0.7.0 | terminal multiplexer; plugin actions | brew install herdr |
| herdr-splits (Herdr plugin) | Herdr side of the split navigation | herdr plugin install lmilojevicc/herdr-splits.nvim |
| herdr-nvim (Herdr plugin) | Persistent Neovim sidebar, touched-file picker, and annotations | herdr plugin install ChmaraX/herdr-nvim |
Neovim plugins bootstrap themselves — lazy.nvim installs itself on first launch
and pins versions from nvim/lazy-lock.json.
After changing herdr/config.toml, apply it with herdr server reload-config.
Leader is <Space>, local leader is \.
| Key | Action |
|---|---|
<C-p> |
Find files |
<C-q> |
Find buffers |
<C-h/j/k/l> |
Move between windows — and Herdr panes, inside a Herdr session |
<M-h/j/k/l> |
Resize window or Herdr pane |
<C-,> / <C-.> |
Shrink / grow split width by 1 column |
<leader>e |
Toggle file tree |
prefix+e |
Toggle the persistent Neovim sidebar in Herdr |
prefix+o |
Pick a file recently touched by the active agent |
| Key | Action |
|---|---|
<leader>gt |
Changed files (git status tree) |
<leader>gd |
Preview hunk diff |
<leader>gb |
Full blame for current line |
Inside the git status tree: ga stage file, gu unstage file, A stage all.
| Key | Action |
|---|---|
<leader>ac |
Toggle Claude Code |
<leader>ax |
Toggle Codex |
<leader>ao |
Toggle OpenCode |
<leader>as |
Send visual selection to active agent |
<leader>rc |
Annotate the current line or visual selection |
<leader>rl |
List pending annotations |
<leader>rs |
Paste annotations into an agent input |
<leader>rS |
Send annotations to an agent |
<Esc><Esc> |
Exit terminal mode (single <Esc> passes through to the agent) |
Split navigation and resizing are unified across Neovim and Herdr by
herdr-splits.nvim. The
Neovim plugin is gated on HERDR_ENV == "1", so outside a Herdr session
<C-h/j/k/l> fall back to plain Neovim window moves.
Ghostty sets macos-option-as-alt = true so <M-hjkl> reaches Herdr and
Neovim. The tradeoff is that Option no longer types composed characters
(ø, å, ...).
nvim/decisions.log records why things are the way they are — read it before
changing something that looks arbitrary.