LANScan

Local-only inventory of every device on your LAN, every USB device, every driver - live dashboard, zero telemetry

Windows / Linux / macOS Python Network Security

LANScan maps your network, your USB bus and your driver table, then renders it as one live dashboard that never leaves your machine.

The dashboard is a browser view; the scanner is a native service. The page cannot send ARP or ICMP itself, so it needs the standalone build running on the host you want to inspect. Releases: Windows · macOS · Linux, no Python needed.

This is also the canonical home of the dashboard’s source. It used to live in a separate neohiro/lanscan.github.io repository, which existed only to hold it before the path /lanscan/ was available on this site; that repository is retired. GitHub serves a repo named <name>.github.io from <owner>.github.io/<name>.github.io/, so it could never have served /lanscan/ in the first place — and two copies of a live dashboard is two that drift.

The dashboard

https://neohiro.github.io/lanscan/

Ordered by how you actually troubleshoot, broadest blast radius first:

# Section What it answers
1 LAN devices who is on the network, who is the gateway, who just appeared
2 USB devices ports, IDs, serials, link speed, bound driver
3 Drivers & system drivers version, provider, date, signature state
4 Host & system resources CPU, memory, disks, throughput, uptime
5 Tests ran every probe this cycle, including the ones that found nothing

A fail in section 5 usually explains a suspiciously short row above it, so the test log is data rather than noise.

Copying raw data

Built for pasting into a terminal, a ticket, or a spreadsheet.

Action Result
Left-click a value that value only, with a tooltip naming the class — IP copied!, MAC copied!
Right-click a row the entire record, key: value aligned
Shift + left-click same as right-click, for trackpads with no second button

The EXPORT button on the bay bar downloads the snapshot as JSON and copies it to the clipboard in one action.

Privacy

Not a disclaimer, an enforced property:

  • No third-party requests. No CDN, no webfont, no analytics, no telemetry. CI fails the build if any shipped file gains an external reference.
  • Loopback only. The service binds 127.0.0.1, so a snapshot is not reachable from your LAN or by a guest on the same Wi-Fi.
  • localStorage only. Two keys. That is why a refresh keeps your data and why RESET genuinely clears it.
  • Self-reported. Every snapshot carries a privacy block naming the hosts the process contacted and what it is bound to. The dashboard shows you instead of asking you to trust it.

Install

Download a standalone build from the Releases page — no Python needed — or run it from source:

pip install scapy     # optional: needed for active sweeps
python -m lanscan serve
# common flags
python -m lanscan serve --iface eth0 --port 8787 --interval 2
python -m lanscan scan --json          # one snapshot to stdout
python -m lanscan serve --no-update-check

How it finds things

Active ARP sweeps catch everything on the subnet, including hosts that ignore multicast. Passive capture and mDNS / SSDP / WS-Discovery add devices that never answer a sweep and, more usefully, give them a name. MAC prefixes are resolved against an offline OUI table, and PCI / USB identifiers against the pci.ids and usb.ids databases — all local lookups, no API calls.

This tool is free and open source. Support the developer: