Get Bananas

Eine handschriftliche Einkaufsliste für iPhone, iPad, Mac und Apple Watch — die Claude bearbeiten kann, während deine Hände voll sind.

Veröffentlicht im April 2026. SwiftUI auf jedem Gerät. Eine Claude Desktop-Erweiterung, die direkt mit der Mac-App ausgeliefert wird. Neunundzwanzig Sprachen, jede mit handkuratierten Anfangsdaten für Einkaufslisten, damit die erste Liste, die ein Nutzer sieht, nicht übersetzt, sondern nativ wirkt. Kein Server, kein Konto, kein API-Key. Eine einzige JSON-Datei in deinem iCloud-Container ist das gesamte Backend.

Get Bananas auf dem iPhone mit einer handschriftlich gestalteten Einkaufsliste mit Proteinen und Kohlenhydraten
Claude Desktop
füg Bananen zu meiner Einkaufsliste hinzu
add_item({"name": "bananas"})
Erledigt — Bananen wurden unter Obst & Gemüse hinzugefügt. Sonst noch etwas?
Claude-Integration

Claude kann deine Einkaufsliste verändern.

Get Bananas liefert eine Claude Desktop-Erweiterung direkt in der Mac-App selbst mit. Öffne die Einstellungen auf dem Mac, klicke auf Erweiterung installieren, und Claude Desktop blendet eine Installationsaufforderung ein. Bestätigen, einen neuen Chat öffnen — und Claude verfügt über fünf Werkzeuge, mit denen es deine echte Einkaufsliste lesen und bearbeiten kann. Frage „was steht auf meiner Liste?“ — Claude sagt es dir. Sage „füg Eier und Milch hinzu“ — sie erscheinen auf deinem iPhone, sobald iCloud das nächste Mal synchronisiert.

Es gibt keine Anmeldung, keinen API-Key, keinen Server von uns. Die Erweiterung ist ein .mcpb-Bündel, das mit einem Node.js-MCP-Server kommuniziert, der wiederum eine einzelne JSON-Datei in deinem eigenen iCloud Drive-Container liest und schreibt.

Claude Desktop deine installierte App
MCP-Server get-bananas.mcpb
Get Bananas iCloud · BananaList.json

Fünf Werkzeuge, jedes mit genau einer Aufgabe.

Die Werkzeugfläche ist bewusst klein gehalten. Claude kann die Liste lesen, einen Eintrag hinzufügen, einen entfernen, einen aktualisieren oder die gesamte Liste ersetzen. Es gibt keine cleveren Komforthelfer und keine Read-Modify-Write-Wrapper; die Schnittstelle entspricht dem, was du tatsächlich im Gespräch verlangen würdest.

  • get_shopping_listDie aktuelle Liste lesen
  • add_itemEinen neuen Eintrag anhängen
  • remove_itemEinen einzelnen Eintrag entfernen
  • update_itemAbhaken, abwählen, umbenennen oder Menge ändern
  • update_shopping_listKomplettaustausch (z. B. „starte eine Thanksgiving-Liste“)

Direkt aus der App heraus installiert.

Die Einstellungen der Mac-App enthalten einen Button zum Installieren der Erweiterung. Ein Tippen darauf öffnet eine mitgelieferte get-bananas.mcpb-Datei mit NSWorkspace, woraufhin Claude Desktop sie als Erweiterung registriert und den Nutzer um Bestätigung bittet. Die gesamte Installation ist ein einziger NSWorkspace.shared.open()-Aufruf auf einer Datei, die im App-Bündel ausgeliefert wird — weil die Plattform uns die richtige Primitive geliefert hat: ein Dateiformat, das bedeutet „registriere mich bei Claude“.

Swift · SettingsView.swift:309-324
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."
    }
}

Dieses Muster wird für viele native Apps wichtig werden. Die Erweiterung lebt im App-Bündel, wird mit der App ausgeliefert und mit der App aktualisiert — keine separate Registry, keine nutzerspezifische Einrichtung, kein „kopiere diese URL in eine Konfigurationsdatei“. Wenn du möchtest, dass Claude etwas in deiner App tun kann, dann steckst du dieses Etwas in die App und lässt das OS die beiden einander vorstellen.

Ästhetik

Stift auf Papier — mit Persistenz.

Einkaufslisten werden von Hand geschrieben, auf Papier, mit einem Stift. Genau so liest sich diese App. Caveat-artige handschriftliche Buchstabenformen für die Abschnittsüberschriften, dünne Stiftlinien als Trenner, hohle Kreise für unabgehakte Einträge. Wenn du etwas abhakst, zeichnet die App eine handgezogene Linie durch den Text — und jede Linie ist ein wenig anders.

Get Bananas auf dem iPhone mit der Einkaufsliste
iPhone
Get Bananas auf dem iPad mit der Einkaufsliste
iPad
Get Bananas auf dem Mac mit der Einkaufsliste und einer handgezeichneten Überschrift
Mac
Get Bananas auf der Apple Watch mit der Einkaufsliste
Watch

