Get Bananas
Une liste de courses manuscrite pour iPhone, iPad, Mac et Apple Watch — que Claude peut modifier pendant que vous avez les mains occupées.
Lancée en avril 2026. SwiftUI sur chaque appareil. Une extension Claude Desktop livrée à l'intérieur de l'application Mac. Vingt-neuf langues, chacune accompagnée de données de courses initiales sélectionnées à la main pour que la première liste qu'un utilisateur voit semble native, pas traduite. Pas de serveur, pas de compte, pas de clé API. Un seul fichier JSON dans votre conteneur iCloud constitue l'intégralité du backend.
Claude peut modifier votre liste de courses.
Get Bananas livre une extension Claude Desktop à l'intérieur même de l'application Mac. Ouvrez les Réglages sur le Mac, cliquez sur Installer l'extension, et Claude Desktop affiche une invite d'installation. Acceptez, ouvrez une nouvelle conversation, et Claude dispose de cinq outils capables de lire et de modifier votre vraie liste de courses. Demandez « qu'est-ce qu'il y a sur ma liste ? » — il vous le dit. Demandez « ajoute des œufs et du lait » — ils apparaissent sur votre iPhone à la prochaine synchronisation iCloud.
Aucune inscription, aucune clé API, aucun serveur de notre part. L'extension est un bundle .mcpb qui communique avec un serveur MCP en Node.js, lequel lit et écrit dans un seul fichier JSON situé dans votre propre conteneur iCloud Drive.
Cinq outils, une fonction chacun.
La surface d'outils est volontairement réduite. Claude peut lire la liste, ajouter un article, en supprimer un, en mettre un à jour ou remplacer l'ensemble. Aucun assistant astucieux, aucun wrapper de lecture-modification-écriture ; la surface suit ce que vous demanderiez réellement dans une conversation.
- get_shopping_listLire la liste actuelle
- add_itemAjouter un nouvel article
- remove_itemSupprimer un seul article
- update_itemCocher, décocher, renommer ou changer la quantité
- update_shopping_listRemplacement complet (par ex. « commencer une liste de Thanksgiving »)
Installée depuis l'application elle-même.
Les Réglages de l'application Mac comportent un bouton « Installer l'extension ». Appuyer dessus ouvre un fichier get-bananas.mcpb intégré via NSWorkspace, que Claude Desktop enregistre comme extension en demandant confirmation à l'utilisateur. Toute l'installation tient dans un seul appel NSWorkspace.shared.open() sur un fichier livré à l'intérieur du bundle de l'application — parce que la plateforme nous a fourni la bonne primitive : un format de fichier qui signifie « enregistre-moi auprès de Claude ».
private func installExtension() { guard let extensionURL = Bundle.main.url( forResource: "get-bananas", withExtension: "mcpb" ) else { extensionMessage = "Error: Extension not found in app bundle." return } let opened = NSWorkspace.shared.open(extensionURL) if opened { extensionMessage = "Check Claude Desktop for the install prompt..." } else { extensionMessage = "Couldn't open the extension. Make sure Claude Desktop is installed." } }
Ce schéma va compter pour beaucoup d'applications natives. L'extension réside à l'intérieur de votre bundle d'application, est livrée quand l'application est livrée et est mise à jour quand l'application est mise à jour — pas de registre séparé, pas de configuration par utilisateur, pas de « copiez cette URL dans un fichier de configuration ». Si vous voulez que Claude puisse faire quelque chose à l'intérieur de votre application, vous mettez ce quelque chose à l'intérieur de l'application et vous laissez l'OS faire les présentations.
Le stylo sur le papier, avec persistance.
Les listes de courses s'écrivent à la main, sur du papier, avec un stylo. L'application se présente comme telle. Des lettrages manuscrits façon Caveat pour les en-têtes de section, des traits fins comme à la plume pour les séparateurs, des cercles vides pour les articles non cochés. Quand vous touchez pour cocher un article, l'application trace une ligne dessinée à la main à travers le texte — et chaque ligne est légèrement différente.




