Jerem abaede799e Claude: persiste le backoff OAuth sur disque (un redéploiement ne re-sollicite plus le 429)
Le backoff anti-429 du refresh OAuth vivait uniquement en mémoire : chaque
redéploiement le remettait à zéro et re-sollicitait IMMÉDIATEMENT l'endpoint de
refresh rate-limité, entretenant le 429 qu'on cherche justement à laisser retomber.

Persiste backoff_until + le palier exponentiel (failures) sur /data
(claude_oauth_state.json), écriture atomique best-effort à la manière du cache
trackers. Chargé une fois par process en tête de fetch_usage, sauvé à chaque
échec et effacé à chaque succès. Un token frais court-circuite de toute façon le
backoff, donc un re-login isolé débloque immédiatement même si une fenêtre court.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 01:04:53 +02:00

Monitorink

Transforme une Kobo Libra 2 (e-reader e-ink) en écran de monitoring domestique affichant : heure, météo, statuts du NAS, ratios des trackers, et surtout le reste de tokens des abonnements Claude et Codex.

Aperçu du dashboard Monitorink

Rendu généré hors-ligne avec données fictives (dev/preview.py).

Architecture

[Serveur]  backend PNG (FastAPI + Playwright, Docker, derrière un reverse proxy)
              ├─ Claude   : GET /api/oauth/usage (login isolé dédié, scope user:profile)
              ├─ Codex    : usage ChatGPT/Codex via un token openai-codex (auth.json monté)
              ├─ Météo    : Open-Meteo (sans clé)
              ├─ NAS      : endpoint HTTP exposant l'état du NAS (/api/status)
              └─ Trackers : ratios des trackers torrent privés (login session)
                    │
                    └── GET /image.png  (1264×1680 niveaux de gris)
                              │  WiFi à la demande
                        [Kobo Libra 2]  boucle NickelMenu : fetch → fbink → suspend rtcwake

Toutes les sources sauf Claude (Codex, NAS, trackers) sont optionnelles : laisser la variable d'env correspondante vide masque la section. Voir .env.example.

  • backend/ — serveur Python qui agrège les données et génère l'image du dashboard.
  • kobo/ — scripts client pour la Kobo (overlay sur usetrmnl/trmnl-kobo).
  • dev/ — utilitaires de dev (sonde de l'endpoint usage, aperçu hors-ligne preview.py).

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 de la machine de dev ou du serveur. Le backend lit/rafraîchit uniquement ce fichier isolé (/creds/.credentials.json), jamais le ~/.claude partagé.

Démarrage backend (dev)

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 (serveur, Docker)

  1. Login Claude isolé dédié (scopes complets) sur le serveur : CLAUDE_CONFIG_DIR=~/.monitorink-claude claude auth login
  2. Créer .env (depuis .env.example) : coords météo, NAS, trackers. Adapter les chemins des volumes dans docker-compose.yml (login Claude → /creds, données → /data).
  3. docker compose up -d --build, puis exposer le service via le reverse proxy de ton choix (le docker-compose.yml fourni utilise caddy-docker-proxy à titre d'exemple).

Voir kobo/README.md pour l'installation côté Kobo.

Description
No description provided
Readme 593 KiB
Languages
Python 70.6%
Shell 15.9%
HTML 13%
Dockerfile 0.5%