Die Durchstreichung ist eine <code>Shape</code>, und jedes Häkchen ist einzigartig.

Die handgezeichnete Linie ist eine eigene SwiftUI-Shape mit zwanzig Pfadsegmenten. Jeder Segmentendpunkt erhält einen kleinen zufälligen vertikalen Versatz zwischen -1,5 und +1,5 Punkten. Das Ergebnis: jede zur Laufzeit gezeichnete Durchstreichung unterscheidet sich leicht von der vorherigen. Auf einer Liste mit zwanzig Einträgen sind keine zwei Linien identisch — so wie es nie zwei identische Stiftstriche gibt.

Swift · HandDrawnStrikethrough.swift
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
    }
}

Es sind zwölf Zeilen Code. Es ist auch der Unterschied zwischen einer App, die handschriftlich aussieht, und einer, die sich handschriftlich anfühlt. Eine statische SVG-Durchstreichung wäre am gleichen Tag fertig gewesen, mit derselben Pixelzahl, hätte sich aber wie Dekoration gelesen.

Get Bananas auf dem Mac mit zwei abgehakten Einträgen, jeweils mit einer leicht unterschiedlichen, handgezeichneten Durchstreichungslinie
Zwei Durchstreichungen · zwei unterschiedliche Linien

Schau dir die zwei abgehakten Einträge oben genau an. Die Linien durch „Egg whites“ und „Cottage cheese 2%“ haben unterschiedliche Formen — anderes Wackeln, anderer Winkel. Sie wurden im Abstand von 200 Millisekunden von derselben Shape erzeugt, jedes Mal mit frischer Zufälligkeit. Das ist die ganze Identität der App: kleine, ehrliche Variation, fest im Layout verankert.

Lokalisiert

Neunundzwanzig Sprachen, mit landesüblichen Einkaufsdaten.

Die erste Liste, die ein japanischer Nutzer öffnet, ist kein übersetzter amerikanischer Wocheneinkauf. Es ist tamagiro in einer tanpaku-shitsu-Sektion — Eiweiß, in einer Proteine-Sektion, die den Begriff verwendet, den man tatsächlich in einem Regal in Tokio finden würde. Neunundzwanzig Lokalisierungen im App Store, und jedes nicht-englische Locale liefert eine eigene, handkuratierte SeedData-{locale}.json mit kulturell passenden Beispieleinträgen und Sektionsnamen. Arabisch bekommt biyad al-bayd in al-burutinat. Hebräisch bekommt helbonei beitza in helbonim. Neunundzwanzig Anfangsdatendateien, von Hand verfasst, nicht durch einen String-Übersetzer geschickt.

Get Bananas auf Englisch mit einer Proteine-Sektion mit Eiweiß, Hüttenkäse und Hähnchenbrust
EnglishProteins · Standard-Anfangsdaten
Get Bananas auf Japanisch mit landesüblichen Zutatenbezeichnungen in Katakana und Kanji
日本語たんぱく質 · landesübliche Anfangsdaten
Get Bananas auf Arabisch mit Rechts-nach-links-Layout und landesüblichen Zutatenbezeichnungen
العربيةالبروتينات · RTL
Get Bananas auf Hebräisch mit Rechts-nach-links-Layout und landesüblichen Zutatenbezeichnungen
עבריתחלבונים · RTL
Get Bananas auf vereinfachtem Chinesisch mit landesüblichen Zutatenbezeichnungen
简体中文蛋白质 · landesübliche Anfangsdaten

RTL ist ein Geschenk, sobald man aufhört, dagegen anzukämpfen.

SwiftUI behandelt .leading und .trailing als semantische Richtungen, nicht .left und .right als feste. Lege den Bildschirm einmal semantisch aus, und Arabisch und Hebräisch spiegeln das gesamte Layout kostenlos — die Abschnittsüberschrift wandert nach rechts, der Häkchenkreis links neben den Text, die Buttons „Zurücksetzen“ und „Mehr“ rotieren in die gegenüberliegende Ecke. Wir haben dafür keine einzige Zeile RTL-spezifischen Code geschrieben.

Get Bananas auf Englisch mit zwei abgehakten Einträgen, Links-nach-rechts-Layout
Englisch · LTR
Get Bananas auf Arabisch mit zwei abgehakten Einträgen, Rechts-nach-links-Layout
Arabisch · RTL
Get Bananas auf Hebräisch mit zwei abgehakten Einträgen, Rechts-nach-links-Layout
Hebräisch · RTL

Die handgezeichnete Durchstreichung liegt über all dem und muss das Locale nie kennen. Die Shape sitzt in einem ZStack über dem Text mit dem Eintragsnamen und zeichnet quer über diese Bounding Box; die umgebende Zeile ist das, was SwiftUIs RTL-Layout spiegelt. Die Linie landet dort, wo sie sein soll — über dem Text — ohne ein einziges sprachabhängiges Conditional im Shape-Code.

