A unified network toolkit for Linux and macOS — inspect, connect, diagnose.
NMLinux is a single, unified GUI that brings together 27 network modules in one window: interface monitoring, Wi-Fi, DNS, SSH terminal, firewall viewer, topology map, traceroute, and more. Built from scratch in Python and PySide6 (Qt 6), with 8 interface languages and no external dependencies beyond standard system tools.
Originally inspired by NETworkManager by BornToBeRoot (a Windows-only tool), NMLinux has since grown well beyond that starting point — adding a PTY-embedded SSH terminal, interactive topology map, macOS support, TLS inspector, and now a command palette and multi-format export engine.
Note
NMLinux is not related to the Linux system daemon /usr/bin/NetworkManager (NetworkManager by Red Hat/GNOME). The name refers to NETworkManager by BornToBeRoot, the Windows tool that originally inspired this project.
Built with Claude Code (Anthropic) and the contribution of its author.
GitHub Discussions are open — share feedback, report ideas, ask questions, or just say hello. The author has 30+ years in infrastructure and operations, and built this tool because good, free, and simple software should exist for Linux too.
Linux screenshots from v1.2.7 — macOS screenshots from v1.3.5. The app has 27 modules and 8 interface languages (FR/EN/ES/DE/IT/PT/JA/ZH).
Linux (KDE)
| Dashboard | Topology |
|---|---|
![]() |
![]() |
| Traceroute | Wi-Fi |
|---|---|
![]() |
![]() |
macOS
| Dashboard | Traceroute |
|---|---|
![]() |
![]() |
- TLS Watchlist fixes: self-signed and untrusted certs now correctly shown as "⚠ Invalid / untrusted cert" (orange) instead of green; SSL exception catching widened to cover all
ssl.SSLErrorsubclasses; entries now show "… (checking)" while the background check runs and "— (unreachable)" when the host cannot be reached
- TLS Watchlist — persistent list of hostnames to monitor certificate expiry; add hosts with
+ Watch(uses current host/port) or manually in the panel; background check runs automatically 2 seconds after launch; sidebar "TLS Inspector" entry shows a colored dot: red if any cert is expired, orange if any cert expires within 30 days; re-check button in the panel; list shows status per entry (✓ / ⚠ / EXPIRED) with color coding
- macOS — IP Scanner: fixed MAC address, vendor and interface lookup on macOS;
_arp_entry()now callsarp -n <ip>on macOS and parses its output format (? (IP) at AA:BB:CC on en0) instead of reading/proc/net/arp(Linux-only); all four scanner columns now populate correctly on macOS - VNC help: added a note in all 8 languages clarifying that Linux has no VNC server by default and listing common options to install (x11vnc, tigervnc-server, wayvnc)
- macOS — IP Scanner: replaced
getent(Linux-only) with Python'ssocket.gethostbyaddr()for cross-platform reverse DNS resolution; hostname lookup now works natively on macOS without any extra tool - macOS — SMB Browser: switched from
smbclient(requires Homebrew samba) tosmbutil view(built-in macOS tool); SMB share listing now works on macOS without any install - macOS — NFS Browser:
showmountis built-in on macOS but doesn't support--no-headers; flag removed on macOS, header line skipped in parser; NFS export listing now works natively - macOS — RDP: when
xfreerdpis not found, falls back toopen rdp://URL scheme; opens Microsoft Remote Desktop (App Store) if installed, with host, port, username and domain pre-filled - macOS — VNC: when
vncvieweris not found, falls back toopen vnc://URL scheme; opens macOS Screen Sharing (built-in, zero install required)
- SSH agent forwarding — new "Agent forwarding" checkbox in the SSH connection form; adds
-Ato thesshcommand; allows jumping between servers without copying your private key (PC → A → B); requires an active SSH agent (SSH_AUTH_SOCK); contextual help updated in all 8 languages
- Command Palette (Ctrl+P) — instant keyboard navigation to any of the 27 modules; fuzzy search on name and keywords (e.g. "firewall", "tls", "ssh key", "scan"); Up/Down arrows + Enter or single click to navigate; opens with Ctrl+P from anywhere in the app
- Export Manager — export a full network snapshot (interfaces, routes, DNS resolvers) from File → Export Network Report… in JSON, Markdown, plain text or PDF (optional:
pip install reportlab) - Module-level export buttons — Export buttons added to Interfaces, DNS, Firewall, SSH Connections, and Connection Manager pages; each page exports its current data in the chosen format with live filename extension update when the format filter changes
- Topology — device icons — each node now displays a Lucide SVG icon matching its device type (router/wifi, computer/laptop, printer, NAS/server, smartphone, network switch, Raspberry Pi) instead of a generic circle; 5 new bundled SVG icons (
printer,server,smartphone,cpu,laptop) - Topology — mDNS detection — device type is detected via
avahi-browse(optional, runs in parallel with nmap scan); identifies printers (_ipp._tcp,PDL Printer), Android phones and TVs (_googlecast._tcp,_androidtvremote2._tcp), Apple Macs (am=Mac16,xmodel in AirPlay TXT), NAS devices (Synology reportsmodel=Xserve), KDE Connect desktops; falls back to MAC vendor OUI and hostname heuristics when avahi is unavailable - Topology — detail panel shows the detected device class (Printer, Smartphone, NAS…) instead of the generic "Host" label; i18n in all 8 languages
- Traceroute — auto-zoom — the world map automatically zooms and centres on the bounding box of geolocated hops at the end of each route; disables when the user pans or zooms manually; restores on next traceroute; right-click resets to full world view
- macOS compatibility — all 9 network modules now run on macOS without breaking Linux behaviour; each module detects the platform at startup (
_IS_MACOS) and branches to native macOS commands:route -n get default,ifconfig,scutil --dns,networksetup,system_profiler SPAirPortDataType,pfctl,netstat -ib; privilege escalation usesosascript+with administrator privilegesinstead ofpkexec; monospace font usesMenloinstead ofMonospace - Modules with dual Linux/macOS paths: Dashboard, Interfaces, Wi-Fi, Topology, Bandwidth, Firewall (pf.conf + pfctl), Connection Manager, Hosts File, MTR
- Modules unchanged (tools identical on both platforms): DNS, Nmap Scan, SNMP, Whois
- i18n extended to 8 languages — added Italiano, Português, 日本語 (Japanese) and 中文 (Chinese Simplified); the full UI (all 27 modules, ~720 translation keys) is now available in FR / EN / ES / DE / IT / PT / JA / ZH; a restart prompt appears after changing the language in Settings
- Contextual help in 8 languages — the
?badge panel (description, usage examples and equivalent CLI commands) now covers all 8 languages for every module; previously JA and ZH fell back to English - Bug fix — nav tooltips for SMB/NFS and Hosts File were displaying in French regardless of the selected language; missing
nav_hint_smb_nfsandnav_hint_hostskeys added to all 7 non-French language blocks
- SSH Key Manager — list all key pairs in
~/.ssh/(file, type, bits, comment, SHA256 fingerprint); generate Ed25519 or RSA 4096 keys with optional passphrase (mismatch detection, auto-filename by type); copy public key to clipboard; deploy to a remote server viassh-copy-idin an inline terminal with stdin support for password prompts; delete key pairs with confirmation; auto-creates~/.ssh/if missing; i18n: fr / en / es / de
- TLS / SSL Inspector — inspect any server's certificate: subject CN, SANs, issuer, validity dates (color-coded: green / orange < 30 days / red expired), serial number, TLS protocol, cipher suite and certificate chain (via
openssl s_client); works for valid, expired and self-signed certs; friendly error messages for unreachable hosts - SMB / NFS Browser — list shares and exports from any server; SMB tab:
smbclient -Lwith optional credentials, shows share name / type / comment; NFS tab:showmount -e, shows export path and access list; detects missing tools with distro-specific install instructions - Hosts File Editor — view and edit
/etc/hosts; table with enable/disable toggle, add/edit/delete entries via dialog; filter by IP or hostname; saves viapkexec cp(polkit authentication dialog) - install.sh — new script for Debian / Ubuntu / Linux Mint: creates a venv in
~/.local/share/nmlinux/venv, installs system deps via apt, creates launcher and.desktopentry (fixes PEP 668externally-managed-environmenterror)
- VNC — new module for managing VNC connection profiles; groups/subgroups like SSH and RDP; launches
vncviewer(TigerVNC); compatible with macOS ARD (DH30 auth handled natively by vncviewer); password never stored; detects missingvncviewerwith distro-specific install instructions - About — Tools & services — new section listing all third-party tools and APIs the app depends on
- Sidebar i18n — all 23 nav tooltips now translated into FR/EN/ES/DE (were hardcoded French); labels corrected: Topology, Connections, Subnet
- Remote Desktop (RDP) — new module for managing Windows RDP connection profiles; groups/subgroups like SSH; launches
xfreerdpas an external process; password prompted at connect time, never stored; fields: host, port, username, domain, resolution, fullscreen; detects missingxfreerdpwith distro-specific install instructions (Arch / Debian / Fedora)
- Bundled Lucide icons — 21 SVG icons from Lucide (MIT) are now bundled in
assets/icons/; rendered at runtime viaQSvgRenderer; coloured#60a5fa; app no longer requires any system icon theme (Breeze, Adwaita, Papirus…)
- GNOME / Adwaita compatibility — fixed icons on non-KDE desktops:
main.pynow auto-detects the GTK icon theme viagsettingsand applies it to Qt; extended fallback chains for Wi-Fi, Traceroute, Speed Test, Interfaces, Port Scanner, Firewall, MTR;themed_icon()now validates that a real pixmap exists before accepting a theme icon - NixOS / KDE compatibility — fixed all icons on NixOS: Breeze 6.x ships SVGZ-only icons; the Nix wrapper now adds
qt6.qtsvgtoQT_PLUGIN_PATHso Qt can render SVG icons;themed_icon()tries sizes 22/24/16/32/48 (Breeze uses 22 px, not 24); theme forced tobreezewhen the Nix-bundled icon set is detected; also checks/etc/xdg/kdeglobalsfor system-wide KDE config
- MTR — embedded My Traceroute: runs
mtr --report, parses text output, displays a live table with Loss %, RTT Last/Avg/Best/Worst/Jitter per hop, colour-coded by loss severity; continuous mode; CSV + TXT export - Speed Test — dependency-free speed test via
curl+ Cloudflare (speed.cloudflare.com): download (25 MB), upload (10 MB), ping to1.1.1.1; up to 5 runs persisted in JSON; historical line graph (Download/Upload) - Firewall Viewer — read-only ruleset viewer: parses
/etc/nftables.confand/etc/iptables/*.ruleswithout root; live ruleset viapkexec nft list ruleset; columns: Table / Chain / Rule / Port / Action / Comment; colour-coded actions; live filter - Sidebar hints — each nav entry now shows a subtle
?badge; hovering displays a tooltip describing what the module does; vertical separator added between sidebar and content area - i18n — all new modules translated in French, English, and Spanish
- Theme adaptation — full runtime light/dark switching support across all pages; new
core/theme.pywithis_dark(),color_ok(),color_err(); custom painter widgets (_Graph,_MapWidget) read palette at paint time; all hardcoded Catppuccin Mocha colours replaced with semantic Qt palette roles - Subnet mask — Dashboard, Interfaces, and Connexions pages now display dotted-decimal subnet mask (e.g.
255.255.255.0) derived from CIDR prefix - Bandwidth Monitor — explicit Start/Stop button replaces unreliable auto-start on page load
- Export CSV/TXT — Nmap and Traceroute pages now offer Export CSV and Export TXT buttons (appear after scan/trace completes)
- i18n — new translation keys for all above features (fr/en/es/de)
- SSH terminal — complete rewrite with pyte (VT100/xterm emulator) + QPainter renderer; 2000-line scrollback, cursor blink, 256-colour support
- Visual Traceroute — world map (Natural Earth 110m), live geolocation per hop (ip-api.com), interactive zoom/pan, dual parser (
traceroute/tracepathfallback) - Bandwidth Monitor — real-time per-interface throughput, 60s sliding graph, live speeds, session totals and peaks
- Wake on LAN — pure Python magic packet (UDP broadcast), persistent host book (JSON)
- IP Scanner — hostname resolution via
getent/avahi/nmblookup; MAC address, vendor (IEEE OUI 39K entries), interface columns; CSV/TXT export updated - i18n — full fr/en/es/de translation for all new pages
Initial public release — 13 modules: Dashboard, Interfaces, Wi-Fi, Subnet Calculator, DNS Lookup, Ping Monitor, IP Scanner, Port Scanner, Nmap, Whois, SNMP, SNTP/NTP, SSH.
| Module | Description |
|---|---|
| Dashboard | Local machine info, gateway, public IP, geolocation, DNS resolvers |
| Connection Manager | NetworkManager profiles via nmcli: list, filter, connect/disconnect/edit/delete |
| Interfaces | Network interfaces table with per-interface detail (ip + nmcli) |
| Wi-Fi | Available networks, signal bars, security, connected network highlighted |
| Subnet Calculator | Network/broadcast/host range from CIDR, host table up to 4096 entries |
| DNS Lookup | dig-based lookup for A, AAAA, MX, TXT, NS, CNAME, PTR, SOA, ANY |
| Ping Monitor | Continuous ping to multiple hosts, RTT stats, packet loss % |
| IP Scanner | CIDR/range ping scan, 50 threads, hostname (DNS/mDNS/NetBIOS), MAC address, vendor (OUI), interface, CSV + TXT export |
| Port Scanner | TCP connect scan, 200 threads, service presets, CSV + TXT export |
| Nmap | 7 scan modes, XML output parsing, Host/Port/Protocol/State/Service table, CSV + TXT export |
| Whois | Raw whois output in monospace |
| SNMP | snmpwalk/snmpget, v1/v2c, 10 OID presets, results table |
| SNTP / NTP | Pure Python RFC 4330 UDP client, offset/delay/stratum/reference |
| SSH | Embedded PTY terminal (pyte/VT100), saved connections (JSON), key auth, scrollback |
| Remote Desktop | RDP connection profiles (groups/subgroups); launches xfreerdp; password never stored |
| VNC | VNC connection profiles (groups/subgroups); launches vncviewer (TigerVNC); macOS ARD compatible; password never stored |
| TLS Inspector | Certificate details: CN, SANs, issuer, validity + expiry countdown, serial, protocol, cipher, chain |
| SMB / NFS | List SMB shares (smbclient) and NFS exports (showmount) from any server or NAS; optional credentials for SMB |
| Hosts File | View/edit /etc/hosts: add, delete, toggle entries; filter; save via pkexec |
| Visual Traceroute | Hop-by-hop route on a world map, live geolocation (ip-api.com), zoom & pan, CSV + TXT export |
| MTR | Embedded My Traceroute: loss %, RTT Last/Avg/Best/Worst/Jitter per hop, colour-coded, CSV + TXT export |
| Firewall Viewer | Read-only nftables + iptables/ip6tables ruleset (no root); live via pkexec; filter by table/chain/action |
| Speed Test | Download/upload/ping via Cloudflare; no external tool beyond curl; history graph (last 5 runs) |
| Bandwidth | Real-time per-interface throughput: 60s sliding graph, live speeds, session totals, peak |
| Wake on LAN | Pure Python magic packet (UDP broadcast), persistent host book, no external tool required |
| Topology Map | Auto-discovers LAN devices via nmap -sn; interactive graph with draggable nodes, zoom/pan, detail panel |
| Settings | Language selection (FR / EN / ES / DE / IT / PT / JA / ZH), persisted; restart required after change |
| Command Palette | Ctrl+P overlay: fuzzy search across all 27 modules by name or keyword |
| Export | File → Export Network Report (JSON/Markdown/Text/PDF); per-module export on Interfaces, DNS, Firewall, SSH, Connections |
Linux — most are already present on a standard install:
# Arch / EndeavourOS
sudo pacman -S iproute2 networkmanager bind-tools nmap whois net-snmp iputils mtr curl
# Debian / Ubuntu
sudo apt install iproute2 network-manager dnsutils nmap whois snmp mtr-tiny curl
# Fedora
sudo dnf install iproute NetworkManager bind-utils nmap whois net-snmp-utils mtr curlmacOS — install via Homebrew:
brew install nmap whois net-snmp mtr curlmacOS ships
ping,dig,traceroute,netstat,ifconfigandroutenatively.networksetupandscutilare built-in macOS tools, no install needed.
| Tool | Feature | Linux | macOS |
|---|---|---|---|
xfreerdp / xfreerdp3 |
Remote Desktop (RDP) | Arch: freerdp · Ubuntu ≤24.04: freerdp2-x11 · Ubuntu 26.04+: freerdp3-x11 |
optional — falls back to Microsoft Remote Desktop (open rdp://) |
vncviewer |
VNC | Arch: tigervnc · Debian: tigervnc-viewer |
optional — falls back to macOS Screen Sharing (open vnc://, built-in) |
nm-connection-editor |
Edit connections from Connection Manager | Arch: nm-connection-editor |
— (System Preferences opens instead) |
traceroute |
Traceroute alternative (tracepath used by default) | Arch: traceroute |
built-in |
- Python 3.11+
- PySide6 6.6+
- ptyprocess 0.7+
- pyte 0.8+ (
pip install pyteorsudo pacman -S python-pyte)
yay -S nmlinuxAll dependencies (PySide6, ptyprocess, pyte, nmcli, …) are handled automatically.
# 1. Install system tools (if not already present)
brew install nmap whois net-snmp mtr curl
# 2. Install NMLinux and its Python dependencies
pip install PySide6 ptyprocess pyte
pip install nmlinux-1.4.3-py3-none-any.whl # download from Releases, or use the line below
# Alternative: run directly from source (no install)
git clone https://github.com/thongor77/nmlinux.git
cd nmlinux
pip install PySide6 ptyprocess pyte
python3 -m nmlinux.main
# Update an existing clone
git pull && python3 -m nmlinux.mainDownload the .whl from the latest release.
Note: Most modules work on macOS without modification. 9 modules use native macOS commands (
networksetup,scutil,ifconfig,pfctl,system_profiler…) instead of their Linux equivalents. RDP falls back toopen rdp://(Microsoft Remote Desktop), VNC falls back toopen vnc://(Screen Sharing built-in). Only Connection Manager has reduced functionality on macOS (nmclinot available) — see Limitations.
Note for Linux Mint / Ubuntu users:
pip installis blocked system-wide on Python 3.12+ (PEP 668 —externally-managed-environment). Use the provided install script — it creates a virtual environment automatically and installs a.desktopentry.
git clone https://github.com/thongor77/nmlinux.git
cd nmlinux
bash install.shThe script will:
- Install system dependencies via
apt(libgl1, python3-venv, freerdp, tigervnc…) - Create a virtual environment in
~/.local/share/nmlinux/venv - Install NMLinux and its Python dependencies inside the venv
- Create a launcher at
~/.local/bin/nmlinux - Add a
.desktopentry so NMLinux appears in your application menu
After install, run nmlinux from a terminal or launch it from the application menu.
Download the .whl from the latest release and install it:
# Arch / Fedora / macOS — no pip restrictions
pip install nmlinux-1.4.3-py3-none-any.whl
# Debian / Ubuntu / Mint — install system libs first, then use pipx
# Ubuntu ≤24.04:
sudo apt install libgl1 libglib2.0-0 libdbus-1-3 freerdp2-x11 tigervnc-viewer
# Ubuntu 26.04+:
sudo apt install libgl1 libglib2.0-0 libdbus-1-3 freerdp3-x11 tigervnc-viewer
pipx install nmlinux-1.4.3-py3-none-any.whlNote for Ubuntu 26.04+:
pipxrequires system libraries (libGL, etc.) to be installed first — the commands above cover them. Ifpipx installfails due to a PySide6 build error, use Option 3 (install script) instead, which handles everything automatically.
git clone https://github.com/thongor77/nmlinux.git
cd nmlinux
pip install PySide6 ptyprocess pyte
python3 -m nmlinux.mainCopy the .desktop file to make NMLinux appear in your application launcher:
cp data/nmlinux.desktop ~/.local/share/applications/
update-desktop-database ~/.local/share/applications/Then edit the Exec= path in the file if needed.
./nmlinux.sh
# or, after pip install:
nmlinux
# or directly:
python3 -m nmlinux.mainnmlinux/
core/
i18n.py — Translation system (8 languages: fr/en/es/de/it/pt/ja/zh), tr(key) function
icons.py — themed_icon(): 21 bundled Lucide SVG icons via QSvgRenderer
settings.py — AppSettings dataclass, JSON persistence
ssh.py — SshConnection dataclass, SshStore
rdp.py — RdpConnection dataclass, RdpStore, find_xfreerdp()
vnc.py — VncConnection dataclass, VncStore, find_vncviewer()
terminal.py — SshWorker (QThread) + PTY via ptyprocess, emits raw bytes
cli_bar.py — CliBar singleton: pedagogical CLI equivalent bar
export_dialog.py — open_export_dialog(): QFileDialog with live extension update
command_palette.py — CommandPalette (Ctrl+P): fuzzy search across 27 modules
export_manager.py — collect_snapshot(), to_json/text/markdown/pdf, save_export()
pages/
about.py — About page (credits, tools & services)
bandwidth.py — Bandwidth Monitor: per-interface 60s graph, live stats
connection_manager.py — Connection Manager: nmcli profiles, connect/disconnect/edit
dashboard.py — Dashboard
dns.py — DNS Lookup
firewall.py — Firewall Viewer: nftables + iptables parser, live via pkexec
interfaces.py — Network Interfaces
ip_scanner.py — IP Scanner
mtr.py — MTR: mtr --report parser, live hop stats table, export
nmap_scan.py — Nmap
ping.py — Ping Monitor
port_scanner.py — Port Scanner
rdp.py — Remote Desktop: RDP profiles, launches xfreerdp
settings.py — Settings page
snmp.py — SNMP
sntp.py — SNTP / NTP
speedtest.py — Speed Test: curl + Cloudflare, history graph
ssh.py — SSH page (connection manager + terminal)
subnet.py — Subnet Calculator
terminal_view.py — TerminalView: pyte VT100 emulator + QPainter renderer
topology.py — Topology Map: nmap -sn, interactive graph, zoom/pan
traceroute.py — Visual Traceroute: world map, geolocation, zoom/pan
vnc.py — VNC: connection profiles, launches vncviewer
whois.py — Whois
wifi.py — Wi-Fi
wol.py — Wake on LAN: magic packet, persistent host book
assets/
icons/ — 21 bundled Lucide SVG icons (#60a5fa)
world.geojson — Natural Earth 110m countries (map background)
window.py — MainWindow (sidebar + QStackedWidget)
main.py — Entry point
Since v1.2.7, NMLinux uses 21 bundled Lucide SVG icons rendered at runtime via QSvgRenderer. The app no longer depends on any system icon theme (Breeze, Adwaita, Papirus…) and displays correctly on KDE, GNOME, XFCE, and others. The Qt style adapts to the running desktop automatically.
Full support — all 27 modules available.
Most modules work out of the box since they rely on tools available on both platforms (ssh, dig, ping, curl, nmap, openssl…).
9 modules required explicit macOS adaptation (dual code paths detecting the platform at startup): Dashboard, Interfaces, Wi-Fi, Topology, Bandwidth, Firewall, Connection Manager, Hosts File, MTR — these use native macOS commands (ifconfig, networksetup, scutil, pfctl, system_profiler…) instead of their Linux equivalents.
Modules with limited or no macOS support:
| Module | Status | Notes |
|---|---|---|
| RDP | ✓ macOS | Falls back to open rdp:// → Microsoft Remote Desktop (App Store) |
| VNC | ✓ macOS | Falls back to open vnc:// → Screen Sharing (built-in, zero install) |
| IP Scanner | ✓ macOS | Uses socket.gethostbyaddr() — native Python, no extra tool |
| SMB | ✓ macOS | Uses smbutil view (built-in) instead of smbclient |
| NFS | ✓ macOS | showmount built-in; header parsing adapted |
| Connection Manager | ⚠ Reduced | Edit/delete require nmcli (Linux only); list view works |
- No root/polkit integration — tools requiring elevated privileges (some Nmap modes, raw sockets) must be run with
sudo; on macOS, privilege escalation usesosascript+administrator privileges - SSH agent forwarding requires an active SSH agent (
SSH_AUTH_SOCK); on macOS this is handled automatically by the system, no manual setup needed
- BornToBeRoot — for NETworkManager, the original inspiration and reference for features and UX
- Anthropic — Claude Code, the AI assistant used to build this project
- The author, for the vision, testing, and direction
GPL-2.0 — see LICENSE.
This project is an independent reimplementation. No code from NETworkManager was used or translated.





