<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: DeviceShelf</title>
    <description>The latest articles on DEV Community by DeviceShelf (@deviceshelf).</description>
    <link>https://dev.to/deviceshelf</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4022828%2F92dc3100-4e93-49c8-b92e-e8436b77eb76.png</url>
      <title>DEV Community: DeviceShelf</title>
      <link>https://dev.to/deviceshelf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/deviceshelf"/>
    <language>en</language>
    <item>
      <title>Network scanner for Linux, from the terminal or a GUI</title>
      <dc:creator>DeviceShelf</dc:creator>
      <pubDate>Mon, 31 Aug 2026 09:00:02 +0000</pubDate>
      <link>https://dev.to/deviceshelf/network-scanner-for-linux-from-the-terminal-or-a-gui-cki</link>
      <guid>https://dev.to/deviceshelf/network-scanner-for-linux-from-the-terminal-or-a-gui-cki</guid>
      <description>&lt;p&gt;On Linux you can scan your LAN two ways. From the terminal, &lt;code&gt;nmap&lt;/code&gt; and &lt;code&gt;arp-scan&lt;/code&gt; hand you a full host list, open ports and MAC vendors in seconds. A GUI makes sense once you'd rather read and sort results than re-type flags. Either route needs root or a &lt;code&gt;setcap&lt;/code&gt; grant for the deeper probes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scanning your LAN from the terminal
&lt;/h2&gt;

&lt;p&gt;Start with a fast sweep of who is alive. &lt;code&gt;arp-scan&lt;/code&gt; is the bluntest tool for a local subnet because it works at layer 2 and returns the MAC vendor for free:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;arp-scan &lt;span class="nt"&gt;--localnet&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That gives you IP, MAC and a vendor guess from the OUI (the first half of the MAC, which identifies the manufacturer). For a subnet &lt;code&gt;nmap&lt;/code&gt; doesn't need root to do, a ping sweep:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;-sn&lt;/span&gt; 192.168.1.0/24
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To see open ports and services on a host, go deeper. This is where the useful detail lives, because a printer speaking IPP on 631 or a NAS offering SMB on 445 tells you what a device actually is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-sV&lt;/span&gt; &lt;span class="nt"&gt;--top-ports&lt;/span&gt; 100 192.168.1.0/24
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For hostnames, &lt;code&gt;nmap&lt;/code&gt; already resolves DNS. mDNS names (the &lt;code&gt;.local&lt;/code&gt; ones Apple and Chromecast devices announce) need &lt;code&gt;avahi-browse -a&lt;/code&gt;, and NetBIOS names come from &lt;code&gt;nmblookup&lt;/code&gt;. Piecing those three together by hand is the tedious part.&lt;/p&gt;

&lt;h2&gt;
  
  
  When a GUI helps
&lt;/h2&gt;

&lt;p&gt;The terminal is fine for a one-off. It gets old when you want to watch a network over time, sort devices by vendor, or hand the result to someone who doesn't live in a shell. A GUI is worth it when you need presence monitoring (which device dropped off, which one is new), a topology view, or a security summary you don't have to assemble from four commands. Zenmap covers the nmap-visualisation case; it stops there.&lt;/p&gt;

&lt;h2&gt;
  
  
  What permissions does a Linux scanner need?
&lt;/h2&gt;

&lt;p&gt;Raw packet capture and SYN scans need elevated rights on Linux. Running everything with &lt;code&gt;sudo&lt;/code&gt; works but is heavy-handed. The cleaner approach is a file capability, which grants one binary the specific privilege without making it root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;setcap cap_net_raw,cap_net_admin&lt;span class="o"&gt;=&lt;/span&gt;eip /path/to/binary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;cap_net_raw&lt;/code&gt; lets a process open raw sockets for ARP and SYN scanning; &lt;code&gt;cap_net_admin&lt;/code&gt; covers interface-level operations. Without one of these, a scanner falls back to a plain TCP connect scan, which is slower, noisier and misses the MAC layer. Any Linux network scanner runs into this, so it's worth understanding rather than reflexively reaching for &lt;code&gt;sudo&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running DeviceShelf natively on Linux
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://deviceshelf.app/" rel="noopener noreferrer"&gt;DeviceShelf&lt;/a&gt; is a local-first scanner that does the terminal work in one pass and keeps the result. It resolves MAC vendor, hostname (DNS, mDNS and NetBIOS together), an OS and device-type guess, open ports and services, then rolls a prioritized security report on top: exposed Telnet or RDP, default-credential checks, risk scores. It also keeps watching, so a new device on the LAN triggers an alert instead of waiting for your next manual scan.&lt;/p&gt;

&lt;p&gt;It ships as an &lt;strong&gt;AppImage&lt;/strong&gt;, a &lt;strong&gt;&lt;code&gt;.deb&lt;/code&gt;&lt;/strong&gt; and an &lt;strong&gt;&lt;code&gt;.rpm&lt;/code&gt;&lt;/strong&gt;, so it runs on Debian, Ubuntu, Fedora and most of what's downstream. The &lt;a href="https://deviceshelf.app/linux" rel="noopener noreferrer"&gt;Linux install page&lt;/a&gt; has the packages and the one &lt;code&gt;setcap&lt;/code&gt; line to enable full capture. There's also a headless server edition (Docker or a systemd service) if you want a homelab box scanning around the clock. No account, no telemetry, and the license check works offline.&lt;/p&gt;

&lt;p&gt;If you're weighing it against nmap, Fing or Angry IP Scanner, the &lt;a href="https://deviceshelf.app/compare" rel="noopener noreferrer"&gt;comparison page&lt;/a&gt; lays out what each one does and doesn't do. The same comparison for macOS, where the built-in options are thinner: &lt;a href="https://deviceshelf.app/network-scanner-mac" rel="noopener noreferrer"&gt;network scanners for the Mac&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can try the full version on your own network first: there's a &lt;a href="https://deviceshelf.app/#download" rel="noopener noreferrer"&gt;free 7-day trial, no account needed&lt;/a&gt;. One-time €59 after that, no subscription.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>linux</category>
      <category>security</category>
      <category>networking</category>
    </item>
    <item>
      <title>How to scan and identify every device on your Windows LAN</title>
      <dc:creator>DeviceShelf</dc:creator>
      <pubDate>Sat, 29 Aug 2026 09:00:04 +0000</pubDate>
      <link>https://dev.to/deviceshelf/how-to-scan-and-identify-every-device-on-your-windows-lan-4ac4</link>
      <guid>https://dev.to/deviceshelf/how-to-scan-and-identify-every-device-on-your-windows-lan-4ac4</guid>
      <description>&lt;p&gt;To scan a network on Windows, start with what ships in the box: &lt;code&gt;arp -a&lt;/code&gt; lists the IP and MAC of every device your PC has recently talked to, and &lt;code&gt;Get-NetNeighbor&lt;/code&gt; in PowerShell does the same with more detail. Both are instant and free. Neither tells you &lt;em&gt;what&lt;/em&gt; those devices are. For names, vendors, open ports, and a security view you need a real scanner.&lt;/p&gt;

&lt;p&gt;On a Mac the command-line half still works (&lt;code&gt;arp -a&lt;/code&gt; is there too), but there has been no bundled graphical scanner since Network Utility was removed. We looked at &lt;a href="https://deviceshelf.app/network-scanner-mac" rel="noopener noreferrer"&gt;nine that do run on macOS&lt;/a&gt; separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Windows already gives you
&lt;/h2&gt;

&lt;p&gt;Open a terminal and run &lt;code&gt;arp -a&lt;/code&gt;. You get a table of IP addresses paired with MAC addresses for hosts in your ARP cache. It's the fastest possible answer to "what's on my network right now", but it only shows devices your machine has recently exchanged traffic with, so it misses quiet ones.&lt;/p&gt;

&lt;p&gt;PowerShell goes a step further:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-NetNeighbor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AddressFamily&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IPv4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-ne&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Unreachable"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To force devices to appear, ping the whole subnet first so the ARP cache fills:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;254&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Test-Connection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Count&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-TimeoutSeconds&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"192.168.1.&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The third free option is your router. Log into its admin page (usually &lt;code&gt;192.168.1.1&lt;/code&gt;) and open the DHCP client or connected-devices list. It sees everything that asked for a lease, including devices your PC never contacted. The catch is that router lists are often stale and label everything by hostname or a bare MAC, so a smart plug and a security camera look identical.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turning a MAC address into a real device name
&lt;/h2&gt;

&lt;p&gt;A raw scan gives you numbers. Identification is the work of turning &lt;code&gt;a4:cf:12:...&lt;/code&gt; into "TP-Link smart plug". The first three bytes of a MAC are the OUI, an IEEE-assigned vendor code, so you can look up the manufacturer against the public OUI registry. Names come from a mix of reverse DNS, mDNS/Bonjour, and NetBIOS queries. Rolling that yourself is fiddly; it's exactly what dedicated scanners automate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free GUI scanners and where they stop
&lt;/h2&gt;

&lt;p&gt;Advanced IP Scanner, Angry IP Scanner, and SoftPerfect are the usual free picks on Windows, and for a quick sweep they're fine. Where they tend to stop is depth. Most give you IP, MAC, hostname, and a vendor guess, then leave you there. They don't score which open ports are risky, they don't flag a device still answering on Telnet or exposing RDP, and they don't keep watching after the scan finishes. If you've outgrown that, the &lt;a href="https://deviceshelf.app/advanced-ip-scanner-alternative" rel="noopener noreferrer"&gt;Advanced IP Scanner alternative&lt;/a&gt; rundown lays out what a deeper tool adds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Live per-device bandwidth needs Npcap
&lt;/h2&gt;

&lt;p&gt;One thing worth knowing before you expect too much: measuring how much bandwidth each device is using in real time requires packet capture, and on Windows that means the &lt;a href="https://npcap.com/" rel="noopener noreferrer"&gt;Npcap&lt;/a&gt; driver installed. No capture driver, no live per-device throughput. Any scanner promising bandwidth without it is estimating, not measuring. &lt;a href="https://deviceshelf.app/" rel="noopener noreferrer"&gt;DeviceShelf&lt;/a&gt; prompts to install Npcap on first run for exactly this reason, and works without it for everything except live traffic graphs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where DeviceShelf fits on Windows
&lt;/h2&gt;

&lt;p&gt;DeviceShelf runs as a native Windows app and does the identification, port enumeration, and security scoring in one pass. It discovers every device, resolves vendor and hostname, guesses OS and device type, lists open ports and services, and produces a prioritized report that flags exposed services, default-credential risks, and CVE hints. It keeps monitoring after the first scan, so a new device joining triggers an alert instead of going unnoticed. If you want a feature-by-feature look against the free tools, the &lt;a href="https://deviceshelf.app/compare" rel="noopener noreferrer"&gt;comparison page&lt;/a&gt; covers it honestly.&lt;/p&gt;

&lt;p&gt;It's local-first: no account, no telemetry, the license check works offline. There's a &lt;a href="https://deviceshelf.app/#download" rel="noopener noreferrer"&gt;free 7-day trial with no account needed&lt;/a&gt; if you want to run it against your own network before deciding. A license is a one-time €59, not a subscription.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;Start with &lt;code&gt;arp -a&lt;/code&gt; and your router page to see what's there. Move to a GUI scanner when you want names and ports without typing. Reach for a monitoring tool when identification depth, a security view, and new-device alerts matter more than a one-off list. And remember that live bandwidth on Windows always needs Npcap underneath.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>windows</category>
      <category>security</category>
      <category>networking</category>
    </item>
    <item>
      <title>Is an open port dangerous? Which ones actually matter</title>
      <dc:creator>DeviceShelf</dc:creator>
      <pubDate>Thu, 27 Aug 2026 09:00:03 +0000</pubDate>
      <link>https://dev.to/deviceshelf/is-an-open-port-dangerous-which-ones-actually-matter-ao7</link>
      <guid>https://dev.to/deviceshelf/is-an-open-port-dangerous-which-ones-actually-matter-ao7</guid>
      <description>&lt;p&gt;An open port on its own is not a vulnerability. It means a program is listening for connections on that number. Whether it matters comes down to two things: what service sits behind it, and who can reach it. Open only inside your LAN, most ports are harmless. Exposed to the internet on an outdated or unauthenticated service, they become the way in.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an open port actually is
&lt;/h2&gt;

&lt;p&gt;When a device offers a service, such as file sharing, a web admin panel, or remote desktop, it binds to a TCP or UDP port and waits for connections. Port 443 serves HTTPS, 22 is SSH, 445 is Windows file sharing. A scanner reports a port as "open" when something answers on it; "closed" or "filtered" means nothing responded. The number itself is just a label. The software behind it is what can be attacked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which open ports are genuinely risky
&lt;/h2&gt;

&lt;p&gt;Not every open port carries equal weight. A short watchlist worth checking first:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Telnet (23)&lt;/strong&gt; sends everything, passwords included, in cleartext. There is no safe reason to run it. Replace it with SSH.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RDP (3389)&lt;/strong&gt; is remote desktop, a constant brute-force and ransomware target. Never expose it directly to the internet; put it behind a VPN.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SMB (445)&lt;/strong&gt; is Windows file sharing, the vector behind WannaCry. Fine on a trusted LAN, dangerous on the open internet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unauthenticated web panels&lt;/strong&gt; on routers, cameras, NAS boxes and printers, still running default or blank admin passwords.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exposed databases&lt;/strong&gt; like MongoDB (27017), Redis (6379) or Elasticsearch (9200) bound to &lt;code&gt;0.0.0.0&lt;/code&gt; with no authentication. Entire breaches have started here.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to check what's really listening
&lt;/h2&gt;

&lt;p&gt;Knowing a port is open is half the picture. You want the service and version behind it. &lt;code&gt;nmap&lt;/code&gt; does this with the &lt;code&gt;-sV&lt;/code&gt; flag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;-sV&lt;/span&gt; 192.168.1.0/24
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This scans the subnet and probes each open port to name the service and, often, its version. A result like &lt;code&gt;445/tcp open microsoft-ds Samba smbd 4.15&lt;/code&gt; tells you far more than "445 open," and an old version is your cue to check for known CVEs.&lt;/p&gt;

&lt;p&gt;Running nmap across a whole network and reading the raw output takes patience. &lt;a href="https://deviceshelf.app/" rel="noopener noreferrer"&gt;DeviceShelf&lt;/a&gt; does the same enumeration in one pass and adds a plain-language risk report per device: it flags exposed services like Telnet and RDP, runs default-credential checks, and hints at relevant CVEs. It works locally, with no account. If you're weighing it against other tools, the &lt;a href="https://deviceshelf.app/compare" rel="noopener noreferrer"&gt;scanner comparison&lt;/a&gt; lays out where each one stops, and the &lt;a href="https://deviceshelf.app/fing-alternative" rel="noopener noreferrer"&gt;Fing alternative&lt;/a&gt; writeup covers that switch in particular.&lt;/p&gt;

&lt;h2&gt;
  
  
  LAN-only or internet-exposed? That's the real question
&lt;/h2&gt;

&lt;p&gt;For most home and small-office ports, the honest answer to "is this dangerous" is: only if something outside can reach it. Check two things. First, is the service bound to &lt;code&gt;127.0.0.1&lt;/code&gt; (localhost only), your LAN IP, or &lt;code&gt;0.0.0.0&lt;/code&gt; (everything)? Second, does your router forward that port? Open the port-forwarding page and look for manual rules as well as any UPnP entries you never created. A database on &lt;code&gt;0.0.0.0&lt;/code&gt; behind a router with no forward is exposed to your LAN, not the internet. Still worth fixing, but not a fire drill.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to close or firewall a port
&lt;/h2&gt;

&lt;p&gt;Three levers, roughly in order of preference:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Stop the service&lt;/strong&gt; if you don't use it. A disabled Telnet or SMB service closes the port outright.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rebind it&lt;/strong&gt; to localhost or the LAN instead of &lt;code&gt;0.0.0.0&lt;/code&gt; in the application's config.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firewall it.&lt;/strong&gt; Block the port at the host (Windows Firewall, &lt;code&gt;ufw&lt;/code&gt;, &lt;code&gt;pf&lt;/code&gt;) or at the router, and delete any port-forward or UPnP rule you didn't add on purpose.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then re-scan and confirm the port now reads closed or filtered.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping an eye on it after the fix
&lt;/h2&gt;

&lt;p&gt;Auditing ports once is worth doing, but the exposure that actually bites is usually the one that appears later, when a new device joins or a service quietly auto-enables itself. DeviceShelf watches for that in the background and alerts you when a new listening service shows up. There's a &lt;a href="https://deviceshelf.app/#download" rel="noopener noreferrer"&gt;free 7-day trial&lt;/a&gt;, no account needed.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>security</category>
      <category>networking</category>
      <category>homelab</category>
    </item>
    <item>
      <title>Why does my phone show a random MAC address on Wi-Fi?</title>
      <dc:creator>DeviceShelf</dc:creator>
      <pubDate>Tue, 25 Aug 2026 09:00:02 +0000</pubDate>
      <link>https://dev.to/deviceshelf/why-does-my-phone-show-a-random-mac-address-on-wi-fi-46km</link>
      <guid>https://dev.to/deviceshelf/why-does-my-phone-show-a-random-mac-address-on-wi-fi-46km</guid>
      <description>&lt;p&gt;Your phone shows a random MAC address because modern operating systems generate a fake hardware address for each Wi-Fi network you join, so networks can't track your device across cafes, airports and offices by its permanent address. iOS 14, Android 10 and current Windows 10/11 all do this by default. It is a privacy feature, not a sign of an intruder.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is MAC randomization?
&lt;/h2&gt;

&lt;p&gt;Every network adapter ships with a burned-in MAC address, and its first three bytes (the OUI) identify the manufacturer. That address used to be broadcast on every network you touched, which turned it into a tracking cookie for the physical world. Retailers and public hotspots logged it to follow foot traffic.&lt;/p&gt;

&lt;p&gt;Apple, Google and Microsoft closed that hole. Since iOS 14 and Android 10 in 2020, and in recent Windows, the OS invents a random MAC per SSID and presents that instead of the real one. Rejoin the same network and you usually get the same random address back. Join a new one and you get a fresh address. Some Android builds rotate it periodically even on a network you already trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  How can I tell a MAC address is randomized?
&lt;/h2&gt;

&lt;p&gt;Look at the second character. A randomized, "locally administered" address has a specific bit set in its first byte, which in practice means the first octet ends in 2, 6, A or E. So &lt;code&gt;A2:...&lt;/code&gt;, &lt;code&gt;7E:...&lt;/code&gt; or &lt;code&gt;36:...&lt;/code&gt; are locally administered; a genuine vendor address like &lt;code&gt;A4:CF:12&lt;/code&gt; (an Espressif prefix) is not. The clearest tell in any device list is a MAC that resolves to no manufacturer at all. That is almost always a phone or laptop with private addressing switched on, not a mystery attacker.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why does a random MAC break vendor lookup and allow-lists?
&lt;/h2&gt;

&lt;p&gt;Two things stop working. Vendor identification through OUI lookup returns nothing, because the locally administered prefix belongs to no company in the IEEE registry. And MAC-based Wi-Fi allow-lists (the "only these addresses may connect" table in your router) become unreliable, because the same phone reappears under a different MAC after a reinstall, an OS update, or a "forget this network." MAC filtering was always weak security theater, and randomization has quietly finished it off. Bind access to a WPA2/WPA3 passphrase, not to hardware addresses.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I identify a device with a random MAC anyway?
&lt;/h2&gt;

&lt;p&gt;The MAC is a dead end, so pivot to the signals randomization doesn't touch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hostname.&lt;/strong&gt; DHCP and mDNS still carry a name. &lt;code&gt;Lisas-iPhone&lt;/code&gt; or &lt;code&gt;Pixel-7&lt;/code&gt; identifies the device outright. &lt;code&gt;nmap -sn&lt;/code&gt; or your router's client list will show it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Behavior and services.&lt;/strong&gt; Open ports and mDNS/SSDP announcements reveal the platform: an iPhone answers on &lt;code&gt;_apple-mobdev&lt;/code&gt;, a Chromecast advertises &lt;code&gt;_googlecast&lt;/code&gt;. Run &lt;code&gt;nmap -sV&lt;/code&gt; against the IP to fill in the rest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A name you assign once.&lt;/strong&gt; The practical fix is a scanner that remembers a device across scans even when its MAC changes, so you label "Lisa's iPhone" a single time and it stays labeled.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://deviceshelf.app/" rel="noopener noreferrer"&gt;DeviceShelf&lt;/a&gt; does all three in one local pass: hostname resolution over DNS/mDNS/NetBIOS, port and service enumeration, an OS and device-type guess, and persistent per-device naming that survives a MAC rotation. It runs on your own machine, with no account and no telemetry.&lt;/p&gt;

&lt;p&gt;If you're weighing scanners on exactly this behavior, the &lt;a href="https://deviceshelf.app/compare" rel="noopener noreferrer"&gt;feature comparison against Fing, LanScan and Angry IP&lt;/a&gt; covers how each one handles randomized addresses, and the &lt;a href="https://deviceshelf.app/fing-alternative" rel="noopener noreferrer"&gt;Fing alternative writeup&lt;/a&gt; goes deeper on the local-first difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;A random, vendor-less MAC on your network is the expected, healthy default for any recent phone or laptop. Don't chase it as a threat. Identify devices by hostname, by the services they run, and by a name you set once, then lock your Wi-Fi with a strong passphrase rather than a MAC allow-list. If you want that identification done in a single scan, DeviceShelf has a &lt;a href="https://deviceshelf.app/#download" rel="noopener noreferrer"&gt;free 7-day trial, no account needed&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>privacy</category>
      <category>networking</category>
      <category>homelab</category>
    </item>
    <item>
      <title>"How to Secure Your Home Network: A Practical Checklist"</title>
      <dc:creator>DeviceShelf</dc:creator>
      <pubDate>Sun, 23 Aug 2026 09:00:02 +0000</pubDate>
      <link>https://dev.to/deviceshelf/how-to-secure-your-home-network-a-practical-checklist-jnh</link>
      <guid>https://dev.to/deviceshelf/how-to-secure-your-home-network-a-practical-checklist-jnh</guid>
      <description>&lt;p&gt;Securing a home network comes down to a short, repeatable checklist: replace the router's default password, enable WPA3, isolate IoT devices on a guest network, disable WPS, close ports you don't need, patch firmware, and keep an eye on what's actually connected. None of it needs enterprise gear. Here is each step in the order that matters.&lt;/p&gt;

&lt;p&gt;Prefer to tick it off as you go? There's a &lt;a href="https://dev.to/checklist"&gt;printable one-page version&lt;/a&gt; you can save or print.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start by knowing what is on your network
&lt;/h2&gt;

&lt;p&gt;You can't secure what you can't see. Open your router's admin page and look at the DHCP client or connected-devices list. It shows IP and MAC addresses, and often hostnames. Cross-check each MAC's first three bytes (the OUI) against a vendor lookup to guess the manufacturer. Anything you can't account for gets investigated.&lt;/p&gt;

&lt;p&gt;For a fuller picture, &lt;code&gt;nmap -sn 192.168.1.0/24&lt;/code&gt; sweeps the whole subnet and lists live hosts. A dedicated scanner does the same faster and adds identification. &lt;a href="https://deviceshelf.app/" rel="noopener noreferrer"&gt;DeviceShelf&lt;/a&gt; discovers every device on the LAN, resolves hostnames over DNS, mDNS and NetBIOS, guesses the OS and device type, and runs entirely on your machine with no account. If you already use Fing, the &lt;a href="https://deviceshelf.app/fing-alternative" rel="noopener noreferrer"&gt;Fing alternative&lt;/a&gt; page covers what a local-first tool does differently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Change the router's default password first
&lt;/h2&gt;

&lt;p&gt;Default admin credentials are the single most exploited weakness in home networks. Log into the router, change the admin password to something long and unique, and while you're there rename the default SSID if it reveals the model. This is the one step that undoes the most common attacks, so do it before anything else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turn on WPA3, or at least WPA2
&lt;/h2&gt;

&lt;p&gt;In the wireless settings, set encryption to WPA3 if every device supports it. Mixed networks can use WPA2/WPA3 transitional mode. Avoid WPA/WPA2-TKIP and never run an open network. Pick a Wi-Fi passphrase of at least 12 characters that isn't reused anywhere else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Put IoT devices on a guest network
&lt;/h2&gt;

&lt;p&gt;Smart plugs, cameras and TVs are the least trustworthy things you own, and many phone home constantly. Move them onto a guest or separate SSID that has client isolation enabled, so a compromised bulb can't reach your laptop or NAS. Most consumer routers support this in a few clicks; prosumer gear lets you split it into a proper VLAN.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turn off WPS, and check UPnP
&lt;/h2&gt;

&lt;p&gt;WPS (the push-button or PIN pairing shortcut) has a known brute-force weakness. Disable it. UPnP is more nuanced: it lets devices open inbound ports automatically, which is convenient for game consoles but can silently expose services to the internet. If you don't rely on it, turn it off and forward ports manually instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Find your exposed ports and risky services
&lt;/h2&gt;

&lt;p&gt;This is where most home users are flying blind. A device with Telnet (port 23), an open RDP (3389), or an unauthenticated web panel is a real problem. Run &lt;code&gt;nmap -sV 192.168.1.50&lt;/code&gt; against a host to list open ports and service versions, then ask whether each one needs to be reachable.&lt;/p&gt;

&lt;p&gt;DeviceShelf turns this into a prioritized security report: a risk score per device, flags for exposed services like Telnet and RDP, default-credential checks, and CVE hints tied to the software it finds. It won't fix anything for you, but it tells you where you actually stand. The &lt;a href="https://deviceshelf.app/compare" rel="noopener noreferrer"&gt;DeviceShelf comparison&lt;/a&gt; page lines up how that reporting differs from other LAN scanners.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep firmware updated
&lt;/h2&gt;

&lt;p&gt;Check the router first, since it's the gateway everything passes through, then work down to APs, NAS boxes and IoT hubs. Enable automatic updates where the vendor offers them and you trust the track record. Retire any device that no longer receives security patches.&lt;/p&gt;

&lt;h2&gt;
  
  
  Watch for devices you don't recognize
&lt;/h2&gt;

&lt;p&gt;Security isn't a one-time scan. New devices appear, guests connect, and something unexpected shows up eventually. Continuous presence monitoring with new-device alerts catches that without you re-checking by hand, and per-device bandwidth helps spot a machine behaving oddly.&lt;/p&gt;

&lt;p&gt;If you'd rather see all of this on one screen instead of stitching &lt;code&gt;nmap&lt;/code&gt; output together, DeviceShelf offers a &lt;a href="https://deviceshelf.app/#download" rel="noopener noreferrer"&gt;free 7-day trial, no account needed&lt;/a&gt;. Either way, run the checklist top to bottom once, then revisit it every few months.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>security</category>
      <category>iot</category>
      <category>networking</category>
    </item>
    <item>
      <title>Self-hosted network monitoring for homelab and office</title>
      <dc:creator>DeviceShelf</dc:creator>
      <pubDate>Fri, 21 Aug 2026 09:00:05 +0000</pubDate>
      <link>https://dev.to/deviceshelf/self-hosted-network-monitoring-for-homelab-and-office-1a8i</link>
      <guid>https://dev.to/deviceshelf/self-hosted-network-monitoring-for-homelab-and-office-1a8i</guid>
      <description>&lt;p&gt;Self-hosted network monitoring means running the software that watches your network on your own hardware, with the data staying on your LAN instead of a vendor's cloud. You get device discovery, uptime checks, and alerts from a box you control, with no external account and no telemetry leaving the building.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does self-hosted network monitoring actually mean?
&lt;/h2&gt;

&lt;p&gt;Two things separate it from a SaaS dashboard: the software runs on hardware you own, and the data never leaves your network. A cloud monitor pushes findings to someone else's servers; a self-hosted one keeps inventory, history, and alerts on a machine in your rack or on your desk. For a homelab or small office that means no per-device pricing, no account to lose access to, and nothing about your internal topology sitting in a third party's database.&lt;/p&gt;

&lt;p&gt;You can assemble this from parts. &lt;code&gt;nmap -sn 192.168.1.0/24&lt;/code&gt; sweeps a subnet for live hosts. A cron job hitting &lt;code&gt;ping&lt;/code&gt; or &lt;code&gt;curl&lt;/code&gt; on critical boxes gives you crude uptime. Your router's DHCP lease table lists MAC addresses you can look up against the OUI registry to guess a vendor. It works, but you end up gluing scripts together and reading raw output.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to monitor: uptime, discovery, and alerts
&lt;/h2&gt;

&lt;p&gt;Three jobs cover most of what a homelab needs. Discovery answers "what is on my network right now": every device, its MAC/OUI vendor, hostname via DNS, mDNS or NetBIOS, an OS guess and a device type. Uptime answers "is it still reachable," ideally with history so you can see a pattern rather than a single failed ping. Alerts close the loop, so you know when something new joins the network or a known host drops without watching a screen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://deviceshelf.app/" rel="noopener noreferrer"&gt;DeviceShelf&lt;/a&gt; does all three from one local scan. It discovers and identifies each device, enumerates open ports and services, and runs continuous presence monitoring that fires a new-device alert the moment an unknown MAC appears. It also builds a prioritized security report flagging exposed services like Telnet or RDP and default-credential risks, which is the part hand-rolled scripts rarely cover.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to run it 24/7 headless
&lt;/h2&gt;

&lt;p&gt;Continuous monitoring only works if it is always on, which means a headless box rather than an app you open. The &lt;a href="https://deviceshelf.app/server" rel="noopener noreferrer"&gt;DeviceShelf server edition&lt;/a&gt; is built for that: it ships as a Docker image, a &lt;code&gt;.deb&lt;/code&gt; package, or a Windows service, so you can run it on a NAS, a Raspberry Pi, a mini PC or a VM and leave it. Because it needs to see Layer 2 traffic for discovery, run the container with &lt;code&gt;network_mode: host&lt;/code&gt; rather than a bridged network.&lt;/p&gt;

&lt;p&gt;Set the scan interval to match your network's churn. A stable home LAN is fine every few minutes; a busier office might scan more often. Route alerts to ntfy, Gotify, a webhook or email so the box can tell you what changed while you were away.&lt;/p&gt;

&lt;p&gt;If your current setup is Uptime Kuma and you want discovery and identification on top of the uptime checks, the &lt;a href="https://deviceshelf.app/uptime-kuma-alternative" rel="noopener noreferrer"&gt;Uptime Kuma alternative comparison&lt;/a&gt; lays out where the two overlap and where they differ.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping the data on your own network
&lt;/h2&gt;

&lt;p&gt;The point of self-hosting is control, so check what leaves the box. DeviceShelf is local-first: no account, no telemetry, and the license check works offline. Inventory, history and reports stay on the device. That matters when your network map is something you would rather not hand to a vendor, and it is often the deciding factor for regulated or air-gapped setups.&lt;/p&gt;

&lt;h2&gt;
  
  
  Querying your network with AI
&lt;/h2&gt;

&lt;p&gt;If you want to ask questions instead of reading tables, the server edition can expose its live inventory to an AI assistant over MCP. The AI part is bring-your-own-key and entirely optional. Point it at Anthropic, OpenAI or a local Ollama model, or skip it. Nothing is sent anywhere unless you turn it on.&lt;/p&gt;

&lt;p&gt;The server edition is young but usable, and it is included in the one-time €59 license rather than sold separately. If you want to try the always-on setup first, there is a &lt;a href="https://deviceshelf.app/#download" rel="noopener noreferrer"&gt;free 7-day trial, no account needed&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>selfhosted</category>
      <category>monitoring</category>
      <category>homelab</category>
    </item>
    <item>
      <title>Who Is on My Wi-Fi? See Every Device and Spot Intruders</title>
      <dc:creator>DeviceShelf</dc:creator>
      <pubDate>Wed, 19 Aug 2026 16:30:53 +0000</pubDate>
      <link>https://dev.to/deviceshelf/who-is-on-my-wi-fi-see-every-device-and-spot-intruders-2kca</link>
      <guid>https://dev.to/deviceshelf/who-is-on-my-wi-fi-see-every-device-and-spot-intruders-2kca</guid>
      <description>&lt;p&gt;To see who's on your Wi-Fi, open your router's admin page and look at its connected-devices list, or run a network scanner that pings every address on your subnet. Each entry shows an IP, a MAC address, and often a hostname. From there you match each device to something you actually own, and whatever's left over is worth a closer look. If one of those leftovers turns out to be real, changing your Wi-Fi password disconnects everyone at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with your router's device list
&lt;/h2&gt;

