Setup

My development environment - the terminal, editor, and config that I actually work in every day.

This is my actual setup - not aspirational, not a list of tools I installed once. Everything here is open right now or runs every time I open a terminal.

Machine

OS: Windows 11 with WSL2 (Ubuntu) for all development work. The Windows host handles the GUI layer - browser, Figma, Postman. Everything else runs inside WSL2 where it belongs.

Why not Linux?

Mostly familiarity and the fact that WSL2 genuinely closed the gap. Docker, Node, Git, Bash - it all works.

The real reason is simpler: games. Linux is great, but when Valorant refuses to run, that’s a dealbreaker. Proton and Wine are impressive, but I don’t want to troubleshoot just to play. I’m not dual-booting just to get tilted in ranked.

Terminal

Windows Terminal

WSL2 terminal host with tabs and split panes. Handles heavy output smoothly and stays responsive under logs and builds.

Bash

Default shell inside WSL2. Reliable and predictable, used for scripting and system tasks.

Shell aliases I actually use

# Git
alias gs="git status"
alias ga="git add ."
alias gc="git commit -m"
alias gp="git push"
alias gl="git log --oneline --graph --decorate"
alias gco="git checkout"

# Package manager
alias pi="pnpm install"
alias pd="pnpm dev"
alias pb="pnpm build"
alias pt="pnpm test"

# Navigation
alias ..="cd .."
alias ...="cd ../.."
alias dev="cd ~/projects"

# Docker
alias dcu="docker compose up -d"
alias dcd="docker compose down"
alias dcl="docker compose logs -f"

Editor

VS Code - I've tried Neovim. I respect it. I came back.

The extensions I'd reinstall first if I wiped my machine:

ExtensionWhy
PrettierFormat on save, non-negotiable
ESLintCatch problems before the CI does
ExtensionWhy
PrismaSchema syntax, formatting, and jump-to-definition
Tailwind CSS IntelliSenseClass autocomplete and hover previews
DockerDockerfile syntax and container management

settings.json (the parts that matter)

{
  "editor.formatOnSave": true,
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "editor.tabSize": 2,
  "editor.fontSize": 14,
  "editor.fontFamily": "JetBrains Mono, monospace",
  "editor.minimap.enabled": false,
  "workbench.colorTheme": "One Dark Pro"
}

Package Manager

pnpm - always. Faster installs, hard links that save disk space across projects, and a strict node_modules structure that makes phantom dependencies fail loudly instead of silently. Once you stop getting burned by packages that work locally but fail in CI because of a hoisted dependency, you stop using npm.

# Set pnpm as the default for new projects
corepack enable
corepack prepare pnpm@latest --activate

For monorepos, pnpm workspaces with Turborepo is my default - see BuildElevate for the full setup.


Git Config

[user]
  name = Vijay Singh
  email = your@email.com

[core]
  editor = code --wait
  autocrlf = input

[alias]
  st = status
  co = checkout
  br = branch
  lg = log --oneline --graph --decorate --all
  undo = reset HEAD~1 --mixed
  amend = commit --amend --no-edit

[pull]
  rebase = true

[push]
  autoSetupRemote = true

[init]
  defaultBranch = main

pull.rebase = true keeps history linear without thinking about it. push.autoSetupRemote = true means I never type --set-upstream again.


Fonts

JetBrains Mono in the editor and terminal. Ligatures on. The => and !== ligatures aren't just aesthetic - they reduce visual parsing time for operators you're reading a hundred times a day.


Browser

Arc as the daily driver. The sidebar, spaces, and command bar replaced how I think about tab management. For dev work, the dev tools are the same Chromium engine underneath - nothing lost there.

Extensions that affect how I work:

  • React Developer Tools - can't debug component state without it
  • Dark Reader - dark mode on every site, because my eyes are tired

Other Tools

Postman

For API testing - collections, environments, and chained requests for complex auth flows.

Figma

For mocking layouts before building them. I'm not a designer, but thinking visually before writing TSX saves time.

Docker Desktop

For the WSL2 integration and the container dashboard. I use the CLI for everything, but the GUI is useful for killing stuck containers.

tmux

Terminal session management across WSL2. Keeps long-running dev servers, logs, and workflows alive across reconnects. I rarely work in a single terminal window.

The best setup is the one you stop thinking about. The goal of all of this is to get out of the way so the only friction left is the actual problem.