Skip to content
← Projects

Portus

A native macOS menu-bar app that lists every process listening on your machine, with port, process, CPU, memory, and origin, so you can spot and kill whatever is holding a port in one click.

View source

Portus is a native macOS menu-bar app for seeing and stopping whatever is listening on your machine. Click the menu-bar icon and a popover lists every TCP listener with its port, process name, PID, CPU, memory, and where it came from. One click kills any of them.

The product is small on purpose. It answers one recurring question, “Port 3000 is taken. Again. By what?”, without making you drop into a terminal to run lsof and kill by hand.

The problem

Local development collides with itself. A dev server is already bound to a port, a container forgot to shut down, an old process is orphaned but still holding a socket. Finding the culprit means remembering the right lsof incantation, reading PID columns, and then killing the process by hand, every time.

Portus replaces that with one popover. Open it, read the table of what is listening, and click to kill. No terminal, no flags to remember.

What I built

  • A live view of every TCP listener: port, process name, PID, CPU, memory, and an origin label (docker, system, from IDE, from Terminal, or orphan?).
  • One-click kill straight from the popover.
  • Deduplicated rows so dual-stack and SO_REUSEPORT processes collapse into one stable entry instead of appearing several times.
  • A native vibrancy popover with no Electron, so the app draws with macOS window materials instead of shipping a browser engine.

Key technical decisions

Portus is a Tauri v2 app. A Rust core does the system inspection and a SvelteKit frontend renders the popover. The Rust side uses the listeners and sysinfo crates to enumerate sockets and read per-process CPU and memory. tauri-specta generates typed bindings, so the frontend and backend share one contract instead of hand-written glue.

Choosing Tauri over Electron keeps the binary small and the popover native. Distribution is the trade-off. The build is ad-hoc signed but not notarized, so the first launch requires approving it in System Settings.

Current status

Portus is in v0.1 beta, distributed as a .dmg from GitHub releases. Next up are Docker container control through the bollard crate and a managed dev-service runner with live log tailing.