Skip to content

Technology · Developer Tooling

The Modern Developer's Local Tooling in 2026: Terminal, Git, and the Productivity Stack

The command line tools most developers use today are a decade old. Here's what's replaced them and why: terminals, Git UIs, shell configuration, and the small tools that compound into significant time savings.

Anurag Verma

Anurag Verma

7 min read

The Modern Developer's Local Tooling in 2026: Terminal, Git, and the Productivity Stack

Sponsored

Share

Most developers spend more time in the terminal than in any other single tool. It’s where builds run, git operations happen, and servers start. But the terminal itself (the emulator, the shell, the tools inside it) rarely gets the same attention as the IDE or the language ecosystem.

The last two years produced a genuinely new generation of terminal tooling. Not incremental improvements to existing tools, but rewrites with different architectures and different tradeoffs. Here’s what’s worth switching to in 2026 and what’s worth keeping.

The Terminal Emulator

Most developers who haven’t actively changed their terminal are still running iTerm2 on Mac or the default terminal on Windows and Linux. These work fine. They’re also noticeably slow compared to what’s available now.

Ghostty (released December 2024 by Mitchell Hashimoto, creator of Vagrant and HashiCorp) is the option generating the most attention. Built in Zig, using native platform rendering on macOS (Metal) and Linux (OpenGL). The result is a terminal that renders at display refresh rate even when scrolling through large outputs, with sub-millisecond latency on keypresses.

What makes it different from other “fast terminal” options:

  • Native rendering means it respects system font rendering and looks correct on macOS
  • GPU-accelerated but without the configuration complexity of Alacritty
  • Configuration is a simple text file, not JSON/YAML
  • Built-in support for ligatures, color emoji, and HiDPI without plugins
# ghostty config (~/.config/ghostty/config)
font-family = "JetBrains Mono"
font-size = 14
theme = "catppuccin-mocha"
window-padding-x = 8
window-padding-y = 8

Warp takes the opposite direction: it’s Electron-based, but redesigned around blocks. Each command and its output is a discrete block you can interact with. Select text from previous commands, share blocks as links, use AI to explain errors. For developers who primarily work on macOS and want an IDE-like terminal experience, Warp is genuinely different. The AI integration is practical rather than gimmicky: “explain this error” works on any block without copying and pasting.

Alacritty and kitty remain solid options for developers who want cross-platform consistency and full control. Both are GPU-accelerated, highly configurable, and have mature plugin ecosystems.

For most developers: try Ghostty if you’re on macOS or Linux and want the fastest terminal with minimal configuration. Try Warp if you want AI integration and collaborative features. Stay on kitty or iTerm2 if they’re already configured the way you want them.

The Shell

Zsh with Starship has become the default for developers who want a good shell without spending days configuring it.

Starship is a cross-shell, cross-platform prompt written in Rust. It shows the context you care about (current directory, git branch, language versions, active Kubernetes context) without the configuration overhead of powerline setups.

# Install
curl -sS https://starship.rs/install.sh | sh

# Add to ~/.zshrc
eval "$(starship init zsh)"

The default configuration is usable immediately. The full configuration docs are one page.

Fish (the Friendly Interactive Shell) is the other serious option. It has syntax highlighting in the input line, autosuggestions based on history, and a web-based configuration UI. The tradeoff: fish is not POSIX-compatible, so scripts written for bash won’t run in fish without changes. For interactive use, it’s better than zsh. For scripting, bash or zsh is safer.

If you’re already comfortable with zsh and your configuration is stable, there’s no urgent reason to switch. If you’re starting fresh or rebuilding a workstation, fish is worth trying.

Git Interfaces

Git from the command line is fine. It’s also verbose for common operations and has cryptic error messages. Several tools address this without hiding how git actually works.

lazygit is a TUI (terminal UI) for git that runs in the terminal. It shows branches, staged/unstaged changes, and the commit graph in one view. Most operations take one or two keystrokes.

# Install on macOS
brew install lazygit

# Run in any git repo
lazygit

The most useful workflow: use the command line for operations you know well, open lazygit for anything involving staging changes, resolving conflicts, or understanding the current branch state. The interactive rebase view alone is worth installing it.

