kill processes by port.
Beautifully.

A blazing-fast CLI that finds and kills processes hogging your ports. Interactive TUI, watch mode, process trees, and zero dependencies.

npm Downloads (opens in new tab) GitHub Stars (opens in new tab)
0 Dependencies
0 Platforms
0+ Tests Passing
0 Languages

Why slay?

Everything you need to reclaim your ports.

Interactive TUI

Search, browse, and multi-select processes with keyboard navigation.

slay -i

Kill Animations

Watch a bullet fly across your terminal when a process gets slayed.

slay 3000

Graceful Shutdown

SIGTERM first, escalate to SIGKILL only if the process refuses to die.

slay -g 3000

Watch Mode

Keep polling and auto-kill processes that respawn on your port.

slay -w 3000

Process Trees

Kill the entire process tree, children first, for clean teardown.

slay --tree 3000

JSON Output

Pipe NDJSON to jq for scripting, CI pipelines, and automation.

slay --json 3000

Smart Labels

Auto-detects Node, Python, Docker, PostgreSQL, Vite, and 20+ more.

slay --all

Zero Dependencies

No bloat. Ships only what it needs. Installs in under a second.

npm i -g slay-port

Cross-Platform

Works on macOS (lsof), Linux (lsof), and Windows (netstat + taskkill).

works everywhere ✓

Profile Presets

Save port combos and flags as named profiles. Run slay --profile dev.

slay --profile dev

Port Ranges

Kill a range of ports with slay 8000-8010.

slay 8000-8010

Port Info

Inspect ports without killing. See PID, CPU, memory, and uptime.

slay info 3000

Shell Completions

Tab-complete commands, flags, and profile names in bash, zsh, and fish.

slay completions zsh

Kill by Name

Target processes by name with regex support. Exclude specific processes from bulk kills.

slay --name "node.*"

Post-Kill Hooks

Automatically run commands after killing — restart servers, trigger builds, or notify your team.

slay 3000 --then "npm start"

Port Availability

Check if ports are free, find the next available port. Perfect for CI scripts and automation.

slay check 3000

Stop guessing PIDs

The old way is painful. The slay way is one command.

The old way

bash
$ lsof -iTCP:3000 -sTCP:LISTEN
node 12847 user 23u IPv4 TCP *:3000
$ kill -9 12847
$ lsof -iTCP:3000 -sTCP:LISTEN
# still alive... try again?
$ kill -SIGKILL 12847

The slay way

slay
$ slay 3000
3000 > node PID 12847 (Dev Server)
killed PID 12847 on port 3000 [SIGKILL]
 
Done in 0.2s
 

Get started

Up and running in one command.

Quick Start
npx slay-port 3000
Global Install
npm i -g slay-port && slay 3000
Quick Start
pnpm dlx slay-port 3000
Global Install
pnpm add -g slay-port && slay 3000
Quick Start
yarn dlx slay-port 3000
Global Install
yarn global add slay-port && slay 3000
Quick Start
bunx slay-port 3000
Global Install
bun add -g slay-port && slay 3000
Quick Start
brew install hammadxcm/slay/slay-port
Global Install
brew install hammadxcm/slay/slay-port && slay 3000
Quick Start
sudo snap install slay-it --classic
Global Install
sudo snap install slay-it --classic && slay 3000
Quick Start
sudo apt install slay-port
Global Install
sudo apt install slay-port && slay 3000
Quick Start
scoop bucket add slay https://github.com/hammadxcm/scoop-slay && scoop install slay
Global Install
scoop install slay && slay 3000
Quick Start
winget install hammadxcm.slay-port
Global Install
winget install hammadxcm.slay-port && slay 3000
API Usage
import { findByPort, killProcess } from 'slay-port'

See it in action

Fifteen ways to slay.

Basic Kill

slay 3000
$ slay 3000
3000 > node PID 12847 (Dev Server)
* *
***
killed PID 12847 on port 3000 [SIGKILL]

Interactive Mode

slay -i
$ slay -i
> 3000 node PID 12847 Dev Server
8080 python PID 9321 HTTP Alt
5432 pg PID 4510 PostgreSQL
↑↓ navigate space select enter confirm

