Icône de l'app Calíope

Fonctionnalités

Chaque capacité, vérifiée face au code source.

Calíope est distribué comme une application unique dont les capacités ci-dessous sont disponibles sur macOS et iPad. Chaque entrée correspond à du code qui existe aujourd'hui — c'est un catalogue, pas une liste de souhaits. Utilisez les raccourcis pour sauter à une catégorie, ou parcourez la liste complète.

Connexion et sécurité

Tunnel SSH natif

“Votre tunnel SSH, sans terminal ni .ssh/config.”

Atteignez des serveurs derrière un bastion depuis le sandbox macOS — sans ssh local, sans ~/.ssh/config, sans batailles de permissions.

SwiftNIO + NIOSSH. Authentification par mot de passe ou par clé privée (ed25519, ECDSA P-256/P-384/P-521). Parseur OpenSSH et déchiffrement de passphrase en mémoire. Proxy local sur 127.0.0.1 ponté via SSH direct-tcpip.

Vérification TOFU de la clé d'hôte

“Vous alerte si quelqu'un a intercepté votre tunnel — avant que vous ne tapiez quoi que ce soit.”

Détecte un MITM contre votre bastion SSH sans conserver un fichier known_hosts sur disque.

Empreintes stockées dans le Keychain. La première connexion demande une confirmation explicite ; une empreinte modifiée échoue durement — équivalent à StrictHostKeyChecking=yes.

TLS strict par défaut

“SSL qui protège vraiment — pas juste un interrupteur.”

Activer « SSL » signifie SSL vérifié. Les certificats auto-signés exigent une CA ou un opt-out explicite avec un avertissement visible.

Politique unique : sauter la vérification est opt-in ; une CA fournie donne une vérification sans hostname ; sinon, vérification complète.

Keychain avec synchronisation iCloud opt-in

“Vos mots de passe ne visitent pas iCloud sauf si vous les invitez.”

Vous décidez quels identifiants voyagent entre vos appareils. Par défaut, aucun.

Le mode local-only fixe les identifiants à WhenUnlockedThisDeviceOnly ; activer la synchronisation les migre à AfterFirstUnlock pour iCloud Keychain. Le toggle est idempotent.

Auth biométrique facultative par profil

“Votre empreinte déverrouille la production, pas seulement votre Mac endormi.”

Ajoutez une porte Touch ID / Face ID avant de vous connecter à des serveurs de production, configurable par profil.

Construit sur le framework LocalAuthentication. Activable par profil de connexion.

Connection pool déterministe

“Un connection pool qui ferme toujours — même quand quelque chose échoue.”

Des connexions qui ne fuient pas de ressources ni ne bloquent l'interface, même lors du changement de session.

SwiftNIO EventLoopGroupConnectionPool, plafonné à 5 connexions par event loop dans un event-loop group mono-thread. Fermeture asynchrone avec timeout de sécurité et fermeture SSH propre lorsque le binding local échoue.

Requêtes préparées natives

“Bindings préparés, pas d'interpolation de chaînes — dès la base de la pile.”

Les valeurs que vous saisissez ne sont jamais concaténées au SQL — elles voyagent via le protocole réseau, séparées du statement.

Requêtes préparées natives de MySQLNIO : sans bindings → chemin rapide simpleQuery ; avec bindings → conn.query(sql, [MySQLData]). Les statements se ferment automatiquement à done(), le pool ne fuit donc jamais. Les identifiants passent toujours par le helper d'échappement centralisé pour les cas DCL/DDL résiduels.

Éditeur SQL et productivité

Autocomplétion sensible au contexte

“L'éditeur sait si vous êtes dans le FROM, le WHERE ou la liste de colonnes.”

Écrivez moins, et commettez moins d'erreurs, car la suggestion comprend où vous êtes dans le statement.

Suggère les colonnes de la table active, les noms de bases de données, les tokens de schéma (tables, vues, fonctions), les mots-clés DML/DDL/de contrôle, les types de données et les phrases auxiliaires SQL filtrées par moteur.

Linter lexical en temps réel

“Les parenthèses déséquilibrées n'atteignent jamais le serveur.”

Attrape l'erreur évidente avant que MySQL ne la rejette.

Détecte les commentaires non fermés, les chaînes non fermées, les parenthèses déséquilibrées et les identifiants avec backtick ouvert. Balayage O(n), sans parseur complet.

