Get Bananas

Odręczna lista zakupów na iPhone, iPad, Mac i Apple Watch — którą Claude może edytować, gdy masz zajęte ręce.

Wydane w kwietniu 2026. SwiftUI na każdym urządzeniu. Rozszerzenie Claude Desktop dostarczane wewnątrz aplikacji na Maca. Dwadzieścia dziewięć języków, każdy z ręcznie dobranymi danymi startowymi listy zakupów, dzięki czemu pierwsza lista, którą widzi użytkownik, sprawia wrażenie rodzimej, a nie tłumaczonej. Bez serwera, bez konta, bez klucza API. Cały backend to jeden plik JSON w Twoim kontenerze iCloud.

Get Bananas na iPhonie wyświetlający odręczną listę zakupów z białkami i węglowodanami
Claude Desktop
dodaj banany do mojej listy zakupów
add_item({"name": "bananas"})
Gotowe — dodałem banany do działu Owoce i Warzywa. Coś jeszcze?
Integracja z Claude

Claude może zmieniać Twoją listę zakupów.

Get Bananas dostarcza rozszerzenie Claude Desktop wewnątrz samej aplikacji na Maca. Otwórz Ustawienia na Macu, kliknij Zainstaluj rozszerzenie, a Claude Desktop wyświetli okno instalacji. Zaakceptuj, otwórz nową rozmowę, a Claude dostaje pięć narzędzi, którymi może czytać i edytować Twoją prawdziwą listę zakupów. Zapytaj „co mam na liście?” — odpowie. Powiedz „dodaj jajka i mleko” — pojawią się na Twoim iPhonie przy następnej synchronizacji iCloud.

Nie ma rejestracji, nie ma klucza API, nie ma naszego serwera. Rozszerzenie to pakiet .mcpb, który komunikuje się z serwerem MCP w Node.js, a ten czyta i zapisuje pojedynczy plik JSON w Twoim kontenerze iCloud Drive.

Claude Desktop Twoja zainstalowana aplikacja
serwer MCP get-bananas.mcpb
Get Bananas iCloud · BananaList.json

Pięć narzędzi, każde do jednego zadania.

Powierzchnia narzędzi jest celowo niewielka. Claude może odczytać listę, dodać pozycję, usunąć ją, zaktualizować lub podmienić całość. Nie ma sprytnych pomocniczych skrótów ani opakowań typu odczyt-modyfikacja-zapis; powierzchnia odpowiada temu, o co realnie poprosiłbyś w rozmowie.

  • get_shopping_listOdczytaj bieżącą listę
  • add_itemDopisz nową pozycję
  • remove_itemUsuń pojedynczą pozycję
  • update_itemOdhacz, odznacz, zmień nazwę lub ilość
  • update_shopping_listHurtowa wymiana (np. „zacznij listę na Święto Dziękczynienia”)

Instalowane z poziomu aplikacji.

Ustawienia aplikacji na Maca zawierają przycisk Zainstaluj rozszerzenie. Jego dotknięcie otwiera dołączony plik get-bananas.mcpb przez NSWorkspace, który Claude Desktop rejestruje jako rozszerzenie i prosi użytkownika o potwierdzenie. Cała instalacja to jedno wywołanie NSWorkspace.shared.open() na pliku dostarczonym wewnątrz pakietu aplikacji — bo platforma podała nam właściwą prymitywę: format pliku, który znaczy „zarejestruj mnie w 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."
    }
}

Ten wzorzec będzie miał znaczenie dla wielu natywnych aplikacji. Rozszerzenie żyje wewnątrz pakietu Twojej aplikacji, jest dostarczane razem z aplikacją i aktualizowane razem z nią — bez osobnego rejestru, bez konfiguracji per użytkownik, bez „wklej ten URL do pliku konfiguracyjnego”. Jeśli chcesz, by Claude umiał coś zrobić w Twojej aplikacji, umieszczasz to coś w aplikacji i pozwalasz, by OS ich sobie przedstawił.

Estetyka

Pióro na papierze, z trwałością.

Listy zakupów pisze się ręcznie, na papierze, długopisem. Aplikacja czyta się właśnie tak. Odręczne litery w stylu Caveat dla nagłówków sekcji, lekkie cienkie linie dla separatorów, puste kółka dla nieodhaczonych pozycji. Gdy stukniesz, by coś odhaczyć, aplikacja rysuje odręczną linię przez tekst — i każda linia jest nieco inna.

Get Bananas na iPhonie wyświetlający listę zakupów
iPhone
Get Bananas na iPadzie wyświetlający listę zakupów
iPad
Get Bananas na Macu wyświetlający listę zakupów z odręcznym nagłówkiem
Mac
Get Bananas na Apple Watch wyświetlający listę zakupów
Watch

