Project Port Manager
EADDRINUSE: address already in use :::3000
Every developer knows the next twenty seconds: open a terminal, remember whether
it is lsof -ti:3000 or netstat -ano | findstr, pipe it to kill, try again.
This puts your project's ports in the Explorer instead, with the process holding
each one, and a button to end it.
It finds your ports for you
Other port extensions ask you to type a number. This one reads the project and
works out which ports it uses:
| Source |
What it reads |
.env files |
Any key containing PORT, plus any localhost:1234 URL |
docker-compose*.yml |
The host side of every ports: mapping |
package.json |
--port 4200, -p 3000, PORT=3000 inside scripts |
angular.json, vite.config.*, next.config.*, nest-cli.json, nodemon.json |
"port": 4200 |
application.properties / application.yml |
Spring's server.port, and JDBC URLs |
launchSettings.json |
.NET applicationUrl |
.vscode/launch.json |
Debug ports, in any language |
Node, Angular, Vite, Next, NestJS, Spring Boot, .NET and anything in Docker
Compose work without configuration.
In a monorepo that means every service's port, labelled with the service it
belongs to:
PROJECT PORTS
● 3000 api node · pid 4471 🌐 ✕
● 5173 web node · pid 5120 🌐 ✕
○ 8080 worker free
● 5432 compose, api postgres · pid 819 🌐 ✕
One row per process, not per port. A Node server and its --inspect
debugger share a process, and killing the process closes both — so they appear
as one row with the extra ports folded in:
● 3000 node · pid 3451 · +9229 🌐 ✕
● 5432 docker · pid 2746 · +6379
Turn that off with projectPorts.groupByProcess if you want a row per socket.
By default only ports that are actually in use are listed — that is the short,
useful list. Click the eye in the view's title bar to also show the ports your
project declares but nothing is running on.
● in use, ○ free. Hover any port to see every file that references it.
If the project declares no ports at all, the view falls back to showing whatever
is listening on your machine, so it is never empty.
What you can do
- ✕ Kill — sends
SIGTERM, waits, then SIGKILL only if the process is
still there. Confirms first, because the port may belong to something you did
not start.
- 🌐 Open in Browser — straight to
http://localhost:<port>
- Copy Process ID — for when you want to investigate rather than kill
- Ports: Kill Process on Port… — type a number, for ports outside the project
Settings
| Setting |
Default |
What it does |
projectPorts.showFreePorts |
false |
Also list declared ports that nothing is using |
projectPorts.groupByProcess |
true |
One row per process instead of per port |
projectPorts.extraPorts |
— |
Always show these, even if nothing references them |
projectPorts.ignorePorts |
— |
Hide these |
projectPorts.showOtherListening |
false |
Also list machine ports your project does not mention |
projectPorts.confirmBeforeKill |
true |
Ask first |
projectPorts.autoRefreshSeconds |
0 |
Poll every N seconds; 0 means only when you ask |
macOS and Linux use lsof; Windows uses netstat and tasklist. Nothing is
bundled and nothing is downloaded — these ship with the operating system.
No network access, no telemetry.
Author
Irfan Ali
MIT licensed.