Skip to content
v1.5.2Retry hints that work, and a matched-only mode for watch

Your ports have squatters.Kick them out.

Kickoutchi is a TUI and CLI port janitor. See which process owns a local port, read its family, and clear the stale dev server without guessing.

Install for your platform
curl --proto '=https' --tlsv1.2 -LsSf https://kickoutchi.com/install.sh | sh
powershell -ExecutionPolicy Bypass -NoProfile -Command "irm https://kickoutchi.com/install.ps1 | iex"

Then run kick to open the TUI.Homebrew, Scoop, AUR, Nix, Cargo →

Demo device: node is squatting on port 3000. Use Scan, Inspect, or Kick.

It's a toy. Press scan, inspect, or kick. Your machine stays untouched.

The TUI

Meet your port janitor.

Run kick with no arguments. Every open port, its owner, and the details of whatever you select. Browsing never stops anything.

$ kickTUI · Linux
Kickoutchi showing a selected Node.js process on port 3000, its listening address, process details, and keyboard shortcuts for inspecting or terminating it.
Captured from a real session with a local demo server.View full size ↗
  • ↵Details
  • xTerminate
  • XForce kill
  • tKill tree
  • /Search
  • mFull report
  • ?Help
  • qQuit
See the confirmation step

The prompt names the process and every affected port. Warnings wrap in full, and nothing stops until you confirm.

The confirmation dialog identifies the Node.js process, lists its ports 3000, 5173, and 8080, and offers y to confirm or Escape to cancel.

The CLI

Get straight to it.

Already know the port? Five verbs cover the job. Every transcript below uses the real output format.

Command

Find the owner

Port 3000 is busy. See the process behind it before you decide anything. Add --json for scripts.

kick list --port 3000
List and filter ports →
$ kick list --port 3000PROTO  ADDRESS    PORT  PID    PROCESS  STATETCP    127.0.0.1  3000  18422  node     LISTEN

Read the family

Dev servers leave workers behind. Inspect shows the tree, the group, and the exact command to clear it. Read-only.

kick inspect --port 3000
Inspect and scoped kills →
$ kick inspect --port 3000Target: PID 18422 (node)  Command: node server.mjs  Ports: TCP 127.0.0.1:3000  … ancestors and siblingsTree (3 processes):  PID 18422 (node) [TCP 127.0.0.1:3000]    PID 18431 (vite)    PID 18444 (esbuild)To terminate this tree: kick kill --pid 18422 --tree

Explain the conflict

Got "address already in use"? Why probes the bind and returns the evidence, even when the owner is unclear.

kick why 3000
Understand bind failures →
$ kick why 3000tcp://127.0.0.1:3000 verdict=owned certainty=proven  probe=address_in_use message=Address already in use (os error 98)  evidence code=visible_verified_owner source=linux_procfs    message=PID 18422 (node) owned the endpoint at snapshot capturetcp://[::1]:3000 verdict=bindable_now certainty=proven  … fields trimmed

Watch it change

One line per change as servers bind, release, or get replaced. Pipe it anywhere.

kick watch --port 5173
Watch ports live →
$ kick watch --port 5173BIND TCP 127.0.0.1:5173 listen owners=21077 filter=matched certainty=provenRELEASE TCP 127.0.0.1:5173 listen owners=21077 filter=matched certainty=proven  … observed timestamps trimmed

Kick it out

One process or a whole batch, confirmed by you, checked again right before the signal, then checked for a real exit.

kick kill --pid 18422
How confirmation works →
$ kick kill --pid 18422Terminate PID 18422 (node)Scope: processPorts: TCP 127.0.0.1:3000Command: kill 18422Type y to confirm, or press Enter to cancel: ysent SIGTERM to PID 18422 (node)PID 18422 (node) exitedconfirmed target ports are no longer visible

Safety

Clear the right process.

A PID can be reused and a port can change hands between two keystrokes. Every kick walks the same path, and it stops the moment the target is no longer the one you confirmed.

  1. Find

    One snapshot ties every socket to its owner.

  2. Inspect

    Read the tree and group. Nothing is stopped.

  3. Confirm

    Type y, tree, force, or a protected PID.

  4. Re-check

    Identity, ports, and protection are read again.

  5. Signal

    SIGTERM by default. Any drift and it refuses.

One process by default. Trees and groups only when you ask.

Protected processes need the PID or name typed. --yes can't skip it.

Changed or uncertain targets are refused, never guessed.

Read how the safety checks work →

Everywhere

Runs in every swamp.

Native collection on Linux, macOS, and Windows. No daemon to run. Two binaries ship together: kickoutchi and the short kick.

Linux

Native /proc collection with pidfd-backed tree/group kill and inspect.

macOS

Native libproc / sysctl collection with tree/group kill and inspect.

Windows

Native IP Helper listing, inspect, single-process kill, and CLI tree kill via Job Objects.

  • HomebrewmacOS, Linux
    brew install nuggocto/tap/kickoutchi
  • ScoopWindows
    scoop bucket add nuggocto https://github.com/nuggocto/scoop-bucket
    scoop install kickoutchi
  • AURArch
    yay -S kickoutchi-bin
  • NixLinux
    nix run github:nuggocto/kickoutchi
  • CargoAnywhere Rust runs
    cargo install --locked --git https://github.com/nuggocto/kickoutchi
Every install method, with checksums and updates →

Clear the swamp.

Your next dev server deserves a free port. Free and open source under MIT.

View the source on GitHub ↗