Skip to main content

DockPilot

A vendor-neutral admin console for USB-C / Thunderbolt docks and hubs on Linux.

Docks ship their network chips in a generic plug-and-play mode that hides most of what the hardware can do — and on Linux, no vendor gives you a tool to change that. DockPilot detects the dock's chipset and, where the hardware allows, safely and reversibly unlocks the manufacturer's native mode (Wake-on-LAN, link tuning, EEPROM inspection), draws a live map of the dock's internals, and controls its USB devices and audio.

Where a dock can do something, it unlocks it. Where a dock can't, it says so clearly and puts you back on a working configuration.

DockPilot dashboard

Screenshots

Dashboard — live throughput, link health, reachability, chip identity Dashboard
Native mode — detect the chip and unlock the manufacturer's driver Native mode
Wake-on-LAN — arm the NIC and send magic packets to other machines Wake-on-LAN
USB topology — a live map of the dock's hubs, ports and devices Topology
Devices & power — enable/disable individual devices behind the dock USB & Power
Automation — rules that fire when the dock connects or disconnects Automation

What it does

  • Native-mode unlock (reversible). Detects ASIX / Realtek dock NICs and, if they're in a limited plug-and-play (CDC) mode, offers a one-click switch to the native driver — then verifies the link actually comes up. If it does, native-only features appear. If it doesn't, it auto-reverts to the working mode and tells you why.
  • Wake-on-LAN. Arm the dock NIC to wake the machine over the wired link, and send magic packets to wake your other machines (pure Python, no external tool).
  • Live dashboard. Real-time throughput graph, link health (error/drop counters), reachability (gateway / internet / DNS latency, public IP, LAN device count), and the dock's chip identity — all from /sys and ethtool.
  • USB topology map. A live diagram of the dock as a device: its hubs, every downstream port, and what occupies each — scoped strictly to the dock (your laptop's own ports are excluded). Falls back gracefully on hubs with no NIC.
  • Per-device USB control. Enable/disable individual devices behind the dock; per-port power via uhubctl where the hub supports it.
  • Link & offload tuning (native mode): force speed/duplex, renegotiate, toggle NIC offloads — each with a plain-language explanation of what it actually does.
  • EEPROM inspection. Read-only: reports whether the NIC has a rewritable EEPROM or uses one-time eFuse, and can back it up. Never writes.
  • Connect/disconnect automation. Rules that fire when the dock link goes up/down (e.g. turn Wi-Fi off when wired, MAC pass-through), persisted across restarts.

What it does not do

  • It does not talk to HDMI/DisplayPort video or Power Delivery — those aren't on the USB data bus and no USB tool can see them (it labels them).
  • It cannot make a dock do something its silicon can't. Some chips (see below) engage native mode but their wired link never comes up — DockPilot diagnoses that and reverts, it does not "fix" the hardware.
  • It writes nothing to any EEPROM/eFuse. Inspection only.
  • Linux only. Uses NetworkManager for some conveniences (degrades gracefully without it).

Tested hardware

Every device below was tested on a real machine.

Device NIC chip Ships as Native mode result
Wavlink WL-UMD05 REV.C ASIX AX88179A cdc_ncm ✅ unlocks, link comes up
UGREEN Revodok Pro (10-in-1) ASIX AX88179B cdc_ncm ⚠️ engages, but wired link won't come up — auto-reverts, diagnosed
TP-Link UE300C ASIX AX88179B cdc_ncm ⚠️ same as above — diagnosed, reverts
Anker USB-C Gigabit adapter ASIX AX88179B cdc_ncm ⚠️ same as above — diagnosed, reverts
uni USB-C Hub 6-in-1 Realtek RTL8153 r8152 ✅ already native out of the box
TP-Link UE302C (2.5G) Realtek RTL8156 r8152 ✅ already native; advertises 2500baseT/Full
MOKiN / C-Smartlink DK1903A (Thunderbolt 4, 12-in-1) Realtek RTL8156B r8152 ✅ already native; works fully over Thunderbolt
ASIX AX88772B USB-A adapter (10/100) ASIX AX88772B asix ✅ single USB config — nothing to unlock; correctly offers no native mode
Lemorele 10-in-1 (no NIC) — ✅ graceful: "no network chip", topology still drawn

The key finding

  • Realtek (RTL8153 / RTL8156) native mode works — the chips ship on the native r8152 driver and link cleanly, gigabit and 2.5G alike.
  • Current-generation ASIX (AX88179B) native mode is broken on current Linux: the native ax88179_178a driver binds, but the Ethernet PHY never links (carrier stays down). Only the older AX88179A links correctly.

DockPilot handles both: it unlocks the chips that work, and for the ones that don't, it engages native mode, detects the dead link, reverts to the working standard mode, and explains why — remembering the verdict per-dock so it won't retry blindly.


Install & run

Requires Python 3 with Tk (python3-tk on Debian/Ubuntu if your Python lacks it).

python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install dockpilot
dockpilot

Option 2 — run from source

git clone https://github.com/dinnerisserved/dockpilot.git && cd dockpilot
python3 -m venv venv && source venv/bin/activate
pip install -r requirements.txt
python3 dockpilot.py

Optional system tools unlock extra panels (each auto-hides if absent): ethtool (link tuning, WoL, EEPROM), usbutils, uhubctl (per-port power), network-manager/nmcli (Wi-Fi auto-switch, reconnect), pactl (audio).

sudo apt install ethtool usbutils uhubctl network-manager  # all optional

Privileged actions (mode switching, WoL) prompt once via pkexec (a polkit dialog), not sudo — you never run the whole app as root.

Configuration

Config lives in ./config/ next to the script — nothing is written to your home directory, and no personal data ships with the project:

  • config/automation.json — your connect/disconnect rules (created when you set them)
  • config/dock_memory.json — remembered per-dock native-mode verdicts
  • config/dock_state.json — captured original MAC (so "reset MAC" always works)

Notes

Detail for people who want it — skip unless you're digging in.

How native-mode unlock works. USB devices can present multiple configurations. Many ASIX/Realtek dock NICs ship on a generic CDC config (driven by cdc_ncm/cdc_ether), which hides the chip's advanced features. Their native/vendor config exposes everything, driven by ax88179_178a (ASIX) or r8152 (Realtek). DockPilot switches by writing the device's bConfigurationValue in sysfs, then re-checks the driver and link, and reverts if the link doesn't come up. Fully reversible — unplugging the dock always returns it to standard mode.

The AX88179B problem is upstream, not ours. It's independently reported on the Linux kernel mailing list ("ax88179_178a … Link status is: 0"). Four devices from three brands reproduce it here.

r8152-cfgselector. Recent kernels ship a helper that performs the same bConfigurationValue switch for Realtek NICs automatically at plug-in. So modern Realtek devices increasingly arrive already-native, and DockPilot's unlock is most valuable on ASIX, where no such helper exists.

Thunderbolt docks. The TB4 dock tested tunnels USB over Thunderbolt rather than presenting a PCIe NIC, so DockPilot manages it exactly like a USB-C dock — no special handling needed. It's also the only dock tested where fwupd sees dock-side firmware (Intel USB3.0 Hub, USB4 Retimer); cheap USB-C docks show nothing. It needs a genuine Thunderbolt cable — a normal USB-C cable silently drops it to USB 2.0 with no error.

2.5G links. An RTL8156 advertises 2500baseT/Full but only links at 2.5G if the other end is also 2.5G; on gigabit infrastructure it negotiates to 1000Mb/s. DockPilot reports advertised modes and negotiated speed separately. On one dock ethtool misreported the advertised modes (claiming 10baseT on a 2.5G chip) while sysfs correctly showed 1000 — worth knowing that advertised-modes output isn't always trustworthy.

EEPROM in practice. Across nine devices, only one exposes a readable EEPROM: the older ASIX AX88772B, where the layout is fully decodable — MAC at 0x0008, VID/PID at 0x0048, vendor strings at 0xC0. Everything else reads back as all-FF (the chip uses one-time eFuse) or reports no EEPROM access at all. Writing was rejected on every device tested; on the AX88772B the driver logs "Failed to enable software MII access", so ethtool -E can't reach the write path. DockPilot therefore treats EEPROM as read-only, which is all it ever claimed to do.

Built on. The Linux ax88179_178a and r8152 drivers; Realtek's own udev rule for forcing native mode; uhubctl for per-port power; ethtool, fwupd, and the sysfs USB/net interfaces. What DockPilot adds is the synthesis: detect the chip, attempt the unlock, verify it works, degrade honestly when it doesn't, and present it in a GUI.

License

See LICENSE.

Disclaimer

DockPilot changes low-level USB/network device state on hardware you own. Mode switches are reversible and the app is careful, but you use it at your own risk. It never writes firmware or EEPROM.

Metadata

Release files for dockpilot 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dockpilot 0.2.0
File Size Uploaded Provenance
dockpilot-0.2.0.tar.gz 33.4 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for dockpilot 0.2.0
File Interpreter ABI Platform
dockpilot-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 67.3 kB

Release files / dockpilot-0.2.0.tar.gz

Download URL dockpilot-0.2.0.tar.gz
Size 33.4 kB
Tags Source
SHA-256 checksum
How to use checksums
af41c3abd8526a85344f0e84ce9a6cbdbdddaa0d6f26b8c621d4e334a2a692a9
BLAKE2b-256 checksum
How to use checksums
afbd91af4c00e6b624507d30e34a6e46977996b8b47a91d49d1febbf1ecef180
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Release files / dockpilot-0.2.0-py3-none-any.whl

Download URL dockpilot-0.2.0-py3-none-any.whl
Size 33.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
5ff5316c28174e6ff8f3c8a8b7bb0e82a33a9e44d5cae582cb52b171b967e16b
BLAKE2b-256 checksum
How to use checksums
359b691707ca4e079f065151d299a58cade764e7c6921fbbbfa5ea10fe82c235
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Security for dockpilot 0.2.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page