Le barré est une <code>Shape</code>, et chaque coche est unique.
La ligne dessinée à la main est une Shape SwiftUI personnalisée composée de vingt segments. Chaque extrémité de segment reçoit un petit décalage vertical aléatoire compris entre -1,5 et +1,5 points. Le résultat : chaque barré tracé à l'exécution est légèrement différent du précédent. Sur une liste de vingt articles, aucune ligne n'est identique — comme aucun trait de stylo ne l'est jamais.
struct HandDrawnStrikethrough: Shape { func path(in rect: CGRect) -> Path { var path = Path() let startY = rect.midY let segments = 20 let segmentWidth = rect.width / CGFloat(segments) path.move(to: CGPoint(x: 0, y: startY)) for i in 1...segments { let x = CGFloat(i) * segmentWidth let randomOffset = CGFloat.random(in: -1.5...1.5) let y = startY + randomOffset path.addLine(to: CGPoint(x: x, y: y)) } return path } }
Cela représente douze lignes de code. C'est aussi la différence entre une application qui a l'air manuscrite et une application qui se ressent manuscrite. Un barré SVG statique aurait été livré le même jour, avec le même nombre de pixels, et serait apparu comme une décoration.
Regardez de près les deux articles cochés ci-dessus. Les lignes traversant « Egg whites » et « Cottage cheese 2% » ont des formes différentes — ondulation différente, angle différent. Elles ont été générées à 200 millisecondes d'écart par la même Shape, qui dessine une nouvelle part d'aléatoire à chaque fois. C'est toute l'identité de l'application : une petite variation honnête, intégrée à la mise en page.
Vingt-neuf langues, avec des données de courses natives.
La première liste qu'un utilisateur japonais ouvre n'est pas une expédition au supermarché américain traduite. C'est tamagiro dans une section tanpaku-shitsu — des blancs d'œufs, dans une section Protéines qui utilise le terme que vous trouveriez réellement sur une étagère à Tokyo. Vingt-neuf localisations sur l'App Store, et chaque locale non anglophone livre son propre SeedData-{locale}.json sélectionné à la main avec des articles d'exemple et des noms de section culturellement appropriés. L'arabe a biyad al-bayd dans al-burutinat. L'hébreu a helbonei beitza dans helbonim. Vingt-neuf fichiers de données initiales, écrits à la main, sans passer par un traducteur de chaînes.





