Why Your Local Environment Matters

Your local development environment is where you spend the majority of your working hours as a developer. A well-configured setup reduces friction, catches errors early, and lets you move from idea to working code faster. This guide covers the tools that form the backbone of a productive modern dev environment — from terminal to container to version management.

Terminal & Shell

iTerm2 (macOS) / Windows Terminal

The default terminal emulators on most operating systems are functional but dated. iTerm2 on macOS offers split panes, profiles, a hotkey window, and excellent customization. On Windows, the modern Windows Terminal is a massive upgrade over Command Prompt or legacy PowerShell, supporting multiple tabs and shell profiles.

Zsh + Oh My Zsh

Zsh is the default shell on modern macOS and a popular choice on Linux. Paired with Oh My Zsh (a framework for managing Zsh configurations), it unlocks plugins for git status in prompts, syntax highlighting, autosuggestions from history, and hundreds of aliases. Starship is a newer cross-shell prompt alternative worth exploring if you want something faster and more customizable.

Version Management

asdf / mise

Managing multiple versions of Node.js, Python, Ruby, or Go across different projects used to mean juggling nvm, pyenv, rbenv, and more. Tools like asdf and its faster Rust-based successor mise (formerly rtx) provide a single unified version manager for every language. Define a .tool-versions file in any project directory and the correct runtime versions are automatically activated.

Containerization

Docker Desktop / OrbStack

Docker has become nearly essential for local development — it ensures your dev environment matches staging and production, and makes spinning up databases, message queues, or third-party services trivial with Docker Compose. OrbStack has emerged as a faster, lighter alternative to Docker Desktop on macOS, with notably better performance and lower memory usage.

Code Editor

VS Code or Cursor

Both are excellent choices covered in depth elsewhere on this site. Key extensions worth adding regardless of which you choose:

  • GitLens — supercharges Git integration with inline blame, history exploration, and comparison tools
  • Error Lens — shows linting and type errors inline next to the problematic code
  • Prettier — automatic code formatting on save
  • REST Client — test API endpoints directly from .http files without leaving the editor

API Testing

Bruno / Postman / Insomnia

Every developer working with APIs needs a way to craft and test requests. Postman is the most widely known, but its move to require a cloud account for many features has pushed developers toward alternatives. Bruno is a newer, fully offline, open-source API client that stores collections as plain text files in your project repo — a significant advantage for version control.

Database GUIs

TablePlus / DBeaver

Working with databases via CLI is powerful but slow for exploration. TablePlus offers a clean, fast GUI that supports PostgreSQL, MySQL, SQLite, Redis, and more. DBeaver is the open-source alternative with broader database support — less polished, but free and capable.

Git Workflow

Lazygit

If you prefer staying in the terminal, Lazygit is a terminal UI for Git that makes staging hunks, managing branches, resolving conflicts, and reviewing commits dramatically faster than raw Git commands. It has a steep initial learning curve but pays off quickly.

Putting It All Together

The ideal local dev environment is personal — what works for one developer may not work for another. But a strong baseline looks like:

  1. A fast terminal with a customized shell (Zsh + Starship)
  2. A unified runtime version manager (mise)
  3. Docker or OrbStack for service dependencies
  4. VS Code or Cursor with a curated extension set
  5. A local-first API client like Bruno
  6. A database GUI matching your stack

Invest time in your environment now and it will pay dividends for every project you work on going forward.