Skip to content
Documentation menu

Configuration

The optional config file • location, precedence, every key, endpoint labels, and the protected-process list.

Kickoutchi runs fine with no config file at all. When you want different defaults, drop a small TOML file in place. The repository also ships a copy-ready example covering settings and exact-before-wildcard endpoint labels.

Location

By default Kickoutchi looks in your platform config directory:

Platform Path
Linux $XDG_CONFIG_HOME/kickoutchi/config.toml (usually ~/.config/kickoutchi/config.toml)
macOS ~/Library/Application Support/kickoutchi/config.toml
Windows %APPDATA%\kickoutchi\config.toml

Point at a different file with the global --config FILE flag.

Precedence

Settings have layers, like any self-respecting swamp: built-in defaults at the bottom, then the config file, then CLI flags on top. Most keys override their default; protected_processes extends it (see below).

Keys

Every key is optional. Anything you leave out keeps its default.

Key Type Default Meaning
refresh_interval_seconds integer (1–3600) 3 How often the TUI re-collects ports.
default_sort string "port" Default sort for the CLI and TUI. One of port, pid, protocol, process, parent, scope.
hide_system_processes boolean false Hide conservative system/service rows from the default view.
confirm_force_kill boolean true Require the typed force confirmation for force kills (when --yes is absent).
check_for_updates boolean (ignored) Deprecated compatibility key. true and false are accepted, but Kickoutchi performs no automatic release check.
protected_processes string[] (see below) Extra process names that require stronger confirmation. Added to the built-in list.
[[ports]] table array (none) Endpoint labels. Up to 256 selectors • see below.

Config files are capped at 64 KiB. Larger files are rejected instead of being partially parsed or allowed to consume unbounded memory.

Example

~/.config/kickoutchi/config.toml
refresh_interval_seconds = 5
default_sort = "scope"
hide_system_processes = true
confirm_force_kill = true
protected_processes = ["redis", "mysqld"]

[[ports]]
protocol = "tcp"
address = "127.0.0.1"
port = 3000
label = "web dev"

Endpoint labels

5432 is a port number. postgres is a name you’ll recognise at 2am. Each [[ports]] block gives one endpoint a label that then follows it through the CLI table, sufficiently wide TUI tables, plain search, filters, list --json, snapshots, watch events, and why output.

endpoint labels
[[ports]]
protocol = "tcp"
address = "127.0.0.1"
port = 3000
label = "web dev"

[[ports]]
protocol = "tcp"
address = "*"
port = 3000
label = "web service"

[[ports]]
protocol = "udp"
address = "fe80::1"
scope_id = 3
port = 5353
label = "mDNS"
Field Required Meaning
protocol yes "tcp" or "udp". The two are matched separately.
address yes An exact literal IPv4/IPv6 address, or "*" for any address.
port yes The exact port.
scope_id no Nonzero IPv6 interface index. Valid only with an exact IPv6 address.
label yes The display text.

Matching rules:

  • Exact beats wildcard. With both blocks above, 127.0.0.1:3000 resolves to web dev and any other address on TCP 3000 resolves to web service.
  • IPv4-mapped IPv6 addresses normalize to IPv4 before duplicate detection and matching.
  • Hostnames, DNS names, CIDR ranges, interface names, and %zone syntax are rejected. Use scope_id for an IPv6 scope.
  • Duplicate selectors are an error, not a last-one-wins surprise.

Up to 256 selectors are accepted.

Protected processes

protected_processes is additive: your names are added on top of the built-in safety set, never instead of it. Adding redis can’t accidentally strip protection from systemd or postgres.

Matching is exact • case-sensitive on Linux/macOS, case-insensitive on Windows • and never a substring, so postgres-backup-helper doesn’t inherit postgres’s protection. Linux also accepts the kernel’s 15-byte /proc/<pid>/comm truncation for longer protected names when that is the only process name available.

The built-in list covers load-bearing processes whose accidental termination takes your containers, database, init system, or desktop with them:

docker, docker.exe, dockerd, dockerd.exe, docker-proxy, docker-proxy.exe,
Docker Desktop.exe, com.docker.backend, com.docker.backend.exe, postgres,
postgres.exe, systemd, System, smss.exe, csrss.exe, wininit.exe, services.exe,
lsass.exe, svchost.exe, winlogon.exe, explorer.exe, dwm.exe, WindowServer

The list is capped at 256 entries and rejects empty names. See Safety for the checks applied to protected processes at kill time.

Hiding system processes

With hide_system_processes = true, the default view drops conservative system/service rows: PID 0 and 1, direct children of PID 1, and a short list of well-known OS process names (plus PID ≤ 4 and children of services.exe on Windows). It’s deliberately cautious • a protected app like postgres is not treated as a system process just because it’s protected; those are two different ideas.