Free & open source · MIT
le — Localhost Explorer for the terminal.
A fast, keyboard-driven TUI for seeing what's listening on your machine and stopping it the right way. Single static binary, macOS and Linux — including servers over SSH. No account, no telemetry.
$ le
PORT PID WHAT DIR RISK OWNER STOP WITH
3000 38814 juice-shop ~/code/juice-shop medium container docker stop juice-shop
8001 43138 Django dev server ~/code/api low terminal TERM
27017 1183 MongoDB /opt/homebrew/var high homebrew brew services stop mongodb-community
lsof -i :3000 gives you a PID. It doesn't tell you the PID belongs to a Homebrew service that launchd will respawn the moment you kill -9 it. le names the owner and picks the stop that actually works — and when it can't confirm what a process is, it refuses to auto-kill rather than guess.
Install
One line, or one tarball.
Homebrew (macOS)
brew install alikatgh/tap/le
Man pages and shell completions included. le completion zsh|bash|fish wires them up on other installs.
Binaries (macOS + Linux)
tar -xzf le_*.tar.gz
sudo mv le /usr/local/bin/
amd64 and arm64 tarballs on the Releases page, checksummed, with a signed build-provenance attestation: gh attestation verify le_*.tar.gz --repo alikatgh/le-cli. Needs only lsof and ps — preinstalled on macOS, available on every Linux.
Commands
Six verbs, no ceremony.
See & stop
le # live TUI (default)
le list # one-shot table and exit
le list node # …filtered
le list --json # …for scripts / jq
le stop 3000 # by port (or PID)
le stop --dir . # everything this project spun up
le stop --dir . -n # …dry run first
Hold & wait
le hold 3000 # squat a port (Ctrl-C frees)
le wait 5432 # block until a port frees up
le ready 8080 # block until something listens
le ready 8080 -t 30s # …bounded, for CI
le ready 5173 && open http://localhost:5173 opens the browser the moment Vite is up. le wait 5432 && pg_ctl start restarts Postgres once the port clears. Every command has --help.
The TUI
Keyboard all the way down.
Navigate
j / k # move down / up
g / G # top / bottom
/ # filter: port, name, folder
1 – 6 # sort by any column
r # refresh now (auto every 3s)
Act
x # stop the selection (asks first)
o # open the port in your browser
c # copy the stop command — OSC 52,
# so it works over SSH
? # help
That c key matters on servers: OSC 52 is the terminal's own clipboard channel, so the stop command lands on your clipboard even when le runs on a box you SSH'd into. More on the SSH story →
Why trust it with a kill signal
Read the code that decides.
Every stop re-verifies the PID's start time first, so a recycled PID never gets a signal meant for something else. The ps/lsof parsers are fuzzed nightly in CI. Three adversarial review rounds found eighteen real bugs before they found you — the full reports, refuted candidates included, ship in the repo at docs/audits/.
le is MIT and free forever — that's the point. If it earns a place in your shell, the $5 menu-bar app is how you support the work.