Skip to content
← Projects

Portus

A native macOS menu-bar app that lists every process listening on your machine — 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. It lives in the menu bar, opens to a popover listing every TCP listener with its port, process name, PID, CPU, memory, and where it came from, and lets you kill any of them in one click.

The product is intentionally small: it answers a single 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 constantly. 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 usually means remembering the right lsof incantation, reading PID columns, and then killing the process manually — every time.

Portus turns that into a glance. Open the menu-bar popover, read a clean 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 feels like part of macOS and stays light.

Key technical decisions

Portus is a Tauri v2 app: a Rust core does the system inspection while 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, and 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 genuinely native. The trade-off is distribution: 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. Coming next: Docker container control (via the bollard crate) and a managed dev-service runner with live log tailing.