Formateur avec mode sûr

“Formate vos requêtes — ne réécrit jamais votre UPDATE.”

Un formatage propre pour SELECT, sans surprise sur un UPDATE sans WHERE.

Connaît plus de 150 mots-clés, types et fonctions. Le mode sûr bloque l'auto-formatage sur les statements destructifs (ALTER, CREATE, DELETE, DROP, GRANT, TRUNCATE, UPDATE, REPLACE, RENAME) pour prévenir les réécritures accidentelles.

Occultation des identifiants dans les logs et la synchronisation

“Synchronisez votre historique, pas vos identifiants.”

Votre journal de requêtes ne devient pas un fichier de mots de passe sur iCloud.

Neutralise IDENTIFIED BY, IDENTIFIED WITH … AS, IDENTIFIED BY PASSWORD, SET PASSWORD FOR et PASSWORD(…). Occultation idempotente, appliquée avant d'exporter le journal de requêtes vers CloudKit.

Constructeurs de requêtes visuels

“Composez des requêtes en cliquant ; elles sortent prêtes pour la production.”

Un SELECT … WHERE … JOIN … correct sans mémoriser la syntaxe.

Constructeurs visuels dédiés aux quatre formes les plus fréquentes : SELECT, WHERE, UPDATE et CREATE de table.

Renommage de symbole avec bornes de mot

“Renommez id sans casser client_id.”

Refactorisez des identifiants en toute sécurité, sans détruire des noms similaires.

Regex avec bornes de mot \b et échappement adéquat. Ne matche jamais à l'intérieur d'identifiants plus longs.

Palette Quick Open (⌘⇧O)

“⌘⇧O et vous êtes sur la table que vous cherchiez.”

Atteignez n'importe quel objet du schéma sans descendre dans l'arbre.

Recherche floue incrémentale sur tables, vues, routines et objets, avec navigation aux flèches et Entrée pour ouvrir.

Gestionnaire de snippets avec seeding par moteur

“Vos snippets s'adaptent au moteur, pas l'inverse.”

Vos recettes SQL toujours à portée, filtrées selon le moteur utilisé.

Stockage JSON local. Chaque snippet déclare à quels moteurs il s'applique (MySQL, MariaDB…). La connexion à un nouveau moteur ajoute les valeurs par défaut sans doublons. Prend en charge la catégorisation.

Popovers de documentation DDL et de fonctions

“La documentation de GROUP_CONCAT s'ouvre là où vous tapez.”

Documentation sans quitter l'éditeur ni ouvrir un navigateur.

Affiche la signature de la fonction SQL ou le DDL de l'objet du schéma sous le curseur.

Éditeur de cellule avancé et édition inline de ligne

“Éditez la cellule, voyez le SQL, et décidez.”

Modifiez les données rapidement et prévisualisez le SQL exact qui sera exécuté.

Édition façon tableur sur les résultats, avec un aperçu de l'UPDATE ou du DELETE généré avant exécution.

SQL Player — historique d'exécution

“Rejouez votre session SQL comme une vidéo.”

Déboguez un batch de requêtes statement par statement, sans tout ré-exécuter.

Rejeu de type timeline des statements exécutés, lié à l'historique persistant des requêtes.

Barres d'aide iPad au-dessus du clavier

“Clavier iPad avec des super-pouvoirs SQL.”

Suggestions tactiles rapides juste au-dessus du clavier virtuel.

Barres contextuelles pour l'objet ou la fonction sous le curseur, avec un accès rapide à « Voir DDL » et aux paramètres de fonction.

Barre d'outils personnalisable

“Votre barre, dans votre ordre.”

Chacun a son ergonomie ; les DBAs réorganisent une fois et oublient.

Réorganisez ou masquez les groupes de boutons depuis une feuille de personnalisation dédiée. La mise en page est persistée.

Administration et catalogue

Arbre de schéma navigable

“Votre schéma, dans un arbre qui reflète comment vous le pensez.”

Une seule vue pour tout le catalogue du serveur.

Bases de données → tables / vues / routines / triggers / événements, avec chargement paresseux et actions contextuelles : DDL, colonnes, index, import de données, WHERE builder.

Schema Diff avec génération d'ALTER

“Comparez votre schéma, générez l'ALTER, relisez avant d'appliquer.”

