Tom Daluzeau
← Projets

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.

Chrome liquide · Pétrole

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.

t = 0,00 s
image = f(t) · boucle de 12 s · image 1 / 360

2

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.

  1. La bouclePlanche de 24 images, les 12 images les plus agitées, et la jointure entre la fin et le début.
  2. Le pixelZooms ×6 sur les bords contrastés, recherche de bandes dans les zones lisses, test de scintillement.
  3. 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

4K · 30 images/s3840 × 2160, la référence× 1
Vertical2160 × 3840× 1
60 images/stoute taille× 2
8K7680 × 4320× 4

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.

73designs essayés
14designs dans l’app
147fonds, une fois déclinés 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

Schéma d’illustration, pas une mesure.

7

Côté DevOps

C’est la partie du projet la plus proche de mes études.

≈ 650 commits

Tout le code dans un dépôt privé. Pas de vidéos dans Git : tout se régénère depuis le code.

Garde-fous à chaque commit

Syntaxe, secrets écrits en dur, fichiers trop lourds. Une erreur bloque le commit.

Site statique bilingue

Fabriqué par un script Python. La fabrication échoue si un texte n’a pas sa traduction.

App Store Connect par API

Versions, fiche et captures passent par des scripts.

File de rendus

Elle choisit un Mac mini libre, synchronise, suit le travail et reprend après une coupure.

Agents programmés

Ils préparent brouillons et rapports avec launchd, mais ne publient rien sans mon accord.

Ce que j’en retiens

  1. Un contrat strict au départ (une image = une fonction du temps) simplifie tout ce qui suit.
  2. Mesurer avant d’optimiser.
  3. Automatiser la préparation, garder la décision : les machines proposent, je valide.