A terminal UI for monitoring and managing local listening ports
Project description
porTUI
A terminal UI application for monitoring local listening ports and managing the processes that own them.
Features
- Real-time display of listening TCP/UDP ports with process information
- Configurable columns (Port, IP, Protocol, Process, PID, User, State, Command)
- Sortable by Port, IP, Protocol, Process, PID, User, State, or Command (numerical IP sorting)
- Sort order maintained during auto-refresh
- Inline tree view with real process hierarchy (toggle with
t) — parent processes are resolved from the OS even when they don't hold ports (e.g. Chrome → Chrome Helper) - Protocol filter to show TCP only, UDP only, or both (cycle with
h) - Real-time text filtering across all fields
- Port detail overlay with full untruncated command line (press Enter, Escape to close)
- Auto-refresh with configurable interval (pauses during interaction)
- Prominent visual indicator when auto-refresh is paused
- Kill processes with choice of graceful (SIGTERM) or force (SIGKILL), with PID recycling guard
- Configuration persistence (
~/.config/portui/config.json) - Cross-platform (macOS, Linux, Windows)
Installation & Usage
Run without installing (recommended)
uvx portui
Install globally
uv tool install portui
portui
Install with pip
pip install portui
portui
Run from source
git clone https://github.com/lowtrak/PorTUI
cd PorTUI
uv sync
uv run portui
Run as a module
uv run python -m portui
Keyboard Shortcuts
| Key | Action |
|---|---|
↑/↓ or j/k |
Navigate rows |
Enter |
Show full port/process details |
/ |
Focus filter input (Escape to clear and exit) |
h |
Cycle protocol filter (Both → TCP → UDP) |
c |
Toggle column configuration |
s |
Cycle sort column (Port → IP → Proto → Process → PID → User → State → Command) |
t |
Toggle tree view (htop-style process hierarchy) |
x |
Kill selected process |
r |
Manual refresh |
p |
Pause/resume auto-refresh |
i |
Set refresh interval |
? |
Show help |
q |
Quit |
Requirements
- Python 3.9+
- uv (for
uvxusage)
Development
git clone https://github.com/lowtrak/PorTUI
cd PorTUI
uv sync --group dev
uv run pytest
Project structure
portui/
├── __init__.py # Public exports
├── __main__.py # python -m portui entry point
├── app.py # PortUIApp (main TUI application)
├── collector.py # PortDataCollector (psutil, kill logic)
├── config.py # ConfigManager (load/save/validate)
├── models.py # PortInfo dataclass
├── screens.py # All Screen subclasses
├── sort.py # SortController
└── tree.py # ProcessTreeBuilder (htop-style tree)
tests/
├── test_config.py # ConfigManager validation (15 tests)
├── test_filter.py # Filter mode UI (8 tests)
├── test_kill.py # Kill + PID recycling guard (9 tests)
├── test_sort.py # Sort all columns (21 tests)
└── test_tree.py # Tree view (7 tests)
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file portui-0.1.5.tar.gz.
File metadata
- Download URL: portui-0.1.5.tar.gz
- Upload date:
- Size: 13.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e1f9af1b6049bb27a39da2a88dc78e6bb6b63f648def2338ba3715aedb498f65
|
|
| MD5 |
a22f907d501bf5fdb7bf7f3dccd4a093
|
|
| BLAKE2b-256 |
5bda84a67b3c022459637b279146aa63281c76b27eb746eb560e44ba0ecc0737
|
Provenance
The following attestation bundles were made for portui-0.1.5.tar.gz:
Publisher:
publish.yml on lowtrak/PorTUI
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
portui-0.1.5.tar.gz -
Subject digest:
e1f9af1b6049bb27a39da2a88dc78e6bb6b63f648def2338ba3715aedb498f65 - Sigstore transparency entry: 1181313574
- Sigstore integration time:
-
Permalink:
lowtrak/PorTUI@298f29e1546d5abb19b453b04750962624e2800b -
Branch / Tag:
refs/tags/v0.1.5 - Owner: https://github.com/lowtrak
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@298f29e1546d5abb19b453b04750962624e2800b -
Trigger Event:
release
-
Statement type:
File details
Details for the file portui-0.1.5-py3-none-any.whl.
File metadata
- Download URL: portui-0.1.5-py3-none-any.whl
- Upload date:
- Size: 17.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bbc930de1eb12a07359b6a4d483eca069f65bc36a0bdfdc6c12affd413edaf4e
|
|
| MD5 |
83249cd0b45f9722d466542bb78676b1
|
|
| BLAKE2b-256 |
7fdacc01360f9406d3e30a3b69d8be22b04c16519510c4296fadcdc433928a02
|
Provenance
The following attestation bundles were made for portui-0.1.5-py3-none-any.whl:
Publisher:
publish.yml on lowtrak/PorTUI
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
portui-0.1.5-py3-none-any.whl -
Subject digest:
bbc930de1eb12a07359b6a4d483eca069f65bc36a0bdfdc6c12affd413edaf4e - Sigstore transparency entry: 1181313579
- Sigstore integration time:
-
Permalink:
lowtrak/PorTUI@298f29e1546d5abb19b453b04750962624e2800b -
Branch / Tag:
refs/tags/v0.1.5 - Owner: https://github.com/lowtrak
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@298f29e1546d5abb19b453b04750962624e2800b -
Trigger Event:
release
-
Statement type: