Native macOS menu bar app & CLI to see what is listening on localhost, identify projects & processes, and gently close them. The safer alternative to lsof and kill-port.
See the codeNative macOS Menu Bar Port Manager & CLI
See what your tools left running on localhost, identify projects, and gently close them.
把那些虚掩着的门,轻轻关上。
English · 中文
When I have several coding agents working in parallel, dev servers and test runners keep starting up on different ports. By the end of the day there are always a few still running.
Existing tools are either too much, or only tell you "port in use" without saying which process it is or which project it came from.
So I made LeftOpen. It sits quietly in the menu bar and shows you the listening ports, the processes behind them and the projects they probably belong to. Once you've had a look, you close the ones you no longer need.
Close the doors that were left ajar, gently.
brew install --cask songhaifan/tap/leftopen
Supports Apple Silicon and Intel Macs running macOS Sonoma (14.0+). The app and bundled CLI are universal binaries, signed with a Developer ID and notarized by Apple.
Get LeftOpen-release.zip from GitHub Releases, unzip, and move LeftOpen.app to /Applications.
.git, package.json, pyproject.toml, Cargo.toml or go.mod, or resolves the owning .app. Global npm packages, python -m modules and standalone services (Redis, Postgres, Ollama…) are named too, so you rarely see a bare node or python..app icon when there is one; otherwise the icon the project or package ships itself (Tauri/Electron app icon, the favicon declared in index.html, public/ conventions); otherwise the favicon served by the local server; otherwise a symbol.brew services stop … for services launchd would restart, quitting the app for apps.SIGTERM only. Never SIGKILL, never system processes.127.0.0.1 from ones on 0.0.0.0 or a LAN address.MenuBarExtra. No daemon, no Dock icon, no telemetry. The only request that leaves this Mac is a daily check of the latest GitHub release, which you can turn off in Settings.leftopen CLI with identical inference and safety rules.EADDRINUSE): When your dev server fails because port 3000, 5173, or 8080 is blocked by a lingering process, LeftOpen shows you what's running and shuts it down gently—without restarting your terminal or machine.node or python PID: Tools like lsof -i or kill-port only report raw PIDs or ambiguous process names. LeftOpen tracks the working directory and project root (package.json, Cargo.toml, pyproject.toml, go.mod, .git), giving you full context before taking action.127.0.0.1 (local only) or 0.0.0.0 (accessible to anyone on your local network/Wi-Fi).kill -9: Unlike blunt force-killing scripts, LeftOpen re-verifies PID and start time, shows sibling ports, and issues a standard SIGTERM so servers can clean up sockets, flush logs, and exit cleanly.Available in the terminal right after installing:
# List every listening port and its owner (or: leftopen list)
leftopen
# Explain one port
leftopen 3000
# Open http://localhost:3000 in the default browser
leftopen open 3000
# Close the process on a port (SIGTERM, asks first)
leftopen close 3000
# Structured JSON output
leftopen --json
Sample output:
LEFT OPEN
26 listening ports · 17 processes · 1 projects · 8 LAN-visible
MY PROJECTS (2)
PORT PID OWNER PROCESS AGE SCOPE
5173 76344 visdelta node 2h LOCAL
↳ ~/Documents/visdelta
5511 4999 visdelta node 27m LOCAL
↳ ~/Documents/visdelta
APPLICATIONS (16)
PORT PID OWNER PROCESS AGE SCOPE
5000 696 ControlCenter Control 3d LAN
9222 36824 Google Chrome Chrome 5h LOCAL
SERVICES (3)
PORT PID OWNER PROCESS AGE SCOPE
11434 911 Ollama ollama 1d LOCAL
LOCAL = this Mac only · LAN = may be reachable from your local network
# Tests
swift test
# Build the app locally
LEFTOPEN_OUTPUT_DIR=dist/dev Scripts/build-app.sh
47 commits
Swift
98.2%
Shell
1.8%
Native macOS menu bar app & CLI to see what is listening on localhost, identify projects & processes, and gently close them. The safer alternative to lsof and kill-port.
See the codeNative macOS Menu Bar Port Manager & CLI
See what your tools left running on localhost, identify projects, and gently close them.
把那些虚掩着的门,轻轻关上。
English · 中文
When I have several coding agents working in parallel, dev servers and test runners keep starting up on different ports. By the end of the day there are always a few still running.
Existing tools are either too much, or only tell you "port in use" without saying which process it is or which project it came from.
So I made LeftOpen. It sits quietly in the menu bar and shows you the listening ports, the processes behind them and the projects they probably belong to. Once you've had a look, you close the ones you no longer need.
Close the doors that were left ajar, gently.
brew install --cask songhaifan/tap/leftopen
Supports Apple Silicon and Intel Macs running macOS Sonoma (14.0+). The app and bundled CLI are universal binaries, signed with a Developer ID and notarized by Apple.
Get LeftOpen-release.zip from GitHub Releases, unzip, and move LeftOpen.app to /Applications.
.git, package.json, pyproject.toml, Cargo.toml or go.mod, or resolves the owning .app. Global npm packages, python -m modules and standalone services (Redis, Postgres, Ollama…) are named too, so you rarely see a bare node or python..app icon when there is one; otherwise the icon the project or package ships itself (Tauri/Electron app icon, the favicon declared in index.html, public/ conventions); otherwise the favicon served by the local server; otherwise a symbol.brew services stop … for services launchd would restart, quitting the app for apps.SIGTERM only. Never SIGKILL, never system processes.127.0.0.1 from ones on 0.0.0.0 or a LAN address.MenuBarExtra. No daemon, no Dock icon, no telemetry. The only request that leaves this Mac is a daily check of the latest GitHub release, which you can turn off in Settings.leftopen CLI with identical inference and safety rules.EADDRINUSE): When your dev server fails because port 3000, 5173, or 8080 is blocked by a lingering process, LeftOpen shows you what's running and shuts it down gently—without restarting your terminal or machine.node or python PID: Tools like lsof -i or kill-port only report raw PIDs or ambiguous process names. LeftOpen tracks the working directory and project root (package.json, Cargo.toml, pyproject.toml, go.mod, .git), giving you full context before taking action.127.0.0.1 (local only) or 0.0.0.0 (accessible to anyone on your local network/Wi-Fi).kill -9: Unlike blunt force-killing scripts, LeftOpen re-verifies PID and start time, shows sibling ports, and issues a standard SIGTERM so servers can clean up sockets, flush logs, and exit cleanly.Available in the terminal right after installing:
# List every listening port and its owner (or: leftopen list)
leftopen
# Explain one port
leftopen 3000
# Open http://localhost:3000 in the default browser
leftopen open 3000
# Close the process on a port (SIGTERM, asks first)
leftopen close 3000
# Structured JSON output
leftopen --json
Sample output:
LEFT OPEN
26 listening ports · 17 processes · 1 projects · 8 LAN-visible
MY PROJECTS (2)
PORT PID OWNER PROCESS AGE SCOPE
5173 76344 visdelta node 2h LOCAL
↳ ~/Documents/visdelta
5511 4999 visdelta node 27m LOCAL
↳ ~/Documents/visdelta
APPLICATIONS (16)
PORT PID OWNER PROCESS AGE SCOPE
5000 696 ControlCenter Control 3d LAN
9222 36824 Google Chrome Chrome 5h LOCAL
SERVICES (3)
PORT PID OWNER PROCESS AGE SCOPE
11434 911 Ollama ollama 1d LOCAL
LOCAL = this Mac only · LAN = may be reachable from your local network
# Tests
swift test
# Build the app locally
LEFTOPEN_OUTPUT_DIR=dist/dev Scripts/build-app.sh
47 commits
Swift
98.2%
Shell
1.8%