Promouvez un schéma du staging à la production sans collecter les diffs à la main.

Compare deux schémas et génère l'ALTER TABLE nécessaire pour amener l'un à l'autre. La comparaison de colonnes tourne en parallèle via la structured concurrency. Source de vérité : INFORMATION_SCHEMA.

Journal d'audit DDL local

“Vous savez quel DDL vous avez exécuté, quand, et contre quel serveur.”

Traçabilité des changements de schéma, sans toucher au serveur.

Chaque CREATE / ALTER / DROP / RENAME est enregistré localement avec horodatage et serveur cible, dans le store SQLite local de l'app.

Migration d'objets entre serveurs

“Du staging à la production en trois clics — avec un aperçu.”

Clonez des objets entre environnements sans mysqldump ni fichiers .sql écrits à la main.

Double connexion (source + destination), sélection granulaire de tables, vues, routines, triggers et événements, avec options REPLACE, inclure les données ou ignorer les clés étrangères. Aperçu du SQL avant exécution.

Éditeurs d'objets avancés

“Un éditeur par type d'objet, pas un .sql générique pour tout.”

Éditez routines et événements correctement, dans un éditeur pensé pour l'objet.

Feuilles dédiées pour routines stockées, triggers, événements, vues et index. Chacune émet un DDL bien formé.

Maintenance des tables

“OPTIMIZE, ANALYZE et REPAIR, en un bouton.”

Entretien des tables MyISAM/InnoDB sans mémoriser les commandes.

Exécute OPTIMIZE TABLE, REPAIR TABLE et ANALYZE TABLE avec un retour de progression.

Administration des utilisateurs et privilèges

“GRANTs et REVOKEs — avec des cases à cocher.”

Gérez les utilisateurs du serveur sans écrire chaque GRANT à la main.

CREATE / ALTER / DROP USER, ainsi que GRANT et REVOKE depuis une UI dédiée.

Conseiller et éditeur d'index

“Les index en trop, et ceux qui manquent — avec preuves.”

Identifiez les index redondants ou manquants à partir des données que le serveur expose déjà.

Vue conseiller qui analyse l'usage des index, associée à un éditeur dédié au catalogue d'index.

Profileur de colonne

“Profilez la colonne, ne devinez pas les données.”

Comprenez la qualité de vos données avant d'écrire la requête analytique.

Distributions par colonne : histogramme, percentiles et cardinalité.

Diagramme ER interactif

“Le diagramme ER que vous n'avez plus à dessiner.”

Documentez les relations sans dessiner des boîtes dans Miro.

Génération automatique à partir du schéma actif, avec visualisation des clés étrangères.

Assistant IA (BYOK)

Apportez votre propre clé. L'abonnement n'inclut pas de crédits IA — vous utilisez votre propre clé d'API. Cela est déclaré ouvertement dans le paywall : « L'assistant IA nécessite votre propre clé d'API OpenAI, Google Gemini ou Anthropic Claude (non incluse dans l'abonnement). »

Fournisseurs OpenAI, Gemini et Claude

“IA qui tourne sur vos tokens, pas sur votre facture d'abonnement.”

Utilisez le modèle que vous payez déjà, et ne dépendez pas d'une hausse de tarif de Calíope par token.

OpenAI (GPT-4, GPT-4o, o1, o3) avec token Bearer. Google Gemini avec clé d'API ; filtré aux modèles exposant generateContent. Anthropic Claude (claude-*) avec x-api-key et system prompt dans son propre champ (pas dans messages). System prompt bilingue avec le contexte du schéma actif, conservant les trois derniers échanges.

Occultation de la clé d'API dans les erreurs et logs

“Votre clé n'apparaît jamais dans une stack trace.”

Si un message d'erreur fuit dans une capture d'écran ou un canal Slack, votre clé d'API ne voyage pas avec.

Masquage par regex pour sk-* (OpenAI), AIza* (Gemini), sk-ant-* (Anthropic Claude, y compris sk-ant-api03-…) et Bearer … dans tout message d'erreur de fournisseur.

Backoff exponentiel avec Retry-After

“Si OpenAI dit attendez, Calíope attend exactement ce délai.”

Les pics de rate-limit ne cassent pas votre session.

