{"id":49584904,"url":"https://github.com/erdemylmaz/ports-cli","last_synced_at":"2026-05-03T22:04:21.541Z","repository":{"id":355405885,"uuid":"1227967631","full_name":"erdemylmaz/ports-cli","owner":"erdemylmaz","description":"Project-aware lsof for macOS. Single-binary Go CLI that shows which dev project each listening port belongs to, and lets you kill, pause, or resume by port number. Find what's using port 3000.","archived":false,"fork":false,"pushed_at":"2026-05-03T14:05:06.000Z","size":34,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-03T14:22:52.494Z","etag":null,"topics":["cli","developer-tools","devtools","eaddrinuse","golang","homebrew","kill-port","listening-ports","lsof","lsof-alternative","macos","networking","port-monitor","ports","process-management","terminal"],"latest_commit_sha":null,"homepage":"https://github.com/erdemylmaz/ports-cli","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/erdemylmaz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-03T12:15:03.000Z","updated_at":"2026-05-03T14:05:10.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/erdemylmaz/ports-cli","commit_stats":null,"previous_names":["erdemylmaz/ports-cli"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/erdemylmaz/ports-cli","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erdemylmaz%2Fports-cli","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erdemylmaz%2Fports-cli/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erdemylmaz%2Fports-cli/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erdemylmaz%2Fports-cli/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/erdemylmaz","download_url":"https://codeload.github.com/erdemylmaz/ports-cli/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erdemylmaz%2Fports-cli/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32579115,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T06:36:36.687Z","status":"ssl_error","status_checked_at":"2026-05-03T06:36:09.306Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","developer-tools","devtools","eaddrinuse","golang","homebrew","kill-port","listening-ports","lsof","lsof-alternative","macos","networking","port-monitor","ports","process-management","terminal"],"created_at":"2026-05-03T22:04:13.215Z","updated_at":"2026-05-03T22:04:21.531Z","avatar_url":"https://github.com/erdemylmaz.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ports — project-aware lsof for macOS\n\n\u003e The macOS CLI that finally tells you **which project** owns port 3000.\n\u003e\n\u003e **Website:** [portscli.com](https://portscli.com)\n\n[![Website](https://img.shields.io/badge/website-portscli.com-7ee787)](https://portscli.com)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE)\n[![macOS](https://img.shields.io/badge/macOS-12%2B-black?logo=apple)](https://portscli.com)\n[![Built with Go](https://img.shields.io/badge/Go-1.26-00ADD8?logo=go)](https://go.dev/)\n[![Release](https://img.shields.io/github/v/release/erdemylmaz/ports-cli)](https://github.com/erdemylmaz/ports-cli/releases)\n\n`ports` is a small, single-binary, zero-dependency Go CLI for macOS that\nshows what's actually listening on your laptop and **why** — with the\nproject context, working directory, parent process, uptime, and caffeinate\nstatus that `lsof` doesn't give you. It can also find local AI app and agent\nsessions that do not bind ports, so you can keep the exact process awake by\nPID. Kill, pause, resume, or caffeinate by port number, PID, project\ndirectory, or AI session.\n\n```\n$ ports\nPORT   PROTO  PID    COMMAND  PARENT          PATH                              CAFFEINATE  HOST       AGE\n3000   TCP    15711  node     node            ~/code/web-app                    on:82031    0.0.0.0    27m\n3030   TCP    12405  node     node            ~/code/api                        -           0.0.0.0    29m\n5432   TCP    23514  ssh      launchd         ~/code/infra                      -           127.0.0.1  10d5h\n6379   TCP    23514  ssh      launchd         ~/code/infra                      -           127.0.0.1  10d5h\n51606  TCP    91160  workerd  launchd         ~/code/edge-app                   -           127.0.0.1  9d2h\n\n5 listener(s)\n```\n\n## Keep Claude Code, Codex, and local agents awake\n\nLong-running agent work often depends on a local port: a Vite preview, a\nbrowser automation bridge, an MCP/tool server, an API, a model proxy, or a\ndashboard. `ports` lets you attach macOS `caffeinate` to the process that\nowns that port:\n\n```sh\nports caffeinate 3000                 # keep whatever owns :3000 awake\nports --caffeinate 12345              # keep a PID awake directly\nports caffeinate --dir ~/code/agent   # keep project listeners awake\nports --find codex \"claude code\"      # find AI/app/agent PIDs\nports caffeinate codex                # keep matching Codex app/agent/session PIDs awake\nports caffeinate codex --dir ~/code/agent --follow\n                                      # keep new Codex children in that project awake\nports caffeinate --find cursor        # explicit AI selector for caffeinate\nports caffeinate --pid 12345          # keep an exact PID awake\nports uncaffeinate 3000               # stop watcher, keep process running\nports decaffeinate                    # stop all caffeinate watchers found\n```\n\n`ports` then shows `CAFFEINATE on:\u003cwatcher-pid\u003e` in the normal table, so you\ncan see whether a Claude Code, Codex, or background-agent session is protected\nfrom idle sleep. For lid-closed runs, keep the Mac on power in a supported\nclamshell setup; macOS can still force sleep outside those conditions.\n\n`ports --find codex \"claude code\" gemini cursor` inspects the live process tree for\nAI-related app roots, CLI agents, workspace sessions, MCP/tool helpers, and\nworkspace child processes. It prints identity, role, workspace/CWD, age,\nlistener ports, caffeinate status, parent chain, and exact `--pid` commands.\nThe same names can be used directly with `ports caffeinate \u003cname\u003e` and\n`ports uncaffeinate \u003cname\u003e`. Add `--dir PATH` to constrain AI matches to a\nproject workspace, and add `--follow` when newly spawned agent children should\nbe caffeinated automatically.\n\n## Install\n\n### Homebrew (recommended)\n\n```sh\nbrew install erdemylmaz/ports-cli/ports\n# or, equivalently:\nbrew tap erdemylmaz/ports-cli \u0026\u0026 brew install ports\n```\n\n### npm\n\n```sh\nnpm install -g @erdemyilmaz/ports-cli\n# or\npnpm add -g @erdemyilmaz/ports-cli\n# or\nyarn global add @erdemyilmaz/ports-cli\n```\n\nThe npm package is a thin wrapper that downloads the right prebuilt binary\nfrom GitHub Releases on `postinstall`. macOS only.\n\n### Go\n\n```sh\ngo install github.com/erdemylmaz/ports-cli/cmd/ports@latest\n```\n\n### Prebuilt binary (no toolchain needed)\n\n```sh\n# Apple Silicon\ncurl -L -o ports https://github.com/erdemylmaz/ports-cli/releases/latest/download/ports-darwin-arm64\n# Intel\ncurl -L -o ports https://github.com/erdemylmaz/ports-cli/releases/latest/download/ports-darwin-amd64\n\nchmod +x ports \u0026\u0026 mv ports ~/.local/bin/   # or /usr/local/bin/\n```\n\n### Build from source\n\n```sh\ngit clone https://github.com/erdemylmaz/ports-cli.git\ncd ports-cli\ngo build -o ports ./cmd/ports\nmv ports ~/.local/bin/\n```\n\nVerify:\n\n```sh\nports version\nports --help\n```\n\n## Why this exists\n\n`lsof -iTCP -sTCP:LISTEN -nP` answers \"what's on port 3000,\" but in practice\nyou're trying to answer different questions:\n\n- *Which project is this `node` from?* (you have five running)\n- *How long has it been there?* (probably a leaked dev server)\n- *Did I start it, or did launchd?* (auto-restart at login, or a real session?)\n- *Can I just kill the thing on :3000 without looking up the pid first?*\n- *Can I keep this AI agent or dev server awake while the Mac idles?*\n- *Show me only my dev servers, not Spotify/Chrome/Figma.*\n\n`ports` answers those directly:\n\n- **Working directory** for each process, so you instantly recognize which\n  project a `node` belongs to.\n- **Parent process** so you can tell `launchd`-started leftovers from things\n  spawned by your current shell.\n- **Age** computed from `ps -o lstart=`.\n- **Filtering by purpose** — by default GUI apps and system daemons are\n  hidden. `ports --all` shows everything.\n- **Kill / pause / resume by port number**, no `lsof | awk` ritual.\n- **Caffeinate by port, pid, or project directory** so long-running local\n  agents, tunnels, and dev servers can keep running through idle sleep.\n\n## What it isn't\n\n- **Not an always-on ports daemon.** No LaunchAgent, no SQLite, no\n  `~/Library/...` data dir. Every normal invocation reads live state. When you\n  ask for `ports caffeinate`, it starts a normal macOS `/usr/bin/caffeinate`\n  watcher for the target PID and that watcher exits automatically with the\n  target. `--follow` is the opt-in exception: it starts a small background\n  `ports` watcher that rescans the same selector.\n- **Not cross-platform.** macOS only — it shells out to `/usr/sbin/lsof` and\n  `/bin/ps` with macOS-specific flags.\n- **Not a monitor.** No history, no notifications, no traffic metrics. If you\n  want \"when did port 3000 first appear two days ago,\" that needs persistent\n  state — out of scope.\n- **Not a closed-lid hardware bypass.** `caffeinate` prevents idle sleep while\n  macOS allows it. Many Mac laptops still sleep when the lid is closed unless\n  they are on power in a supported clamshell setup.\n- **Not a privileged tool.** No setuid, no helper. Killing root-owned ports\n  needs `sudo ports kill ...`.\n\nThe whole binary is one Go file, no third-party dependencies.\n\n## Usage\n\n```\nports [list] [flags]                          Show listening ports (default)\nports kill \u003cport|pid|--dir PATH\u003e [...]        Send SIGTERM (graceful)\nports force-kill \u003cport|pid|--dir PATH\u003e [...]  Send SIGKILL (immediate)\nports pause \u003cport|pid|--dir PATH\u003e [...]       Freeze process (SIGSTOP)\nports resume \u003cport|pid|--dir PATH\u003e [...]      Unfreeze process (SIGCONT)\nports caffeinate [\u003cport|pid|AI|--dir PATH\u003e ...] Keep Mac awake while process runs\nports --caffeinate \u003cport|pid\u003e                 Shortcut for ports caffeinate\nports uncaffeinate [\u003cport|pid|AI|--dir PATH\u003e ...] Stop awake watchers\nports decaffeinate [\u003cport|pid|AI|--dir PATH\u003e ...] Same as uncaffeinate\nports find [QUERY...]                         Find AI/app/agent process PIDs\nports --find [QUERY...]                       Shortcut for ports find\nports inspect \u003cport\u003e                          Full process detail + HTTP probe\nports self-destroy                            Uninstall the binary\nports version                                 Print version\n```\n\n### Flags\n\n| Flag             | Effect                                                     |\n| ---------------- | ---------------------------------------------------------- |\n| `--all` / `-a`   | Include GUI apps and system services                       |\n| _(automatic)_    | Docker via Colima, Lima, or OrbStack appears as `docker(...)` instead of `ssh`. The truthful raw command is preserved in JSON output and `ports inspect`. |\n| `--apps`         | Show **only** GUI apps and system services                 |\n| `--range A:B`    | Only ports in range, e.g. `--range 3000:9000`              |\n| `--pid N`        | Only this PID                                              |\n| `--cmd SUBSTR`   | Filter by command name (case-insensitive)                  |\n| `--dir PATH`     | Only processes whose cwd is at or under `PATH` (accepts `~`, relative, or absolute paths) |\n| `--strict-dir`   | For control commands with `--dir`, skip PIDs that also own listeners outside `PATH` |\n| `--find QUERY`   | For `caffeinate` / `uncaffeinate`, target matching AI processes |\n| `--follow` / `--watch` | For `caffeinate`, keep rescanning and caffeinate newly matching PIDs |\n| `--interval DUR` | Rescan interval for `--follow`, such as `1s`, `5s`, or `30s` |\n| `--since DUR`    | Started within DUR (e.g. `30m`, `2h`, `today`)             |\n| `--today`        | Shortcut for processes started since 00:00                 |\n| `--tcp`          | TCP only                                                   |\n| `--udp`          | UDP only                                                   |\n| `--sort KEY[:DIR]` | Sort by `path` (default), `port`, `pid`, `age`, `command`, or `kind`. Optional `:asc` (default) or `:desc`. The default groups same-project ports together. |\n| `--reverse` / `-r` | Flip the current sort direction                          |\n| `--json`         | Machine-readable output                                    |\n\nFor `ports find`, pass one or more queries such as `codex`, `\"claude code\"`,\n`gemini`, or `cursor`. With no query it searches all four. Add `--verbose` for\nfull session details or `--json` for automation.\n\n### Keeping dev servers and AI agents awake\n\n`ports caffeinate` wraps macOS's built-in `caffeinate` command around the\nprocess that owns a port. It starts `/usr/bin/caffeinate -dimsu -w \u003cpid\u003e` in\nthe background, returns immediately, and the watcher exits automatically when\nthe target process exits.\n\n```sh\nports caffeinate 3000                 # keep whatever owns :3000 awake\nports --caffeinate 12345              # same shortcut, targeting a pid\nports caffeinate --dir ~/code/agent   # keep every listener in a project awake\nports caffeinate                      # keep all current listening PIDs awake\nports uncaffeinate 3000               # stop the awake watcher, keep app running\nports decaffeinate                    # stop every caffeinate watcher found\n```\n\nThis is useful for long-running local AI agents and coding sessions: Claude\nCode, Codex, background tool servers, local dashboards, Vite/Next.js previews,\nDocker tunnels, and project-specific API stacks. If the thing you care about\nlistens on a port, pass the port. If it does not listen on a port, pass the\nPID directly.\n\n`ports` shows the current status in the `CAFFEINATE` column:\n\n```sh\nPORT  PROTO  PID    COMMAND  PARENT  PATH          CAFFEINATE  HOST       AGE\n3000  TCP    15711  node     zsh     ~/code/agent  on:82031    127.0.0.1  4h12m\n```\n\nThe `on:\u003cpid\u003e` value is the background `caffeinate` watcher PID. JSON output\nalso includes `caffeinated` and `caffeinate_pids`.\n\nFor AI apps and agents that do not listen on a local port, use process discovery:\n\n```sh\nports --find codex \"claude code\" gemini cursor\nports find codex --verbose\nports caffeinate codex\nports caffeinate codex --dir ~/code/agent --follow\nports caffeinate --find \"claude code\" cursor\nports caffeinate --pid 93633\nports uncaffeinate --pid 93633\nports uncaffeinate codex\nports decaffeinate codex --follow\n```\n\n`--pid` forces PID targeting for control commands. That avoids the normal\n`port first, then PID` numeric lookup when you know you want an exact process.\nAI names are only accepted by `caffeinate` and `uncaffeinate`; destructive\ncommands stay explicit, so use `ports find ...` and then `--pid` when you\nreally mean to signal an AI process.\n\n`--follow` fixes the \"new child process appeared later\" case. It starts a\nbackground `ports __follow-caffeinate ...` watcher that repeatedly resolves\nthe same selector and attaches `/usr/bin/caffeinate -w \u003cpid\u003e` to new matches.\nFor example, `ports caffeinate codex --dir ~/code/agent --strict-dir --follow`\nkeeps current and future Codex workspace/session PIDs under that project awake,\nwhile skipping shared listener PIDs that also expose ports outside the project.\nStop both the current PID watchers and the follow watcher with\n`ports decaffeinate codex --dir ~/code/agent --strict-dir --follow`.\n\nWith no target, `ports caffeinate` is a bulk operation: after confirmation it\ncaffeinates every currently listening PID visible to `ports`. With no target,\n`ports decaffeinate` stops all active `/usr/bin/caffeinate -w \u003cpid\u003e` watchers it\ncan discover, including watchers started manually or by another tool, and also\nstops any `ports --follow` watchers.\n\n`ports find` understands common AI process identities:\n\n- Codex desktop app roots, app-server processes, `node_repl` workspace\n  sessions, Codex CLI wrappers/native agents, and Computer Use MCP helpers.\n- Claude / Claude Code desktop and helper processes.\n- Gemini CLI or app processes when present.\n- Cursor app, helper, and agent processes.\n- Workspace child processes launched below an AI root, including local dev\n  servers with listening ports and active caffeinate watchers.\n\nUse `--verbose` when deciding what to keep awake. It includes the full command,\nexecutable path, cwd, workspace, parent chain, root process, listening ports,\nand the exact `ports caffeinate --pid \u003cPID\u003e` / `ports uncaffeinate --pid \u003cPID\u003e`\ncommands for every match.\n\nImportant macOS reality: this prevents idle sleep while macOS permits the\nassertion. A closed laptop lid can still force sleep unless the Mac is on\npower in a supported clamshell setup. Keep lid-closed agent runs on power and\nventilated.\n\n### Killing by directory\n\n`kill`, `force-kill`, `pause`, `resume`, `caffeinate`, and `uncaffeinate` all\naccept `--dir PATH` to target every listener whose working directory is at or\nunder the given path. Useful for \"shut down everything in this project\" or\n\"keep this whole agent workspace awake\" without listing pids by hand. When\nmore than one process would be targeted (or when `--dir` is used at all),\nyou'll be asked to confirm — pass `--yes` / `-y` to skip.\n\n```sh\nports kill --dir ~/code/web-app          # SIGTERM everything in this project\nports force-kill --dir ~/code/web-app -y # SIGKILL, no confirmation\nports pause --dir ~/code/api             # freeze the API stack\nports resume --dir ~/code/api            # unfreeze it\nports caffeinate --dir ~/code/agent -y    # keep project listeners awake\nports caffeinate --dir ~/code/agent --strict-dir -y\n                                      # skip shared PIDs that cross projects\nports uncaffeinate --dir ~/code/agent -y  # release their awake watchers\nports caffeinate codex --dir ~/code/agent --follow\n                                      # keep new AI children under this project awake\n```\n\nSome runtimes expose ports for multiple projects from one shared host PID. The\ncommon macOS case is Docker via Colima/Lima, where one SSH multiplexer can own\nport forwards for several Compose projects. Because macOS `caffeinate -w`\nwatches a PID, `ports caffeinate --dir ...` warns when a selected PID also owns\nlisteners outside that directory. Use `--strict-dir` when you prefer skipping\nthose shared PIDs over affecting another project. `--strict-dir` does not make\nmacOS caffeinate only selected ports inside a shared PID; that is not possible\nwith PID-scoped `caffeinate`.\n\nWhen `--dir` is combined with an AI selector such as `codex`, `claude code`,\n`gemini`, or `cursor`, AI matches are filtered to processes whose workspace,\ncwd, or listening port cwd is under that directory. That keeps\n`ports caffeinate codex --dir ~/code/benzersor --follow` from also selecting a\nseparate Codex session under `~/code/devredin`.\n\n### Examples\n\n```sh\n# Just my dev servers (default behavior)\nports\n\n# Everything, including Spotify/Chrome/system daemons, with kind column\nports --all\n\n# Only the noise, in case you want to know what your \"background\" is doing\nports --apps\n\n# Dev-port range, TCP only\nports --range 3000:9000 --tcp\n\n# Node servers started in the last hour\nports --cmd node --since 1h\n\n# Only listeners running under a specific directory tree\nports --dir ~/Documents\nports --dir ~/code/web-app\nports --dir .                          # current directory\n\n# Sort by something other than path (the new default)\nports --sort port                      # back to numeric port order\nports --sort age:desc                  # oldest-running first — zombie hunt\nports --sort command                   # group by command name\nports --sort path -r                   # path order, descending\n\n# Free up port 3000 (graceful)\nports kill 3000\n\n# It didn't shut down? Force it.\nports force-kill 3000\n\n# Multiple at once (mix port numbers and pids)\nports kill 3000 4000 12345\n\n# Kill everything running under a project tree\nports kill --dir ~/code/web-app          # asks for confirmation\nports force-kill --dir ~/code/web-app -y # immediate, no confirmation\n\n# Freeze a process without killing it (e.g. to see if a request is hanging on it)\nports pause 3000\nports resume 3000\n\n# Keep a local AI agent, dev server, or tunnel running through idle sleep\nports caffeinate 3000\nports --caffeinate 12345\nports caffeinate --pid 12345\nports caffeinate codex\nports caffeinate \"claude code\" gemini cursor\nports caffeinate codex --dir ~/code/agent-workspace --strict-dir --follow\nports caffeinate --dir ~/code/agent-workspace --yes\nports uncaffeinate 3000\nports uncaffeinate codex\nports decaffeinate\n\n# Find AI app/agent/session PIDs that may not listen on ports\nports --find codex \"claude code\" gemini cursor\nports find codex --verbose\n\n# Full detail + HTTP probe on whatever's there\nports inspect 3000\n\n# Pipe into jq\nports --json --range 3000:9000 | jq '.[] | {port, command, cwd, caffeinated}'\n```\n\n### How \"dev vs. app\" is decided\n\nA listener is classified as `app` if its executable lives inside a\n`.app/Contents/` bundle, and `system` if it lives under `/System/`,\n`/usr/libexec/`, `/Library/Apple/`, or matches a known noisy daemon name\n(`mDNSResponder`, `rapportd`, `sharingd`, etc.). Everything else is `dev` and\nshown by default.\n\nHeuristics aren't perfect. Edit the `classify` function in\n`cmd/ports/main.go` to teach it about anything in your environment that\nsneaks through (e.g. apps installed outside `/Applications/`).\n\n## Comparison\n\n|                                | `ports` | `lsof -i -P -n` | `netstat -anv` | `lsof-ng` / TUI tools |\n| ------------------------------ | ------- | --------------- | -------------- | --------------------- |\n| Project / cwd shown            | ✓       | ✗               | ✗              | rare                  |\n| Parent process shown           | ✓       | ✗               | ✗              | rare                  |\n| Process age / uptime           | ✓       | ✗               | ✗              | rare                  |\n| Filter by working directory    | ✓       | manual `\\| grep`  | ✗              | ✗                     |\n| Kill by port number            | ✓       | ✗               | ✗              | some                  |\n| Bulk kill by project           | ✓       | ✗               | ✗              | ✗                     |\n| Keep awake by port/project     | ✓       | ✗               | ✗              | ✗                     |\n| Hides GUI apps by default      | ✓       | ✗               | ✗              | varies                |\n| Single-binary, no dependencies | ✓       | ✓               | ✓              | varies                |\n| macOS only                     | ✓       | cross           | cross          | varies                |\n\n## Scope, on purpose\n\nThis is a small tool with a deliberately small surface. Things explicitly\n**not** planned:\n\n- Persistent history / event log of port bindings (would need a daemon).\n- TUI or menu-bar app.\n- Per-port traffic measurement (requires `pktap`/root).\n- Linux/Windows support.\n- Circumventing macOS lid-close sleep rules. `ports caffeinate` uses the\n  supported system assertion mechanism; it does not patch power management.\n\nIf any of those would change the tool's character (a ports-owned daemon,\nelevated privileges, GUI), they belong in a different project.\n\n## Contributing\n\nPRs welcome for: better classification heuristics, additional `inspect`\noutput (parent-chain walk, open files, env vars), JSON schema improvements,\nand bug fixes for edge-case `lsof` output.\n\nThings less likely to be merged: anything that adds a daemon, a database,\nexternal dependencies, or a config file.\n\n## Links\n\n- **Website:** [portscli.com](https://portscli.com) — install instructions, examples, FAQ\n- **Source:** [github.com/erdemylmaz/ports-cli](https://github.com/erdemylmaz/ports-cli)\n- **Releases:** [github.com/erdemylmaz/ports-cli/releases](https://github.com/erdemylmaz/ports-cli/releases)\n- **Homebrew tap:** [github.com/erdemylmaz/homebrew-ports-cli](https://github.com/erdemylmaz/homebrew-ports-cli)\n- **npm:** [@erdemyilmaz/ports-cli](https://www.npmjs.com/package/@erdemyilmaz/ports-cli)\n- **Author:** [erdm.io](https://erdm.io)\n\n## License\n\nMIT — see [LICENSE](./LICENSE).\n\n---\n\n**Keywords:** macOS port monitor · which process is using port 3000 ·\nkill port 3000 mac · lsof alternative · find process using port macOS ·\nfree up port mac · check listening ports macOS · `EADDRINUSE` fix mac ·\nproject-aware port listing · dev server cleanup · caffeinate port mac ·\nkeep Mac awake by pid · run Claude Code with lid closed · run Codex in\nbackground · keep AI agents running on Mac · portscli.com\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ferdemylmaz%2Fports-cli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ferdemylmaz%2Fports-cli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ferdemylmaz%2Fports-cli/lists"}