Architektur

Eine JSON-Datei in deinem iCloud-Container.

Der geräteübergreifende Austausch ist eine einzelne Datei in deinem eigenen iCloud Drive: BananaList.json, im Get Bananas-Container. Der MCP-Server liest und schreibt genau diese Datei. Die iOS-, iPad-, Mac- und Watch-Apps lesen und schreiben genau diese Datei. iCloud übernimmt die Synchronisation — Apples kostenlose, im Ruhezustand verschlüsselte, Ende-zu-Ende-private (sofern Advanced Data Protection aktiv ist) Infrastruktur. Unsere ist gleich null.

JavaScript · mcp-extension/server/index.js:21-28
// 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;

Jeder Pfad, den der MCP-Server berührt, ist ein Geschwister dieser JSON-Datei. Die Lock-Datei liegt direkt daneben (.lock, atomare Schreibvorgänge, Fünf-Sekunden-Timeout, das sich selbst aufräumt, falls sie veraltet ist). Schreibvorgänge gehen in eine prozessgekennzeichnete temporäre Datei (.tmp.{pid}) und werden dann atomar auf den eigentlichen Pfad umbenannt. Das gesamte Concurrency-Modell — Claude gegen die laufende App — passt in eine einzige Acquire/Release-Funktion.

Auf jedem Gerät ist SwiftData der lokale Speicher. Das iCloud-JSON ist das Übertragungsformat. SwiftData bleibt schnell und abfragbar auf dem Gerät; das JSON bleibt einfach und für Menschen lesbar — für die Synchronisation und für Claudes Bearbeitung. Zwei Speicher mit jeweils einer Aufgabe — keiner versucht, beides zu sein.

Was wir damit versprechen können.

Kein 941 Apps-Server. Keine Analytik. Kein Login. Kein API-Key für Claude — du hast dich bereits bei Claude Desktop authentifiziert. Kein Abonnement. Die Erweiterung ist Open Source, sodass jeder Neugierige den gesamten Datenpfad nachlesen kann: es ist die JSON-Datei, und das ist alles, was sie jemals berührt. Deine Einkaufsliste verlässt deinen iCloud-Container niemals über irgendeine Infrastruktur von uns.

Praxis

Die Aufgabe ist die Liste.

Eine Einkaufsliste ist eine Aufgabe. Einen Eintrag in dem Moment festhalten, in dem er dir einfällt, ihn abhaken, wenn du ihn findest, und die Liste die restliche Zeit aus dem Weg haben. Das Produkt ist die Aufgabe. Keine Rezept-App, kein Mahlzeitenplaner, kein Barcode-Scanner, kein Preisverfolger, kein Inventarmanager. Die Liste ist das Lieferergebnis.

Die Claude-Integration verdient ihren Platz gerade deshalb, weil sie das Erfassen und Bearbeiten in genau den Momenten beschleunigt, in denen Tippen am Telefon das falsche Werkzeug ist: am Herd stehend mit nach Knoblauch riechenden Händen, laut über die Mahlzeiten der Woche sprechend, zwölf Einträge von einer Rezeptkarte abkupfernd, ohne jeden einzeln neu tippen zu müssen. Diese Momente an Claude zu delegieren, hält den Rest der App klein.

Alles, was nicht Liste, Erfassen, Abhaken oder diese Delegation ist, ist ein anderes Produkt. Andere Produkte gehören in andere Apps.

Zurückhaltung

Was nicht in Get Bananas steckt.

Die meisten Einkaufslisten-Apps haben eine Roadmap, die in „zum Instacart werden“ endet. Diese hier nicht. Get Bananas weigert sich bewusst, zu einer Lebensmittelplattform heranzuwachsen. Hier ist die explizite Liste der Dinge, die sie nicht tut:

  • Kein Barcode-Scannen
  • Keine Preise, Summen oder Budgetierung
  • Kein Rezeptimport, keine Mahlzeitenplanung
  • Keine Gangnavigation, keine Ladenkarten
  • Keine Web-App
  • Kein Konto, kein Login, keine E-Mail-Sammlung
  • Keine geteilten Listen mit anderen Nutzern (nur dein eigener iCloud, über deine eigenen Geräte hinweg)
  • Keine Analytik, niemals
  • Keine Werbung, kein Abonnement, keine Pro-Stufe
  • Keine Nervscreens, kein In-App-Upselling

Get Bananas kostet 0,99 $. Du zahlst einmal und besitzt sie. Der MCP-Server ist Open Source. Die Daten gehören dir und liegen in deinem iCloud Drive. Die Aufgabe ist schnelles Erfassen, schnelles Abhaken und das Delegieren von Bearbeitungen an Claude, wenn deine Hände voller Koriander sind. Alles andere ist die App von jemand anderem.

Get Bananas.

Jetzt im App Store für iPhone, iPad, Mac und Apple Watch verfügbar. Die Claude Desktop-Erweiterung lässt sich direkt aus der Mac-App heraus installieren.