Sur 429 / 503, réessai jusqu'à trois fois (1 s / 2 s / 4 s), en respectant l'en-tête Retry-After. Timeouts : 30 s pour la génération, 15 s pour lister les modèles.

Voix vers SQL

“Dictez la question ; exécutez le SQL.”

Dictez une demande et l'assistant la transforme en SQL — utile sur iPad et en sessions pair-DBA quand les mains sont prises.

Basé sur Speech et AVFoundation d'Apple. Détecte la locale, avec un fallback vers es-ES. Permissions séparées pour la reconnaissance vocale et le micro. Résultats partiels en direct.

Assistant conversationnel persistant

“Une conversation avec votre base de données, pas un prompt isolé.”

Demandez « maintenant avec un LEFT JOIN » et il sait de quelle requête vous parlez.

Conserve le contexte du schéma actif plus les derniers échanges, par conversation.

Sauvegarde, import et synchronisation

Moteur de sauvegarde avec identifiants opt-in

“Sauvegardes avec gzip natif — et pas de mots de passe exportés par accident.”

Des dumps compacts et sûrs par défaut — personne n'exporte de hashes de mots de passe par accident.

Génère un .sql avec les options de drop-before, inclusion des données, inclusion des utilisateurs, inclusion des identifiants utilisateurs (opt-in, désactivé par défaut) et compression gzip native. CREATE USER / ALTER USER / GRANT sont neutralisés quand les identifiants sont exclus. Événements de progression avec ETA.

Sauvegardes planifiées avec rétention

“Des sauvegardes qui ne comptent pas sur votre mémoire.”

Votre Mac effectue la sauvegarde à l'heure, même s'il dormait, et ne remplit pas votre disque.

Planifications quotidiennes ou hebdomadaires. Utilise des bookmarks security-scoped vers la destination pour fonctionner dans le sandbox. Gère les planifications ratées entre redémarrages, les noms de fichiers suffixés en nanosecondes pour éviter les collisions, la purge par rétention, et les notifications de succès/erreur/ignoré.

Import CSV / JSON / XLSX

“D'un tableur à une table en trois clics.”

Importez des fichiers tabulaires du monde réel — pas seulement le CSV idéal.

