Personal terminal environment for macOS — tuned for security engineering and penetration testing work. Built around Neovim, tmux, and zsh with a focus on keyboard-driven workflows and minimal friction.
Bootstrap a fresh machine:
git clone https://github.com/Gerrrt/dotfiles-MacBook ~/.config && bash ~/.config/bootstrap.sh
| Layer | Tool | Notes |
|---|---|---|
| Terminal | Ghostty | TokyoNight, CaskaydiaCove Nerd Font |
| Shell | zsh + Starship | Custom plugin loader, no Oh My Zsh |
| Editor | Neovim | lazy.nvim, full LSP, DAP, neotest |
| Multiplexer | tmux | TPM, TokyoNight theme, sessionizer |
| History | Atuin | SQLite-backed, synced |
| Fuzzy finder | fzf + fzf-lua | fd + bat previews |
| File manager | yazi | TUI, replaces Ranger |
| Git TUI | lazygit | delta pager, conventional commits |
| Secrets | 1Password CLI | SSH agent, secret injection |
| Directory nav | zoxide | z / Alt+Z jump |
~/.config/
├── bootstrap.sh # Provisions a fresh Mac end-to-end
├── Brewfile # All Homebrew packages and casks
├── atuin/
│ └── config.toml # History sync, search mode, enter_accept
├── ghostty/
│ └── config.ghostty # Theme, font, transparency, keybinds
├── git/
│ ├── config # Core git config, delta pager, LFS
│ └── ignore # Global gitignore (HOME-level)
├── lazygit/
│ └── config.yml # Delta pager, nvim editor, custom commands
├── nvim/
│ └── lua/gerrrt/
│ ├── config/ # options, keymaps, autocmds, lazy bootstrap
│ ├── plugins/ # One file per plugin
│ ├── servers/ # One file per LSP server
│ └── utils/ # lsp.lua, diagnostics.lua
├── ssh/
│ └── config # Hardened defaults, ControlMaster, templates
│ # Symlinked to ~/.ssh/config by bootstrap.sh
├── tmux/
│ ├── tmux.conf
│ └── scripts/
│ ├── tmux-sessionizer.sh
│ ├── tmux-scratch.sh
│ └── tmux-menu.sh
└── zsh/
├── .zshenv # XDG dirs, EDITOR, MANPAGER, PATH
├── .zprofile # Homebrew shellenv
├── .zshrc # Entry point — sources all modules below
├── aliases.zsh # eza, bat, git, navigation
├── atuin.zsh # Atuin init (ATUIN_NOBIND=true, bound to Ctrl+E)
├── bindings.zsh # vi-mode keybindings via zvm_after_init hook
├── fzf.zsh # fzf config + custom widgets
├── op.zsh # 1Password CLI helpers
├── plugins.zsh # Lightweight plugin loader
├── prompt.zsh # Starship init
├── security.zsh # Recon, nmap, SSL, network aliases
└── starship.toml # Prompt theme
# Clone into ~/.config (repo lives here directly — no stow needed)
git clone https://github.com/Gerrrt/dotfiles-MacBook ~/.config
# Bootstrap: installs Homebrew, Brewfile, Atuin, TPM, sets default shell
bash ~/.config/bootstrap.sh
# Create SSH sockets dir (required for ControlMaster)
mkdir -p ~/.ssh/sockets && chmod 700 ~/.ssh/sockets
# Start tmux and install plugins
tmux
# then: prefix + IAfter bootstrap, open Neovim and run :Lazy sync to install all plugins.
| Key | Action |
|---|---|
Ctrl+R |
Fuzzy history search (custom fzf widget) |
Ctrl+E |
Atuin TUI history search |
Ctrl+F |
Fuzzy file picker — no hidden files |
Ctrl+T |
Fuzzy file picker — including hidden files (fzf default) |
Ctrl+G |
tmux sessionizer from shell |
Alt+Z |
Zoxide fuzzy jump |
Ctrl+\ |
Toggle zsh-autosuggestions |
↑ / ↓ |
History substring search by prefix |
Ctrl+→ |
Forward word |
Ctrl+← |
Backward word |
Managed by a lightweight built-in loader in plugins.zsh — no Oh My Zsh,
no Zinit. Plugins are auto-cloned to zsh/plugins/ on first launch (that
directory is gitignored).
| Plugin | Purpose |
|---|---|
| zsh-autosuggestions | Fish-style inline suggestions |
| zsh-history-substring-search | Prefix-filtered Up/Down history |
| zsh-vi-mode | Vi keybindings with cursor shape |
| fast-syntax-highlighting | Syntax highlighting |
| fzf-tab | fzf-powered tab completion |
| zsh-you-should-use | Alias reminder |
Update all plugins:
zplugin-update| Function | Usage |
|---|---|
fif <term> |
Find term inside files (rg + fzf + bat preview) |
fbr |
Fuzzy git branch checkout |
dotsync |
Commit and push ~/.config to GitHub |
sslcheck <host> |
Print SSL cert dates + issuer |
Leader: Space
| Key | Action |
|---|---|
s |
Flash jump (label-based 2-char motion) |
S |
Flash Treesitter jump |
<leader>e |
Toggle file tree |
<leader>z |
Zen mode |
<C-h/j/k/l> |
Move between windows / tmux panes |
| Key | Action |
|---|---|
<leader>ha |
Add current file to list |
<leader>hh |
Open quick menu |
<leader>1-4 |
Jump to mark 1–4 |
<leader>hn/hp |
Next / previous mark |
| Key | Action |
|---|---|
K |
Hover documentation |
<leader>gd |
Peek definition |
<leader>gD |
Go to definition |
<leader>gS |
Go to definition in split |
<leader>ca |
Code action |
<leader>rn |
Rename symbol |
<leader>D |
Line diagnostics |
<leader>d |
Cursor diagnostics |
<leader>pd / nd |
Prev / next diagnostic |
<leader>oi |
Organise imports |
| Key | Action |
|---|---|
<leader>ff |
Files |
<leader>fg |
Live grep |
<leader>fb |
Buffers |
<leader>fh |
Help tags |
<leader>fd |
LSP finder |
<leader>fr |
References |
<leader>fs |
Document symbols |
<leader>fw |
Workspace symbols |
<leader>fx/fX |
Diagnostics (buffer / workspace) |
| Key | Action |
|---|---|
<leader>tt |
Run nearest test |
<leader>tf |
Run file |
<leader>ts |
Toggle summary panel |
<leader>to |
Toggle output panel |
<leader>td |
Debug nearest test (DAP) |
<leader>tS |
Stop run |
| Key | Action |
|---|---|
<leader>dc |
Continue / start |
<leader>do |
Step over |
<leader>di |
Step into |
<leader>du |
Step out |
<leader>db |
Toggle breakpoint |
<leader>dr |
Open REPL |
| Key | Action |
|---|---|
<leader>xx |
Workspace diagnostics |
<leader>xX |
Buffer diagnostics |
<leader>cs |
Document symbols |
<leader>cl |
LSP references / definitions |
lua_ls · pyright · gopls · ts_ls · bashls · clangd · dockerls
· emmet_ls · yamlls · tailwindcss · solidity_ls_nomicfoundation · efm
Linters and formatters managed through EFM: stylua · luacheck · black
· flake8 · gofumpt · go_revive · prettier_d · eslint_d · shfmt
· shellcheck · clang-format · cpplint · solhint
Prefix: Ctrl+A
| Key | Action |
|---|---|
prefix + | |
Split vertically |
prefix + - |
Split horizontally |
prefix + h/j/k/l |
Navigate panes |
Shift+←/→ |
Previous / next window |
prefix + c |
New window (cwd) |
prefix + r |
Reload config |
| Key | Action |
|---|---|
prefix + f |
Project sessionizer (fuzzy-find → create/switch session) |
prefix + g |
lazygit popup |
prefix + T |
Scratchpad session |
prefix + w |
Session/window switcher menu |
tpm · tmux-sensible · vim-tmux-navigator · tmux-yank ·
tmux-resurrect · tmux-continuum · tokyo-night-tmux
Sessions are auto-saved every 15 minutes and restored on tmux start via
tmux-continuum. To wipe saved sessions: rm -rf ~/.local/share/tmux/resurrect/
Aliases and functions in zsh/security.zsh, tools installed via Brewfile.
| Alias | Command |
|---|---|
myip |
External IP via ipinfo.io |
localip |
LAN IP on en0 |
listening |
All listening TCP sockets |
ports |
All open ports |
nmap-quick <target> |
-T4 -F fast scan |
nmap-full <target> |
-T4 -A -v full scan |
nmap-vuln <target> |
NSE vuln scripts |
nmap-ping <subnet> |
Host discovery |
rscan <target> |
RustScan fast port scan |
rscan-full <target> |
RustScan → nmap -A |
| Alias / Function | Purpose |
|---|---|
sslcheck <host> |
Cert dates, subject, issuer |
headers <url> |
HTTP response headers |
b64e / b64d |
Base64 encode / decode |
sha256 / sha512 |
File hashing |
urlencode / urldecode |
URL encoding via Python |
hflush |
Flush DNS cache |
ssh-sessions |
List active ControlMaster sockets |
Shell integration in zsh/op.zsh. The 1Password SSH agent replaces
ssh-agent — private keys never touch disk.
# Fetch a secret by path
opsecret "Personal/AWS/access_key_id"
# Run a command with secrets injected from a .env.op template
# .env.op format: KEY=op://vault/item/field
openv .env.op cargo run
# Copy a TOTP code to clipboard
optoken "Personal/GitHub"
# List SSH keys stored in 1Password
opsshTo enable the 1Password SSH agent, uncomment the IdentityAgent line in
ssh/config and enable it in the 1Password app under
Settings → Developer → SSH Agent.
ssh/config is tracked in this repo and symlinked to ~/.ssh/config by
bootstrap.sh. It provides:
- ControlMaster multiplexing — reuses existing connections, eliminates repeated auth for the same host
- Hardened algorithm preferences — Ed25519, ChaCha20-Poly1305, ECDH
- Jump host template — commented-out bastion +
*.internalpattern - Lab host template — for throwaway pentest targets
Edit the commented sections to add your actual hosts.
# Commit and push dotfiles
dotsync
# Update all zsh plugins
zplugin-update
# Update Neovim plugins
nvim +LazyUpdate
# Update tmux plugins
# prefix + U (inside tmux)
# Install new Brew packages after editing Brewfile
brew bundle --file=~/.config/Brewfile