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
$ 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.