My terminal setup at the end of 2025
The shell, prompt, and CLI tools I actually reach for every day. Writing it down so I can diff it next year.
This is my daily driver terminal setup on both macOS and Linux at the end of 2025. Writing it down so I can diff it a year from now.
Terminal emulator: Ghostty
I switched from iTerm2 to Ghostty earlier this year and haven’t looked back. It’s GPU-accelerated, genuinely fast, native on both macOS and Linux, and the config is a single file in plain key-value format. No plugin ecosystem, no electron, no settings UI with twelve nested tabs. It does one thing well and then gets out of the way.
The things that sold me: startup time is effectively instant, scrollback is smooth with a million lines, and the font rendering on macOS is the best I’ve seen in a terminal.
Shell: zsh, but barely configured
Still zsh. But I dropped Oh My Zsh a couple years ago and never went back. The plugin sprawl was slower than it had any right to be, and most of what Oh My Zsh gave me is covered better by the standalone tools below. My .zshrc is about 60 lines now and starts in 30 ms instead of 400.
The three zsh plugins I keep, installed directly via zinit:
zsh-autosuggestions— the gray ghost-text suggestions from history.zsh-syntax-highlighting— colors commands as you type so you know if they’re valid.fzf-tab— tab completion goes through fzf instead of the default menu.
Prompt: Starship
Starship is a cross-shell prompt written in Rust. One binary, one config file in TOML, works identically in zsh, bash, fish, and nushell. It shows me the current directory, git branch and dirty state, language version (Python / Node / Go) when relevant, and the exit code of the last command when it’s nonzero. Fast enough that I never notice it.
The CLI tools I actually use every day
These are the ones that have earned a permanent slot in my muscle memory:
fzf— fuzzy finder.Ctrl+Rfor fuzzy history search is the single biggest upgrade over stock shell.Ctrl+Tfor fuzzy file insertion into the current command is the second. I’d pay real money for this.zoxide—cdthat learns. Typez projand it jumps to whicheverproj-ish directory you visit most often. I aliased it tocdso it’s transparent.eza—lsreplacement. Nicer colors, git status integration, tree view, icons if you want them. Aliased tols.bat—catwith syntax highlighting, line numbers, and git diff markers. Aliased tocat.ripgrep(rg) —grepbut 10x faster and with sensible defaults (respects.gitignore, recursive by default).fd—findwith sensible defaults and half the flags to remember.atuin— shell history that syncs across machines, stores timing and exit code, and has a much better search UI thanCtrl+Ralone. Bound toCtrl+Ron top of fzf.delta— a pager forgit diffandgit log -pthat makes diffs actually readable. Set ascore.pagerin git config.jq— JSON on the command line. Not new, but indispensable.httpie— curl alternative for humans. I use curl too, but httpie is what I reach for when I just need to poke an endpoint.lazygit— a terminal UI for git. I still usegiton the command line for most things, but for complex interactive staging and rebasing, lazygit is much faster.btop—htopwith a better UI. Process list, CPU, memory, network, disk, all in one view.
The editor question
Neovim for quick edits in the terminal. Cursor (VS Code fork) for actual coding. I used to pretend I could live in the terminal full time and I was lying to myself. The TUI editing experience is great for small edits and bad for the part of my day where I need a debugger, a file tree, and an AI assistant all visible at once.
The diff from last year
Things that are new in my setup compared to a year ago:
- Ghostty replaced iTerm2.
uvreplacedpyenv+poetry+pipx.atuinreplaced vanilla history.zinitreplaced Oh My Zsh.- I stopped pretending I use tmux (I do not use tmux).
Things I expected to adopt and didn’t:
- nushell — interesting, but the cost of relearning muscle memory wasn’t worth the benefit for how I actually use a shell.
- fish — beautiful, but every shell script on the internet is bash, and not speaking bash natively as my primary shell caused more friction than fish’s niceties solved.
The meta-point
The theme of my terminal evolution over the last five years has been: replace the bloated aggregate (oh-my-zsh, iTerm2 with all its features enabled, the one giant config file) with a collection of small, fast, focused tools that each do one thing. It’s both faster and easier to maintain. The Rust tooling renaissance — ripgrep, fd, bat, eza, starship, zoxide, atuin, delta, uv — is most of what made it possible.
I’ll check back in December 2026 and see what replaced what.