NetScan Pro — an unmetered Windows LAN scanner built with Blazor Hybrid + Radzen.Blazor
Hi all,
I wanted to share a small desktop tool I built and open-sourced: NetScan Pro, a Windows LAN scanner and monitor. No cloud round-trip, no daily scan quota, no account — everything runs and stays on your machine, and Radzen.Blazor components do all the heavy lifting on the UI side.
Repo: https://github.com/benjaminsqlserver/NetScanPro
What it does
NetScan Pro discovers every device on your local network and keeps watching it. Instead of relying on a single ping sweep (which misses anything with ICMP blocked), it runs three discovery layers on every pass:
-
Parallel ICMP echo — catches most hosts, fast
-
TCP connect probes on common ports (445 / 135 / 80 / 443 / 22 / 3389) — catches hosts that block ping but still have a service listening
-
A read of the Windows ARP cache (
GetIpNetTable) — catches anything still on the wire that answered neither of the above
The ARP read happens after the sweep on purpose — the ping attempts themselves force ARP resolution, so the cache is warm by the time it's read.
Turn on continuous mode and it rescans on an interval indefinitely, logging every device join/drop as an event. Turn it off for a single one-shot pass. Either way, you can export the full table (online and offline hosts) to CSV.
Tech stack
-
.NET 10, WPF host + Blazor Hybrid (
BlazorWebView) for the UI -
Radzen.Blazor 7.x for every interactive control in the app
-
P/Invoke against
iphlpapifor ARP table reads -
No admin rights required — ICMP, ARP, and TCP connect all work as a standard user
-
Single project, single solution — no backend, no database, nothing to deploy
How Radzen Blazor is used
The entire UI — settings sidebar, live grid, and controls — is one Scanner.razor component, and it leans on Radzen almost exclusively rather than mixing in raw HTML form controls:
-
RadzenDropDownto pick the network adapter, populated from the machine's live adapters, with the one that has a default gateway pre-selected -
RadzenTextBoxfor the scan range (from/to), andRadzenNumericfor ping timeout, parallel probe count, and rescan interval — all withMin/Max/Stepbounds so you can't type in a nonsense value -
RadzenCheckBox+RadzenLabelpairs for the scan-depth toggles (continuous mode, hostname resolution, TCP fallback, port probing) -
RadzenButtonwith icons for Start/Stop, switching label and style depending on whether continuous mode is on -
RadzenProgressBarto show live scan progress on each pass -
RadzenDataGrid, the centerpiece — a strongly-typedTItem="DeviceInfo"grid with sortable columns for name, MAC, vendor, latency, discovery method, open ports, and first/last-seen timestamps (withFormatStringfor the dates) -
RadzenBadgeinline inside the grid's name column, tagging the router as "gateway" and the host machine as "this PC" so they stand out at a glance -
RadzenStackfor laying out the toolbar responsively (horizontal, wrapping, centered) -
NotificationService(injected) drives toast notifications for scan start/stop/errors
Because Radzen ships its own Material/Fluent/Standard themes as plain CSS files loaded in wwwroot/index.html, swapping the whole app from dark to light theme — or to a completely different look — is a one-line change with zero component code to touch.
Try it / build it
powershell
dotnet restore NetScanPro.sln
dotnet run --project NetScanPro
Or open the .sln in Visual Studio 2026 (17.14+, for .NET 10 support) and hit F5. There's also a single-file publish command in the README for shipping it as one .exe.
Repo again: https://github.com/benjaminsqlserver/NetScanPro
Happy to answer questions about the ARP/TCP discovery approach or the Radzen setup — and feedback on the grid/theme choices is very welcome.
— Benjamin