&lt;p&gt;Type your router's address into a browser (often &lt;code&gt;192.168.1.1&lt;/code&gt; or &lt;code&gt;192.168.0.1&lt;/code&gt;, printed on a sticker on the box). Log in, then find a section called Attached Devices, DHCP Clients, or Connected Devices. You get a table of everything the router has handed an address to: IP, MAC, and sometimes a name.&lt;/p&gt;

&lt;p&gt;This is the fastest free check, but router lists have limits. They often miss devices on a guest network or a second access point, they drop stale entries slowly, and the names are frequently blank or cryptic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the MAC address and vendor (OUI)
&lt;/h2&gt;

&lt;p&gt;Every network device has a MAC address, six pairs of hex like &lt;code&gt;a4:83:e7:2b:19:0c&lt;/code&gt;. The first three pairs are the OUI (Organizationally Unique Identifier), assigned to the manufacturer. &lt;code&gt;a4:83:e7&lt;/code&gt; maps to Apple, for instance. Look the prefix up in any OUI database and an anonymous row becomes "some Apple device."&lt;/p&gt;

&lt;p&gt;Vendor alone rarely finishes the job. A house full of Apple gear turns into a wall of "Apple, Apple, Apple," and you still have to work out which entry is the iPhone and which is the Apple TV.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get real names with hostnames and mDNS
&lt;/h2&gt;

&lt;p&gt;Hostnames close some of that gap. Many devices announce a name over DHCP or mDNS/Bonjour, like &lt;code&gt;Christofs-MacBook&lt;/code&gt; or &lt;code&gt;living-room-tv&lt;/code&gt;. NetBIOS does the same on older Windows networks. A scanner that queries all three resolves far more names than the router shows on its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why randomized MAC addresses confuse things
&lt;/h2&gt;

&lt;p&gt;Since iOS 14, Android 10, and recent Windows builds, phones use a random MAC per network by default, and some rotate it over time. The upside is privacy. The downside for you is that a phone can show up under a vendor prefix that no longer maps to its maker, and a device you already trust can look brand new after a rotation.&lt;/p&gt;

&lt;p&gt;This is also the wrinkle most likely to fake an intruder. Before you assume the worst, test it directly: turn Wi-Fi off on a phone you suspect and watch whether the mystery entry disappears. Look at the vendor too. A randomized MAC often reads as "locally administered" or an unknown vendor rather than a clean Apple or Samsung block. And if an entry only shows up when one particular family member is home, it is theirs.&lt;/p&gt;

&lt;p&gt;The broader fix is to match on hostname and behavior rather than MAC alone, and to name devices in a tool that remembers them across scans, so a rotated address doesn't reset your whole inventory. If the randomization itself is what puzzles you, we've covered &lt;a href="https://deviceshelf.app/blog/2026-07-24-random-mac-address/" rel="noopener noreferrer"&gt;why your phone shows a random MAC address&lt;/a&gt; separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Name everything in one pass with a scanner
&lt;/h2&gt;

&lt;p&gt;Doing all of the above by hand is slow. A scanner sweeps the whole subnet, collects MAC/OUI vendor, hostname, an OS guess, and open ports, then hands you one labeled inventory. nmap does this from the command line (&lt;code&gt;nmap -sn 192.168.1.0/24&lt;/code&gt; for a quick host sweep). GUI tools do the same with less typing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://deviceshelf.app/" rel="noopener noreferrer"&gt;DeviceShelf&lt;/a&gt; is one such scanner. It discovers every device on your LAN or Wi-Fi, identifies each by vendor, hostname, and type, and lets you rename and pin the ones you recognize so the list stays meaningful next time. It runs locally, with no account and no data leaving your machine, which is why people looking for a &lt;a href="https://deviceshelf.app/fing-alternative" rel="noopener noreferrer"&gt;private alternative to Fing&lt;/a&gt; tend to land on it. If you're weighing tools, our &lt;a href="https://deviceshelf.app/compare" rel="noopener noreferrer"&gt;comparison of network scanners&lt;/a&gt; shows where each one fits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Match every device against hardware you own
&lt;/h2&gt;

&lt;p&gt;Now the tedious but decisive part. Walk through the place and count: phones, laptops, tablets, the TV, a streaming stick, the console, printer, robot vacuum, smart plugs, thermostat, doorbell, speakers, the router itself, and any range extenders. Write them down, then cross each one off the scan.&lt;/p&gt;

&lt;p&gt;The MAC vendor is your best clue here. A prefix that resolves to Amazon is probably an Echo or Fire TV. Espressif or Tuya usually means a cheap smart-home gadget. Apple, Samsung, and Google cover most phones and laptops. Line up hostnames where you can. Smart-home gear is the hardest group to pin down, so there's a separate walkthrough on &lt;a href="https://deviceshelf.app/blog/2026-07-24-find-iot-devices-on-network/" rel="noopener noreferrer"&gt;finding IoT devices on your network&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Once every entry is named, the unknowns stand out. Go one by one: power a suspect device off and see which row drops, or check the vendor against what you own. A camera vendor you don't recognize, an open Telnet port, or a host that only appears at odd hours all deserve a second look. Open ports are worth understanding before you judge them, and our guide to &lt;a href="https://deviceshelf.app/blog/2026-07-24-open-ports-explained/" rel="noopener noreferrer"&gt;what an open port actually means&lt;/a&gt; covers which ones matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do if someone really is on your Wi-Fi
&lt;/h2&gt;

&lt;p&gt;If a device survives all of that and you're confident it isn't yours, the fastest fix is to lock everyone out and let your own gear back in.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Change the Wi-Fi password.&lt;/strong&gt; This kicks every device off instantly, the intruder included, and they can't rejoin without the new key. Reconnect your own hardware afterward.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch to WPA3&lt;/strong&gt;, or at least WPA2-AES. Never run WEP or an open network. WPA3 makes offline password guessing far harder.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disable WPS.&lt;/strong&gt; Its 8-digit PIN is brute-forceable and a well-known way in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Move IoT gadgets to a guest network.&lt;/strong&gt; A cheap camera with weak firmware has no business sharing a subnet with your laptop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Changing the password is the step that actually disconnects someone. The rest stops them from coming back. For the full pass over your router settings, work through the &lt;a href="https://deviceshelf.app/checklist" rel="noopener noreferrer"&gt;home network security checklist&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a one-time check isn't enough
&lt;/h2&gt;

&lt;p&gt;A manual sweep only catches whoever is connected the moment you look. It says nothing about last night or next week. Someone who joins at 2am and is gone by morning never appears in a check you run at noon.&lt;/p&gt;

&lt;p&gt;Continuous monitoring closes that gap. The network gets watched around the clock, you approve the devices you own once, and an alert fires only when a genuinely new one shows up. DeviceShelf does this on the desktop while your computer is awake, or 24/7 on a Raspberry Pi or NAS with the &lt;a href="https://deviceshelf.app/server" rel="noopener noreferrer"&gt;server edition&lt;/a&gt;. That always-on watch is one of the main things separating it from a pull-to-refresh phone app.&lt;/p&gt;

&lt;p&gt;You can do every step here with free tools and some patience. If you'd rather get the labeled list and the alerts in one pass, DeviceShelf has a &lt;a href="https://deviceshelf.app/#download" rel="noopener noreferrer"&gt;free 7-day trial, no account needed&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>security</category>
      <category>networking</category>
      <category>homelab</category>
    </item>
    <item>
      <title>How to find a device by its MAC address</title>
      <dc:creator>DeviceShelf</dc:creator>
      <pubDate>Wed, 19 Aug 2026 16:27:59 +0000</pubDate>
      <link>https://dev.to/deviceshelf/how-to-find-a-device-by-its-mac-address-34d0</link>
      <guid>https://dev.to/deviceshelf/how-to-find-a-device-by-its-mac-address-34d0</guid>
      <description>&lt;p&gt;A MAC address is usually all your router gives you about a device: twelve hex digits like &lt;code&gt;a4:cf:12:9b:00:01&lt;/code&gt;, maybe with a half-usable name next to it. The good news: those digits carry more information than they look like. The bad news is that they stop well short of "this is Lisa's tablet". Here is how far a MAC gets you, and how to cover the rest of the distance.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the address contains
&lt;/h2&gt;

