All work

Home network dashboard

A dashboard for a home Wi-Fi mesh: where each access point is, how healthy it is, what is connected to it and what uses the most internet.

Role
Sole developer
Year
2026
Outcome
The weak spots in the house Wi-Fi became visible: which access point is struggling, which devices sit on it, and whether a change actually helped.
Built with
Vue 3, TypeScript, Vite, gridstack, ECharts, reka-ui, Node 22, SQLite (node:sqlite), Vitest, Docker
Home network dashboard: four access points and their status, the devices using the network now and today's traffic, on made-up data.
Screenshot on made-up data.

Why I built it

A mesh Wi-Fi system with four access points had patchy signal and warning lights, and its own app gave no reason why. A packet sniffer on one computer cannot see the rest of the house.

What it does

  1. The access points

    One tile per access point: model, role, whether it is online, the bands of its link back to the main unit, signal per band and the number of clients, with a light that is fine, limping or red. The same light is used on the tiles, the map and the topology, so they always agree.

    Illustration: four access point tiles with their lights: two fine, one limping, one offline.
  2. The map

    Each access point on the floor plan, one image per floor, with the links between them drawn in the colour of their light. Tap one to see its clients; in edit mode, drag it to where it really is. Dots mark spots tried before, coloured by how that went.

    The map: three access points lit on an invented floor plan, one limping on 2.4 GHz and one offline, with dotted links to their parent.
  3. What to fix

    A rules engine reads the latest poll and the last 24 hours and writes cards in plain English: an action, the reason, a "Seen:" line with the real numbers, a severity and a confidence. About a dozen rules: a satellite offline, a weak or 2.4 GHz-only link, a device that should be cabled, an upload hog, a crowded 2.4 GHz band, a unit that keeps dropping off. Rules that need data the system does not have are shown as inactive rather than guessed.

    What to fix: four suggestions in plain English, each with its "Seen:" numbers, a confidence and, where it helps, a restart button.
  4. Trials

    Every change becomes a trial: moving a unit, or restarting one, which is the only thing the app can change, one satellite at a time and always confirmed. The server compares the hour before with the time since, on signal, time on 5 GHz, time online and drops, and writes the verdict as a sentence with the numbers: better, worse, mixed, the same, or too early to tell.

    The backhaul over 24 hours, the lights of each access point over a week, and three trials with their verdicts in numbers. Made-up data.
  5. Usage and history

    Live speed per device with its band and access point, today's traffic for the busiest devices, each satellite's link over the last 24 hours, and a strip per access point showing its light over the week: how often it goes red, and when.

    Illustration: speed bars for four devices, and a week of lights for each access point, one with a few red marks.
  6. A layout you arrange

    The page is widgets on a grid. In edit mode you drag, resize and hide them, and bring them back from a tray; Save keeps the layout on the server for every browser. On a phone everything stacks in one column.

    Edit mode: the widgets with their grips, the tray of hidden ones to add back, and Discard changes or Save layout. Made-up data.
  7. Honest about its data

    A pill and a banner say whether the data is live, stale, broken, paused or unreachable, and live widgets fade as it ages. Pause stops polling for a while so the vendor's phone app can be used; otherwise the two log each other out.

    The data gone stale: an amber banner says the access point has not answered for two minutes, and the widgets fade. Made-up data.

How it works

Metadata, not content
It records which device, on which access point and band, how fast, and when. Never packet contents, domains or browsing, and a recorded decision forbids adding anything that could collect them. The household knows it exists and what it records.
An undocumented API
The vendor has no public API. The collector polls the main unit's local web API every 30 seconds, with a protocol ported to Node from an open-source Home Assistant integration: a key exchange, then signed and encrypted requests. It never makes the call that returns the Wi-Fi passwords. Along the way: the speeds are kbit/s, not the KB/s the community labels say; wired clients are not measured at all; and polling faster than every 30 seconds makes the unit drop connections.
Storage
The SQLite that comes with Node: 30-second samples kept for 30 days, hourly summaries for a year, and a nightly backup. Failed polls back off, and a wrong password stops the collector so the account does not get locked.
Safety
No login of its own: it sits behind the same two-factor sign-in as the other apps. The vendor password lives only in an environment file. A restart is allowed for one satellite at a time, from an allowlist, never the main unit, and is refused while polling is paused or the data is old.

How it is built and tested

Tests
About 210 tests, none of them on the real network. The collector is tested against a fake access point that speaks the real encrypted protocol, and about 40 tests cover the rules engine.
Why build it
Home Assistant with community cards would have covered most of it, but on a small server it meant unclear memory use, a second login, and about 75 hand-written sensors before per-device history lasted more than ten days.

How Atta helped

  • A research brief with nine questions came before any stack was chosen; the agent team was generated only once the stack was settled.
  • What it learned about the mesh's local API (speeds come in kbit/s, poll gently) went into the shared wiki for any later project.
  • A screen sketch was published as a page to agree the layout before building it.
  • Standing rules such as metadata, not content were written as directives every agent follows.