Une liste complète de ce que l’app supervise, et le raisonnement derrière les choix techniques.
NetPulse lit les données de vos routeurs et les affiche sur un seul écran. Le sondage est en lecture seule ; ce qui écrit est toujours explicite et couvert par un retour arrière.
Un score de 0 à 100 qui condense latence, pertes, uptime et température. À côté, le débit WAN en direct face à votre forfait, la latence moyenne et les appareils connectés.
Carte sémantique construite à partir de la FDB du bridge et de LLDP quand disponible. Dessine routeurs, switches, hyperviseurs, conteneurs imbriqués, clients filaires et sans fil et tunnels WireGuard. Et quand l’inférence ne peut pas savoir où quelque chose est branché, ancrez l’appareil à son routeur et à son port exacts à la main.
Chaque client classé automatiquement par motifs de hostname et OUI, avec bande, signal en dBm, première apparition et le routeur ou port auquel il parle.
Vue d’ensemble de tous vos routeurs avec CPU, mémoire, température, uptime, clients connectés et un mini sparkline de charge sur 24 h. Les switches gérés sondés par SNMP sont aussi des citoyens de première classe, avec leur historique de trafic et leurs clients.
L’agent est un paquet OpenWrt natif (.ipk et .apk, de mips à x86/64) avec init procd, config UCI et watchdog. Le serveur installe et met à jour toute la flotte depuis l’UI, et renouvelle les jetons à chaud sans réinstaller.
Matrice de signal entre APs et clients, événements de roaming conservés 30 jours, et outils pour réancrer les clients sticky ou les expulser d’un AP afin qu’ils en choisissent un meilleur.
Un vrai spectre par radio : chaque réseau dessiné comme une cloche sur l’axe des fréquences, zones DFS ombrées et une bande d’occupation continue. Votre réseau, vu comme l’air le voit.
Vue par port des switches : vitesse négociée, trafic, erreurs, état du lien et alertes spécifiques comme port fantôme, flapping ou vitesse dégradée.
Liste de peers, derniers handshakes, transfert par peer et tunnel dessiné sur la carte de topologie, avec chaque peer étiqueté par son vrai nom issu de la configuration UCI.
Statistiques de requêtes DNS, part bloquée, domaines les plus bloqués et quels clients utilisent le filtre, à côté du reste du réseau.
Six catégories avec une urgence par catégorie : température, firmware disponible, nouvel appareil, handshake WireGuard, port réseau et événements de roaming. Fil dans la cloche et notifications Web Push.
Rapports de disponibilité quotidiens, hebdomadaires et mensuels par routeur et par appareil. En développement : trafic, activité, résumé des alertes et export.
Une seule colonne avec un index fixe qui vous suit au défilement : utilisateurs et rôles, langue par utilisateur, apparence avec aperçus réels, seuils de données, routeurs, services et intégrations, orchestration et mises à jour automatiques.
DEMO_MODE=1 lance un réseau d’exemple complet de 67 appareils sans routeurs réels. Utile pour tester l’interface avant d’installer.
luci-app-netpulse intègre l’état de l’agent dans l’interface web d’OpenWrt : procd, UCI, journaux, redémarrage et lien vers l’app principale.
Si vous n’avez pas de machine en plus, le serveur peut tourner sur le routeur OpenWrt lui-même, avec config UCI, pinning TLS et appairage local.
Un serveur MCP intégré sur /mcp : votre assistant IA interroge l’état de la flotte, les appareils, les alertes et la topologie en HTTP avec un token d’API. Outils en lecture seule sur le dernier sondage.
Dessinez votre baie 19 pouces, placez routeurs, switches et serveurs par unité U, et laissez NetPulse proposer le câblage à partir de la topologie détectée, uplinks entre routeurs compris. Aperçu très précoce.
NetPulse publie l’état de la flotte sur un broker MQTT et Home Assistant le découvre seul : il crée les appareils et leurs entités sans que vous définissiez quoi que ce soit à la main. Tout se passe sur votre réseau local.
NetPulse n’est pas un produit marketing : c’est un outil personnel construit pour résoudre de vrais problèmes. Voici les décisions qui suscitent le plus de questions.
NetPulse est né d’un réseau domestique avec quatre routeurs : un GL.iNet Flint 2 comme gateway et trois Xiaomi AX6 d’occasion. OpenWrt permet de flasher, d’inspecter et de contrôler le matériel. Sans cela, impossible de lire la FDB, iwinfo ou les événements iw qui alimentent l’app.
Un seul binaire statique avec CGO désactivé. Pas de toolchain C nécessaire sur la cible, mises à jour par échange atomique, et utilisateurs, sessions et séries temporelles stockés dans un SQLite local avec WAL. modernc.org/sqlite le rend totalement statique.
Le serveur génère sa propre paire de clés ed25519 et vous autorisez la clé publique sur chaque routeur. À partir de là, le sondage ne fait que lire : ubus, /proc, iwinfo, bridge fdb, wg show. Les actions qui écrivent (réserver une IP, bloquer un appareil, orchestrer des services, flasher un firmware) sont toujours explicites, déclenchées par un admin et appliquées avec un instantané et un retour arrière automatique.
NetPulse supervise un réseau ; il n’a pas besoin d’un conteneur pour ça. Un service systemd cloisonné avec un fichier d’unité simple, des journaux journald et un redémarrage automatique est plus léger et plus simple à opérer sur un petit LXC ou une petite VM.
L’interface est une SPA React avec Vite et Tailwind qui s’installe comme PWA. Le backend envoie des événements en direct par SSE toutes les ~5 s. Pas de polling constant ni de WebSocket : SSE est unidirectionnel, se reconnecte seul et fonctionne bien derrière des proxys domestiques.
Nous avons commencé avec DAWN pour le steering WiFi parce que c’était l’option la plus visible dans la communauté OpenWrt. En réseaux réels, nous avons vu qu’il pouvait refuser des authentifications en chaîne, expulser des clients de façon inattendue et garder des bugs non résolus dans le modèle peer-to-peer. usteer est le démon officiel d’OpenWrt, avec des fonctions équivalentes et un modèle plus stable. La migration vers usteer est en cours et conserve la même visibilité du roaming.
Il est important d’être honnête sur le périmètre. NetPulse ne prétend pas être :