A complete list of what the app monitors, and the reasoning behind the technical choices.
NetPulse reads data from your routers and shows it on one screen. Polling is read-only; anything that writes is explicit and covered by rollback.
A 0-100 score that condenses latency, loss, uptime and temperature. Next to it, live WAN throughput against your contracted plan, average latency and connected devices.
Semantic map built from the bridge FDB and LLDP when available. Draws routers, switches, hypervisors, nested containers, wired and wireless clients and WireGuard tunnels. And when inference cannot know where something is plugged, pin any device to its exact router and port by hand.
Each client automatically classified by hostname patterns and OUI, with band, signal in dBm, first-seen and the router or port it talks to.
Fleet-wide view of all your routers with CPU, memory, temperature, uptime, connected clients and a 24 h load sparkline. SNMP-polled managed switches are first-class citizens too, with their own traffic history and clients.
The agent is a native OpenWrt package (.ipk and .apk, from mips to x86/64) with procd init, UCI config and a watchdog. The server installs and updates the whole fleet from the UI, and rotates tokens in place without reinstalling.
Signal matrix between APs and clients, roaming events kept for 30 days, and tools to re-anchor sticky clients or kick them off an AP so they choose a better one.
A real spectrum per radio: every network drawn as a bell on the frequency axis, DFS ranges shaded, plus a continuous occupancy strip. Your network, the way the air sees it.
Per-port view of switches: negotiated speed, traffic, errors, link state and specific alerts like ghost port, flapping or degraded speed.
Peer list, last handshakes, transfer per peer and tunnel drawn on the topology map, with each peer labeled by its real name from the UCI config.
DNS query statistics, blocked percentage, top blocked domains and which clients use the filter, all next to the rest of the network.
Six categories with per-category urgency: temperature, available firmware, new device, WireGuard handshake, network port and roaming events. Feed in the bell and Web Push notifications.
Daily, weekly and monthly availability reports per router and per device. In development: traffic, activity, alert summary and export.
One column with a sticky index that follows you as you scroll: users and roles, per-user language, appearance with real previews, data thresholds, routers, services and integrations, orchestration and auto-updates.
DEMO_MODE=1 spins up a complete sample network with 67 devices without real routers. Useful for testing the UI before installing.
luci-app-netpulse integrates the agent status inside the OpenWrt web interface: procd, UCI, logs, restart and a link to the main app.
If you do not have a spare box, the server can run on the OpenWrt router itself, with UCI config, TLS pinning and local pairing.
An MCP server embedded at /mcp: your AI assistant queries fleet status, devices, alerts and the topology graph over HTTP with an API token. Read-only tools on the latest poll.
Draw your 19-inch rack, place routers, switches and servers by rack unit, and let NetPulse propose the cabling from the detected topology, including router-to-router uplinks. Very early preview.
NetPulse publishes the fleet state to an MQTT broker and Home Assistant discovers it on its own: it creates the devices and their entities without you defining anything by hand. Everything happens on your local network.
NetPulse is not a marketing product: it is a personal tool built to solve real problems. These are the decisions that get the most questions.
NetPulse was born from a home network with four routers: a GL.iNet Flint 2 as gateway and three second-hand Xiaomi AX6. OpenWrt lets you flash, inspect and control the hardware. Without that there would be no way to read the FDB, iwinfo or iw events that feed the app.
A single static binary with CGO disabled. No C toolchain needed on the target, updates with an atomic swap, and users, sessions and time series stored in a local SQLite with WAL. modernc.org/sqlite makes it fully static.
The server generates its own ed25519 key pair and you authorize the public key on each router. From there polling only reads: ubus, /proc, iwinfo, bridge fdb, wg show. Writing actions (reserve an IP, block a device, orchestrate services, flash firmware) are always explicit, admin-triggered, and applied with a snapshot and automatic rollback.
NetPulse monitors a network; it does not need a container to do it. A sandboxed systemd unit with simple service file, journald logs and automatic restart is lighter and easier to operate on a small LXC or VM.
The UI is a React SPA with Vite and Tailwind that installs as a PWA. The backend pushes live events via SSE every ~5 s. No constant polling, no WebSocket: SSE is unidirectional, reconnects by itself and works well behind home proxies.
We started with DAWN for WiFi steering because it was the most visible option in the OpenWrt community. In real networks we saw it could deny authentications in a chain, kick clients unexpectedly and keep unresolved bugs in the peer-to-peer model. usteer is the official OpenWrt daemon, with equivalent features and a more stable model. The migration to usteer is in progress and keeps the same roaming visibility.
It is important to be honest about scope. NetPulse does not pretend to be: