{"_id":"@burakboduroglu/portkill","_rev":"9-da2e6514ff3d4da1b8d954f8bea49669","name":"@burakboduroglu/portkill","dist-tags":{"latest":"0.4.6"},"versions":{"0.4.1":{"name":"@burakboduroglu/portkill","version":"0.4.1","keywords":["cli","port","kill","lsof","dev"],"license":"MIT","_id":"@burakboduroglu/portkill@0.4.1","maintainers":[{"name":"burakboduroglu","email":"burakboduroglu0@gmail.com"}],"homepage":"https://github.com/burakboduroglu/portkill#readme","bugs":{"url":"https://github.com/burakboduroglu/portkill/issues"},"bin":{"portkill":"dist/index.js"},"dist":{"shasum":"bc958a4b961f8af0f86ab5e66674c5c68da64608","tarball":"https://registry.npmjs.org/@burakboduroglu/portkill/-/portkill-0.4.1.tgz","fileCount":4,"integrity":"sha512-70fSUFKnCxFMqYvbEsEWPrzP5wMhoEDrJ7mwa/N1hc6Ieys2t5VGIzDN3kc2/6wQbV4zUmAoJo9n6cCn0aXFnQ==","signatures":[{"sig":"MEQCIF02FNKrr88oWHKkZK/8XprdbxiklvtpZ57lkf6rwWuiAiAfroWsI/LS3CJx2zPQA4M4OhVsEOQ3NxXkIcd33xrtmg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":49052},"type":"module","engines":{"node":">=18"},"gitHead":"f8d0160022e0da623963870f27f6fe3c68b5d820","scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest run","build":"tsup","start":"node dist/index.js","format":"prettier --write .","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"burakboduroglu","email":"burakboduroglu0@gmail.com"},"repository":{"url":"git+https://github.com/burakboduroglu/portkill.git","type":"git"},"_npmVersion":"11.11.1","description":"Kill processes listening on TCP ports — CLI for macOS/Linux: dry-run, port ranges, --list, optional local web UI (--gui). Node.js 18+.","directories":{},"_nodeVersion":"25.8.0","dependencies":{"chalk":"^5.4.1","commander":"^13.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","eslint":"^9.21.0","vitest":"^3.0.8","prettier":"^3.5.3","@eslint/js":"^9.21.0","typescript":"^5.8.2","@types/node":"^22.13.10","typescript-eslint":"^8.26.1","@vitest/coverage-v8":"^3.0.8"},"_npmOperationalInternal":{"tmp":"tmp/portkill_0.4.1_1774165027194_0.531856131766349","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@burakboduroglu/portkill","version":"0.4.2","keywords":["cli","port","kill","lsof","dev"],"license":"MIT","_id":"@burakboduroglu/portkill@0.4.2","maintainers":[{"name":"burakboduroglu","email":"burakboduroglu0@gmail.com"}],"homepage":"https://github.com/burakboduroglu/portkill#readme","bugs":{"url":"https://github.com/burakboduroglu/portkill/issues"},"bin":{"portkill":"dist/index.js"},"dist":{"shasum":"8a5c0703ad892336c360ba83cbb79cd4bb21216c","tarball":"https://registry.npmjs.org/@burakboduroglu/portkill/-/portkill-0.4.2.tgz","fileCount":4,"integrity":"sha512-JqLNiTeYZzJhWKqkcO5dDjFEn0I8JoO762iCepOX65VJW4I/8jRr7cj0vKdeubqgf+aBglIRik4Rxn2iGGWa2w==","signatures":[{"sig":"MEQCIAPFK5kFt4W4uyNNTf25G8FokIC4EBxeQuFApFkw+E5IAiAQNJtUGF2gtamgcyWg72TKMQFTuL9n7Kh3ApIUsZYW5w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":49078},"type":"module","engines":{"node":">=18"},"gitHead":"f246a958fc728d5ea287a13f501bb43b5fc3515b","scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest run","build":"tsup","start":"node dist/index.js","format":"prettier --write .","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"burakboduroglu","email":"burakboduroglu0@gmail.com"},"repository":{"url":"git+https://github.com/burakboduroglu/portkill.git","type":"git"},"_npmVersion":"11.11.1","description":"Kill processes listening on TCP ports — CLI for macOS/Linux: dry-run, port ranges, --list, optional local web UI (--gui). Node.js 18+.","directories":{},"_nodeVersion":"25.8.0","dependencies":{"chalk":"^5.4.1","commander":"^13.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","eslint":"^9.21.0","vitest":"^3.0.8","prettier":"^3.5.3","@eslint/js":"^9.21.0","typescript":"^5.8.2","@types/node":"^22.13.10","typescript-eslint":"^8.26.1","@vitest/coverage-v8":"^3.0.8"},"_npmOperationalInternal":{"tmp":"tmp/portkill_0.4.2_1774165493151_0.42915175937632655","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"@burakboduroglu/portkill","version":"0.4.3","keywords":["cli","port","kill","lsof","dev"],"license":"MIT","_id":"@burakboduroglu/portkill@0.4.3","maintainers":[{"name":"burakboduroglu","email":"burakboduroglu0@gmail.com"}],"homepage":"https://github.com/burakboduroglu/portkill#readme","bugs":{"url":"https://github.com/burakboduroglu/portkill/issues"},"bin":{"portkill":"dist/index.js"},"dist":{"shasum":"4ef7a157d7dca666b86a5412e000ed8b9efce5f7","tarball":"https://registry.npmjs.org/@burakboduroglu/portkill/-/portkill-0.4.3.tgz","fileCount":4,"integrity":"sha512-K4dXMpk7FpN90Ac4Lo6m/NKgDVfjygSMbc/xsThudI/Vfzkjf285ICbe3hRirhUNdAzUG+3Y1z++pnSE4HAF0Q==","signatures":[{"sig":"MEYCIQCydeDi/BU+8cbnShZQ2sHTRWuIY/maqWp3M3E47u1UggIhAPRSmoVt1OzZQY8EDaatgInnVOIVqMUsjJoaR2zRB0BP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":49423},"type":"module","engines":{"node":">=18"},"gitHead":"61037cc0ff7d480d2ec220ddecd67e426b6fcb8a","scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest run","build":"tsup","start":"node dist/index.js","format":"prettier --write .","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"node scripts/assert-version-not-published.mjs && npm run build && npm test","release:bump-minor":"npm version minor --no-git-tag-version","release:bump-patch":"npm version patch --no-git-tag-version"},"_npmUser":{"name":"burakboduroglu","email":"burakboduroglu0@gmail.com"},"repository":{"url":"git+https://github.com/burakboduroglu/portkill.git","type":"git"},"_npmVersion":"11.11.1","description":"Kill processes listening on TCP ports — CLI for macOS/Linux: dry-run, port ranges, --list, optional local web UI (--gui). Node.js 18+.","directories":{},"_nodeVersion":"25.8.0","dependencies":{"chalk":"^5.4.1","commander":"^13.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","eslint":"^9.21.0","vitest":"^3.0.8","prettier":"^3.5.3","@eslint/js":"^9.21.0","typescript":"^5.8.2","@types/node":"^22.13.10","typescript-eslint":"^8.26.1","@vitest/coverage-v8":"^3.0.8"},"_npmOperationalInternal":{"tmp":"tmp/portkill_0.4.3_1774167038472_0.8669498024842985","host":"s3://npm-registry-packages-npm-production"}},"0.4.4":{"name":"@burakboduroglu/portkill","version":"0.4.4","keywords":["cli","port","kill","lsof","dev"],"license":"MIT","_id":"@burakboduroglu/portkill@0.4.4","maintainers":[{"name":"burakboduroglu","email":"burakboduroglu0@gmail.com"}],"homepage":"https://www.npmjs.com/package/@burakboduroglu/portkill","bugs":{"url":"https://github.com/burakboduroglu/portkill/issues"},"bin":{"portkill":"dist/index.js"},"dist":{"shasum":"70a494bd919180e756793add2486b886a5e226db","tarball":"https://registry.npmjs.org/@burakboduroglu/portkill/-/portkill-0.4.4.tgz","fileCount":4,"integrity":"sha512-hEicyT6wy3jC8bMbby/Ii0t4iAgFDHAgStQbnXUMhadIEcYkqdlYwDpF3jcOqBTw9bDc6F8/jSpzEJ/VZG5nUg==","signatures":[{"sig":"MEUCIQCeOa+L1jaYfefZ/36YfMhy6ppx77DNT+fVQAkk7au74QIgNPVGkAZdKabFm9Ajd7YSgM9DIUEEsbwxDi2l3SARbfo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":49432},"type":"module","engines":{"node":">=18"},"gitHead":"8c86375d22569e063f6dc5a19d8f48c3fb1a585e","scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest run","build":"tsup","start":"node dist/index.js","format":"prettier --write .","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"node scripts/assert-version-not-published.mjs && npm run build && npm test","release:bump-minor":"npm version minor --no-git-tag-version","release:bump-patch":"npm version patch --no-git-tag-version"},"_npmUser":{"name":"burakboduroglu","email":"burakboduroglu0@gmail.com"},"repository":{"url":"git+https://github.com/burakboduroglu/portkill.git","type":"git"},"_npmVersion":"11.11.1","description":"Kill processes listening on TCP ports — CLI for macOS/Linux: dry-run, port ranges, --list, optional local web UI (--gui). Node.js 18+.","directories":{},"_nodeVersion":"25.8.0","dependencies":{"chalk":"^5.4.1","commander":"^13.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","eslint":"^9.21.0","vitest":"^3.0.8","prettier":"^3.5.3","@eslint/js":"^9.21.0","typescript":"^5.8.2","@types/node":"^22.13.10","typescript-eslint":"^8.26.1","@vitest/coverage-v8":"^3.0.8"},"_npmOperationalInternal":{"tmp":"tmp/portkill_0.4.4_1774167397359_0.5714650153873944","host":"s3://npm-registry-packages-npm-production"}},"0.4.5":{"name":"@burakboduroglu/portkill","version":"0.4.5","keywords":["cli","port","kill","lsof","dev"],"license":"MIT","_id":"@burakboduroglu/portkill@0.4.5","maintainers":[{"name":"burakboduroglu","email":"burakboduroglu0@gmail.com"}],"homepage":"https://www.npmjs.com/package/@burakboduroglu/portkill","bugs":{"url":"https://github.com/burakboduroglu/portkill/issues"},"bin":{"portkill":"dist/index.js"},"dist":{"shasum":"c8eeaed6aaacc84c9cc0f6e9b9c24a037ca87929","tarball":"https://registry.npmjs.org/@burakboduroglu/portkill/-/portkill-0.4.5.tgz","fileCount":4,"integrity":"sha512-TwHL9N9a2m3yiw0ZbHLPjhduXpn0CO+7/Iqp7DKFfJVMvvFQwOiG6GWWprHtTRWMS7hnxq7rZ3gQk7IaLksXPA==","signatures":[{"sig":"MEUCIQD4FL5np9B5ybr2x3xcdKqx2lnSMqu+L/BCHgGD0vxIrgIgUqQ+j1UHGIRvUc4JO1RTfzbKtX8bbRpM4aCyTkji7eE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":49666},"type":"module","engines":{"node":">=18"},"gitHead":"8bd809acefecbd704a1418025a9ade4ad107ff3a","scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest run","build":"tsup","start":"node dist/index.js","format":"prettier --write .","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"node scripts/assert-version-not-published.mjs && npm run build && npm test","release:bump-minor":"npm version minor --no-git-tag-version","release:bump-patch":"npm version patch --no-git-tag-version"},"_npmUser":{"name":"burakboduroglu","email":"burakboduroglu0@gmail.com"},"repository":{"url":"git+https://github.com/burakboduroglu/portkill.git","type":"git"},"_npmVersion":"11.11.1","description":"Kill processes listening on TCP ports — CLI for macOS/Linux: dry-run, port ranges, --list, local web UI (--gui) on loopback. Node.js 18+.","directories":{},"_nodeVersion":"25.8.0","dependencies":{"chalk":"^5.4.1","commander":"^13.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","eslint":"^9.21.0","vitest":"^3.0.8","prettier":"^3.5.3","@eslint/js":"^9.21.0","typescript":"^5.8.2","@types/node":"^22.13.10","typescript-eslint":"^8.26.1","@vitest/coverage-v8":"^3.0.8"},"_npmOperationalInternal":{"tmp":"tmp/portkill_0.4.5_1774187344916_0.19604417324007462","host":"s3://npm-registry-packages-npm-production"}},"0.4.7":{"name":"@burakboduroglu/portkill","version":"0.4.7","keywords":["cli","port","kill","lsof","dev"],"license":"MIT","_id":"@burakboduroglu/portkill@0.4.7","maintainers":[{"name":"burakboduroglu","email":"burakboduroglu0@gmail.com"}],"homepage":"https://www.npmjs.com/package/@burakboduroglu/portkill","bugs":{"url":"https://github.com/burakboduroglu/portkill/issues"},"bin":{"portkill":"dist/index.js"},"dist":{"shasum":"7e2fdb846c076a070ed925648845a26c4a71798a","tarball":"https://registry.npmjs.org/@burakboduroglu/portkill/-/portkill-0.4.7.tgz","fileCount":4,"integrity":"sha512-on7/RetYw8SHMmjxwIDy3658D9MVAcp7izfSKHA/M5THoQSa5WaYQVM5fdi/tNwjv0SDYQ+Lai5yyJDGKkSxmw==","signatures":[{"sig":"MEYCIQDbObRgwzr6R5GdmMSgpchMNAn1YZKuIpMpFcyEsxJTLwIhAO4fTTUXBpixWmoeKJwyTWeau3guYl4Ao8sBdVMWfrqT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":50101},"type":"module","engines":{"node":">=18"},"gitHead":"b97a8cc0d34520699ef38eda070ee814c7eefef3","scripts":{"dev":"tsup --watch","lint":"eslint .","test":"vitest run","build":"tsup","start":"node dist/index.js","format":"prettier --write .","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"node scripts/assert-version-not-published.mjs && npm run build && npm test","release:bump-minor":"npm version minor --no-git-tag-version","release:bump-patch":"npm version patch --no-git-tag-version"},"_npmUser":{"name":"burakboduroglu","email":"burakboduroglu0@gmail.com"},"deprecated":"This release was published under the wrong version. Use @burakboduroglu/portkill@0.4.5 instead.","repository":{"url":"git+https://github.com/burakboduroglu/portkill.git","type":"git"},"_npmVersion":"11.11.1","description":"Kill processes listening on TCP ports — CLI for macOS/Linux: dry-run, port ranges, --list, local web UI (--gui) on loopback. Node.js 18+.","directories":{},"_nodeVersion":"25.8.2","dependencies":{"chalk":"^5.4.1","commander":"^13.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","eslint":"^9.21.0","vitest":"^3.0.8","prettier":"^3.5.3","@eslint/js":"^9.21.0","typescript":"^5.8.2","@types/node":"^22.13.10","typescript-eslint":"^8.26.1","@vitest/coverage-v8":"^3.0.8"},"_npmOperationalInternal":{"tmp":"tmp/portkill_0.4.7_1774873381300_0.22182841355471417","host":"s3://npm-registry-packages-npm-production"}},"0.4.6":{"name":"@burakboduroglu/portkill","version":"0.4.6","description":"Kill processes listening on TCP ports — CLI for macOS/Linux: dry-run, port ranges, --list, local web UI (--gui) on loopback. Node.js 18+.","type":"module","bin":{"portkill":"dist/index.js"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/burakboduroglu/portkill.git"},"bugs":{"url":"https://github.com/burakboduroglu/portkill/issues"},"homepage":"https://github.com/burakboduroglu/portkill#readme","engines":{"node":">=18"},"scripts":{"build":"tsup","dev":"tsup --watch","start":"node dist/index.js","test":"vitest run","test:coverage":"vitest run --coverage","test:watch":"vitest","lint":"eslint .","typecheck":"tsc --noEmit","format:check":"prettier --check .","format":"prettier --write .","release:bump-patch":"bun pm version patch --no-git-tag-version","release:bump-minor":"bun pm version minor --no-git-tag-version","prepublishOnly":"node scripts/assert-version-not-published.mjs && bun run build && bun run test"},"keywords":["cli","port","kill","kill-process","lsof","fuser","tcp","eaddrinuse","port-in-use","devtools","macos","linux"],"license":"MIT","dependencies":{"chalk":"^5.4.1","commander":"^13.1.0"},"devDependencies":{"@vitest/coverage-v8":"^3.0.8","@eslint/js":"^9.21.0","@types/node":"^22.13.10","eslint":"^9.21.0","prettier":"^3.5.3","tsup":"^8.4.0","typescript":"^5.8.2","typescript-eslint":"^8.26.1","vitest":"^3.0.8"},"_id":"@burakboduroglu/portkill@0.4.6","gitHead":"59cc123e0907abac87e791775af63403a89e9449","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-tBnkfxX+zLs6RQKocfLEZItQCdvjGmcn5HWYXBuljtHbifrbr6qqNXCfKZQJ5bTudrdhhqQsMi+SNcish4RVoA==","shasum":"e082fdbb51eb8ccdbc2bf1ef84b799a645eda59a","tarball":"https://registry.npmjs.org/@burakboduroglu/portkill/-/portkill-0.4.6.tgz","fileCount":4,"unpackedSize":57660,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@burakboduroglu%2fportkill@0.4.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCC+SVfqFeE5RSnZYWeIpsUot1XQCROpJtkaMD2e6Zz9QIhANkyZIvDp3tbEB114fwILwUYOqPA/TjhIoIWE8ebZO+Z"}]},"_npmUser":{"name":"burakboduroglu","email":"burakboduroglu0@gmail.com"},"directories":{},"maintainers":[{"name":"burakboduroglu","email":"burakboduroglu0@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/portkill_0.4.6_1788360921614_0.5283046995653766"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-22T07:37:07.139Z","modified":"2026-09-02T14:55:22.089Z","0.4.1":"2026-03-22T07:37:07.329Z","0.4.2":"2026-03-22T07:44:53.305Z","0.4.3":"2026-03-22T08:10:38.633Z","0.4.4":"2026-03-22T08:16:37.563Z","0.4.5":"2026-03-22T13:49:05.043Z","0.4.7":"2026-03-30T12:23:01.434Z","0.4.6":"2026-09-02T14:55:21.744Z"},"bugs":{"url":"https://github.com/burakboduroglu/portkill/issues"},"license":"MIT","homepage":"https://github.com/burakboduroglu/portkill#readme","keywords":["cli","port","kill","kill-process","lsof","fuser","tcp","eaddrinuse","port-in-use","devtools","macos","linux"],"repository":{"type":"git","url":"git+https://github.com/burakboduroglu/portkill.git"},"description":"Kill processes listening on TCP ports — CLI for macOS/Linux: dry-run, port ranges, --list, local web UI (--gui) on loopback. Node.js 18+.","maintainers":[{"name":"burakboduroglu","email":"burakboduroglu0@gmail.com"}],"readme":"<div align=\"center\">\n\n<img src=\"https://raw.githubusercontent.com/burakboduroglu/portkill/main/assets/portkill-logo.svg\" alt=\"portkill logo\" width=\"120\">\n\n# `.portkill`\n\n**Free stuck TCP ports in one command — no `lsof` pipelines, no guessing PIDs.**\n\n[**Install with Homebrew or npm →**](#install)\n\n[![CI](https://img.shields.io/github/actions/workflow/status/burakboduroglu/portkill/ci.yml?branch=main&label=ci&style=flat-square)](https://github.com/burakboduroglu/portkill/actions/workflows/ci.yml)\n[![npm](https://img.shields.io/npm/v/%40burakboduroglu%2Fportkill?style=flat-square&logo=npm&label=npm)](https://www.npmjs.com/package/@burakboduroglu/portkill)\n[![Release](https://img.shields.io/github/v/release/burakboduroglu/portkill?style=flat-square)](https://github.com/burakboduroglu/portkill/releases)\n[![License](https://img.shields.io/github/license/burakboduroglu/portkill?style=flat-square)](https://github.com/burakboduroglu/portkill/blob/main/LICENSE)\n[![Last commit](https://img.shields.io/github/last-commit/burakboduroglu/portkill?style=flat-square)](https://github.com/burakboduroglu/portkill/commits)\n\n![TypeScript](https://img.shields.io/badge/TypeScript-5-000?style=flat-square&logo=typescript)\n![Node.js](https://img.shields.io/badge/Node.js-18+-000?style=flat-square&logo=node.js)\n![macOS](https://img.shields.io/badge/macOS-supported-000?style=flat-square&logo=apple)\n![Linux](https://img.shields.io/badge/Linux-supported-000?style=flat-square&logo=linux&logoColor=white)\n![Homebrew](https://img.shields.io/badge/Homebrew-tap-000?style=flat-square&logo=homebrew)\n![Vitest](https://img.shields.io/badge/Vitest-tested-000?style=flat-square&logo=vitest)\n\n</div>\n\n---\n\nYour dev server crashes, the port stays taken, and the next `npm run dev` greets you with `EADDRINUSE`. The fix is a pipeline you look up every time — `lsof -i :3000`, read the PID out of the table, `kill -9`, hope it was the right one.\n\n`.portkill` is that pipeline as one command. It shows what owns the port, lets you preview before anything is signalled, and stops only what you meant to stop. Same logic from the terminal or from a local web UI.\n\n> The name reads like **`.portkill`** — a small, local dev utility, `.env`-style prefix. The CLI binary is still `portkill`.\n\n<div align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/burakboduroglu/portkill/main/assets/demo.png\" alt=\"portkill listing three TCP listeners, previewing two with --dry-run, then stopping the one on port 3000\" width=\"760\">\n</div>\n\n## What it is\n\nGive it a port and it answers with the process that holds it, by name and PID. Give it several, or an inclusive range, and it walks them in order. Nothing is signalled until you confirm — or you pass `--dry-run` and nothing is signalled at all, so you can look first and decide after.\n\nIt sends `SIGTERM` by default, not `SIGKILL`, so a process gets the chance to shut down the way it wants to. It never escalates: if a listener belongs to another user, portkill says so and exits 3 rather than reaching for `sudo` on your behalf.\n\n`portkill --gui` puts the same logic behind a small local web UI on loopback, for when a browser tab is closer to hand than a terminal.\n\n## Highlights\n\n|     | Feature                | How it works                                                                                                             |\n| --- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------ |\n| 🔍  | **See before you act** | `--dry-run` resolves every port and prints what it would stop, without sending a single signal.                          |\n| 🎯  | **Ports, not PIDs**    | `lsof` on both platforms, with `fuser` as the Linux fallback, so you never copy a PID out of a table again.              |\n| 📚  | **Ranges**             | `portkill 9000-9002` expands inclusively, capped at 4096 ports per range token so a typo cannot expand into a fork bomb. |\n| 🖥️  | **Local web UI**       | `--gui` serves the same resolve-and-kill logic on `127.0.0.1`, with a browser confirm. No Electron, no bundled runtime.  |\n| 🧯  | **Polite by default**  | `SIGTERM` unless you ask otherwise, a confirmation prompt unless you pass `--force`, and never `sudo`.                   |\n| 🚦  | **Scriptable**         | Exit codes distinguish success, nothing-found, and permission denied, so a shell script can branch on the outcome.       |\n| 🎨  | **Readable output**    | Colour through chalk, and it steps aside for `NO_COLOR` or a non-TTY.                                                    |\n| 🪶  | **Small**              | Roughly 1,500 lines of TypeScript with two runtime dependencies, published as a four-file tarball.                       |\n\n## Install\n\n**Homebrew** — [burakboduroglu/homebrew-portkill](https://github.com/burakboduroglu/homebrew-portkill)\n\n```bash\nbrew install burakboduroglu/portkill/portkill\nportkill --version\n```\n\n**npm** — [@burakboduroglu/portkill](https://www.npmjs.com/package/@burakboduroglu/portkill)\n\n```bash\nnpm i -g @burakboduroglu/portkill\n```\n\n**No install at all**\n\n```bash\nnpx @burakboduroglu/portkill --list\n```\n\nIf Homebrew reports that `/opt/homebrew/bin/portkill` already exists, an older npm global install is in the way:\n\n```bash\nnpm uninstall -g @burakboduroglu/portkill\nbrew link portkill\n```\n\n**From source**\n\n```bash\ngit clone https://github.com/burakboduroglu/portkill.git && cd portkill\nbun install && bun run build\nbun link   # optional: puts `portkill` on PATH\n```\n\n## Quick start\n\n```bash\n# What is listening, everywhere?\nportkill --list\n\n# See what would happen — nothing is signalled\nportkill 3000 8080 --dry-run\n\n# Stop them (prompts unless --force)\nportkill 3000 8080\n\n# An inclusive range\nportkill 9000-9002\n\n# Something that will not die politely\nportkill 3000 --signal SIGKILL\n\n# The same logic in a browser tab\nportkill --gui\n```\n\n## CLI reference\n\n| Flag              | Meaning                                |\n| ----------------- | -------------------------------------- |\n| `-n`, `--dry-run` | Show targets only; do not send signals |\n| `-f`, `--force`   | Skip the terminal confirmation         |\n| `-s`, `--signal`  | Signal to send (default `SIGTERM`)     |\n| `-l`, `--list`    | List all TCP listeners                 |\n| `--gui`           | Open the local web UI                  |\n| `-v`, `--verbose` | More detail on stderr                  |\n| `-V`, `--version` | Print the version                      |\n\n| Exit code | Meaning                                                          |\n| --------- | ---------------------------------------------------------------- |\n| `0`       | Every requested port was handled                                 |\n| `1`       | General error — invalid arguments, unexpected failure            |\n| `2`       | No process was listening on any requested port                   |\n| `3`       | Permission denied — another user's process, or a privileged port |\n\nFull reference: [docs/cli-reference.md](https://github.com/burakboduroglu/portkill/blob/main/docs/cli-reference.md).\n\n## The local web UI\n\n`portkill --gui` starts an HTTP server on loopback — `127.0.0.1`, and `::1` when it is available — prints the URL, and opens it. The page lists listeners, previews a kill, and asks the browser to confirm before it calls the API. **Ctrl+C** stops the server; nothing is left running behind you.\n\nIt has **no authentication**. It is bound to loopback, but while it runs, anything that can reach your loopback can call it. Treat it as local-only tooling and close it when you are done — [SECURITY.md](https://github.com/burakboduroglu/portkill/blob/main/SECURITY.md) is specific about what that means.\n\n### Walkthrough\n\n<div align=\"center\">\n  <a href=\"https://www.youtube.com/watch?v=_-Z6zwiEHmg\" title=\"portkill --gui — watch on YouTube\">\n    <img src=\"https://img.youtube.com/vi/_-Z6zwiEHmg/hqdefault.jpg\" alt=\"portkill --gui demo — click to watch on YouTube\" width=\"560\">\n  </a>\n  <br>\n  <b><a href=\"https://www.youtube.com/watch?v=_-Z6zwiEHmg\">Open on YouTube</a></b>\n</div>\n\n## How it works\n\nPort arguments are matched against `^\\d+$`, range-checked to 1–65535, expanded, and deduplicated before anything else happens — so what reaches the system is always a number.\n\nDiscovery runs `lsof -nP -iTCP:<port> -sTCP:LISTEN` through `execFile`, without a shell. On Linux, if `lsof` is missing, it falls back to `fuser -n tcp <port>`. `lsof` exiting 1 means \"no matches\", not failure, which is a distinction portkill makes rather than reporting an error you would have to interpret.\n\nStopping a listener is `process.kill(pid, signal)` — a syscall, not a shell command. `EPERM` becomes \"permission denied\" and exit 3. `ESRCH` means the process died between discovery and the signal, which is a success, not an error.\n\n## Requirements\n\n- **Node.js ≥ 18**\n- **macOS** or **Linux**, with `lsof` available (`fuser` covers the Linux fallback)\n\n## Project layout\n\n```\nsrc/\n├─ index.ts              Commander wiring, flags, exit code\n├─ commands/\n│  ├─ kill.ts            Resolve ports → kill → outcomes\n│  └─ list.ts            Every listener on the machine\n├─ core/\n│  ├─ finder.ts          lsof and fuser discovery for one port\n│  ├─ lister.ts          One lsof pass for the whole table\n│  └─ killer.ts          process.kill, EPERM and ESRCH handling\n├─ gui/\n│  ├─ server.ts          Loopback HTTP server and JSON API\n│  ├─ index-html.ts      The single-page UI\n│  └─ open-browser.ts    Opens the printed URL\n└─ utils/                Port parsing, output, colour, exit codes, platform\n```\n\n`core/` never prints and never reads flags; it takes an injected `execFile` or `kill`, which is why the tests can cover it without touching a real process.\n\n## Docs\n\n| Doc                                                                                         | What it is                                                   |\n| ------------------------------------------------------------------------------------------- | ------------------------------------------------------------ |\n| [CLI reference](https://github.com/burakboduroglu/portkill/blob/main/docs/cli-reference.md) | Every flag, exit code, outcome, and the local GUI HTTP API   |\n| [Changelog](https://github.com/burakboduroglu/portkill/blob/main/CHANGELOG.md)              | What changed in each release                                 |\n| [Security policy](https://github.com/burakboduroglu/portkill/blob/main/SECURITY.md)         | What portkill touches, and private vulnerability reporting   |\n| [Release](https://github.com/burakboduroglu/portkill/blob/main/RELEASE.md)                  | Cutting a release: version, changelog, tag, Homebrew formula |\n| [Contributing](https://github.com/burakboduroglu/portkill/blob/main/CONTRIBUTING.md)        | Fork, branch, tests, PR expectations                         |\n| [Code of Conduct](https://github.com/burakboduroglu/portkill/blob/main/CODE_OF_CONDUCT.md)  | Community standards (Contributor Covenant 2.0)               |\n\n## Development\n\n```bash\nbun install\nbun run build\nbun run test\nbun run test:coverage\nbun run lint\nbun run typecheck\nbun run format\n```\n\n`core/` takes an injected `execFile` or `kill`, so the tests drive discovery and\nsignalling without a real process on a real port; the command tests mock\n`finder` in turn. CI runs the checks on every push and the suite across Node 18,\n20 and 22 on both Linux and macOS, and the coverage thresholds in\n`vitest.config.ts` are enforced there. Terminal colour comes from [chalk](https://github.com/chalk/chalk); set `NO_COLOR=1` to turn it off ([no-color.org](https://no-color.org/)).\n\n## Contributing\n\nBug reports and small, focused fixes are welcome. The tool is deliberately narrow — Windows support and long-running port monitors are out of scope — so open an issue before building anything substantial.\n\n- [**Contributing guide**](https://github.com/burakboduroglu/portkill/blob/main/CONTRIBUTING.md) — setup, tests, commits, pull requests\n- [**Code of Conduct**](https://github.com/burakboduroglu/portkill/blob/main/CODE_OF_CONDUCT.md) — how we treat each other here\n- [**Security policy**](https://github.com/burakboduroglu/portkill/blob/main/SECURITY.md) — what the tool touches, and how to report a vulnerability privately\n\n## License\n\nMIT — see [LICENSE](https://github.com/burakboduroglu/portkill/blob/main/LICENSE).\n","readmeFilename":"README.md"}