Aller au contenu
storagebits

Douze minutes entre l'idée et la télé

Quatre jours, six projets, 159 commits. Le délai entre « j'aimerais bien » et « ça tourne sur l'appareil » est devenu ridicule. Ce qui ralentit encore, c'est moi, mes câbles et mes quotas.

15 min de lecture#devlog#agents#android-tv#esp32

Jeudi 8 octobre, 20 h 34, j’envoie un prompt de mission à un agent. 20 h 46, l’heure s’affiche en grand sur ma télé, dans une typo choisie par l’agent.

Quatre jours plus tard : six projets, 159 commits, quelque 240 messages de ma part, dont une bonne partie font moins de cinq mots. « go T8 ». « vas-y présente la tranche 3 ». « c’est fait, reteste ».

Le délai entre l’intention et le concret est devenu ridicule. Douze minutes pour l’application Almanak. Seize pour Lukarne. Le goulot d’étranglement, maintenant, c’est moi : mon sommeil, mes câbles, mes quotas.

Quatre jours de commits, projet par projetUne ligne par projet, du jeudi 8 octobre 19 h au lundi 12 octobre 19 h. Chaque trait est un commit. Le cercle vide marque le premier message à l'agent ; le cercle plein, relevé au-dessus de la ligne, le premier résultat concret. Les nuits sont ombrées.ven. 9sam. 10dim. 11lun. 12jeu. 8Almanakjeu. 20 h 34 · prompt de mission20 h 46 · l'heure s'affiche sur la télé12 min11Homelabjeu. 21 h 19 · « c'est parti ! »22 h 00 · double authentification active sur la passerelle41 min63Lukarneven. 17 h 58 · prompt de mission18 h 14 · premier direct en plein écran16 min27DropboksTVdim. 15 h 18 · « read the prompt and go »16 h 02 · appairage réussi sur la télé44 min12shot2cartdim. 20 h 13 · « forget about previous session »23 h 01 · photo → liste → liens marchands2 h 4813Kronograflun. 3 h 19 · « read it and get started »3 h 48 · premier flash vérifié sur la montre29 min33premier message à l'agentpremier résultat concretun commitnuit
Une ligne par projet, du jeudi 19 h au lundi 19 h. Le chiffre à droite compte les commits. Survole les cercles pour les heures exactes.

Chaque ligne est un projet, chaque trait un commit. Le cercle vide, c’est mon premier message à l’agent. Le plein, relevé au-dessus de la ligne, c’est le premier truc concret : l’app qui tourne sur la télé, le firmware sur la montre, la double authentification active sur la passerelle du homelab. Les bandes grises, ce sont les nuits. Il y a des commits dedans. Pas toujours parce que j’étais debout.

# Jeudi soir : trois agents en 45 minutes

Le 8 au soir, en 45 minutes :

  • 20 h 34 : la mission Almanak part.
  • 20 h 36 : je relance shot2cart, un projet commencé en septembre avec un autre outil. « inspect project, it comes from an other AI conversation, inspect and we pursue ».
  • 21 h 07 : je télécharge depuis claude.ai le CLAUDE.md de mon homelab, que je redesign par LLM, et que je venais d’écrire avec une autre instance pendant que la première construisait Almanak.
  • 21 h 19 : « je viens de créer CLAUDE.md pour toi, c’est parti ! »

Personne n’attend personne. Pendant qu’un agent compile, j’écris la mission du suivant avec un troisième.

# Almanak, l’étincelle

Le north star tenait en une phrase :

Un écran qu’on a envie de laisser allumé. Quand je passe devant ma télé, je sais en 2 secondes : l’heure, la date, le temps qu’il fait et va faire, et dans combien de minutes passe mon prochain bus. C’est beau comme un objet de design, pas comme un dashboard d’admin.

Et une règle que j’ai gardée pour tous les projets suivants : aucune tranche n’est finie tant que l’agent ne l’a pas vue tourner sur la Shield. Il fait une capture par adb, il la lit, il la critique. Lisibilité à 3 m, overscan, débordements. Et pour chaque tranche visuelle, deux variantes, on garde la meilleure.

Almanak sur la télé, thème sombre : l’heure en grand, la date, le jour de l’année, les prochains bus et la météo sur cinq jours

Almanak, thème papier : l’heure, la fête du jour, les bus et la courbe de température des prochaines heures

Almanak sur la Shield le premier soir : le thème sombre à 22 h 17, le thème papier à 21 h 38.

Sept tranches entre 20 h 46 et 22 h 32. Pour l’horloge, l’agent a comparé une police serif éditoriale et une sans-serif suisse, et il a gardé Fraunces parce qu’à 3 m, Inter en graisse 200 « commence à ressembler à un fil de fer ». Il a raison.

