October 9, 2026 • 6 Min Read • Developer Tools

How to Fix Localhost Port Conflicts on macOS

Every developer on macOS has encountered it: you run npm run dev or cargo run, and your terminal throws Error: listen EADDRINUSE: address already in use :::3000. A background process is holding onto your development port, blocking your workflow.

Port conflicts interrupt developer flow dozens of times a week. Whether a crashed Node server failed to release its socket, a background Docker container bound port 8080, or a rogue Python script is lingering in the background, resolving port lockups manually is annoying and prone to accidental process termination.

Quick Summary: The error EADDRINUSE means a process is actively listening on your requested socket. This guide covers standard Terminal commands (lsof, kill) and how to instantly release ports from your menu bar using native tools.

Why Do Localhost Ports Get Stuck on macOS?

When a server process initializes a TCP network socket, macOS allocates a file descriptor and binds a specific port (e.g., 3000, 5173, 8080, 5432). When you stop the server cleanly with Ctrl + C, the operating system issues a SIGINT or SIGTERM signal, allowing the process to gracefully close open network connections.

However, ports become orphaned in several common scenarios:

Method 1: Resolving Port Conflicts via macOS Terminal

Step 1: Identify the Process Holding the Port

Use the lsof (List Open Files) utility to identify which process (PID) is bound to your target port:

# Replace 3000 with your target port number
lsof -i :3000

Sample output:

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
node    48291  paw   23u  IPv6 0x1234      0t0  TCP *:3000 (LISTEN)

Step 2: Terminate the Process Safely

First, attempt a graceful termination (SIGTERM) using the PID from Step 1:

kill 48291

If the process refuses to exit or is hung in an un-interruptible state, issue a force kill (SIGKILL):

kill -9 48291

One-Liner Terminal Shortcut

For quick terminal work, you can combine discovery and termination into a single command using npx kill-port or fuser:

# Using npx
npx kill-port 3000

# Using native xargs with lsof
lsof -ti :3000 | xargs kill -9

Method 2: The Native Menu Bar Solution with PortWatcher

Switching to Terminal, typing lsof, searching for PIDs, and typing kill -9 interrupts your focus state. PortWatcher is a lightweight, native macOS menu bar app that solves localhost port management visually.

Feature Terminal (lsof / kill) PortWatcher (Native App)
Discovery Speed Manual command per port Real-time live status in Menu Bar
Process Information Raw PID and binary name Working directory, memory, & icon
Port Release Multi-step terminal commands 1-Click Instant Release
RAM Consumption N/A Under 15 MB (Native SwiftUI)
Safety Check Easy to kill wrong PID by mistake Confirms process path before killing

PortWatcher sits silently in your macOS menu bar. When a port conflict occurs, simply click the icon to view all active TCP/UDP ports, see exactly which project directory owns each port, and release it with a single click.

Best Practices for Preventing Localhost Port Collisions


Never Suffer EADDRINUSE Friction Again

Monitor, inspect, and release occupied localhost ports directly from your macOS menu bar with PortWatcher.

Get PortWatcher for Mac

Related Guides & Workflow Tips