Le RTL est une victoire gratuite si vous arrêtez de lui résister.
SwiftUI traite .leading et .trailing comme des directions sémantiques, et non .left et .right comme des directions fixes. Disposez l'écran de manière sémantique une fois, et l'arabe et l'hébreu retournent toute la mise en page gratuitement — l'en-tête de section bascule à droite, le cercle de coche bascule à gauche du texte, les boutons Réinitialiser et Plus pivotent vers le coin opposé. Nous n'avons pas écrit une seule ligne de code spécifique au RTL pour cela.
Le barré dessiné à la main vit au-dessus de tout cela et n'a jamais besoin de connaître la locale. La Shape se trouve dans un ZStack au-dessus du Text du nom de l'article et trace à travers cette boîte englobante ; c'est la rangée environnante qui est inversée par la mise en page RTL de SwiftUI. La ligne se retrouve là où elle devrait être — sur le texte — sans une seule condition de langue dans le code de la Shape.
Un seul fichier JSON dans votre conteneur iCloud.
L'échange entre appareils tient dans un seul fichier de votre propre iCloud Drive : BananaList.json, dans le conteneur Get Bananas. Le serveur MCP lit et écrit ce fichier précis. Les applications iOS, iPad, Mac et Watch lisent et écrivent ce fichier précis. iCloud gère la synchronisation — l'infrastructure d'Apple, gratuite, chiffrée au repos, de bout en bout privée quand la Protection avancée des données est activée. La nôtre, aucune.
// iCloud path for Banana List data const ICLOUD_FILE_PATH = path.join( os.homedir(), "Library/Mobile Documents/iCloud~com~941apps~Banana-List/Documents/BananaList.json" ); // Lock file for atomic operations const LOCK_FILE_PATH = ICLOUD_FILE_PATH + ".lock"; const LOCK_TIMEOUT_MS = 5000;
Chaque chemin que touche le serveur MCP est un voisin de ce fichier JSON. Le fichier de verrouillage se trouve à côté (.lock, écritures atomiques, délai d'attente de cinq secondes qui s'auto-nettoie s'il devient obsolète). Les écritures vont dans un fichier temporaire étiqueté par processus (.tmp.{pid}) puis sont renommées atomiquement vers le chemin réel. Tout le modèle de concurrence — Claude contre l'application en cours d'exécution — tient dans une seule fonction d'acquisition/libération.
Sur chaque appareil, SwiftData est le magasin local. Le JSON iCloud est le format de transport. SwiftData reste rapide et interrogeable sur l'appareil ; le JSON reste simple et lisible par un humain pour la synchronisation et pour que Claude puisse le manipuler. Deux magasins avec une fonction chacun — aucun n'essaie d'être les deux.
Ce que cela nous permet de promettre.
Pas de serveur 941 Apps. Pas d'analytics. Pas de connexion. Pas de clé API pour Claude — vous vous êtes déjà authentifié auprès de Claude Desktop. Pas d'abonnement. L'extension est open source, donc toute personne curieuse peut lire l'intégralité du chemin des données : c'est le fichier JSON, et c'est tout ce qu'il touche. Votre liste de courses ne quitte jamais votre conteneur iCloud par le biais d'une infrastructure qui nous appartiendrait.
Le travail, c'est la liste.
Une liste de courses, c'est un seul travail. Saisir un article au moment où vous y pensez, le cocher quand vous le trouvez, et écarter la liste de votre chemin le reste du temps. Le produit, c'est le travail. Pas une application de recettes, pas un planificateur de repas, pas un scanner de codes-barres, pas un suivi de prix, pas un gestionnaire d'inventaire. La liste est le livrable.
L'intégration Claude gagne sa place précisément parce qu'elle accélère la saisie et la modification dans les cas où taper sur un téléphone est le mauvais outil : debout devant la cuisinière avec les mains qui sentent l'ail, en train de discuter à voix haute des repas de la semaine, en train de copier douze articles d'une fiche de recette sans avoir à les retaper un par un. Déléguer ces moments à Claude permet de garder le reste de l'application minimaliste.
Tout ce qui n'est pas la liste, la saisie, le cochage ou cette délégation est un produit différent. Les produits différents appartiennent à des applications différentes.
Ce qui n'est pas dans Get Bananas.
La plupart des applications de liste de courses ont une feuille de route qui finit par « devenir Instacart ». Ce n'est pas le cas ici. Get Bananas refuse délibérément de devenir une plateforme d'épicerie. Voici la liste explicite des choses qu'elle ne fait pas :
- Pas de scan de codes-barres
- Pas de prix, de totaux ni de gestion de budget
- Pas d'import de recettes ni de planification de repas
- Pas de navigation par allée ni de plans de magasin
- Pas d'application web
- Pas de compte, pas de connexion, pas de collecte d'e-mails
- Pas de listes partagées avec d'autres utilisateurs (uniquement votre propre iCloud, sur vos propres appareils)
- Pas d'analytics, jamais
- Pas de publicités, pas d'abonnement, pas de niveau Pro
- Pas d'écrans intempestifs, pas de promotion intégrée
Get Bananas coûte 0,99 $. Vous payez une fois et l'application vous appartient. Le serveur MCP est open source. Les données sont les vôtres et vivent dans votre iCloud Drive. Le travail, c'est la saisie rapide, le cochage rapide et la délégation des modifications à Claude quand vous avez les mains pleines de coriandre. Tout le reste est l'application de quelqu'un d'autre.
Get Bananas.
Disponible dès maintenant sur l'App Store pour iPhone, iPad, Mac et Apple Watch. Installez l'extension Claude Desktop depuis l'application Mac elle-même.