Icône de l'app Calíope

Comment Calíope est faite

La pile, les frontières, et ce qui a été laissé de côté volontairement.

Cette page explique comment Calíope est assemblée : sur quels frameworks elle repose, où passe la frontière avec le moteur, ce que le sandbox autorise, et ce que l’app ne fait pas, volontairement. Chaque chiffre vient de l’arbre des sources, à septembre 2026.

Une app, trois binaires

Calíope est distribuée comme une seule app, org.caliope.caliope, en achat universel : un achat couvre tous les appareils Apple sur lesquels elle tourne. Derrière cette seule app, trois binaires : un pour macOS, un pour iPhone et iPad (le même binaire sert aux deux, et l’app Apple Watch voyage embarquée dedans), et un pour Apple TV.

L’essentiel du code n’est pas écrit trois fois. Sources/Shared contient 268 fichiers Swift et 234 vues SwiftUI qui compilent aussi bien dans le binaire Mac que dans le binaire iOS. Les widgets sont des extensions de la même app et lisent ce que l’app publie via un App Group : l’app écrit, le widget ne fait que lire.

SwiftUI de bout en bout

Chaque fenêtre est SwiftUI natif — sans web views, sans émulation multiplateforme. Cette phrase est sur la page d’accueil et elle est littéralement vraie : les 234 vues partagées sont en SwiftUI, et là où un Mac et un iPad doivent se comporter différemment, la différence se décide à la compilation, dans le même fichier, pas dans une couche de compatibilité à l’exécution.

La frontière avec le moteur

Tout ce qui parle à un moteur de base de données vit derrière 15 protocoles dans Sources/Models/Database/Protocols/, un par sous-domaine. Chaque moteur a une implémentation de ces protocoles, et rien au-dessus de la frontière — ni une vue, ni l’orchestrateur — n’écrit de SQL ni ne connaît les codes d’erreur d’un moteur. Ajouter un moteur, c’est implémenter les protocoles, pas modifier ceux qui les appellent.

MySQL et MariaDB passent par MySQLKit 4.10.1, et PostgreSQL par PostgresKit 2.16.1 sur PostgresNIO 1.33.1, le tout sur SwiftNIO 2.101.0 (versions à septembre 2026). Les requêtes avec paramètres utilisent les bindings natifs de requêtes préparées de MySQLNIO : les valeurs voyagent par le protocole réseau et ne sont jamais concaténées dans le SQL.

SQLite est à part : l’éditeur SQLite parle à la bibliothèque système par son API C, sans aucun pilote entre les deux. MongoDB est à part aussi. Il est pris en charge via MongoKitten 7.16.3, un pilote communautaire, et il reste hors de la frontière avec le moteur, volontairement : aucune vue n’importe MongoKitten, et toute la couche MongoDB est conçue pour pouvoir être retirée sans toucher au côté relationnel.

SSH sans ssh

Le tunnel SSH est écrit dans l’app, sur SwiftNIO SSH 0.13.0 et swift-crypto 3.15.1. Aucune dépendance au ssh du système. Les clés déchiffrées ne sont jamais écrites sur disque.

Calíope lit elle-même les clés privées OpenSSH, accepte ed25519 et ECDSA P-256, P-384 et P-521, vérifie la clé de l’hôte avant d’envoyer quoi que ce soit d’autre, et ouvre un canal direct-tcpip jusqu’à la base de données. De votre côté, elle écoute sur 127.0.0.1, sur un port choisi à l’ouverture du tunnel, et la connexion à la base passe par ce proxy local. Une clé protégée par phrase de passe est déchiffrée en mémoire, et elle y reste.

Dans le sandbox

Calíope tourne avec l’App Sandbox activé, comme l’exige le Mac App Store, et Caliope.entitlements demande exactement ceci :

  • com.apple.security.app-sandbox
  • com.apple.security.network.client — les connexions sortantes vers vos serveurs
  • com.apple.security.network.server — les écouteurs locaux : le proxy du tunnel et le serveur MCP
  • com.apple.security.device.audio-input — la dictée, qui tourne sur l’appareil
  • com.apple.security.files.user-selected.read-write — les fichiers .sql que vous ouvrez et les dossiers que vous choisissez pour les sauvegardes
  • com.apple.security.application-groups — le conteneur partagé que lisent les widgets
  • iCloud : CloudDocuments, CloudKit et le magasin clé-valeur, pour la synchronisation que vous pouvez activer

Et ce qui n’y est pas : pas d’accès à tout le système de fichiers, pas d’exception à la validation des bibliothèques, pas de JIT.

L’IA et MCP selon vos règles

L’assistant IA a trois sortes de fournisseur. Apple Intelligence passe par le framework FoundationModels d’Apple, sur l’appareil, sans clé et sans compte. Ollama tourne sur votre propre machine, avec les modèles que vous y avez installés. Les fournisseurs cloud fonctionnent avec votre propre clé. L’app décide comment parler à un fournisseur d’après les capacités qu’il déclare, pas d’après son nom. C’est un assistant, pas un agent.

Le serveur MCP, sur macOS, inverse le sens et laisse un client IA externe — Cursor, Claude Desktop, tout ce qui parle MCP — interroger Calíope sur vos bases de données, dans des limites. Il est désactivé par défaut. Il n’écoute que sur 127.0.0.1, sur le port 41500 sauf si vous le changez, et cette adresse n’est pas configurable. Chaque requête exige un jeton Bearer que Calíope génère (32 octets aléatoires) et garde dans le Trousseau. Le client ne voit que les connexions que vous exposez explicitement, et cette liste naît vide. Il est en lecture seule : une instruction par appel, contrôlée par une porte qui refuse aussi FOR UPDATE et LOCK IN SHARE MODE, et les résultats sont plafonnés à 200 lignes. Cinq outils, JSON-RPC 2.0 sur une seule route POST /mcp, version de protocole 2025-06-18. Aucun des deux consentements — ni l’interrupteur, ni la liste exposée — ne se synchronise vers un autre appareil ni ne voyage dans une sauvegarde des réglages. La page du serveur MCP liste les cinq outils et explique comment y brancher un client.

Ce qu’elle ne fait pas, volontairement

  • Ni Windows, ni Linux. Calíope est écrite pour les plateformes Apple et y reste.
  • Ni SQL Server, ni Oracle, ni Redis. Les moteurs sont MySQL, MariaDB, PostgreSQL, SQLite et MongoDB.
  • Ni espaces d’équipe. Il n’y a ni serveur à nous ni comptes ; vos profils et votre historique sont à vous, et la synchronisation iCloud est une option entre vos propres appareils.

Si l’une de ces trois choses vous est nécessaire, la comparaison de la page d’accueil nomme les outils qui la font bien.