Monitor all devices on your local network directly on your TRMNL display.
- Create a Private Plugin in TRMNL
- Choose "Webhook" as data source
- Copy your Plugin UUID from the webhook URL
git clone https://github.com/ExcuseMi/trmnl-network-devices-plugin.git
cd trmnl-network-devices-plugin
cp .env.example .env
nano .env # Add your PLUGIN_UUID
docker compose up -dThat's it. The scanner pulls the pre-built image from the GitHub Container Registry and auto-detects your network.
The image is built for linux/amd64 and linux/arm64 (Raspberry Pi).
PLUGIN_UUID=your_plugin_uuid_here
INTERVAL=15 # Scan every 15 minutes
BYTE_LIMIT=2000 # 2000 for free, 5000 for TRMNL+
# Network to scan in CIDR notation (auto-detected if empty)
# Example: 192.168.1.0/24
NETWORK=192.168.1.0/24
# How long to keep offline devices in minutes (default: 1440 = 24 hours)
# Devices last seen longer than this will be removed from display
# These offline devices will still be sent to the TRMNL plugin until the OFFLINE RETENTION is reached.
# Examples: 60 (1 hour), 180 (3 hours), 720 (12 hours), 1440 (24 hours)
OFFLINE_RETENTION=1440
# Enable port scanning (default: false)
# Set to true, 1, or yes to enable
ENABLE_PORT_SCAN=false
# Ports to scan (comma-separated list or ranges, default: common ports)
# Default: 22,80,443,8080,3389,5900,9000
# Common ports explained:
# 22 - SSH
# 80 - HTTP
# 443 - HTTPS
# 8080 - HTTP alternate
# 3389 - RDP (Remote Desktop)
# 5900 - VNC
# 9000 - Various services
#
# Examples:
# PORT_SCAN_PORTS=22,80,443,8080,3389,5900,9000 (default common ports)
# PORT_SCAN_PORTS=20-25,80,443,3389,8000-8100 (ranges supported)
# PORT_SCAN_PORTS=all (scan all 65535 ports - VERY SLOW!)
PORT_SCAN_PORTS=22,80,443,8080,3389,5900,9000cd trmnl-network-devices-plugin
git pull
docker compose pull
docker compose up -dAfter updating, review .env.example and compare it with your existing .env file. Add or adjust any new configuration options as needed.
To build and run the image locally instead of pulling from the registry:
docker compose -f docker-compose.dev.yml up -dThe network scanner uses two complementary methods to discover devices:
- ARP Scan - Fast layer-2 discovery that finds devices on your local subnet by sending ARP requests
- Nmap Scan - Layer-3 ping scan that can find devices that don't respond to ARP
Once devices are found, the scanner:
- Resolves hostnames using DNS, mDNS (Avahi), and NetBIOS
- Looks up vendor information from MAC addresses using the Wireshark OUI database
- Detects device types based on hostname patterns and vendor names
- Tracks online/offline status by comparing timestamps between scans
- Cause: The scanner only finds devices on the same network segment
- Check: Is the device on a different VLAN, guest network, or subnet?
- Solution: Run the scanner on each network segment, or adjust your
NETWORKenvironment variable
- Cause: Some IoT devices, guest networks, or AP isolation features prevent device discovery
- Check: Can you ping the device from the scanner host?
ping 192.168.1.x - Solution: Disable AP/client isolation in your router settings
- Cause: Some devices intentionally hide from network scans (stealth mode), or firewalls block ICMP/ARP
- Check: Try scanning manually:
docker exec trmnl-network-devices-scanner arp-scan --interface=eth0 --localnet docker exec trmnl-network-devices-scanner nmap -sn 192.168.1.0/24
- **Sadly, These devices can't be auto-discovered **
- Cause: Container must run in
hostnetwork mode to see local devices, and needsprivileged: truefor raw socket access - Check: Verify docker-compose.yml has both settings:
docker inspect trmnl-network-devices-scanner | grep -A5 NetworkMode docker inspect trmnl-network-devices-scanner | grep Privileged
- Solution: Ensure your docker-compose.yml contains:
network_mode: host privileged: true
- Cause: Devices show as IP addresses instead of friendly names (common with mobile devices using MAC randomization)
- Check: Does the device have a hostname configured? Does it broadcast via mDNS?
- Solution: Use Device Configuration in TRMNL plugin settings to set custom names
- Cause: Router/firewall may rate-limit or block scanning activity
- Check: Look for "host unreachable" or timeout errors in logs
- Solution: Increase
INTERVALbetween scans, or whitelist the scanner in your firewall
MIT
Last updated: 2026-03-11 06:34:50 UTC
Keep tabs on every device connected to your home or office network with automatic discovery, smart categorization, and real-time status tracking. Network Devices scans your local network, identifies devices by vendor and type, and displays them with intuitive icons on your TRMNL.
Features:
• Automatic device detection via arp-scan and nmap
• Smart vendor identification from MAC addresses
• Offline tracking - see when devices disconnect
• Port scanning with customizable labels
• Customizable names, icons, and device types
• Clean, modern interface with Material Symbols icons
Requires a Docker container running on your network (5 min setup). Perfect for monitoring IoT devices, tracking network usage, or keeping an eye on who's connected.
Changelog:
• v1.3: fixes #3: Deduplicate devices with same IP by keeping lowest MAC.
• v1.2: Added the device running the network-scanner in the report.
• v1.1: Added port scanning.
Update your network-scanner and enable the .env properties (see the updated .env.axample )
- Uses Wireshark OUI Database for vendor identification
