← All work

Sensing

WiFi Atlas

At home the Wi-Fi either worked or it did not, and the only reading I had was a hunch. So I made the signal something you can walk through and look at.

Year
2026
Role
Solo — iOS app, signal pipeline, map rendering
Status
In development
WiFi Atlas — walk through your room and the app maps signal strength in AR. A phone shows 53% Fair at 64ms ping, with the trail of spheres turning from green to purple through a doorway
Walk the room and the signal is painted into the space behind you. Green to purple is excellent to no signal.

The problem

Parts of our apartment had Wi-Fi and parts did not, and I had no way to see where the boundary was. Every tool I could find gave me a number for where I was standing. I wanted to look at the problem, not read it.

WiFi Atlas measures connection quality continuously while you walk and paints the result into the space behind you in augmented reality — green for strong, yellow for fair, purple for no signal. Save the walk and it flattens into a top-down floor map: a coverage heatmap with the dead zones outlined and measured in real metres. Surveys never leave the device.

How it changed

Each version below exists because the one before it was wrong about something specific.

  1. v1

    Read the radio directly

    Why
    The obvious measurement is RSSI — the actual radio signal strength of the connected network.
    Change
    Built `HotspotSignalSource` on `NEHotspotNetwork.fetchCurrent`, normalising raw signal strength to a 0–1 score that drives the colour ramp.
    Result
    It works, but it needs the Access WiFi Information entitlement, which needs a paid developer account, plus location permission before iOS will disclose the connected network at all. On a free account the app simply has nothing to draw. iOS also refuses to scan neighbouring access points at all, so 'where is my Wi-Fi weak' is answerable and 'am I clashing with my neighbour's channel' is not.
  2. v2

    Measure the experience instead of the radio

    Why
    A survey tool that requires an entitlement most people cannot get is a survey tool nobody runs.
    Change
    Added `GatewaySignalSource`, which sends ICMP echoes to the router and derives a score from round-trip time and packet loss. No entitlement required. Both sources sit behind one `SignalSource` protocol, and `CompositeSignalSource` silently picks whichever currently works — promoting to the radio source mid-scan if permission is granted later, without restarting the walk.
    Result
    The app now runs on a free Apple ID. It also measures a subtly different and arguably more honest thing: experienced quality rather than radio strength. A room can show four bars and still be unusable, and the latency probe catches that where RSSI does not.
    AR view by the balcony: 99% Excellent, ping 8ms, 13 points, a trail of green spheres
    By the balcony — 99%, 8ms.
    AR view in the hallway: 53% Fair, ping 64ms, 40 points, green spheres turning purple
    Same walk, one wall further in — 53%, 64ms. The trail turning purple is the dead zone appearing in real time.

Where it landed

The fallback stopped being a fallback. Latency to the gateway is what a person actually feels, so shipping it as a first-class source made the map more useful, not less — and made the whole app installable by anyone with an iPhone and no developer account.

The parts that can be verified without hardware are covered by 155 tests: normalisation and the colour ramp, immutability of the survey model, storage round-trips, the source-fallback policy, IPv4 and subnet arithmetic, ICMP packet framing, and the map projection, rotation, IDW interpolation and coverage masking.

A saved survey flattened to a top-down floor map: the walked path over a green-to-purple heatmap, 86% average, 1% weak area, 27.9 square metres, 3.4% loss, 72 points
The same walk, saved and flattened. 27.9 m² surveyed, 86% average, and the 1% that is unusable marked where it actually is.

Built with

  • Swift
  • ARKit
  • RealityKit
  • ICMP / networking
  • Swift Testing