git-delta improves diff output without changing how you use git:

# Install
brew install git-delta

# Add to ~/.gitconfig
[core]
    pager = delta

[delta]
    navigate = true
    line-numbers = true
    side-by-side = true

[merge]
    conflictstyle = diff3

[diff]
    colorMoved = default

git diff and git log -p become readable. Side-by-side diffs, syntax highlighting, and word-level diff highlighting are on by default.

gh (GitHub CLI) handles the GitHub-specific operations that don’t fit git: creating PRs, reviewing pull requests, checking CI status, managing issues. If you’re not using it already:

gh pr create --fill    # open a PR with auto-generated title and body
gh pr checkout 123     # check out a PR branch by number
gh pr status           # show your open PRs and review requests
gh run list            # list recent CI runs

The commands are intuitive enough that you don’t need to memorize them. gh help is good.

Package and Environment Management

mise (formerly rtx) is the tool to know here. It’s a runtime manager for Node.js, Python, Ruby, Go, and others, configured with a single .mise.toml file in your project:

# .mise.toml
[tools]
node = "22"
python = "3.13"

[env]
NODE_ENV = "development"

When you cd into the project directory, mise automatically activates the right versions. No .nvmrc plus .python-version plus .ruby-version in every project. One file, all runtimes.

# Install
curl https://mise.run | sh

# Add to shell profile
echo 'eval "$(mise activate zsh)"' >> ~/.zshrc

uv for Python projects specifically has become standard in 2025-2026. It’s a Python package manager written in Rust that handles both package installation and virtual environments, at a speed that makes waiting for pip feel absurd. If you work on any Python projects:

# Create a project
uv init my-project

# Install deps
uv add fastapi uvicorn

# Run
uv run python main.py

Virtual environment creation and activation happens automatically. You don’t need to think about it.

Search and Navigation

ripgrep (rg) is a drop-in replacement for grep that’s 10-100x faster on typical codebases and respects .gitignore by default. If you’re still using grep for searching code, install ripgrep:

brew install ripgrep

# Search for a pattern recursively
rg "function handleAuth" --type ts

# Search with file type filter and context
rg "tenantId" -t typescript -A 2 -B 2

fd is the equivalent for find. The syntax is simpler and it’s faster:

brew install fd

# Find all TypeScript files modified today
fd --extension ts --changed-within 1d

# Find all .env files
fd --hidden --no-ignore ".env"

fzf is a fuzzy finder that integrates with the shell to make history search and file selection interactive:

brew install fzf

# Install shell integration
$(brew --prefix)/opt/fzf/install

After installation, Ctrl+R in your shell opens an interactive history search. Ctrl+T opens an interactive file selector. These two shortcuts replace a large number of manual history recall and tab completion interactions.

A Reasonable Starting Point

If you’re setting up a new machine or want to modernize an existing setup, here’s the minimum useful configuration:

# macOS
brew install ghostty lazygit git-delta ripgrep fd fzf starship mise gh

# Add to ~/.zshrc
eval "$(starship init zsh)"
eval "$(mise activate zsh)"
source <(fzf --zsh)

# Add to ~/.gitconfig
[core]
    pager = delta
[delta]
    navigate = true
    line-numbers = true
    side-by-side = true
[alias]
    lg = "log --oneline --graph --all"

This covers the terminal, prompt, git, search, and runtime management in one pass. The full configuration for each tool can come later. These defaults are better than what most developers have now.

The underlying principle across all of these: tools that stay out of your way and require no ongoing maintenance are the ones that actually stick. Ghostty needs one config file. Starship needs none to be useful. mise needs a .mise.toml. The best tooling is the kind you configure once and stop thinking about.

Sponsored

Enjoyed it? Pass it on.

Share this article.

Sponsored

The dispatch

Working notes from
the studio.

A short letter twice a month — what we shipped, what broke, and the AI tools earning their keep.

No spam, ever. Unsubscribe anytime.

Discussion

Join the conversation.

Comments are powered by GitHub Discussions. Sign in with your GitHub account to leave a comment.

Sponsored