Présentation
SCM (Screen Memories) est une application macOS qui indexe chaque image et chaque image‑clé d’une vidéo afin de les rendre interrogeables par texte naturel. Le traitement s’effectue entièrement sur la machine : aucune donnée n’est envoyée vers le cloud et les modèles de vision, de reconnaissance optique de caractères (Tesseract) et de transcription audio (Whisper) sont téléchargés une seule fois. Le poids du modèle CLIP par défaut est d’environ 435 Mo, après quoi l’application fonctionne hors ligne.
Architecture et fonctionnement
L’application repose sur Electron, empaqueté avec electron-builder pour produire un DMG ou un ZIP. Le code source utilise Bun comme gestionnaire et exécuteur de paquets, Vite pour la compilation du rendu React et TypeScript pour le typage. Le processus d’indexation s’appuie sur un pipeline en deux temps : d’abord un pré‑filtrage des noms de fichiers, puis l’inférence du modèle de vision qui génère des embeddings. Les scores sont calculés par similarité cosinus, avec des majorations basées sur la présence de mots‑clés dans le nom de fichier et un filtre de diversité qui élimine les quasi‑doublons. Chaque vidéo est découpée en scènes ; chaque scène reçoit un embedding et un badge de timecode, limitant le nombre de scènes par vidéo à trois pour éviter la surcharge.
# Installation via Homebrew (Apple Silicon, macOS 12+)
brew tap allenv0/scm
brew trust allenv0/scm
brew install --cask allenv0/scm/scm
Les commandes de développement utilisent Bun :
# Lancer le mode développeur
bun run dev
# Démarrer l’application sans recompilation
bun start
# Recompiler le bundle React
bun run build
Analyse des performances et limites
Le recours à CLIP pour la recherche d’images offre une correspondance sémantique robuste, mais la précision dépend de la qualité de l’embedding et de la diversité du jeu de données. Le filtre de « honesty floor » ajuste le seuil de confiance par modèle, réduisant les faux positifs. L’OCR utilise Tesseract avec le jeu de langues anglais + 35 langues ; les requêtes CJK sont traitées comme des bigrammes qui augmentent la couverture mais peuvent générer des correspondances partielles. Whisper, intégré pour la transcription de dialogues, fonctionne en deux niveaux de précision : un mode exact et un mode tolérant, ce qui influe sur le temps de traitement. L’indexation initiale d’un volume important de médias peut être longue, car chaque image et chaque scène vidéo nécessite un calcul d’embedding. Cependant, le système de hachage de contenu déduplique les fichiers renommés et ré‑embed les nouveaux modèles en arrière‑plan, limitant l’impact sur l’expérience utilisateur.
Déploiement et sécurité
Le modèle de distribution via Homebrew cask supprime automatiquement le flag de quarantaine macOS, évitant les étapes manuelles de Gatekeeper. Le code est signé lorsqu’une identité est présente dans le trousseau, sinon une version non signée peut être générée avec bun run dist:unsigned. La confidentialité est garantie : les poids du modèle sont téléchargés une fois, puis toutes les inférences restent locales. Aucun compte utilisateur n’est requis, ce qui élimine les vecteurs d’attaque liés à l’authentification. Le seul point d’exposition potentiel réside dans les dépendances Node/Bun, qui doivent être maintenues à jour pour prévenir les vulnérabilités connues.