L'ancien triple-tap via finger_trace dessinait des points noirs (outil de demo FBInk), ne respawnait pas (mort definitif si le process tombait) et le tactile ne reveille pas l'appareil. Le power, lui, n'emet que des scancodes MSC_SCAN parasites (etat de charge USB). Les boutons de page emettent des EV_KEY propres (codes 193/194). reboot_watcher.sh: lit l'evdev (FD persistant, pas de perte d'evenements), declenche sur 3 press EV_KEY < 3 s, boucle de respawn. Plus de finger_trace. Refresh: full force au (re)demarrage (reset=1 cote client -> oubli de prev_image cote serveur) pour eviter un refresh partiel pose sur un ecran efface par le reboot.
Monitorink
Transforme une Kobo Libra 2 (e-reader e-ink) en écran de monitoring domestique affichant : heure, météo, statuts Home Assistant, et surtout le reste de tokens de l'abonnement Claude.
Architecture
[Homelab] backend PNG (FastAPI + Playwright, Docker, derrière Caddy)
├─ Claude : GET /api/oauth/usage (token longue durée `claude setup-token`)
├─ Météo : Open-Meteo (sans clé)
└─ Home Assistant : API REST /states
│
└── GET /image.png (1264×1680 niveaux de gris)
│ WiFi à la demande
[Kobo Libra 2] boucle NickelMenu : fetch → fbink → suspend rtcwake
backend/— serveur Python qui agrège les données et génère l'image du dashboard.kobo/— scripts client pour la Kobo (overlay surusetrmnl/trmnl-kobo).dev/— utilitaires de dev (sonde de l'endpoint usage Claude).
Le « reste de tokens Claude »
L'endpoint OAuth /usage (celui derrière la commande /usage de Claude Code) renvoie des
pourcentages d'utilisation des fenêtres glissantes (session 5 h + hebdo), pas un nombre brut
de tokens — Anthropic n'expose pas de compteur absolu côté abonnement. Monitorink affiche donc
le % restant (100 − utilisation) et le temps avant reset. (ChatGPT : hors scope, aucune
API officielle de quota restant.)
L'endpoint /usage exige le scope OAuth user:profile, que le token claude setup-token
n'a pas (403). Le backend utilise donc les credentials d'un login Claude isolé dédié
à Monitorink (CLAUDE_CONFIG_DIR séparé) : scopes complets + lignée de refresh token propre,
sans aucun conflit avec le Claude Code du Mac ou du homelab. Le backend lit/rafraîchit
uniquement ce fichier isolé (/creds/.credentials.json), jamais le ~/.claude partagé.
Démarrage backend (dev, sur Mac)
cd backend
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
.venv/bin/python -m playwright install chromium
cp ../.env.example ../.env # puis compléter
.venv/bin/uvicorn app:app --reload --port 8080
# -> http://localhost:8080/image.png et /debug.html (itération design)
Déploiement (homelab, Docker + Caddy)
- Login Claude isolé dédié (scopes complets) sur le homelab :
CLAUDE_CONFIG_DIR=/home/jerem/.monitorink-claude claude auth login - Créer
.env(depuis.env.example) : coords météo, config HA. Le compose monte~/.monitorink-claudesur/creds(lecture/écriture pour le refresh du token). docker compose up -d --build(le service s'expose via caddy-docker-proxy surmonitorink.homelab.nestor-server.fr).
Voir kobo/README.md pour l'installation côté Kobo.