Watch Mode

slay 3000 -w
$ slay 3000 -w
watching port 3000...
killed PID 12847 [SIGKILL]
watching port 3000...
process respawned as PID 12901
killed PID 12901 [SIGKILL]
watching port 3000...

Force Kill

slay 3000 -f
$ slay 3000 -f
3000 > node PID 12847 (Dev Server)
*========================***
killed PID 12847 on port 3000 [SIGKILL]
no confirmation needed (-f)

Graceful Shutdown

slay 3000 --soft
$ slay 3000 --soft
3000 > node PID 12847 (Dev Server)
sending SIGTERM...
waiting for graceful exit (5s)...
process exited gracefully [SIGTERM]

Multi-port

slay 3000 8080 5432
$ slay 3000 8080 5432
3000 > node PID 12847 (Dev Server)
8080 > python PID 9321 (HTTP Alt)
5432 > pg PID 4510 (PostgreSQL)
killed 3 processes on 3 ports

Dry Run

slay 3000 -n
$ slay 3000 -n
3000 > node PID 12847 (Dev Server)
[dry run] would kill PID 12847
no processes were harmed

Process Tree

slay 3000 -t
$ slay 3000 -t
3000 > node PID 12847 (Dev Server)
└─ PID 12848 (worker)
└─ PID 12849 (worker)
killed tree: 12849, 12848, 12847

Kill by Name

slay --name "node.*"
$ slay --name "node.*" --exclude "vite"
PID 12847 node server.js (port 3000)
PID 13201 node worker.js (port 3001)
PID 14500 node vite.js (excluded)
killed 2 processes, 1 excluded

Post-Kill Hook

slay 3000 --then "npm start"
$ slay 3000 --then "npm start"
3000 > node PID 12847 (Dev Server)
killed PID 12847 on port 3000 [SIGKILL]
running hook: npm start
hook completed (exit 0)

Port Check

slay check 3000
$ slay check 3000
port 3000 is in use (node PID 12847)
$ slay check --next 3000
port 3002 is available

Init Config

slay init
$ slay init
✓ Created .slay.json with example profiles

Run Profile

slay --profile dev
$ slay --profile dev
3000 > node PID 12847 (Dev Server)
5173 > node PID 13201 (Vite)
5432 > pg PID 4510 (PostgreSQL)
killed 3 processes on 3 ports

Port Range

slay 8000-8005
$ slay 8000-8005
8000 > node PID 9001 (HTTP Alt)
8001 > node PID 9002 (HTTP Alt)
killed 2 processes on 2 ports (4 ports clear)

JSON Output

slay 3000 --json
$ slay 3000 --json
{"type":"found","pid":12847,"port":3000}
{"type":"killed","pid":12847,"signal":"SIGKILL"}
{"type":"summary","killed":1,"failed":0}

UDP Ports

slay 53 --udp
$ slay 53 --udp
53/udp > mDNSResponder PID 289
*========================***
killed PID 289 on port 53/udp [SIGKILL]

All Listeners

slay --all -y
$ slay --all -y
scanning all ports...
found 5 listening processes
killed 5/5 processes
0 failed

Verbose Mode

slay 3000 -v
$ slay 3000 -v
[tcp] 3000 > node PID 12847
[signal] sending SIGKILL to 12847
[timing] kill took 12ms
killed PID 12847 on port 3000 [SIGKILL]

Programmatic API

Use slay as a library in your Node.js projects.

Exports

  • findByPort(platform, port) Find processes on a specific port
  • findByPorts(platform, ports) Find processes on multiple ports
  • findAllListening(platform) Find all listening processes
  • killProcess(platform, proc) Kill a single process
  • killAll(platform, procs) Kill multiple processes
  • enrichLabel(proc) Add smart labels to a process
api.ts
import { findByPort, killProcess, platform }
from 'slay-port';
 
const procs = await findByPort(platform, 3000);
 
for (const proc of procs) {
const result = await killProcess(platform, proc);
console.log( `Killed $${result.pid} on $${result.port}` );
}