&lt;p&gt;The first half of a MAC address names the manufacturer of the network chip. Those prefixes are assigned by the IEEE and public, so &lt;code&gt;A4:CF:12&lt;/code&gt; resolves to Espressif (smart-home gadgets and DIY boards), &lt;code&gt;D8:3A:DD&lt;/code&gt; to Raspberry Pi. The second half is a serial number from the manufacturer's own pool; it identifies nothing publicly.&lt;/p&gt;

&lt;p&gt;You can resolve the prefix with our free &lt;a href="https://dev.to/mac-address-lookup"&gt;MAC address vendor lookup&lt;/a&gt;. It uses the official IEEE registries (all three of them, including the smaller MA-M and MA-S blocks), runs entirely in your browser, and flags randomised addresses for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  When the vendor comes back empty
&lt;/h2&gt;

&lt;p&gt;Modern phones, tablets and laptops invent a random MAC per Wi-Fi network by default. Those addresses are marked "locally administered" and deliberately match no registry entry. So an address with no vendor is rarely an intruder; it is usually a phone protecting its privacy. The same phone can even show up as several different devices over time.&lt;/p&gt;

&lt;p&gt;If the lookup flags your address as locally administered, stop chasing the vendor. Identify the device by the other signals below instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  From vendor name to actual device
&lt;/h2&gt;

&lt;p&gt;A vendor name narrows things down, and sometimes that is enough: an Espressif device is almost certainly a smart plug, sensor or similar; a printer vendor is a printer. But "Hui Zhou Gaoshengda Technology" sits inside half the cheap smart-home hardware on the market, and Apple covers everything from a watch to a desktop. To get further you need the device to talk:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hostname.&lt;/strong&gt; DHCP and mDNS names like &lt;code&gt;HS110&lt;/code&gt; or &lt;code&gt;MacBook-Pro-von-Lisa&lt;/code&gt; settle it immediately. Your router list often shows them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Services.&lt;/strong&gt; A printer answers on port 631, a camera streams on 554, a NAS offers file sharing on 445, a smart speaker announces itself via mDNS. Which doors are open tells you what lives behind them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Behaviour over time.&lt;/strong&gt; A device that appears every evening at seven and vanishes at midnight is somebody's phone, not a server.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can collect all of that by hand, or let a scanner do it in one pass. &lt;a href="https://dev.to/"&gt;DeviceShelf&lt;/a&gt; resolves vendor, hostname, services and open ports for every device on the network and turns them into an actual identification; the same IEEE data behind our lookup page ships inside the app. For the full detective story, see the guide on &lt;a href="https://dev.to/blog/2026-07-05-unknown-device-on-network/"&gt;identifying an unknown device&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding the MAC in the first place
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Router:&lt;/strong&gt; the client list shows a MAC per device — the usual starting point.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows:&lt;/strong&gt; &lt;code&gt;ipconfig /all&lt;/code&gt; (Physical Address).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;macOS/Linux:&lt;/strong&gt; &lt;code&gt;ifconfig&lt;/code&gt; or &lt;code&gt;ip link&lt;/code&gt;; macOS also shows it under System Settings → Network → Details.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iPhone/iPad:&lt;/strong&gt; Settings → Wi-Fi → ⓘ on the network (this is the per-network, usually randomised, address).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Android:&lt;/strong&gt; Settings → About phone → Status, or in the Wi-Fi details.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What a MAC address will never tell you
&lt;/h2&gt;

&lt;p&gt;No owner, no location, no serial number. The registry knows which company bought the prefix, and that is all. The claim that "this MAC belongs to this person" has no technical basis, which is also why sharing a MAC address is not the privacy catastrophe it is sometimes made out to be. On your own network, though, it remains the most stable handle a device offers, randomisation aside.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>networking</category>
      <category>homelab</category>
      <category>selfhosted</category>
    </item>
    <item>
      <title>DeviceShelf for iOS is out of TestFlight and on the App Store</title>
      <dc:creator>DeviceShelf</dc:creator>
      <pubDate>Tue, 21 Jul 2026 15:36:26 +0000</pubDate>
      <link>https://dev.to/deviceshelf/deviceshelf-for-ios-is-out-of-testflight-and-on-the-app-store-20a4</link>
      <guid>https://dev.to/deviceshelf/deviceshelf-for-ios-is-out-of-testflight-and-on-the-app-store-20a4</guid>
      <description>&lt;p&gt;I'm the developer of DeviceShelf, a local-first network scanner for desktop, mobile and a headless server edition. Until this week the iOS app only existed on TestFlight. Apple has now approved version 1.3.0, so for the first time you can get it straight from the App Store: &lt;a href="https://apps.apple.com/app/deviceshelf/id6779666567" rel="noopener noreferrer"&gt;DeviceShelf on the App Store&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the app does on a phone
&lt;/h2&gt;

&lt;p&gt;The iOS app is not a companion viewer. It runs the same scanning engine as the desktop version: it scans the network you're on, identifies devices (vendor, type, OS fingerprint), shows open ports per device, builds a security report, and raises presence alerts when devices appear or drop off. You can export and share results from the phone.&lt;/p&gt;

&lt;h2&gt;
  
  
  The multicast entitlement
&lt;/h2&gt;

&lt;p&gt;iOS restricts multicast traffic for ordinary apps, and SSDP/UPnP discovery depends on it. Apple grants the multicast entitlement on request, and DeviceShelf's App Store build has it. In practice, UPnP/SSDP devices show up in scans on the phone the same way they do on desktop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Licensing
&lt;/h2&gt;

&lt;p&gt;The download is free and comes with a trial. Full features unlock in one of two ways: activate a DeviceShelf license, which covers desktop, mobile and the server edition with a single purchase, or use the in-app purchase upgrade on iOS. Pricing is on the website if you want the details.&lt;/p&gt;

&lt;h2&gt;
  
  
  Local-first, on mobile too
&lt;/h2&gt;

&lt;p&gt;Scans stay on the device. There is no cloud account, and the AI-assisted device identification is bring-your-own-key; no key is bundled or required.&lt;/p&gt;

&lt;p&gt;The app is still young, and a phone is an unforgiving place for a network scanner. If it mislabels a device on your network or misses one entirely, I'd genuinely like to hear about it.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://deviceshelf.app" rel="noopener noreferrer"&gt;deviceshelf.app&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>networking</category>
      <category>mobile</category>
      <category>indiedev</category>
    </item>
    <item>
      <title>Wiring a local network scanner into an AI assistant with MCP</title>
      <dc:creator>DeviceShelf</dc:creator>
      <pubDate>Tue, 14 Jul 2026 20:00:19 +0000</pubDate>
      <link>https://dev.to/deviceshelf/wiring-a-local-network-scanner-into-an-ai-assistant-with-mcp-45o0</link>
      <guid>https://dev.to/deviceshelf/wiring-a-local-network-scanner-into-an-ai-assistant-with-mcp-45o0</guid>
      <description>&lt;p&gt;I build DeviceShelf, a local-first network scanner. Its Server edition is the headless, always-on one, and as of build 1.5.3 it speaks the &lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;Model Context Protocol&lt;/a&gt; (MCP). That means an assistant like Claude Desktop can answer questions about your network from your own live data: "what's online right now?", "anything new or offline since yesterday?", "which devices have certificates expiring soon?", "how does tonight differ from last week's snapshot?"&lt;/p&gt;

&lt;p&gt;This post is about how that's wired, and more to the point how it's fenced in, because handing a language model a read of your network inventory is the sort of thing that deserves some paranoia. I'm the developer, so take the enthusiasm with the usual pinch of salt; the design choices below are the interesting part.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the endpoint exposes
&lt;/h2&gt;

&lt;p&gt;All told it's 22 tools (14 read-only, 8 opt-in actions), 3 guided prompts, 4 attachable resources, and an optional live mode that pushes changes to the client as they happen. MCP is the glue: the assistant discovers those tools and calls them, instead of you copy-pasting dashboard output into a chat window.&lt;/p&gt;

&lt;h2&gt;
  
  
  Everything stays on your LAN
&lt;/h2&gt;

&lt;p&gt;The MCP endpoint runs &lt;em&gt;inside&lt;/em&gt; the DeviceShelf Server, on the same port as the API, behind a bearer token, reachable only on your LAN. There's no DeviceShelf cloud connector and no remote OAuth. The only thing that ever leaves your network is whatever the AI client &lt;em&gt;you&lt;/em&gt; chose to connect decides to send. It reads the same in-process data that backs the dashboard, so the model's view can't drift from what you see with your own eyes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The read side
&lt;/h2&gt;

