NetPulse is a Windows desktop app (WPF, .NET 8) for discovering devices on your local network and monitoring their connectivity in real time. It provides a dark-mode dashboard with device cards, a detail sidebar, and a live latency graph.
Status: actively built/iterated. Discovery + monitoring + persistence are working.
- Manual Scan button
- Scans your local subnet (derived from your active network interface IPv4 + subnet mask)
- Uses ARP-based discovery (plus an ICMP ping attempt for latency)
- Shows deterministic scan progress
- Automatically runs in the background
- Updates each known device:
- Online/offline state
- Last seen timestamp
- Latency (when ping succeeds)
- Ping history (for the graph)
- Uses a “miss threshold” to avoid flapping (device goes offline after several missed checks)
- Devices are uniquely tracked by MAC address (handles DHCP IP changes)
- Reverse DNS hostname resolution (best-effort)
- Vendor lookup from a local Wireshark-style
manufOUI database (best-effort)
- Modern dark mode dashboard
- Wrap-style device cards
- Online devices listed above offline devices
- Green status indicator for online
- Detail sidebar with a live latency graph
- Settings panel for auto-prune
- Saves and restores device list and settings:
devices.jsonsettings.json
- Uses “portable mode” storage (stored next to the executable / output)
- Optional automatic cleanup of stale offline devices
- Runs on startup and daily when enabled
- Manual Prune now button
- Windows 10/11
- .NET 8 SDK (for development)
From the repo root:
cd NetPulse
dotnet runThis will build and run the WPF app.
NetPulse stores its files next to the executable/output directory:
devices.jsonsettings.jsonResources/manuf(vendor/OUI database; copied to output)
When running via dotnet run, these will appear in the build output folder (e.g. bin/Debug/net8.0-windows/...).
NetPulse determines your active network interface’s IPv4 address and subnet mask, computes the host IP range, then scans each IP.
To find devices reliably, it performs an ARP sweep:
- For each IP in the subnet: “Who has this IP?”
- Devices that respond are considered present on the local network.
- After ARP identifies a device, NetPulse also attempts to ping it for latency (many devices block ping; that’s normal).
IPs can change (DHCP), but a MAC address is a stable identity on a local network.
NetPulse uses the device’s MAC address as its primary identifier so:
- Same device, new IP ⇒ updates the same card
- Same IP, different MAC ⇒ treated as a different device
Once devices are known, NetPulse periodically checks them to keep status current. It updates:
- Online/offline
- Last seen time
- Latency (if pingable)
- Ping history for the graph
- Hostname: reverse DNS lookup (best-effort; not all networks provide reverse DNS)
- Vendor: MAC OUI lookup from a local
Resources/manuffile (Wiresharkmanufformat)
Local network discovery is not perfectly consistent across all routers/devices. A few important points:
Many phones/IoT devices drop ICMP requests. That’s why NetPulse primarily uses ARP to detect presence, and only uses ping for latency when allowed.
ARP only works within your local subnet/broadcast domain. NetPulse is designed for local LAN visualization, not internet-wide scanning.
If you run arp -a, you may see entries marked dynamic. That simply means they were learned automatically (normal behavior).
Phones often use a randomized/private MAC per Wi‑Fi network. The MAC you see in the phone’s “device MAC” screen may not match the MAC currently used for that SSID. NetPulse shows the MAC that is actually present on the network.
Reverse DNS depends on your router/DNS configuration. Some networks return hostnames only for a few devices, or none at all.
NetPulse ships with a small starter Resources/manuf so vendor lookup works end-to-end.
For better coverage, replace it with the full Wireshark manuf file:
- Keep the filename exactly:
Resources/manuf - Rebuild / rerun so it copies to output
In the Settings panel:
- Enable Auto-Prune
- Choose days (default 3)
- Use Prune now to run immediately
Prune criteria:
- Only removes devices that are offline and whose
LastSeenis older than the threshold.
NetPulse/ModelsNetworkDevice(persisted fields + transient runtime fields)PingPoint(timestamp + latency;LatencyMs = -1is used as a “gap” marker in graph)UserSettings
NetPulse/ServicesScannerService(subnet discovery / ARP sweep / ping latency attempt)PersistenceService(devices.json / settings.json)DnsService(reverse DNS)VendorLookupService(WiresharkmanufOUI lookup)
NetPulse/ViewModelsMainViewModel(state, commands, monitoring loop, auto-prune scheduler)
NetPulse/ViewsMainWindow.xaml(dashboard UI)Controls/LatencyGraph(custom real-time graph)
- Vendor icons on cards (not just vendor text)
- Reduce ARP usage during monitoring (more “ping-first” strategies)
- Unit tests (mock services and test ViewModel logic)
- Packaging (MSIX), app icon, and release builds
Choose a license before publishing (e.g., MIT). Currently: not specified.