Przekreślenie to <code>Shape</code>, a każdy haczyk jest unikalny.

Odręczna linia to niestandardowy SwiftUI Shape z dwudziestoma segmentami ścieżki. Każdy koniec segmentu dostaje niewielkie losowe pionowe przesunięcie między -1.5 a +1.5 punktu. Efekt: każde przekreślenie rysowane w czasie pracy jest nieco inne od poprzedniego. Na liście dwudziestu pozycji żadne dwie linie nie są identyczne — tak jak żadne dwa pociągnięcia długopisem nie są.

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
    }
}

To dwanaście linii kodu. To także różnica między aplikacją, która wygląda odręcznie, a taką, która czuje się odręcznie. Statyczne przekreślenie w SVG dałoby się wydać tego samego dnia, przy tej samej liczbie pikseli, i czytałoby się jak dekoracja.

Get Bananas na Macu z dwoma pozycjami odhaczonymi odręcznymi liniami przekreślenia, każda nieco inna
Dwa przekreślenia · dwie różne linie

Przyjrzyj się dokładnie dwóm odhaczonym pozycjom powyżej. Linie przez „Egg whites” i „Cottage cheese 2%” mają różne kształty — różne falowanie, różny kąt. Wygenerował je ten sam Shape w odstępie 200 milisekund, każdorazowo czerpiąc świeżą losowość. To cała tożsamość aplikacji: drobna szczera zmienność, wpisana w układ.

Zlokalizowane

Dwadzieścia dziewięć języków z rodzimymi danymi zakupowymi.

Pierwsza lista, którą otwiera japoński użytkownik, to nie przetłumaczone amerykańskie zakupy. To tamagiro w sekcji tanpaku-shitsu — białka jaj w sekcji Białka, użyto terminu, który faktycznie znajdziesz na półce w Tokio. Dwadzieścia dziewięć lokalizacji w App Store, a każda nieanglojęzyczna lokalizacja dostarcza własny ręcznie dobrany SeedData-{locale}.json z kulturowo trafnymi przykładowymi pozycjami i nazwami sekcji. Arabski dostaje biyad al-bayd w al-burutinat. Hebrajski dostaje helbonei beitza w helbonim. Dwadzieścia dziewięć plików startowych, napisanych ręcznie, a nie przepuszczonych przez tłumacz stringów.

Get Bananas po angielsku z sekcją Proteins zawierającą białka jaj, twaróg, pierś z kurczaka
EnglishProteins · domyślne dane startowe
Get Bananas po japońsku z nazwami składników zapisanymi katakaną i kanji
日本語たんぱく質 · rodzime dane startowe
Get Bananas po arabsku z układem od prawej do lewej i nazwami składników w języku ojczystym
العربيةالبروتينات · RTL
Get Bananas po hebrajsku z układem od prawej do lewej i nazwami składników w języku ojczystym
עבריתחלבונים · RTL
Get Bananas w chińskim uproszczonym z nazwami składników w języku ojczystym
简体中文蛋白质 · rodzime dane startowe

RTL to darmowa wygrana, jeśli przestaniesz z nim walczyć.

SwiftUI traktuje .leading i .trailing jako kierunki semantyczne, a nie .left i .right jako stałe. Rozłóż ekran semantycznie raz, a arabski i hebrajski przerzucą cały układ za darmo — nagłówek sekcji wędruje na prawo, kółko zaznaczenia ląduje po lewej stronie tekstu, a przyciski Reset i Więcej obracają się do przeciwnego rogu. Nie napisaliśmy ani jednej linii kodu specyficznego dla RTL.

Get Bananas po angielsku z dwoma odhaczonymi pozycjami, układ od lewej do prawej
Angielski · LTR
Get Bananas po arabsku z dwoma odhaczonymi pozycjami, układ od prawej do lewej
Arabski · RTL
Get Bananas po hebrajsku z dwoma odhaczonymi pozycjami, układ od prawej do lewej
Hebrajski · RTL

Odręczne przekreślenie żyje na wierzchu tego wszystkiego i nigdy nie musi znać lokalizacji. Shape siedzi w ZStack nad Text z nazwą pozycji i rysuje wzdłuż tego obszaru ograniczającego; otaczający wiersz to to, co odbija układ RTL SwiftUI. Linia trafia tam, gdzie powinna — nad tekstem — bez ani jednego warunku językowego w kodzie Shape.

Architektura

Jeden plik JSON w Twoim kontenerze iCloud.

