What it does (did)

portr was a TUI over a fast TCP SYN scanner. You gave it a CIDR and a port list; it ran the scan in the background and populated a sortable table in real time — host, port, state, service guess, response time. The header line showed scan progress and an ETA.

It was my answer to “I know nmap can do this, but I always want to watch the results come in, sorted by response time, and nmap’s interactive output is … not that.”

Why I made it

I’d been working through a homelab IP cleanup — figuring out what all those machines I’d plugged in over the years were actually running — and I wanted a view that updated as the scan ran. I wrote the TUI first, then a scanner underneath, which in hindsight was the wrong order.

Why it’s archived

Three reasons:

  1. Raw socket support on macOS got harder between a couple of OS updates and I kept breaking the build.
  2. nmap already does this well enough for 95% of what I need, and the remaining 5% is better handled by masscan piped into jq.
  3. I wasn’t using it myself. When a side project stops being useful to its author, it mostly stops being maintained. Better to say so on the README than pretend.

What I still think was right

The live-updating TUI for a port scan is still the right interface, and no one has really built a good one. If I were to try again I’d skip the raw sockets entirely, use plain connect() scans with aggressive concurrency (which is plenty fast for a /24), and focus on the UX.

Install

The source is frozen at /src/portr/. I won’t ship binaries anymore. The README points people at nmap --stats-every 10s as a decent substitute.