Here is what my machine looks like on any given workday.
Tools
- Homebrew — package manager
- Ghostty — terminal
- zsh with Sheldon — shell and plugin manager
- Starship — prompt
- tmux — multiplexer
- Aerospace — window manager
- Neovim — editor
- Zed — editor
- Yazi — file manager
- fzf — fuzzy finder
- fd — find replacement
- bat — cat replacement
- Lazygit — git TUI
- Atuin — shell history
- thefuck — command correction
- direnv — per-directory env vars
- Devbox — portable dev environments
- Ollama — local LLM runtime
- Claude Code — AI coding
- opencode — AI coding, local models
Terminal
Ghostty is my terminal. I went through Kitty and WezTerm before settling here. It is fast, the config is dead simple, and it stays out of the way.
Shell is zsh. I manage plugins with Sheldon. The ones I actually use are zsh-autosuggestions, zsh-syntax-highlighting, zsh-vi-mode, and fzf-tab. That last one swaps out the default tab completion for an fzf picker, which is much better.
The prompt is Starship. Minimal config, shows what I need.
Multiplexer
tmux. The prefix is the backtick. I use fzf popups for session and window switching instead of the default C-b s navigation. Lazygit and AI tools also open through tmux popups, each on its own keybinding.
Window Management
Aerospace is a tiling window manager for macOS. No SIP disabling required, which is the main reason I moved to it from Yabai. I have a shell function ff that fuzzy searches all open windows with fzf and focuses the one I pick.
Editor
Neovim is the main one. I also use Zed when I want to open something quickly without thinking about it. Real work happens in Neovim.
CLI Tools
Yazi is a terminal file manager. The one wrapper I added is y(), a shell function that changes your current directory to wherever you land when you quit Yazi. Without that it is not really useful.
fzf is in everything. Tab completion, session switching, window picking, project navigation. I use fd instead of find because the syntax is saner.
bat replaces cat, with syntax highlighting out of the box. Themed with Tokyo Night.
Lazygit handles the git operations that are tedious to type out: staging hunks, browsing the log, cherry picking. Opens in a tmux split at the current path.
Atuin syncs shell history across machines. I no longer lose commands between work and personal setups.
direnv handles per-directory env vars. I have a shell function st() that sets the AWS profile and switches the kubectl context at the same time, since those two always need to change together.
Devbox
Devbox gives you portable, isolated dev environments without Docker. It sits on top of Nix but you never have to write Nix. You define the packages you need in a devbox.json and anyone on any machine can run devbox shell and get the exact same environment. No more “works on my machine”.
I use it for project-level tooling where I do not want things bleeding into my global setup.
AI Coding Tools
Claude Code is what I use the most. It runs as a tmux popup, bound to a key. A launcher script picks a repo via fzf and opens it in a new window or a new session depending on what I want.
For offline work I use opencode backed by Ollama.
Local LLMs with Ollama
Ollama runs locally and serves models over a simple API at localhost:11434. All three models I have pulled are MLX variants, which run faster on Apple Silicon because they use the Neural Engine.
qwen3.5:9b-mlx is the default. Fast and good enough for most everyday coding.
qwen2.5-coder:14b is the coding specialist. Larger and slower, but meaningfully better at code generation and debugging.
gemma4:12b-mlx is for review and planning. Good at reading code and reasoning about it. In opencode I have this wired as both the reviewer and planner agent.
opencode routes tasks to the right model automatically:
"agent": {
"plan": { "model": "gemma4:12b-mlx" },
"coder": { "model": "qwen3.5:9b-mlx" },
"reviewer": { "model": "gemma4:12b-mlx" }
}
I also have custom slash commands in opencode for reviewing Terraform, Helm charts, and Kubernetes manifests. Each command specifies which agent to use, so Terraform review hits the coder and architecture questions go to the reviewer.
Everything runs offline. No tokens, no API costs, no data leaving the machine.
If you want to go over the dotfiles, reach out.