NAPWATCH : pourquoi votre MacBook se vide la nuit, enfin visible en temps réel
https://github.com/Tuguberk/napwatch
📌 NAPWATCH est un TUI macOS (Rust + ratatui) qui diagnostique et contrôle le comportement énergétique de votre machine : dark wakes, Power Nap, consommation en Watts en temps réel, et processus gourmands.
L’origine de l’outil est aussi son meilleur cas d’usage. Un MacBook qui tombe à 0 % après quelques jours fermé — on pense d’abord à une app qui tourne en arrière-plan. Mais non. La commande pmset -g stats révèle le coupable : 1 342 dark wakes contre seulement 6 réveils utilisateur en une semaine. La machine se réveillait toutes les quinze minutes, jour et nuit, pour Power Nap — synchronisation mail, iCloud, Calendar, et vérifications FileVault. Aucune app coupable. Juste macOS qui s’active tout seul.
NAPWATCH transforme cette enquête en un tableau de bord continu. Trois questions, un seul écran : qu’est-ce qui consomme maintenant, la machine dort-elle vraiment, et quels réglages puis-je inverser sans quitter le terminal ?
La lecture batterie ne se contente pas d’un pourcentage. Elle tire la consommation instantanée en Watts directement d’ioreg — InstantAmperage, Voltage, AppleRawMaxCapacity — ce qui donne un chiffre juste dès le premier relevé, sans attendre trois minutes qu’un delta de pourcentage se stabilise. Une version antérieure fonctionnait par fenêtre glissante sur les pourcentages entiers ; elle a été remplacée parce qu’elle imposait justement cette attente.
Le flux des réveils est la pièce maîtresse. pmset -g log alimente un fil en direct, colorisé par type — Sleep, DarkWake, Wake — avec une raison nettoyée. Coupez Power Nap avec p, et vous voyez les entrées DarkWake cesser d’apparaître sous vos yeux. C’est la validation immédiate de la correction. Le log complet étant coûteux à parser (plus d’une seconde après quelques jours d’historique), il est échantillonné sur un cycle plus lent, environ seize secondes.
Le tableau des processus mérite un détail. macOS classe par energy-impact via top, mais top -l 1 renvoie 0.0 partout — la puissance est un taux, il faut deux échantillons. NAPWATCH lance donc top -l 2 et ne garde que le second. La sélection suit le PID, pas la ligne : le processus reste sélectionné même si le tri le déplace à chaque rafraîchissement. Le détail (Enter) affiche chemin complet, parent, label launchd, et pour les app bundles, le nom lu depuis Info.plist via plutil — indépendant de l’indexation Spotlight, contrairement à mdls.
Les réglages basculent au clavier : Power Nap, Wake for network access, Low Power Mode, Standby, TCP Keepalive. Le sudo est demandé une fois au démarrage et rafraîchi toutes les soixante secondes en arrière-plan — pas de re-saisie en plein usage. Sans sudo, l’app fonctionne en lecture seule mais kill et renice restent actifs sur vos propres processus.
J’ai trouvé l’approche honnête. NAPWATCH n’invente rien — tout passe par des outils macOS standards (pmset, ioreg, top, ps, plutil), aucune API privée. La valeur est dans la mise en relation : un seul écran qui rend visible ce qui est normalement invisible et silencieux. Pour qui possède un MacBook qui se vide inexplicablement, c’est l’outil de diagnostic le plus direct que j’aie vu.
Points clés :
- 🔋 Watts instantanés depuis
ioreg(zéro temps d’attente) - 🌙 Fil en direct des dark wakes via
pmset -g log - ⚙️ Bascule Power Nap, Wake-on-LAN, Low Power Mode au clavier
- 👁️ Tableau processus par energy-impact (
top -l 2) - 🔍 Détail PID : chemin, parent, label launchd, bundle Info.plist
- 🛠️
napwatch --once/--wake-logpour le debug hors TUI - 📦 macOS only, Rust, MIT, Homebrew
Tuguberk/napwatch/napwatch
