App macOS, en ligne depuis le 5 novembre 2026
Moireloop
Des fonds d’écran animés pour Mac, en boucle parfaite. Voici comment un fond passe d’une idée à un bureau, et pourquoi tout est calculé sur deux Mac mini M4.

1
Un fond est un programme
Chaque fond est une page web qui dessine une image en fonction du temps, et de rien d’autre. Pas de hasard, pas de minuteur, aucun état gardé d’une image à la suivante.
Le fond ci-contre est calculé en direct dans ton navigateur par un petit shader. Déplace le curseur : chaque position donne toujours la même image. À la fin, on retombe exactement sur le début, et la boucle n’a pas de raccord.
image = f(t) · boucle de 12 s · image 1 / 3602
La même boucle, image par image
Avant de valider un fond, je regarde une planche de 24 images réparties sur toute la boucle. Celle-ci est fabriquée à l’instant à partir du shader du dessus. La première et la dernière image se suivent sans saut : c’est le premier des trois contrôles.
- La bouclePlanche de 24 images, les 12 images les plus agitées, et la jointure entre la fin et le début.
- Le pixelZooms ×6 sur les bords contrastés, recherche de bandes dans les zones lisses, test de scintillement.
- Un relecteur indépendantUn second Claude, sans mémoire de la conversation, note les planches et dit si le fond est publiable.
3
De la page web à la vidéo 4K
Un navigateur sans écran ouvre la page, avance le temps d’une image, capture, et recommence. Puis ffmpeg assemble le tout. Comme chaque image se calcule seule, un rendu peut reprendre où il s’est arrêté.
360
images pour une boucle de 12 s à 30 images par seconde
0,25 à 0,6 s
de calcul par image en 4K sur un Mac mini M4
1 min 30 à 3 min 36
pour capturer cette boucle, avant l’encodage
Coût d’un rendu selon le format, la 4K servant de référence
4
Trois zones, aucun serveur à maintenir
Mon MacBook Air pilote. Deux Mac mini M4 calculent, joints en SSH par un réseau privé Tailscale. Cloudflare diffuse. L’app installée ne parle qu’à Cloudflare.
- Catalogue signé en Ed25519 : un catalogue modifié d’un seul mot est refusé.
- Vidéos chiffrées en AES-256, déchiffrées en mémoire pendant la lecture.
- Nouveaux fonds sans mise à jour : au lancement suivant, tout le monde les voit.
- Hors ligne, l’app reprend la dernière copie du catalogue et garde tous ses fonds.
5
Beaucoup d’essais, peu d’élus
Un design n’entre dans l’app que s’il passe les contrôles et que je le valide. Ensuite, il se décline en couleurs.
6
Une app qui sait s’arrêter
L’app est écrite en SwiftUI, environ 4 700 lignes, pour macOS 15 ou plus récent. Une fenêtre sans bord par écran, placée sous les icônes, joue la vidéo en boucle.
Un fond tourne toute la journée : l’énergie passe avant tout. La lecture se met en pause dès que personne ne regarde.
- Bureau caché
- Écran en veille
- Session verrouillée
- Batterie faible
- Mac chaud
- 15 min sans clavier ni souris
Une journée type : quand le fond joue, quand il se repose
lecturepause automatique
7
Côté DevOps
C’est la partie du projet la plus proche de mes études.
Tout le code dans un dépôt privé. Pas de vidéos dans Git : tout se régénère depuis le code.
Syntaxe, secrets écrits en dur, fichiers trop lourds. Une erreur bloque le commit.
Fabriqué par un script Python. La fabrication échoue si un texte n’a pas sa traduction.
Versions, fiche et captures passent par des scripts.
Elle choisit un Mac mini libre, synchronise, suit le travail et reprend après une coupure.
Ils préparent brouillons et rapports avec launchd, mais ne publient rien sans mon accord.
Ce que j’en retiens
- Un contrat strict au départ (une image = une fonction du temps) simplifie tout ce qui suit.
- Mesurer avant d’optimiser.
- Automatiser la préparation, garder la décision : les machines proposent, je valide.