PortDrop

See every process listening on a local port — open it in one click, kill it in two.

A free macOS menu-bar app that shows every process listening on a local TCP port — with the app's real icon, the owner, the PID, and a link straight to the service. Search it, open it, or kill it.

Download PortDrop 1.0.1 for macOS 4.1 MB · SHA-256 · what's new

brew install --cask jeffcaldwellca/tap/portdrop

Requires macOS 26 Tahoe or later. Signed with an Apple Developer ID and notarized.

The PortDrop panel: a searchable list of listening ports, each with the owning app's icon, a protocol chip, owner and PID, the port number, and Open and Kill buttons

See what's listening on every port

Dev servers, databases, SSH, that thing squatting on port 3000 — PortDrop shows them all, live, and gives you the two actions you actually want.

Install PortDrop on macOS

With Homebrew

brew install --cask jeffcaldwellca/tap/portdrop

Later, brew upgrade --cask portdrop updates it — or let PortDrop update itself.

With the DMG

  1. Download PortDrop-1.0.1.dmg (4.1 MB).
  2. Open it and drag PortDrop onto the Applications shortcut.
  3. Launch PortDrop from Applications or Spotlight. It appears in the menu bar — there's no Dock icon or window.

To verify the download: shasum -a 256 -c PortDrop-1.0.1.dmg.sha256 (checksum file).

PortDrop is signed with an Apple Developer ID and notarized by Apple, so it opens without Gatekeeper warnings. Turn on Launch at Login from the ⚙︎ menu to keep it around. It checks for a new release once a day and offers to install it; choose ⚙︎ → Check for Updates… to check now. Prefer to build it yourself? See Build from source in the README.

How PortDrop works

PortDrop runs lsof -iTCP -sTCP:LISTEN and turns the output into a list of listening ports, one row per process and port. For each row it asks macOS which running app or bundle owns the process to get a real icon and name, and it classifies the service by process name and well-known port so it can build a URL. Ports it can't classify get a quick HTTP HEAD request — to 127.0.0.1 or ::1 only — so a dev server on an unusual port still gets an http:// link.

Kill sends SIGTERM so the process can shut down cleanly; Force Kill (hold ⌥ while confirming, or use the right-click menu) sends SIGKILL. Your own processes are signalled directly. For processes owned by root or another user, PortDrop asks macOS for administrator privileges through the standard dialog — there is no privileged helper running in the background.

Because lsof and kill need direct access to other processes, PortDrop is deliberately not sandboxed. It is hardened-runtime, Developer ID-signed, and notarized.

Privacy

Nothing leaves your Mac. PortDrop has no analytics, telemetry, crash reporting, or accounts. Its only network activity is the local HTTP probe described above and a once-a-day check of the GitHub release feed for updates, which you can turn off in the ⚙︎ menu.

This website is static, sets no cookies, and runs no analytics.

Frequently asked questions

How do I find what's using a port on my Mac?
Click the PortDrop icon in the menu bar. The panel lists every process that is listening on a local TCP port, with the app's icon, name, owner, PID, and port number. Type a port number in the search field to jump straight to it. Under the hood PortDrop runs lsof -iTCP -sTCP:LISTEN every few seconds so you never have to.
How do I kill the process on port 3000 (or any other port) on macOS?
Open PortDrop, search for 3000, and click the ⊗ button on that row. It turns into a red Confirm button; click it to send SIGTERM. Hold ⌥ Option while confirming to send SIGKILL instead. If the process belongs to another user or to root, macOS asks for your administrator password first.
Is PortDrop safe to install? Is it notarized?
Yes. Every release is signed with an Apple Developer ID certificate and notarized by Apple, so it opens without Gatekeeper warnings. Each download comes with a SHA-256 checksum you can verify with shasum -a 256 -c, and the source code is available on GitHub.
Why does PortDrop ask for my password?
Only when you kill a process that belongs to another user or to root. Your own processes are terminated directly. For anything else PortDrop uses the standard macOS administrator-privileges dialog, rather than failing silently or installing a background helper with elevated rights.
What's the difference between Kill and Force Kill?
Kill sends SIGTERM, which asks the process to shut down cleanly. Force Kill sends SIGKILL, which the process cannot catch or ignore. Use Force Kill — hold ⌥ Option while confirming, or pick it from the right-click menu — when a process ignores a normal kill.
Does PortDrop show UDP ports or outbound connections?
No. PortDrop lists listening TCP ports only: the servers, dev tools, and daemons waiting for connections on your Mac. UDP sockets and established outbound connections are out of scope.
Which macOS versions does PortDrop support?
PortDrop requires macOS 26 Tahoe or later. It is built with Swift 6 and SwiftUI.
Does PortDrop send any data anywhere?
No. PortDrop has no analytics, telemetry, or accounts. The only network requests it makes are an HTTP HEAD probe to 127.0.0.1 and ::1 to detect web servers on unknown ports, and a once-a-day check of the GitHub release feed for updates, which you can turn off.
Is PortDrop free?
Yes. PortDrop is free to download and use, and the source code is available on GitHub.
Where is the Dock icon or window?
There isn't one. PortDrop is a menu-bar utility: it sits next to your clock as the PortDrop mark plus the number of listening ports. Click it to open the panel. To keep it around, turn on Launch at Login from the ⚙︎ menu.
How do I update PortDrop?
PortDrop checks for a new release once a day and offers to install it. Choose ⚙︎ → Check for Updates… to check right now. If you installed with Homebrew, brew upgrade --cask portdrop works too.
How do I uninstall PortDrop?
Turn off Launch at Login if it was on, quit PortDrop from the ⚙︎ menu, then drag PortDrop.app from Applications to the Trash. Homebrew users can run brew uninstall --cask portdrop instead.