Every framework defaults to it. Every project fights for it. It's time to break free.
You start a React app. Port 3000. You spin up an Express server. Port 3000. Next.js? Port 3000. Vite? You guessed it.
"Something is already running on port 3000" — the error message you see 47 times a day.
Which project is hogging 3000? Time to run lsof -i :3000 for the 100th time.
Kill one project to run another. Forget to restart it. Wonder why your API calls fail. Repeat.
"It works on my machine" — because everyone has different projects squatting on 3000.
These frameworks all default to port 3000:
It's not their fault. But it's time to take matters into your own hands.
3000 isn't the only troublemaker. These ports are also overcrowded:
8080The "alternative HTTP port." Tomcat, Jenkins, dev servers — everyone's second choice is still a bad choice.
8000Python's SimpleHTTPServer, Django default. Another classic collision zone.
4000Phoenix, Gatsby, Jekyll dev servers. The "I'm not like other ports" port.
5000Flask default. Also used by macOS AirPlay. Surprise conflicts guaranteed.
9000PHP-FPM, SonarQube, various dev tools. Deceptively busy.
8888Jupyter notebooks. Looks unique but isn't.
Rule of thumb: if the port is a round number, someone else is already using it.
Project A on 8001. Project B on 8002. Never collide again. Put it in your .env file and forget about it.
Frontend: 3001-3099. Backend: 4001-4099. Databases: 5001-5099. Create a system. Stick to it.
Add a PORTS.md or note in README. Your future self (and teammates) will thank you.
Run everything behind nginx or Caddy with nice URLs. project-a.localhost, project-b.localhost. Chef's kiss.
Any of these are better than 3000:
🙏 Just not 3000. Please.