Most developer setups are layers of accumulated junk. The solution is to wipe everything and rebuild from scratch. What follows is the stack that emerged after three iterations - genuinely fast, with specific tools and config that make a real difference.
The Core Stack
These are not optional extras. They are the foundation.
| Tool | What it replaces | Why it wins |
|---|---|---|
| zsh + zinit | bash + oh-my-zsh | Faster load, lazy loading plugins |
| tmux | Terminal tabs | Persistent sessions, splits, scripting |
| fzf | Manual history search | Fuzzy everything |
| starship | custom PS1 | Fast, any shell, zero config needed |
| eza | ls | Colors, icons, git status inline |
| bat | cat | Syntax highlighting, line numbers |
| ripgrep | grep | 10x faster, respects .gitignore |
| zoxide | cd | Frecency-based directory jumping |
zsh Without the Bloat
Oh-My-Zsh is slow and most people use 5% of it. Switch to zinit with lazy loading.
# ~/.zshrc
source ~/.local/share/zinit/zinit.zsh
# Load syntax highlighting and autosuggestions lazily
zinit light zsh-users/zsh-autosuggestions
zinit light zsh-users/zsh-syntax-highlighting
zinit light zsh-users/zsh-completions
# History settings - the ones that actually matter
HISTSIZE=100000
SAVEHIST=100000
HISTFILE=~/.zsh_history
setopt SHARE_HISTORY
setopt HIST_IGNORE_DUPS
setopt HIST_FIND_NO_DUPS
Shell startup time drops from 800ms to under 100ms. That matters when you open 20 terminals a day.
tmux: Sessions That Survive
The biggest productivity gain comes from learning tmux properly. An entire workflow can run in named sessions.
# ~/.tmux.conf
set -g prefix C-a
unbind C-b
bind C-a send-prefix
# Split with | and -
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
# Vim-style pane navigation
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
# Session persistence with tmux-resurrect
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'
set -g @continuum-restore 'on'
Persistent sessions for each project - work, personal, infra - mean closing the terminal does nothing. The session is there on return. Ctrl+a s to switch sessions. This alone removes 15 minutes of daily context-switching friction.
fzf: Fuzzy Everything
fzf is arguably the highest return-on-investment terminal tool available. Install it, then wire it into everything.
# ~/.zshrc additions
export FZF_DEFAULT_COMMAND='rg --files --hidden --follow --glob "!.git/*"'
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
export FZF_DEFAULT_OPTS='--height 40% --border --preview "bat --color=always {}"'
# Ctrl+R for fuzzy history search (built into fzf)
# Ctrl+T for fuzzy file search
# Alt+C for fuzzy directory jump
# Custom: fuzzy git branch checkout
fbr() {
git branch | fzf --height 20% | xargs git checkout
}
The history search alone is worth it. Every command you have ever run, fuzzy-searchable in under a second.
Starship: The Prompt That Gets Out of the Way
Stop configuring your PS1. Starship reads your project context automatically.
# ~/.config/starship.toml
format = """
$directory$git_branch$git_status$nodejs$python$rust$golang
$character"""
[directory]
truncation_length = 3
truncate_to_repo = true
[git_branch]
symbol = " "
style = "bold purple"
[character]
success_symbol = "[>](bold green)"
error_symbol = "[>](bold red)"
It shows the right language version per project, git status, and nothing else. Renders in under 5ms.
The Aliases That Save Hours
# Git aliases worth using every day
alias gs='git status'
alias gd='git diff'
alias gl='git log --oneline --graph --decorate -20'
alias gco='git checkout'
alias gcp='git cherry-pick'
# Navigation
alias ..='cd ..'
alias ...='cd ../..'
alias ll='eza -la --git --icons'
alias lt='eza --tree --level=2 --icons'
# Dev shortcuts
alias dc='docker compose'
alias k='kubectl'
alias tf='terraform'
What Did Not Make the Cut
Things that did not make the cut after testing:
- Neovim as main editor - Great tool, but VS Code with vim keybindings gives 90% of the benefit without rebuilding muscle memory
- Fish shell - The syntax incompatibilities with bash scripts were a constant annoyance
- Powerlevel10k - Beautiful but slow and complex; Starship does the job
- Custom scripts for everything - Maintenance overhead is real; use existing tools
Bottom Line
The stack is zsh with zinit, tmux with persistent sessions, fzf wired into history and file search, starship for the prompt, and the modern CLI replacements (eza, bat, ripgrep, zoxide). Each tool has one job and does it well. Total setup time is two hours. The productivity return starts the same day and compounds for years.
Comments