Terminal Productivity: tmux, fzf, and Shell Aliases That Save Hours

Your Terminal Is an IDE

I spend about 70% of my working day in a terminal. Not because I'm trying to look cool — because it's genuinely faster for most tasks once you've built up muscle memory. The key tools that make this work: tmux for session management, fzf for finding anything, and a curated set of shell aliases.

tmux: Terminal Sessions That Survive SSH Drops

If you SSH into servers without tmux, you're one network hiccup away from losing your running processes. But tmux is useful even locally — it lets you split your terminal into panes, switch between named sessions, and keep processes running when you close the terminal.

JavaScript Runtime Comparison
Runtime Cold Start HTTP Throughput TypeScript
Node.js 22~50 ms~85k req/sVia tsx/ts-node
Deno 2~30 ms~120k req/sBuilt-in
Bun 1.x~10 ms~260k req/sBuilt-in
Cloudflare Workers0 ms (pre-warm)N/A (edge)Via Wrangler

The essential commands:

# Start a named session
tmux new -s project

# Detach: Ctrl-b d
# Reattach
tmux attach -t project

# Split horizontally: Ctrl-b "
# Split vertically: Ctrl-b %
# Switch panes: Ctrl-b arrow-key
# Resize pane: Ctrl-b Ctrl-arrow-key

# Create a new window: Ctrl-b c
# Switch windows: Ctrl-b 0-9
# Rename window: Ctrl-b ,

My typical tmux layout for a project:

  • Window 0: Editor (neovim)
  • Window 1: Two panes — dev server on top, logs/tests on bottom
  • Window 2: Git operations and general shell
  • Window 3: Database CLI

Add this to ~/.tmux.conf for a better experience:

We covered a related topic in Tailwind CSS 4.0: Oxide Engine, CSS-First Configuration, and.

# Use Ctrl-a instead of Ctrl-b (easier to reach)
set -g prefix C-a
unbind C-b
bind C-a send-prefix

# Mouse support (scrolling, pane selection)
set -g mouse on

# Start window numbering at 1
set -g base-index 1
set -g pane-base-index 1

# Faster key repetition
set -sg escape-time 0

# Increase scrollback
set -g history-limit 50000

# Better split shortcuts
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"

fzf: Fuzzy Find Everything

fzf is a fuzzy finder that connects to anything that produces lines of text. It changed how I interact with the command line more than any other tool.

After installing fzf, you get three killer keybindings:

  • Ctrl-R — Fuzzy search through shell history (replaces the terrible default reverse-search)
  • Ctrl-T — Fuzzy search files in the current directory tree and insert the selected path
  • Alt-C — Fuzzy search directories and cd into the selected one

But the real power is piping anything through it:

# Find and open a file
vim $(fzf)

# Find a process and kill it
kill $(ps aux | fzf | awk '{print $2}')

# Checkout a git branch
git checkout $(git branch | fzf)

# Search git log and show the selected commit
git show $(git log --oneline | fzf | awk '{print $1}')

# SSH to a host from your config
ssh $(grep "^Host " ~/.ssh/config | awk '{print $2}' | fzf)

Pair fzf with ripgrep (rg) for searching file contents, and fd as a faster alternative to find:

See also: Monitoring and Alerting: Avoiding Alert Fatigue with Actiona.

# Set fd as fzf's default file finder
export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow --exclude .git'
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"

# Preview files while fuzzy finding
export FZF_CTRL_T_OPTS="--preview 'bat --color=always --line-range :500 {}'"

Shell Aliases and Functions

Don't alias everything — alias the things you type multiple times per day. Here are the ones I actually use:

# Git shortcuts (the most common ones)
alias gs='git status'
alias gd='git diff'
alias gc='git commit'
alias gp='git push'
alias gl='git log --oneline -20'
alias gco='git checkout'

# Docker
alias dc='docker compose'
alias dps='docker ps --format "table {{.Names}}	{{.Status}}	{{.Ports}}"'
alias dlogs='docker compose logs -f'

# Navigation
alias ..='cd ..'
alias ...='cd ../..'
alias ll='ls -alh'

# Functions for things that need arguments
mkcd() { mkdir -p "$1" && cd "$1"; }
port() { lsof -i :"$1"; }
weather() { curl "wttr.in/$1"; }

# Quick HTTP server in current directory
serve() { python3 -m http.server "${1:-8000}"; }

Other Tools Worth Installing

bat — cat with syntax highlighting and line numbers. Drop-in replacement.

ripgrep (rg) — grep that's 10-100x faster, respects .gitignore by default, and has better output formatting.

jq — JSON processing on the command line. Invaluable for working with API responses.

This connects to the ideas in Progressive Web Apps in 2026: Push Notifications, Background.

# Pretty-print JSON
curl -s api.example.com/users | jq '.'

# Extract specific fields
curl -s api.example.com/users | jq '.[] | {name: .name, email: .email}'

# Filter
curl -s api.example.com/users | jq '[.[] | select(.active == true)]'

htop/btop — Better process viewers than top. btop has nice graphs and is keyboard-friendly.

tldr — Community-maintained simplified man pages. tldr tar gives you the 5 commands you actually use instead of 4,000 lines of documentation.

Invest an afternoon setting up your terminal. The compound time savings over the next year will be substantial.

References & Standards: W3C Standards · WebAssembly specification