&lt;p&gt;The 14 read tools cover the whole monitoring surface. Inventory is &lt;code&gt;network_summary&lt;/code&gt; for the one-shot overview, &lt;code&gt;list_devices&lt;/code&gt; with filters and pagination, &lt;code&gt;find_device&lt;/code&gt; for free-text lookups ("the printer", "my NAS"), &lt;code&gt;get_device&lt;/code&gt; for full per-host detail (open ports, OS, SNMP, TLS, matched CVEs, notes), and &lt;code&gt;list_interfaces&lt;/code&gt; for multi-NIC collectors.&lt;/p&gt;

&lt;p&gt;Monitoring adds &lt;code&gt;list_changes&lt;/code&gt;, &lt;code&gt;list_alarms&lt;/code&gt;, &lt;code&gt;list_checks&lt;/code&gt;, &lt;code&gt;get_device_history&lt;/code&gt;, &lt;code&gt;get_device_uptime&lt;/code&gt; (per-device uptime over up to 90 days) and &lt;code&gt;list_offline_devices&lt;/code&gt;. Security is one call: &lt;code&gt;security_overview&lt;/code&gt; surfaces expiring and expired certificates, self-signed certs, and hosts with known CVEs grouped by severity, across the whole network without a lookup per host. And &lt;code&gt;list_snapshots&lt;/code&gt; / &lt;code&gt;diff_snapshots&lt;/code&gt; compare two named captures, or a capture against the live scan, so "what's new since the audit in May?" becomes a single question.&lt;/p&gt;

&lt;h2&gt;
  
  
  The write side is opt-in, twice
&lt;/h2&gt;

&lt;p&gt;Writes are off by default. You turn them on with a second, separate switch (&lt;code&gt;DEVICESHELF_MCP_ALLOW_ACTIONS=true&lt;/code&gt;), and only then does the assistant get action tools: rename or retag a device, acknowledge an alarm, create or delete monitor checks in plain language, save a named snapshot, trigger an on-demand scan or a TCP port check, or fire a test notification. The probing actions (&lt;code&gt;scan_now&lt;/code&gt;, &lt;code&gt;port_check&lt;/code&gt;) are restricted to your own locally-attached subnets and rate-limited.&lt;/p&gt;

&lt;p&gt;If even that feels too loose, &lt;code&gt;DEVICESHELF_MCP_CONFIRM_ACTIONS=true&lt;/code&gt; makes the impactful actions ask the client for a yes first, using MCP elicitation, so a scan never runs without you clicking confirm.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompts and resources
&lt;/h2&gt;

