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:
| Extension | Why |
|---|---|
| Prettier | Format on save, non-negotiable |
| ESLint | Catch problems before the CI does |
| Extension | Why |
|---|---|
| Prisma | Schema syntax, formatting, and jump-to-definition |
| Tailwind CSS IntelliSense | Class autocomplete and hover previews |
| Docker | Dockerfile 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 --activateFor 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 = mainpull.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.