Filtering and search
Every table has a free-text filter, a set of chips and sortable columns. The command palette is a separate, faster route to a service.
Per-screen filters
| Screen | Chips | Free text matches |
|---|---|---|
| Services | All · Node · Python · Databases | Label, process name, framework, PID, any port |
| Processes | All · Services · Other | Name, PID, parent PID |
| Ports | All · TCP · UDP | Port, protocol, address, PID, process name, service label |
Filtering is instant and local to the snapshot already on screen. It never triggers a scan, so typing in a filter box costs nothing.

The chips and the text filter compose: a chip narrows by kind, the text box narrows within it.


Counts stay honest
Every table header reads “N of M · sorted by …”. A filtered view is never presented as the whole set, and the navigation badges count what the current mode will show, so a badge always agrees with the table you land on.
Sorting
Click a column heading to sort by it. Services and Processes default to memory, because that is usually the column that explains a slow machine. Ports defaults to port number, ordered so that IPv4 precedes IPv6 within the same port and a dual-stack pair reads as one thing.
The command palette

Ctrl + K opens it, Esc closes it. You can type a command or a port number. Each service offers three actions:
- Show — open that service’s detail panel.
- Open in browser — launch its localhost URL, validated against an
http/httpsallowlist first. - Copy — put that URL on the clipboard.
In V1 the palette covers services only. It does not search processes or ports, and it does not run navigation commands beyond opening a service. Broader coverage is on the roadmap rather than implemented.
When nothing matches
The table says so in words — “No services match the current search or filter” — rather than collapsing to a hairline, which would read as a rendering fault instead of an empty result.