Des scènes interactives — physique de dés, IA de jeu, animations — enregistrées en base et rendues en temps réel.
Extension · Widgets 3D · 04/11
Tether
« Mac Island »
Des widgets vivants en 3D, pilotés par l'IA et l'extension — le 421, le damier, un diaporama, le score de Wimbledon, en temps réel.
Comment ça est né
Tether est parti d'une idée simple : et si mon écran macOS était une « île » — un lieu où des widgets vivants en 3D se mettaient à jour toute seule, sans que j'aie à ouvrir une app ? Le 421 qui roule, un damier qui s'anime, un score qui se met à jour. C'est l'idée d'un écran qui a une vie, pas juste un fond d'écran.
Le projet est devenu la brique « écran » de l'écosystème Igor : c'est lui qui affiche, mais aussi qui pilote — un onglet Tâches qui relance les tâches d'Igor directement depuis l'extension, avec feedback immédiat et notifications push.
Le contexte
Tether est une « île » d'écran pour macOS : des widgets qui vivent en 3D et qui se mettent à jour tout seuls. Ce ne sont pas des images, ce sont des scènes interactives rendues en Three.js — une physique de dé, une IA de jeu, une scène animée.
Chaque widget est une petite application 3D enregistrée en base : la physique d'un dé, une IA de jeu, une scène animée. Le 421, le damier en 3D, un diaporama — et des données du monde réel, comme le résultat de Wimbledon, récupérées par scraping et mises à jour automatiquement.
En plus d'afficher, l'extension pilote : un onglet Tâches permet de surveiller et de relancer les tâches Igor directement depuis l'extension, avec notifications push et proxy des actions vers l'assistant. C'est le pont entre l'écran et le noyau.
Ce qui distingue Tether, c'est la persistance : les scènes et les tâches sont en base, pas en mémoire. On ferme l'extension, on la rouvre, et l'île est toujours là, au même état.
• En vidéo — le codage de Tether
Le point dur
Un widget 3D, ça semble simple — un Three.js qui rend une scène. Mais une scène « vivante » qui se met à jour toute seule, c'est un mini-jeu : il faut un état persistant, une logique qui tourne (physique de dé, IA de jeu), et une source de données qui se met à jour sans que j'intervienne. J'ai dû concevoir un moteur de widgets où chaque widget est une entité avec son propre état, son propre cycle de vie, et sa propre source de données.
Le deuxième point dur, c'est le scraping des données du monde réel (ex. Wimbledon) : les sources changent, les structures bougent, et il faut que le widget se mette à jour sans casser. J'ai dû construire un parser résilient avec fallback, et un mécanisme d'auto-update qui retente proprement.
Fonctionnalités
Des widgets signatures : le 421 et un damier rendu en 3D, jouables et animés.
Le score de Wimbledon et d'autres données vivent dans le widget et se mettent à jour sans intervention.
Surveiller et relancer les tâches Igor depuis l'extension, avec un retour immédiat.
Les actions de l'extension sont proxied vers Igor, qui renvoie les notifications.
L'île survit à la fermeture : l'état des scènes et des tâches est persisté.
Arbitrages techniques
Stack technique
En chiffres
Parcours du projet
-
Widgets
Moteur de widgets 3D en Three.js, scènes enregistrées en base.
-
Scènes signatures
Le 421, le damier 3D, la physique de dés, le diaporama.
-
Temps réel
Scraping des données du monde réel (ex. Wimbledon) avec mise à jour automatique et fallback.
-
Pilotage
Onglet Tâches, relance des tâches Igor, notifications push, proxy des actions.
-
Persistance
Scènes et tâches en base — l'île survit à la fermeture de l'extension.
Ce que ça a rendu
-
01
Un écran qui a une vie
Des widgets 3D qui s'animent et se mettent à jour tout seuls — pas un fond d'écran.
-
02
Pont écran ↔ noyau
L'onglet Tâches pilote Igor directement depuis l'écran, avec feedback.
-
03
Données vivantes
Les données du monde réel (ex. Wimbledon) sont dans l'île, en auto-update.