Le meilleur bug : la synchro des horaires de bus renvoyait HTTP 441 sur la Shield et marchait depuis le Mac. L’agent a fouillé dumpsys connectivity et trouvé le VPN qui tourne sur la Shield : le site de la STM (le réseau de transport de Montréal) refuse les IP de sortie des VPN. Il a basculé sur un miroir du même flux, octet pour octet, et documenté le split tunneling dans le README. Le prompt ne parlait pas de VPN.

Pour être honnête : ma définition de « fini » demandait 24 h d’écran de veille sans fuite mémoire. La mesure réelle couvre à peu près une heure. Fini, donc. Avec des guillemets.

# Lukarne, mon préféré

Le lendemain, 17 h 58, deuxième mission. Une fenêtre sur le monde : faire tourner un globe à la télécommande, plonger sur une région, voir une mosaïque de webcams en direct, zapper d’une caméra à l’autre. La phrase qui compte dans le prompt :

Si une interaction n’est pas fluide à la télécommande, elle est ratée, même si elle est techniquement correcte.

Et une autre, plus discrète, qui explique pourquoi tout est allé si vite : « J’ai déjà développé une autre app Google TV avec toi sur cette même Shield. Avant toute chose, retrouve dans mon environnement […] comment on s’y connecte […]. Réutilise ce qui marche. » Chaque projet laisse derrière lui une adresse adb, un script de déploiement, un format de DECISIONS.md. Le suivant part de là.

18 h 14 : premier direct en plein écran sur la télé, HLS et YouTube, gauche/droite pour passer de l’un à l’autre. 16 minutes. À 20 h 54, la V1 était là : un globe jour/nuit en OpenGL à 60 images par seconde (3 ms par image), 1 640 caméras dans 34 régions (19 de plus depuis lundi), une mosaïque 3×3 dont la tuile sélectionnée passe en direct en deux secondes, et un bouton « surprends-moi » qui t’envoie là où il fait jour. Deux tests d’endurance de 22 minutes, zéro crash.

Le globe de Lukarne centré sur l’Europe de nuit, Venise sélectionnée, une webcam de la place Saint-Marc en incrustation

Lukarne : l’Europe de nuit, Venise sélectionnée, 16 webcams en direct, le bassin de Saint-Marc en coin d’écran.

Le plus simple, c’est de la regarder tourner :

78 secondes sur la Shield, sans le son : le globe jusqu'à la Californie, la plongée sur Pollock Pines, la mosaïque de caméras d'autoroute en direct, le plein écran, la caméra suivante, on remonte, puis « surprise me ».

Cette vidéo, c’est l’agent qui l’a tournée, lundi soir, pour ce billet. Il pilotait la Shield à la télécommande virtuelle (adb shell input keyevent) et enregistrait l’écran avec screenrecord. Il a fait une première prise en français, en Europe, où il était 1 h du matin : tout était noir. Il a refait la prise en anglais, en Californie, de jour.

La mosaïque de Pollock Pines : neuf caméras d’autoroute de l’US 50 en direct, la tuile sélectionnée encadrée

Plein écran sur une caméra d’autoroute en Californie, une voiture rouge au carrefour, le nom du lieu et l’heure locale en bas

La mosaïque d’un lieu, puis le plein écran. Gauche/droite passe à la caméra voisine sans repasser par la mosaïque.

Une aurore boréale verte au-dessus de Fairbanks, en Alaska, avec le nom de la caméra et l’heure locale

« surprise me » est tombé là-dessus, en plein tournage. La caméra aurore d’explore.org à Fairbanks, 15 h 09 heure locale : sans doute une rediffusion de la nuit entre deux plans en direct.

Puis je l’ai utilisée, et je me suis plaint. Samedi, 23 h 20 : « je suis assez surpris du peu de flux video , bcp d’images fixes qui apportent peu ». 23 h 34, commit : le direct d’abord, les images fixes en option. Quatorze minutes.

Dans la nuit de dimanche à lundi, minuit huit : « parfait , je vais dormir là ». Et deux demandes : « les vignettes pixelisée : on peut trouver un moyen de charger ne serait ce qu 1 frame propre plutôt que la vignette degeueu ? », et pour le dernier niveau de zoom, un « effet plongeant genre zoom google earth ». À 0 h 26, les vignettes sont des vraies images capturées sur l’appareil pendant la lecture. À 0 h 48, on plonge sur un lieu avec un zoom ×30, les lumières s’allument, et on remonte. À 0 h 59, test d’endurance de 10 minutes après tout ça. Je dormais.

Lundi après-midi, j’ai demandé un mode démo, pour que la télé voyage toute seule. 41 minutes plus tard :

Le mode démo : des caméras au hasard, là où il fait jour, jamais deux fois la même région, avec un fondu sur un carton-titre entre deux.

Le panneau de réglages de Lukarne ouvert sur le globe : langue, température, images fixes, lecteur en coin, durée par caméra du mode démo, crédits des sources

Les réglages, au bout de la télécommande : langue (anglais, français, espagnol), unités, images fixes ou direct seulement, lecteur en coin, durée par caméra du mode démo, et les crédits de chaque source.

Ce qui manque encore : la couverture en direct hors Amérique du Nord reste mince. Le premier jour, l’agent a brûlé tout le quota de recherche YouTube pendant que deux bugs cachaient les résultats. Aujourd’hui, un dépôt public republie chaque jour le catalogue des directs, et l’app le télécharge derrière son logo. Et il y a un bug que je ne sais pas toujours reproduire : une webcam YouTube qui reste figée quand on en enchaîne deux. Je l’ai signalé à 15 h 46, il y a eu un correctif à 16 h 31. Reste à le vérifier sur la télé.

# DropboksTV, un dimanche après-midi

Un client Dropbox pour la télé, pensé pour le canapé : photos et vidéos d’abord, lecture seule, pas de backend. Dimanche, 15 h 18 : « read prompt-dropbokstv-claude-code.md and go ». 16 h 02 : l’appairage par téléphone marche sur la télé. 18 h 28 : huitième et dernière tranche, avec la recherche, le mode hors ligne, l’écran de veille et 128 textes traduits par langue.

Le morceau le plus tordu, c’est l’appairage. Se connecter à Dropbox depuis une télé, sans clavier, ça devrait être un code à taper sur le téléphone. Sauf que l’API de Dropbox ne propose pas ce flux. L’agent l’a vérifié dans le SDK et l’a consigné dans son journal de décisions. Il a donc monté autre chose :

  • la télé affiche un QR code qui pointe vers une page servie par la télé elle-même, sur le Wi-Fi de la maison ;
  • le téléphone ouvre cette page, qui l’envoie autoriser DropboksTV chez Dropbox ;
  • Dropbox affiche un code, on le colle sur le téléphone, et la télé l’échange contre un jeton (PKCE : le secret ne quitte jamais la télé, pas de backend) ;
  • la session expire au bout de 10 minutes et la télé renouvelle le QR toute seule. Une faute de frappe ne grille pas la session. Et si le téléphone ne voit pas la télé, un bouton bascule sur le lien Dropbox direct.

Le petit serveur HTTP de la télé (150 lignes), il l’a repris d’Almanak.

Écran d’appairage de DropboksTV : trois étapes numérotées et un QR code, flouté ici

L’appairage

Et puis il y a le lecteur. En trois tranches, entre 16 h 25 et 18 h 07, l’agent a écrit une visionneuse qui ouvre à peu près tout :

  • les photos, avec un zoom ×2 et ×3 qu’on déplace aux flèches, et un diaporama en fondu ou en Ken Burns ;
  • les vidéos : H.264, HEVC jusqu’en 4K, reprise là où on s’était arrêté, sous-titres .srt ;
  • les PDF, page par page, avec zoom ;
  • Word et PowerPoint, que Dropbox convertit en PDF, et les tableurs, mis à l’échelle à 170 % pour être lisibles depuis le canapé ;
  • le Markdown mis en forme, le code avec numéros de ligne et coloration ;
  • la musique, MP3 et FLAC, avec la pochette ;
  • et pour tout le reste, un QR code qui envoie le fichier sur le téléphone.

Le lecteur vidéo a pris 16 minutes. Les documents, la musique et l’envoi vers le téléphone, 27. La folie.

Huit écrans de DropboksTV : une photo zoomée, une vidéo, un PDF, un tableur, des notes Markdown, du code Kotlin, un morceau de musique avec sa pochette et l’écran d’envoi vers le téléphone

Dans l’ordre : photo zoomée, vidéo, PDF, tableur, Markdown, code, musique, envoi vers le téléphone (QR flouté). Les fichiers de test, c’est l’agent qui les a fabriqués et déposés dans un dossier Dropbox dédié. Captures prises pendant le développement.

# Kronograf, ou le retour du matériel

Lundi, 3 h 19 du matin, une montre LilyGO T-Watch de 2020 branchée en USB, et une mission : un cadran de chronographe d’aviation, et des afficheurs 7 segments « circuits temporels ». À 3 h 48, premier flash vérifié sur la montre, après une sauvegarde complète de la flash d’origine. C’était la règle n° 2 du prompt : on n’écrit rien sur la montre sans filet. Le câble a lâché pendant la première sauvegarde, et l’agent a refusé de flasher tant qu’il n’en avait pas une complète.

La vraie T-Watch 2020 posée sur la table : écran de diagnostic Kronograf, mémoire, capteurs détectés en vert, batterie à 100 %

La vraie montre, lundi à 18 h 11 : l’écran de diagnostic, le premier écran flashé. En vert, les puces détectées ; en gris, ce que la V1 n’a pas.

Cadran chronographe d'aviation : lunette graduée, trois sous-cadrans batterie, minutes et pas, trotteuse orangeCadran à afficheurs 7 segments : destination en rouge, présent en vert, dernière synchro en orange

À gauche, capture de la vraie montre par le port série. À droite, le cadran « circuits temporels » dans le simulateur, qui compile exactement la même interface.

Là, le délai remonte, et ce n’est pas la faute de l’agent. Ce n’est plus du code contre un émulateur, c’est un connecteur micro-USB fatigué. Mes messages de la matinée : « elle plante systematiquement au bout de quelque secondes », « va vite sinon elle plante », « j’espère qu’elle n’est pas brikée ». Le problème venait du sommeil léger, avec une tempête d’interruptions au réveil par le bouton. À 11 h 17 : « ce semble tres bien tenir maintenant ». À 11 h 18 : « go pour la météo ». À 11 h 31, la montre affiche la météo et le prochain bus en temps réel.

Ce soir, elle a 33 commits, des alarmes, un chrono, un podomètre, des mises à jour par Wi-Fi et les notifications de l’iPhone en Bluetooth, qui accrochent encore mal. Le double tapotement est « un peu alétoire , comme le mouvement du poignet … mais ca passe ».

# Le homelab, et l’app shot2cart

Le chantier le plus long ne se voit pas. Soixante commits et 276 messages pour remettre à plat le serveur de la maison : état des lieux, sauvegardes avec de vrais tests de restauration, accès à distance par passkeys pour la famille, alertes, une page d’accueil avec un schéma animé de l’infra et un autre du réseau local.

Mon message préféré de toute la série, le premier soir : « ignore cet audit ; je ne compte que sur toi maintenant ». Le plus honnête, dimanche : « Nest dans Home Assistant c’est payant ??!! ». Et ouais, 5 $, merci Google.

shot2cart, c’est le contre-exemple. Le pitch de l’app, c’est une photo d’une liste de courses, et le panier s’ouvre chez le marchand en moins de 15 secondes, sans rien taper. Première tentative en septembre, avec un autre outil et un workflow de spécifications : trois jours, deux commits. Jeudi soir, je l’ai relancée sur cette base. Dimanche, 20 h 13, j’ai tout archivé : « forget about previous session, I archived the previous project and to start a new one with better prompt ». 23 h 01 : photo, analyse par un modèle de vision, liens marchands article par article. Minuit quatre : « I’m going to sleep […] please go as far as you can in full autonomy ». Le matin, il y avait la détection en streaming, des fiches de relecture et des parcours de test automatisés.

Même idée, même développeur. La différence entre septembre et ce dimanche, c’est la qualité des modèles, et notamment Opus 5.5. Une bête !!!

# Le délai, mesuré

TypeCe que j’ai demandéDélai jusqu’au commit
FEAT« ajoute la langue espagnole à l’application » (Lukarne)5 min
BUGLes voisins à 2 500 km : « je suis sur Londres mais la Patagonie est listée »5 min
BUGLe logo qui n’apparaît qu’une demi-seconde au lancement2 min
FEATPlus de direct, moins d’images fixes14 min
FEATLe zoom plongeant « genre Google Earth », demandé avant d’aller dormir40 min
FEATUn mode démo qui enchaîne les webcams au hasard41 min
BUGLa vidéo récente qui ouvre toujours une vidéo de 2012 (DropboksTV)2 min
FEAT« go pour la météo » sur la montre13 min

Ce qui ne va pas plus vite : un câble micro-USB qui se débranche, un quota YouTube qui se remet à zéro à 3 h du matin, une clé d’API que le portail du fournisseur refuse, mon abonnement. Dimanche, 16 h 46 : « il me reste que 10% pour notre session en cours ». Et mon sommeil, que j’ai fini par intégrer au plan : « je vais dormir la , avance au maximum de ton autonomie ».

Ce que je ne sais pas encore : combien de ces six projets j’utiliserai encore dans un mois. Faut aller au bout maintenant, publier ce qui est publiable, alimenter d’autres agents.

Ce billet a été fait pareil. Un message de ma part lundi en fin d’après-midi, en vrac, avec mes fautes de frappe : « génère moi un article complet […] mettre en avant le délai ridicule que c’est devenu entre l’intention et le concret ». Reprends tout en transparence et honnêteté. Le blog lui-même était en ligne 45 minutes après mon premier message, lundi à 4 h du matin.

En bref, une bonne fin de semaine !