My MacOS focused development environment dotfiles.
# 1. Clone the repo
git clone https://github.com/YOUR_USER/dotfiles.git ~/Personal/Repos/dotfiles
cd ~/Personal/Repos/dotfiles
# 2. Run the install script (installs Homebrew and dotbot if needed, then symlinks everything)
./install
# 3. Install Homebrew packages
brew bundle --file ~/.Brewfile
# 4. Open a new terminal to load ZSH configuration# Install tmux plugins (open tmux first, then press prefix + I)
tmux
# Neovim plugins auto-install on first launch
nvim- macOS (Apple Silicon, paths assume
/opt/homebrew/) - Xcode Command Line Tools (
xcode-select --install) - SSH key at
~/.ssh/id_rsa(optional, for git/GitHub) ~/secrets.shfor private environment variables (optional)
- Nord Color Scheme
- Homebrew
- Yabai WM & SKHD
- Sketchybar
- Kitty
- Tmux
- Neovim
- Ruby development focused
- LSP
- Treesitter
- Snacks
- Git
- Ranger
- Bat
- ZSH
- FZF
- Starship Prompt
- LazyGit
FZF commands are available both as shell functions and as tmux popup keybindings.
All bindings use the tmux prefix (Ctrl+Space). Popup windows display a centered title so you know what you're looking at.
Popup Apps
| Binding | Description |
|---|---|
prefix + f |
Ranger file manager |
prefix + d |
LazySQL |
prefix + h |
Htop |
prefix + i |
IRB (Ruby REPL) |
prefix + v |
Cloudflare speed test |
Files & Navigation
| Binding | Description |
|---|---|
prefix + e |
Find and edit a file in the current directory |
prefix + s |
Live ripgrep search, Enter to open file at match |
Tmux (prefix + t, then second key)
| Binding | Description |
|---|---|
prefix + t p |
Switch to another tmux pane across windows |
prefix + t e |
Sessionizer - find a project directory and open/switch to a tmux session |
prefix + t t |
Toggle the status bar |
Git (prefix + g, then second key)
| Binding | Description |
|---|---|
prefix + g g |
Lazygit |
prefix + g b |
Git branch switcher (sorted by recent, with log preview) |
prefix + g l |
Git log browser (Enter to view diff, Ctrl-O to checkout) |
prefix + g s |
Git stash browser (Enter to apply, Ctrl-D to drop) |
System & Tools
| Binding | Description |
|---|---|
prefix + K |
Fuzzy find and kill a process |
prefix + N |
Browse listening ports and kill the process |
| Command | Description |
|---|---|
fe [query] |
Find and open a file in $EDITOR |
fo [query] |
Find a file - Ctrl-O to open, Enter to edit |
fcd |
cd into a directory (including hidden) |
| Binding | Description |
|---|---|
Ctrl+R |
Search shell history (Ctrl-Y to copy to clipboard) |
Ctrl+T |
Find files/directories with preview |
Debug Ruby files, RSpec tests, and Rails servers directly in Neovim using nvim-dap with the rdbg adapter (from the debug gem). Two debugging UIs are available: nvim-dap-ui (multi-panel layout) and nvim-dap-view (single-window).
Prerequisites:
The debug gem must be available in your project. It's already bundled as a dependency of ruby-lsp, but you can also add it explicitly:
# Gemfile
group :development, :test do
gem "debug"
endKeybindings:
| Binding | Description |
|---|---|
<leader>db |
Toggle breakpoint |
<leader>dc |
Start/continue debugging |
<leader>di |
Step into |
<leader>do |
Step over |
<leader>dO |
Step out |
<leader>du |
Toggle DAP UI (multi-panel) |
<leader>dv |
Toggle DAP View (single-window) |
<leader>dw |
Add watch expression (DAP View) |
DAP UI opens automatically when a debug session starts and closes when it ends. It shows scopes, breakpoints, stacks, watches, and a REPL in a multi-panel layout.
DAP View is toggled manually with <leader>dv. Switch between sections using the winbar keys:
| Key | Section |
|---|---|
S |
Scopes — inspect local/global variables |
W |
Watches — evaluate custom expressions |
B |
Breakpoints — view and manage breakpoints |
T |
Threads — navigate call stacks |
E |
Exceptions — configure exception breakpoints |
R |
REPL — interactive debug console |
Press g? inside any section to see all available actions (expand, edit, delete, etc.).
Debugging Ruby files and RSpec:
- Open a Ruby file and set breakpoints with
<leader>db - Start debugging with
<leader>dcand choose a launch config:- Run current file — runs
ruby <file>under the debugger - RSpec - current file — runs
bundle exec rspec <file>under the debugger
- Run current file — runs
- DAP UI opens automatically showing scopes, breakpoints, stacks, and a REPL
- Step through code with
<leader>di/<leader>do/<leader>dO - Optionally open DAP View with
<leader>dvfor a focused single-window view
Debugging a Rails server:
Rails requires an attach workflow since Puma manages its own process lifecycle:
- Start Rails with rdbg in a separate terminal or tmux pane:
bundle exec rdbg --open --port 12345 --nonstop -c -- bin/rails server - Set breakpoints in a controller/model with
<leader>db - Attach with
<leader>dc→ Attach to Rails server - Hit the route in your browser — Neovim will pause at the breakpoint
- Step through code and inspect variables in DAP UI or DAP View
Run RSpec tests from within Neovim using neotest with the neotest-rspec adapter.
| Binding | Description |
|---|---|
<leader>tn |
Run nearest test |
<leader>tf |
Run current file |
<leader>ts |
Run full test suite |
<leader>to |
Show test output |
<leader>tS |
Toggle test summary panel |
vim-rails provides Rails-aware navigation commands:
| Command | Description |
|---|---|
:Emodel <name> |
Jump to a model |
:Econtroller <name> |
Jump to a controller |
:Eview <name> |
Jump to a view |
:Emigration <name> |
Jump to a migration |
:A |
Jump to alternate file (e.g. model → test) |
:R |
Jump to related file (e.g. migration → schema) |
gf |
Enhanced go-to-file that understands Rails paths |
The WM needs to add hacks to get it working fully:
After upgrading Yabai, you need to follow these steps to properly setup application following:
Installing claude-code
Add/edit ~/.claude/settings.json to have:
{
"apiKeyHelper": "~/.claude/anthropic_key.sh"
}
Then in ~/.claude/anthropic_key.sh:
echo "sk-........."
and make it executable with:
chmod +x ~/.claude/anthropic_key.sh