Wymianą danych między urządzeniami jest pojedynczy plik w Twoim własnym iCloud Drive: BananaList.json, w kontenerze Get Bananas. Serwer MCP czyta i zapisuje dokładnie ten plik. Aplikacje na iOS, iPad, Mac i Watch czytają i zapisują dokładnie ten plik. Synchronizacją zajmuje się iCloud — darmowa infrastruktura Apple, szyfrowana w spoczynku, end-to-end-prywatna gdy włączona jest Zaawansowana Ochrona Danych. Naszej tu nie ma.

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;

Każda ścieżka, której dotyka serwer MCP, jest sąsiadem tego pliku JSON. Plik blokady leży obok niego (.lock, atomowe zapisy, pięciosekundowy timeout, który sam się sprząta, gdy się zestarzeje). Zapisy idą do oznaczonego procesem pliku tymczasowego (.tmp.{pid}), a następnie atomowo zmieniają nazwę na właściwą ścieżkę. Cały model współbieżności — Claude kontra działająca aplikacja — mieści się w jednej funkcji acquire/release.

Na każdym urządzeniu lokalnym magazynem jest SwiftData. Plik JSON w iCloud to format wymiany. SwiftData pozostaje szybki i odpytywalny lokalnie; JSON pozostaje prosty i czytelny dla człowieka, dla synchronizacji i dla Claude'a, by mógł nim manipulować. Dwa magazyny, każdy z jednym zadaniem — żaden nie próbuje być oboma.

Co to nam pozwala obiecać.

Brak serwera 941 Apps. Brak analityki. Brak logowania. Brak klucza API dla Claude'a — uwierzytelniłeś się już w Claude Desktop. Brak subskrypcji. Rozszerzenie jest open source, więc każdy ciekawski może przeczytać całą ścieżkę danych: to plik JSON i tylko jego dotyka. Twoja lista zakupów nigdy nie opuszcza Twojego kontenera iCloud przez jakąkolwiek naszą infrastrukturę.

Praktyka

Robotą jest lista.

Lista zakupów to jedno zadanie. Złap pozycję w chwili, gdy o niej pomyślisz, odhacz ją, gdy ją znajdziesz, a przez resztę czasu trzymaj listę z dala od oczu. Produkt to robota. Nie aplikacja z przepisami, nie planer posiłków, nie skaner kodów kreskowych, nie tracker cen, nie menedżer zapasów. Lista to deliverable.

Integracja z Claude'em zarabia swoje miejsce konkretnie dlatego, że przyspiesza dorzucanie i edycję w przypadkach, gdy pisanie na telefonie jest niewłaściwym narzędziem: gdy stoisz przy kuchence z rękami pachnącymi czosnkiem, gdy omawiasz na głos posiłki na tydzień, gdy przepisujesz dwanaście pozycji z karty z przepisem, nie wystukując każdej. Oddanie tych chwil Claude'owi sprawia, że reszta aplikacji pozostaje mała.

Wszystko, co nie jest listą, dorzucaniem, odhaczaniem ani tym oddelegowaniem, to inny produkt. Inne produkty należą do innych aplikacji.

Powściągliwość

Czego nie ma w Get Bananas.

Większość aplikacji do list zakupów ma roadmapę, która kończy się na „staniu się Instacartem”. Ta nie. Get Bananas celowo odmawia rozrastania się w platformę spożywczą. Oto wprost lista rzeczy, których nie robi:

  • Bez skanowania kodów kreskowych
  • Bez cen, sum, bez budżetowania
  • Bez importu przepisów ani planowania posiłków
  • Bez nawigacji po alejkach ani map sklepów
  • Bez aplikacji webowej
  • Bez konta, bez logowania, bez zbierania adresów e-mail
  • Bez współdzielonych list z innymi użytkownikami (tylko Twój własny iCloud, między Twoimi własnymi urządzeniami)
  • Bez analityki, nigdy
  • Bez reklam, bez subskrypcji, bez wersji Pro
  • Bez ekranów nagabujących, bez sprzedaży w aplikacji

Get Bananas kosztuje 0,99 dolara. Płacisz raz i jest Twoja. Serwer MCP jest open source. Dane są Twoje i żyją w Twoim iCloud Drive. Robotą jest szybkie dorzucanie, szybkie odhaczanie i oddelegowanie edycji do Claude'a, gdy masz ręce pełne kolendry. Cała reszta to czyjaś inna aplikacja.

Get Bananas.

Już dostępne w App Store na iPhone, iPad, Mac i Apple Watch. Rozszerzenie Claude Desktop instalujesz z poziomu aplikacji na Maca.