Signal Boy

WiFi survey tool that runs on your own machine. Walk around your house and watch the dBm move.

npx signalboy

Node 20+ · macOS, Windows, Linux · zero dependencies · MIT

Download for Android

The Android app reads WifiManager directly — exact dBm for your own connection, exact dBm for every nearby access point, plus BLE device hunting by audio and radar. It never shows a distance; no BLE or WiFi radio measurement supports one. Installing it needs allowing installs from your browser once.

What it does

Signal Boy reads the WiFi signal strength of the machine it runs on, once a second, and renders it on a Game Boy-style LCD in your browser. A Kalman filter drives the displayed number so it settles on the true value instead of jittering; an EWMA drives the sparkline so it stays responsive enough to show you walking.

Use it to find dead zones, pick a router location, work out whether a wall is the problem, or check that a mesh node actually helped.

How you use it

  1. Run it on the machine you want to measure. It starts instantly and prints two URLs — one local, one for your network.
    $ npx signalboy
    
      SIGNAL BOY  ->  platform MACOS
      local       ->  http://localhost:3000
      network     ->  http://192.168.1.14:3000  (en0)
  2. Open the local URL. You get a live dBm readout, a quality band, the noise floor and SNR where your OS reports it, plus the channel, band and PHY mode you are connected on.
  3. Open the network URL on your phone. Same page, same data, served off your laptop. This is the point — your phone becomes a remote display, so you can carry the number around while the laptop stays put. Both devices need to be on the same WiFi.
  4. Walk. Stand somewhere, wait two or three seconds for the filter to settle, note the number. Repeat. Anything at −67 dBm or better is comfortable; below −80 you are in trouble.

Reading the number

dBm What it means
−30 to −50 Excellent. You are next to the router.
−50 to −67 Good. Video calls and streaming are fine.
−67 to −70 Usable. Fine for browsing, marginal for calls.
−70 to −80 Weak. Expect stalls.
Below −80 Effectively unusable.

Signal is logarithmic: −60 dBm is ten times the power of −70 dBm, not 17% more.

Options

npx signalboy --https           # serve over TLS (see below)
npx signalboy --port 8080       # bind a specific port
npx signalboy --interval 500    # poll twice a second
npx signalboy --platform linux  # force a backend
npx signalboy --help

Phones

A phone browser cannot read WiFi signal strength. There is no Web API for it on Android or iOS — the OS reserves that for native apps. So on a phone, Signal Boy shows you the host machine's readings over the network. That is still the useful thing: the laptop measures, the phone displays.

Phones do carry sensors a laptop doesn't — a rear camera, a magnetometer, and on Android, Web Bluetooth. But browsers only expose those in a secure context, and http://192.168.1.14:3000 is not one. Over plain HTTP they stay greyed out. Running with --https generates a self-signed certificate covering your current LAN addresses and serves over TLS. Your phone warns once; accept it and those sensors become available while the page still talks to your laptop.

Why isn't there a hosted version to try? Because it could not work. A page served from an HTTPS origin cannot fetch http://192.168.1.14:3000 — browsers block mixed content with no override. A hosted copy would get a secure context and lose every reading. The daemon has to serve the page itself, which is why this site is documentation and the tool is an npx command.

What works where

Capabilities differ sharply by OS, and they do not form a hierarchy — Windows sees every nearby access point while macOS refuses to. Signal Boy reads this matrix at runtime and greys out what your platform cannot do, with the reason printed next to it. It never shows you a number it had to invent.

Capability macOS Windows Linux
Own signal Exact Yes Exact
Scan all APs No Full Partial
See own SSID No Yes Yes
Noise / SNR Yes No Driver

macOS removed the airport CLI in 14.4 and reclassified WiFi metadata as location data. system_profiler still reports your connected network's signal and noise without sudo, which is enough to survey your own network, but neighbouring SSIDs come back redacted. Windows is the strongest platform here: netsh lists every visible AP with SSID, BSSID, band, channel and signal, with no admin rights. Linux reads true dBm from /proc/net/wireless with no root.