&lt;p&gt;For people who don't want to learn tool names, the server ships three guided prompts that show up in the client's prompt picker: a security audit, a "what changed recently" report, and "identify unknown devices". One click, useful answer. It also exposes four read-only resources (&lt;code&gt;deviceshelf://network/summary&lt;/code&gt;, &lt;code&gt;deviceshelf://devices&lt;/code&gt;, &lt;code&gt;deviceshelf://alarms&lt;/code&gt;, &lt;code&gt;deviceshelf://security/overview&lt;/code&gt;) a client can attach as context without any tool call at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Live mode
&lt;/h2&gt;

&lt;p&gt;By default the endpoint is stateless request/response. Set &lt;code&gt;DEVICESHELF_MCP_LIVE=true&lt;/code&gt; and it switches to stateful sessions: clients can subscribe to the device, alarm and summary resources and receive &lt;code&gt;resources/updated&lt;/code&gt; notifications when the inventory changes, so the assistant stays current without polling. Idle sessions close after 30 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Treating it as a security surface
&lt;/h2&gt;

&lt;p&gt;An AI reading your inventory gets the same scrutiny as any other client:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/mcp&lt;/code&gt; is auth-required, exactly like the API. No token, no answer.&lt;/li&gt;
&lt;li&gt;A scoped token (&lt;code&gt;DEVICESHELF_MCP_TOKEN&lt;/code&gt;) is accepted for &lt;code&gt;/mcp&lt;/code&gt; only, never for the admin API or metrics, so the AI client never holds an admin credential.&lt;/li&gt;
&lt;li&gt;All tool calls are rate-limited (token bucket, default 300/min) and audit-logged by tool name and outcome, never by arguments.&lt;/li&gt;
&lt;li&gt;Device-reported strings (hostnames, banners, cert subjects) are untrusted input: control and text-spoofing characters (bidi, zero-width) are stripped and values truncated before they reach the model, and the model is told to treat them as data.&lt;/li&gt;
&lt;li&gt;An &lt;code&gt;Origin&lt;/code&gt; allowlist guards against DNS rebinding from a browser.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last group is the reason I'd trust this on my own network. Prompt-injection through a hostname a rogue device set to something clever is a real risk, and stripping the spoofing characters plus flagging the strings as data is the boring, correct answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turning it on
&lt;/h2&gt;

&lt;p&gt;In &lt;code&gt;/etc/deviceshelf/server.env&lt;/code&gt; (or your Docker environment):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;DEVICESHELF_MCP_ENABLE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart the server. The endpoint is served at &lt;code&gt;http://&amp;lt;your-server&amp;gt;:8088/mcp&lt;/code&gt; with the bearer token. To connect Claude Desktop, bridge to it with &lt;a href="https://www.npmjs.com/package/mcp-remote" rel="noopener noreferrer"&gt;&lt;code&gt;mcp-remote&lt;/code&gt;&lt;/a&gt;. Keep &lt;code&gt;--allow-http&lt;/code&gt; (it's plain http on your LAN) and pass the token via an env var, which sidesteps a Windows argument-quoting bug:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"deviceshelf"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp-remote"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://&amp;lt;your-server&amp;gt;:8088/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
               &lt;/span&gt;&lt;span class="s2"&gt;"--transport"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http-only"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--allow-http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
               &lt;/span&gt;&lt;span class="s2"&gt;"--header"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Authorization:${AUTH}"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"AUTH"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer &amp;lt;your-token&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Any MCP client that speaks Streamable HTTP can connect directly. It's available from &lt;code&gt;deviceshelf-server&lt;/code&gt; 1.5.3 (Docker image &lt;code&gt;ghcr.io/wealthwallet/deviceshelf-server:1.5.3&lt;/code&gt;, .deb, or later), off by default and fully additive, so existing servers are untouched until you set &lt;code&gt;DEVICESHELF_MCP_ENABLE&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it stands
&lt;/h2&gt;

&lt;p&gt;MCP is part of the Server edition rather than a separate purchase, and it works during the 7-day trial so you can evaluate it; the endpoint returns &lt;code&gt;402&lt;/code&gt; once an unlicensed trial expires. The Server edition itself is still public beta, so treat it as early, and if a tool returns something wrong or a check behaves oddly I'd genuinely like the report. The full write-up with the client configs (Cursor, VS Code, Windsurf, Cline, Gemini CLI) is on the DeviceShelf blog, and the project lives at &lt;a href="https://deviceshelf.app" rel="noopener noreferrer"&gt;https://deviceshelf.app&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>networking</category>
      <category>selfhosted</category>
    </item>
    <item>
      <title>What a local network scanner actually knows about your devices</title>
      <dc:creator>DeviceShelf</dc:creator>
      <pubDate>Sun, 12 Jul 2026 15:08:23 +0000</pubDate>
      <link>https://dev.to/deviceshelf/what-a-local-network-scanner-actually-knows-about-your-devices-2lkf</link>
      <guid>https://dev.to/deviceshelf/what-a-local-network-scanner-actually-knows-about-your-devices-2lkf</guid>
      <description>&lt;p&gt;I build DeviceShelf, a local-first network scanner, so I spend a lot of time staring at the question "what is this thing on my LAN?" Turns out there's no single answer. A scanner guesses, using a handful of weak signals that each get one part of the picture right and one part wrong. This post walks through those signals and where each one lies to you.&lt;/p&gt;

&lt;p&gt;Nothing here is specific to my tool. Any scanner works from roughly the same inputs, so this is meant to be useful whether you ever open DeviceShelf or not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The MAC address and the vendor behind it
&lt;/h2&gt;

&lt;p&gt;Every device on a local network has a MAC address, and the first three bytes are the OUI, the block assigned to a hardware vendor. Look that prefix up against the IEEE registry and you get a name: Apple, Ubiquiti, Espressif, Raspberry Pi Foundation. That one lookup is the cheapest and most reliable identifier you have. It's also the first one to fall apart.&lt;/p&gt;

&lt;p&gt;Modern phones rotate their MAC per network to stop being tracked, so the vendor you see is a placeholder, not Apple or Samsung. Some cheap gear ships with a MAC from whatever reference-design chip is inside, so a smart plug reports as the Wi-Fi module maker rather than the brand on the box. And anyone can set a MAC to anything. A spoofed address means the OUI is simply a lie you can't detect from the outside. So: good for a first pass, wrong often enough that you can't stop there.&lt;/p&gt;

&lt;h2&gt;
  
  
  mDNS and Bonjour
&lt;/h2&gt;

&lt;p&gt;Many devices announce themselves over multicast DNS. Printers, Apple gear, Chromecasts, a surprising number of IoT boxes. Ask the right multicast group and they'll tell you their hostname, service types, and sometimes a friendly model string. When a device participates, mDNS is the richest source you get for free, because the device is describing itself in its own words.&lt;/p&gt;

&lt;p&gt;The catch is participation. A locked-down sensor or a random Linux box says nothing, and silence reads the same as absence. You also can't trust the self-reported name too far, since a user can rename a device to whatever they like, and some vendors put marketing text where a model number should be.&lt;/p&gt;

&lt;h2&gt;
  
  
  SSDP and UPnP
&lt;/h2&gt;

&lt;p&gt;SSDP is the discovery half of UPnP, and it's how routers, media servers, smart TVs and game consoles advertise themselves. A scanner sends a multicast search, listens for responses, then fetches the device description XML each responder points at. That XML often carries a manufacturer, model name and model number straight from the firmware, which is more structured than a hostname.&lt;/p&gt;

&lt;p&gt;UPnP has a reputation, mostly earned, for being chatty and inconsistent between vendors. Descriptions can be sparse, fields get left blank, and plenty of security-conscious setups disable it entirely. When it answers it's genuinely useful. You just can't count on it answering.&lt;/p&gt;

&lt;h2&gt;
  
  
  DHCP fingerprinting
&lt;/h2&gt;

&lt;p&gt;When a device asks the network for an address, its DHCP request carries a fingerprint: the specific options it requests, in a specific order, plus fields like the vendor class identifier. Different operating systems and stacks produce recognizably different requests, so with a decent signature database you can often tell Android from an IoT RTOS from a desktop OS without the device volunteering anything.&lt;/p&gt;

&lt;p&gt;Two honest limitations. You only see the request if you happen to be listening when the device renews its lease, which on a passive scan you usually aren't. And fingerprints drift as OS versions change, so a signature set goes stale and starts producing confident, wrong answers. It's a strong hint about device class, not proof of identity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open ports as a hint, not a verdict
&lt;/h2&gt;

&lt;p&gt;What a device exposes says something about what it is. Port 9100 leans printer. 554 suggests a camera speaking RTSP. 445 points at a Windows or SMB host, 22 at something with SSH. Stack a few of these together and a rough device type appears.&lt;/p&gt;

&lt;p&gt;I treat this as the softest signal of the set. A port tells you a service might be running, not what the box is for, and homelabbers run services on hardware that has nothing to do with the service's usual home. Aggressive probing also annoys fragile devices, so a scanner has to stay gentle, which means less data and more uncertainty. Useful for corroboration, weak on its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optional AI identification, with your own key
&lt;/h2&gt;

&lt;p&gt;When the mechanical signals disagree or come up thin, there's room for a model to weigh the messy evidence, the odd hostname, the vendor guess, the port pattern, the way a human would. DeviceShelf can do this, and it's strictly opt-in: you bring your own API key, nothing is bundled, and it does nothing unless you turn it on. Local-first means the default is that nothing about your network leaves your machine.&lt;/p&gt;

&lt;p&gt;Being blunt about it, an AI guess is still a guess. It can be confidently wrong, it depends entirely on the quality of the signals underneath, and it's an assist, not an oracle. I'd rather it be honestly uncertain than smoothly incorrect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why identification is a best guess
&lt;/h2&gt;

&lt;p&gt;Every signal here is partial. MACs get randomized and spoofed, half your devices stay silent, DHCP and port data show up late or not at all, and a good scanner combines the weak signals into something better than any one of them without pretending the result is certain. That's the honest frame: a network scanner narrows down what a device probably is, and tells you how sure it isn't.&lt;/p&gt;

&lt;p&gt;DeviceShelf is a young project and I'm still improving how it fuses these signals. If it mislabels something on your network, or misses a device you can see with your own eyes, I'd genuinely like to hear about it. That kind of report is what makes the next version better. You can find it at &lt;a href="https://deviceshelf.app" rel="noopener noreferrer"&gt;https://deviceshelf.app&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>networking</category>
      <category>privacy</category>
      <category>selfhosted</category>
      <category>go</category>
    </item>
    <item>
      <title>Building a local-first network scanner in Go, Wails and Flutter</title>
      <dc:creator>DeviceShelf</dc:creator>
      <pubDate>Thu, 09 Jul 2026 13:34:48 +0000</pubDate>
      <link>https://dev.to/deviceshelf/building-a-local-first-network-scanner-in-go-wails-and-flutter-4f87</link>
      <guid>https://dev.to/deviceshelf/building-a-local-first-network-scanner-in-go-wails-and-flutter-4f87</guid>
      <description>&lt;p&gt;Most network scanners I tried wanted a cloud account and a subscription just to tell me what was sitting on my own LAN. That bugged me enough to build the opposite: a scanner that runs on your machine, keeps the data there, and still tells you what every device is. It's called DeviceShelf, and this is a short tour of how it's put together.&lt;/p&gt;

&lt;h2&gt;
  
  
  One core, three front-ends
&lt;/h2&gt;

&lt;p&gt;The scanning and analysis live in a Go core: ARP/ping sweep, port checks, service probes, DHCP fingerprinting, SNMP, and the device-identification logic. On the desktop that core is wrapped with &lt;a href="https://wails.io" rel="noopener noreferrer"&gt;Wails&lt;/a&gt; — Go on the backend, a normal web UI on the front — so the same engine ships on macOS, Windows and Linux without three native rewrites. The mobile apps are Flutter, talking to the same concepts (a chunk of the identification logic is mirrored and unit-tested on both sides so behaviour matches). And there's a headless build of the core for a 24/7 server edition with no GUI at all.&lt;/p&gt;

&lt;p&gt;Keeping one engine and swapping the shell is the only reason a solo project can cover desktop, mobile and server without drowning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Local-first, and meaning it
&lt;/h2&gt;

&lt;p&gt;"Local-first" is easy to put on a landing page and easy to quietly break. The rule here is simple: nothing about your network leaves the machine unless you switch something on. Device identification runs locally; the online fingerprint lookup is opt-in and off by default. If you want AI to help name a weird device, that's there too — but you bring your own key, so the calls are yours, not routed through a server I run.&lt;/p&gt;

&lt;h2&gt;
  
  
  The parts that were actually hard
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Identification.&lt;/strong&gt; Turning a MAC prefix, open ports, a DHCP fingerprint and an SNMP sysName into "this is a printer" is a pile of heuristics with sharp edges — a Nintendo Switch that looks like a network switch, say. It's ordered rules, not one magic classifier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live bandwidth.&lt;/strong&gt; Per-device throughput means packet capture (Npcap on Windows, BPF on macOS), which is platform- and permission-dependent and needs care to stay light.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The server edition.&lt;/strong&gt; Running unattended on a LAN changes everything: alert routing over ntfy/Gotify/webhook, threshold and dependency checks, and taming alert floods so it doesn't page you at 3am because Wi-Fi hiccuped.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where it is now
&lt;/h2&gt;

&lt;p&gt;Desktop and mobile are shipping; the server edition is an honest public beta. If you want to see what's on your own network without signing up for anything, that's the whole point.&lt;/p&gt;

&lt;p&gt;Full write-ups and release notes: &lt;a href="https://deviceshelf.app/blog" rel="noopener noreferrer"&gt;https://deviceshelf.app/blog&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>flutter</category>
      <category>privacy</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
