VS Code Extensions Every Developer Needs in 2026
My VS Code has been through phases. The “install everything that looks cool” phase. The “why does my editor take 14 seconds to start” phase. And finally, the “ruthlessly uninstall anything that doesn’t pull its weight” phase. I’m firmly in phase three now, and my extension list is smaller than most people’s grocery list. Here’s what survived the purge.
Essential (Install These First)
1. Error Lens
Error Lens (an extension that surfaces errors and warnings inline, right next to your code) takes those cryptic little squiggly lines and screams the actual error message right next to the offending line. It’s the difference between your editor politely coughing and grabbing you by the shoulders.
You know when a teacher marks your homework and puts a big red circle right next to the mistake? Error Lens does that for your code. Instead of hiding the error message behind a tiny squiggle you have to hover over, it just screams it right there on the line. No hiding, no squinting. I honestly can’t code without this anymore.
ext install usernamehw.errorlens# Copy-paste this into VS Code's command line to install it.
# It's like telling the toy store "give me the loud teacher one."
ext install usernamehw.errorlens2. GitLens
GitLens is a Git integration extension that shows blame, history, and authorship right in your editor. Half the time I use it to confirm that yes, past-me really did write that questionable code. The free version covers 90% of what you need.
GitLens puts a little “this was written by Stephan on Tuesday” note next to every line of code. It’s like a diary for your project that tells you who touched what and when. I mostly use it to confirm that yes, past-me really did write something that bad. It’s a time machine, but the kind where you only travel back to your own mistakes.
ext install eamodio.gitlens# Install the "who wrote this garbage" extension.
# Spoiler: it was you. It's always you.
ext install eamodio.gitlens3. Prettier
Prettier (an opinionated code formatter that auto-formats on save) ended formatting arguments in my life. Configure it once and never think about semicolons or trailing commas again. It’s like hiring a very opinionated janitor who never takes a day off.
Imagine your room cleans itself every time you close the door. That’s Prettier. Every time you save a file, it rearranges all your code to look tidy. Tabs? Spaces? Semicolons? Prettier has opinions about all of it and it will not be argued with. I set it up once and haven’t thought about code formatting since. Best trade deal I ever made.
ext install esbenp.prettier-vscodeAdd to your settings:
{
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
}# Install the "clean your room" robot
ext install esbenp.prettier-vscodeAdd to your settings:
{
// "Hey VS Code, let Prettier be the boss of formatting"
"editor.defaultFormatter": "esbenp.prettier-vscode",
// "Clean up every time I hit save. Every. Single. Time."
"editor.formatOnSave": true
}4. ESLint
ESLint is a linter that catches bugs and enforces code style rules before they reach production. If Prettier is the janitor, ESLint is the building inspector pointing at structural issues you were hoping nobody would notice.
If Prettier is the kid who makes sure your drawing is neat, ESLint is the kid who says “um, you drew the dog with five legs.” It catches actual mistakes in your code while you’re writing it, before anyone else sees your five-legged dog. Prettier makes things pretty. ESLint makes things correct. You want both.
ext install dbaeumer.vscode-eslint# Install the "your dog has five legs" spotter
ext install dbaeumer.vscode-eslintProductivity Boosters
5. Auto Rename Tag
Auto Rename Tag does exactly what it says. It auto-renames the matching HTML/JSX tag when you edit one end. You rename an opening <div> to a <section> and the closing tag just… follows along. Tiny feature. I’d mass-produce broken HTML without it.
ext install formulahendry.auto-rename-tag# Install the "matching socks" extension. Change one, the other follows.
ext install formulahendry.auto-rename-tag6. Path Intellisense
Path Intellisense autocompletes file paths as you type imports. Sounds boring. Saves me from typo-driven 404s roughly eight times a day.
ext install christian-kohler.path-intellisense# Install the "finish your sentences" helper for file paths.
# No more typos. Well, fewer typos.
ext install christian-kohler.path-intellisense7. Todo Tree
Todo Tree finds and organizes every TODO, FIXME, and custom tag across your entire codebase into a neat sidebar. It’s basically a guilt dashboard for all the shortcuts you took. I find it oddly motivating.
ext install Gruntfuggly.todo-tree# Install the "list of promises you made to yourself" tracker.
# Spoiler: the list is longer than you think.
ext install Gruntfuggly.todo-tree8. Multiple Cursor Case Preserve
Here’s a niche one. Multiple Cursor Case Preserve is an extension that preserves casing when you use multi-cursor rename, so userName stays camelCase, user_name stays snake_case. Without it, multi-cursor renaming is like performing surgery with oven mitts.
This is a super niche one. When you rename a word that shows up in different styles (like userName and user_name), this makes sure each one keeps its own style. Without it, renaming things is like trying to repaint a fence and accidentally painting the cat. Small extension, saves surprisingly big headaches.
ext install Cardinal90.multi-cursor-case-preserve# The "don't paint the cat" extension.
# Keeps each naming style safe when you rename things.
ext install Cardinal90.multi-cursor-case-preserveLanguage-Specific Must-Haves
For React/TypeScript
- ES7+ React snippets -
rafcespits out a functional component faster than I can think of a name for it - Tailwind CSS IntelliSense - Autocomplete for Tailwind classes, because nobody memorizes 12,000 utility names
- Pretty TypeScript Errors - Translates TypeScript’s hieroglyphic error messages into something a human can parse. If you’re working in TypeScript, I wrote about patterns that actually scale once your codebase outgrows the “single file of vibes” phase.
For Python
- Pylance - Microsoft’s type checker, genuinely good
- Black Formatter - Opinionated formatting, zero arguments, maximum peace
- autoDocstring - Generates docstrings from function signatures so you have no excuse
For Go
- Go (by Go Team at Google) - One extension that does everything. The Go ecosystem’s “we don’t do twelve tools for one job” philosophy in action.
Visual Enhancements
9. Material Icon Theme
Material Icon Theme is a file icon theme that gives each file type a distinct, recognizable icon. It sounds cosmetic, but when you’re scanning a file tree with 200 entries, the difference between a generic document icon and a distinct .tsx icon is the difference between reading and squinting.
You know how in a toy box, it’s easier to find the dinosaur if everything isn’t the same color? This gives every file type its own little picture. JavaScript files get a yellow icon, TypeScript gets blue, CSS gets purple. When you have 200 files in a project, spotting the right one by color is way faster than reading every single name. Sounds silly. Weirdly life-changing.
ext install PKief.material-icon-theme# Give every file type its own color. Like sorting crayons into the right slots.
ext install PKief.material-icon-theme10. Indent Rainbow
Indent Rainbow color-codes your indentation levels so you can actually tell where you are in nested code. I didn’t think I needed this until I was four levels deep in a YAML file, questioning my life choices. Turns out color-coded nesting is the handrail I never knew I was missing.
Code can be nested inside other code inside other code, like those Russian dolls that stack inside each other. This extension paints each layer a different color so you can actually tell which doll you’re inside. Before this, I was four layers deep in a YAML file, squinting at spaces, questioning my career. Now the colors tell me where I am. It’s like GPS for indentation.
ext install oderwat.indent-rainbow# GPS for your code nesting. Each layer gets its own color.
# No more "which Russian doll am I inside right now?"
ext install oderwat.indent-rainbowWhat I Don’t Use Anymore
Some extensions I’ve kicked to the curb:
- Bracket Pair Colorizer - VS Code absorbed this into core. The circle of extension life.
- Live Server - Vite exists. Framework dev servers exist. This one can retire.
- Settings Sync - Native sync works fine now. One less extension to worry about.
- Most themes - I settled on GitHub Dark and stopped theme-shopping. That’s a productivity hack in itself.
Some toys I used to love are now in the donation pile. Bracket Pair Colorizer? VS Code stole its job and built it in. Live Server? Newer tools like Vite do the same thing but better. Settings Sync? Also built in now. And I finally stopped trying a new color theme every week, which honestly saved me more time than any actual extension ever did. Sometimes the best productivity hack is just… stopping.
My Recommended Settings
Beyond extensions, a few settings tweaks that have stuck:
{
"editor.minimap.enabled": false,
"editor.renderWhitespace": "boundary",
"editor.cursorBlinking": "smooth",
"editor.cursorSmoothCaretAnimation": "on",
"editor.stickyScroll.enabled": true,
"editor.bracketPairColorization.enabled": true,
"files.autoSave": "onFocusChange",
"workbench.startupEditor": "none"
}Disabling the minimap was surprisingly freeing. I never once looked at that tiny smudge of color and thought “ah yes, now I understand my codebase.” It was just a decorative sidebar eating screen real estate.
{
// Kill the minimap. That tiny smudge never helped anyone.
"editor.minimap.enabled": false,
// Show invisible spaces at the edges of words. Trust me.
"editor.renderWhitespace": "boundary",
// Make the blinky cursor smooth. It's the little things.
"editor.cursorBlinking": "smooth",
// Cursor glides instead of teleporting. Fancy.
"editor.cursorSmoothCaretAnimation": "on",
// Sticky headers so you know which function you're lost inside
"editor.stickyScroll.enabled": true,
// Color-coded brackets. Which parenthesis matches which? Now you know.
"editor.bracketPairColorization.enabled": true,
// Auto-save when you click away. No more "did I save?" panic.
"files.autoSave": "onFocusChange",
// Don't show me a welcome tab every time. I live here. I know.
"workbench.startupEditor": "none"
}I killed the minimap and never looked back. That tiny smudge of color never once helped me understand anything. It was just a decorative sidebar eating screen space.
The 80/20 Rule
I genuinely believe most developers would be fine with about 10-15 extensions. The rest is hoarding. Every few months I do a cull, if I can’t remember what an extension does without reading its description, it goes. If you’re also considering AI-powered editors like Cursor as a VS Code alternative, I compared them all in my AI coding tools post.
Most people have way too many extensions. It’s like filling your backpack with every toy you own and then wondering why it’s so heavy. You probably need 10, maybe 15. My rule: if I can’t remember what an extension does without reading its description, it gets uninstalled. Every few months I go through and toss the ones I forgot I had. My editor breathes easier and so do I.
What extensions am I sleeping on? I’m always curious what other people can’t live without, especially the weird niche ones nobody talks about.