CSV style RFC 4180 (guillemets échappés, champs avec virgules), JSON (tableau d'objets) et XLSX en streaming. Modes : INSERT, INSERT IGNORE, REPLACE.

Journal local persistant des requêtes

“La commande que vous avez exécutée mardi, en deux secondes.”

Cherchez parmi des milliers de requêtes passées par texte SQL ou date.

Store SQLite local dans Application Support avec tables pour requêtes exécutées et journal d'audit DDL, indexé par texte de requête (asc) et date (desc).

Synchronisation iCloud du journal (opt-in, occultée)

“Votre historique SQL, dans votre iCloud, sans vos identifiants.”

Cherchez dans l'historique de votre Mac depuis votre iPad — sans les identifiants.

Conteneur CloudKit iCloud.org.caliope.caliope, lots de 400 enregistrements, rétention configurable (par défaut 30 jours). Applique l'occultation des identifiants avant l'envoi. Vérifie l'état du compte iCloud avant de synchroniser.

Toggles de synchronisation par section

“Vous décidez ce qui part vers iCloud.”

Synchronisez uniquement ce qui vous intéresse — pas de tout ou rien.

Toggles indépendants pour la synchronisation iCloud du Keychain et du journal de requêtes, depuis les Préférences.

Monitoring, diagnostic et réplication

Moteur de monitoring avec votre propre stockage

“Métriques de votre MySQL, stockées dans votre MySQL.”

Monitoring historique sans installer Prometheus.

Un collecteur dédié écrit des snapshots sur un serveur de stockage de votre choix, en provisionnant des tables pour les échantillons (CPU, mémoire, connexions, QPS) et les événements (dépassements de seuil, retard de réplication). Rétention automatique.

Visual EXPLAIN interactif

“Votre plan d'exécution comme un diagramme vivant.”

Repérez l'ALL qui tue votre requête sans lire du JSON à la main.

Prend EXPLAIN FORMAT=JSON et le dessine en arbre. Codage couleur par type d'accès : full scan, range / index merge, optimisé, sort, join. Info-bulles avec access_type, lignes estimées et temps. Zoom et pan à la molette.

Profileur de requêtes

“Voyez où vous perdez les millisecondes.”

Localisez quelle phase de la requête prend le temps.

Basé sur SHOW PROFILE. Tableau et graphique en barres par phase (starting, Sending data, etc.) avec des temps en millisecondes.

Process List avec KILL guidé

“Un KILL pour la requête qui a bloqué votre production.”

Terminez une requête incontrôlée sans ouvrir de terminal.

SHOW FULL PROCESSLIST avec colonnes pour id, user, host, database, command, time, state et info. Actions KILL QUERY et KILL CONNECTION.

Moniteur de réplication (MySQL 8 et legacy)

“Répliques MySQL 8 et 5.7, dans le même panneau.”

Voyez le retard de la réplique sans vous battre avec le vocabulaire legacy vs. 8.0.

SHOW REPLICA STATUS (MySQL 8) avec fallback automatique vers SHOW SLAVE STATUS (MariaDB 10.5 / MySQL 5.7). Métriques : IO/SQL running, secondes de retard sur la source, dernières erreurs avec horodatage, GTID sets, positions de log. Auto-rafraîchissement configurable.

Visualiseur de binlog avec filtres et PURGE

“Votre binlog, filtrable et purgable — depuis l'app.”

Auditez quels événements vos statements ont produits sans descendre à mysqlbinlog.

SHOW BINLOG EVENTS avec catégorisation en DDL / DML / Système, recherche par texte et une limite de lignes configurable (par défaut 300). Prend en charge les binlogs chiffrés (MySQL 8.0.14+). PURGE BINARY LOGS TO avec confirmation explicite.

Dashboard, Server Info et Health

“Le pouls de votre MySQL, dans une seule vue.”

Consolidez la santé du serveur sans ouvrir cinq clients.

Server Info multi-onglets (variables globales et de session, statuts globaux et de session, usage HDD), Server Dashboard avec des graphiques en direct, et un Server Health Monitor.

Benchmark en direct

“Deux requêtes sur la balance ; l'une gagne.”

Choisissez entre deux requêtes avec des preuves, pas de l'intuition.

Compare les temps d'exécution de variantes de requêtes côte à côte.

Alertes et notifications locales

“Votre Mac vous prévient quand la réplique décroche.”

Le système vous prévient — vous n'avez pas à fixer l'app.

Alertes par seuil sur CPU, mémoire, connexions et retard de réplication. Notifications natives macOS/iOS.

Widgets natifs

Widget de bureau macOS

“État du serveur, visible d'un coup d'œil, sur votre bureau.”

Voyez le pouls de votre serveur sans ouvrir Calíope.

Familles Small, Medium et Large. Les snapshots sont lus depuis un app group partagé avec file coordination pour des lectures concurrentes sûres. Les payloads dépassant un seuil sûr sont rejetés (protection DoS).

Widgets Home Screen et Lock Screen sur iPad

“Votre MySQL sur l'écran verrouillé de l'iPad.”

Métriques du serveur sur l'écran verrouillé de votre iPad — à quelques secondes.

Sept familles au total : Small, Medium, Large, ExtraLarge, plus les accessoires Rectangular, Circular et Inline (iOS 16.1+).

Deep-linking vers le profil épinglé

“Touchez le widget → le dashboard du bon serveur, d'un seul geste.”

Un toucher et vous êtes sur le dashboard du serveur correct.

URL du widget caliope://server/<uuid> quand un profil est lié ; sinon, retour à caliope://.

Sélection basée sur AppIntent

“Un widget par serveur — édité comme un widget météo.”

Épinglez un widget différent à chaque serveur — configuré en quelques secondes.

Configurable depuis l'UI d'édition de widget du système via une AppIntentConfiguration. Aucun code requis de l'utilisateur.

Rafraîchissement en arrière-plan avec le budget système

“Se rafraîchit quand ça compte ; dort quand ça ne compte pas.”

Le widget n'épuise pas votre batterie tout en affichant des données fraîches.

La politique de timeline confie le contrôle à WidgetKit, en respectant le budget de rafraîchissement du système. Retour au dernier snapshot lorsqu'aucune donnée fraîche n'est disponible.

Intégrations système

Siri et App Intents

“Un SELECT COUNT(*) depuis Siri, sans ouvrir Calíope.”

Exécutez une requête ou listez les bases de données depuis Raccourcis, sans ouvrir l'app.

Intents enregistrés : se connecter à un serveur, exécuter une requête (renvoie TSV avec en-têtes), lister les bases de données, ouvrir un onglet du workspace. Adossé à un pont interne qui expose les session et database managers aux AppIntents.

Menus macOS et gestion des fichiers .sql

“Sait s'ouvrir depuis Spotlight avec un .sql — comme toute app native.”

Se comporte comme une vraie app Mac — pas comme un portage Windows ou Electron.

Barre de menu complète : À propos, Ouvrir un fichier SQL, Fichiers récents, Quick Open, navigation entre onglets, Aide, Nouveautés, Politique de confidentialité, Support. Gère l'ouverture de fichiers .sql via NotificationCenter.

Élément dans la barre de menu

“Une icône dans la barre de menu : vous savez si vous êtes connecté sans changer de fenêtre.”

Contexte de connexion d'un coup d'œil, sans ramener l'app au premier plan.

Icône dans la barre de menu reflétant l'état de connexion et le profil actif.

Onboarding TipKit

“Découvrez ce dont vous avez besoin, quand vous en avez besoin.”

Apprenez à connaître les fonctionnalités au moment où elles sont pertinentes.

Tips contextuels pour Quick Open, WHERE Builder, import de données, journal d'audit DDL, visualiseur de binlog, moniteur de réplication, migration d'objets, Visual EXPLAIN, profileur de requêtes et arbre de schéma.

Handoff, gestes iPad et trackpad

“iPad + Magic Keyboard = un Mac de DBA portable.”

Sur iPad avec un Magic Keyboard, travaillez comme vous le feriez sur le Mac.

Gestion native du pointeur et du clavier sur iPad. Gestes : swipe entre onglets, pinch-zoom dans l'éditeur. Split View.

Mode capture d'écran

“Des captures prêtes pour la doc — pas amateur.”

Prenez des captures prêtes pour la documentation avec un rendu cohérent.

Cmd+Opt+P sur macOS produit des PNG stylisés pour la documentation et le marketing.

« Nouveautés » intégrées à l'app

“Les nouveautés, dans l'app — pas dans un changelog.”

Apprenez ce qui est nouveau sans lire les notes de version de l'App Store.

Points forts par version, avec un état local « déjà vu ».

UI trilingue (espagnol, anglais, français)

“Calíope parle votre langue — espagnol, anglais ou français.”

Une app conçue d'abord en espagnol, elle ne donne donc pas l'impression d'une traduction automatique.

Bundles de ressources complets en, es et fr, avec un gestionnaire de langue à l'exécution et un helper de localisation. Fallback vers l'anglais.

Confidentialité, sandbox et conformité

Sandbox App Store actif

“Sandbox activé — fait ce qu'il déclare, et rien de plus.”

Calíope ne peut pas accéder à quoi que ce soit en dehors des entitlements déclarés. Le système l'applique.

App sandbox activé avec un jeu d'entitlements restreint : client et serveur réseau (pour le proxy SSH), entrée audio (voix vers SQL), fichiers sélectionnés par l'utilisateur (documents), app groups (pour les widgets) et iCloud (CloudKit et Cloud Documents).

Service d'effacement des données

“Un bouton, et il ne reste rien.”

Un bouton pour laisser la machine propre avant de la rendre ou de la vendre.

Suppression sécurisée à la demande des sessions, identifiants et journal de requêtes.

BYOK avec divulgation formelle

“Abonnement honnête — l'IA tourne sur votre clé, et nous le disons.”

Vous savez exactement ce que l'abonnement paie et ce qu'il ne paie pas.

Le paywall affiche une note BYOK et un avis de renouvellement automatique, conformément à l'App Store §3.1.2c.

Abonnement StoreKit 2 avec essai de 7 jours

“Une semaine gratuite, sans piège.”

Essayez Calíope pendant une semaine gratuitement, et annulez depuis votre Apple ID.

Produit annuel avec une semaine d'essai gratuit. Vérification via AppTransaction.shared et Transaction.latest(for:) de StoreKit 2. Restauration via AppStore.sync(). Le prix est toujours affiché depuis product.displayPrice.

Prêt à essayer Calíope ?

Toutes les capacités de cette page sont incluses dans l'abonnement annuel. Une semaine d'essai gratuit, annulable à tout moment depuis votre Apple ID.

Essayer gratuitement une semaine →