Get Bananas
Uma lista de compras manuscrita para iPhone, iPad, Mac e Apple Watch — que o Claude pode editar enquanto suas mãos estão ocupadas.
Lançado em abril de 2026. SwiftUI em todos os dispositivos. Uma extensão do Claude Desktop entregue dentro do app para Mac. Vinte e nove idiomas, cada um com dados iniciais de compras curados à mão para que a primeira lista que o usuário vê pareça nativa, não traduzida. Sem servidor, sem conta, sem chave de API. Um arquivo JSON no seu container do iCloud é todo o backend.
O Claude pode alterar sua lista de compras.
Get Bananas inclui uma extensão do Claude Desktop dentro do próprio app para Mac. Abra Configurações no Mac, clique em Instalar Extensão e o Claude Desktop exibe um aviso de instalação. Aceite, abra um novo chat e o Claude tem cinco ferramentas que podem ler e editar sua lista de compras real. Pergunte "o que tem na minha lista?" — ele responde. Diga "adicione ovos e leite" — eles aparecem no seu iPhone na próxima sincronização do iCloud.
Não há cadastro, chave de API ou servidor nosso. A extensão é um pacote .mcpb que conversa com um servidor MCP em Node.js, que lê e escreve em um único arquivo JSON dentro do seu próprio container do iCloud Drive.
Cinco ferramentas, cada uma com um único propósito.
A superfície de ferramentas é intencionalmente pequena. O Claude pode ler a lista, adicionar um item, remover um, atualizar um ou substituir tudo. Não há atalhos de conveniência sofisticados nem invólucros de leitura-modificação-escrita; a superfície segue o que você realmente pediria em uma conversa.
- get_shopping_listLer a lista atual
- add_itemAcrescentar um novo item
- remove_itemRemover um único item
- update_itemMarcar, desmarcar, renomear ou alterar a quantidade
- update_shopping_listSubstituir tudo (ex.: "comece uma lista de Ação de Graças")
Instalada de dentro do próprio app.
As Configurações do app para Mac têm um botão Instalar Extensão. Tocá-lo abre um arquivo get-bananas.mcpb empacotado com NSWorkspace, que o Claude Desktop registra como extensão e pede confirmação ao usuário. A instalação inteira é uma única chamada NSWorkspace.shared.open() sobre um arquivo entregue dentro do bundle do app — porque a plataforma nos deu a primitiva certa: um formato de arquivo que significa "registre-me com o 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." } }
Esse padrão vai importar para muitos apps nativos. A extensão vive dentro do bundle do seu app, é distribuída quando o app é distribuído e atualiza quando o app atualiza — sem registro separado, sem configuração por usuário, sem "copie esta URL para um arquivo de configuração." Se você quer que o Claude consiga fazer algo dentro do seu app, você coloca esse algo dentro do app e deixa o OS apresentar os dois.
Caneta sobre papel, com persistência.
Listas de compras são escritas à mão, no papel, com uma caneta. O app se lê assim. Letras manuscritas no estilo Caveat para os cabeçalhos das seções, linhas finas como traços de caneta para os divisores, círculos vazados para os itens não marcados. Quando você toca para marcar algo, o app desenha uma linha à mão sobre o texto — e cada linha é ligeiramente diferente.




O risco é uma <code>Shape</code>, e cada marcação é única.
A linha desenhada à mão é uma Shape personalizada do SwiftUI com vinte segmentos de caminho. Cada extremidade de segmento recebe um pequeno deslocamento vertical aleatório entre -1.5 e +1.5 pontos. O resultado: cada risco desenhado em tempo de execução é ligeiramente diferente do anterior. Em uma lista de vinte itens, não existem duas linhas idênticas — assim como nunca existem dois traços de caneta iguais.
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 } }
São doze linhas de código. É também a diferença entre um app que parece manuscrito e um que se sente manuscrito. Um risco em SVG estático teria sido entregue no mesmo dia, com a mesma contagem de pixels, e seria lido como decoração.
Olhe atentamente para os dois itens marcados acima. As linhas sobre 'Egg whites' e 'Cottage cheese 2%' têm formas diferentes — ondulação diferente, ângulo diferente. Foram geradas com 200 milissegundos de diferença pela mesma Shape, sorteando aleatoriedade nova a cada vez. Essa é a identidade inteira do app: pequena variação honesta, embutida no layout.
Vinte e nove idiomas, com dados de compras nativos.
A primeira lista que um usuário japonês abre não é uma compra americana traduzida. É tamagiro em uma seção de tanpaku-shitsu — claras de ovo, em uma seção de Proteínas que usa o termo que você realmente encontraria numa prateleira em Tóquio. Vinte e nove localizações na App Store, e cada locale fora do inglês traz seu próprio SeedData-{locale}.json curado à mão, com itens de exemplo e nomes de seção culturalmente apropriados. Em árabe, biyad al-bayd em al-burutinat. Em hebraico, helbonei beitza em helbonim. Vinte e nove arquivos seed, escritos à mão, não passados por um tradutor de strings.





RTL é uma vitória de graça se você parar de lutar contra ele.
O SwiftUI trata .leading e .trailing como direções semânticas, não .left e .right como direções fixas. Disponha a tela semanticamente uma vez e o árabe e o hebraico invertem o layout inteiro de graça — o cabeçalho da seção vai para a direita, o círculo de marcação vai para a esquerda do texto, os botões Reset e Mais giram para o canto oposto. Não escrevemos uma linha de código específica para RTL.
O risco desenhado à mão fica por cima de tudo isso e nunca precisa saber o locale. A Shape está em um ZStack sobre o Text com o nome do item e desenha sobre aquela bounding box; a linha ao redor é o que é espelhado pelo layout RTL do SwiftUI. A linha acaba onde deveria — sobre o texto — sem um único condicional de idioma no código da Shape.
Um arquivo JSON no seu container do iCloud.
A troca entre dispositivos é um único arquivo no seu próprio iCloud Drive: BananaList.json, no container do Get Bananas. O servidor MCP lê e escreve exatamente esse arquivo. Os apps de iOS, iPad, Mac e Watch leem e escrevem exatamente esse arquivo. O iCloud cuida da sincronização — a infraestrutura gratuita da Apple, criptografada em repouso, ponta a ponta privada quando a Proteção Avançada de Dados está ativada. A nossa é nenhuma.
// 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;
Cada caminho que o servidor MCP toca é vizinho desse arquivo JSON. O arquivo de lock vive ao lado dele (.lock, escritas atômicas, timeout de cinco segundos que se autolimpa se ficar obsoleto). Escritas vão para um arquivo temporário marcado com o processo (.tmp.{pid}) e depois renomeiam atomicamente para o caminho real. O modelo de concorrência inteiro — Claude versus o app em execução — cabe em uma única função de aquisição/liberação.
Em cada dispositivo, o SwiftData é o armazenamento local. O JSON do iCloud é o formato de transporte. O SwiftData permanece rápido e consultável no dispositivo; o JSON permanece simples e legível por humanos para sincronização e para o Claude manipular. Dois armazenamentos com um trabalho cada — nenhum tenta ser os dois.
O que isso nos permite prometer.
Sem servidor da 941 Apps. Sem analytics. Sem login. Sem chave de API para o Claude — você já se autenticou com o Claude Desktop. Sem assinatura. A extensão é open source, então qualquer curioso pode ler todo o caminho de dados: é o arquivo JSON, e isso é tudo que ela toca. Sua lista de compras nunca sai do seu container do iCloud por nenhuma infraestrutura nossa.
O trabalho é a lista.
Uma lista de compras é um único trabalho. Capturar um item no momento em que você pensa nele, marcá-lo quando encontrar, tirar a lista do caminho no resto do tempo. O produto é o trabalho. Não um app de receitas, não um planejador de refeições, não um leitor de código de barras, não um rastreador de preços, não um gerenciador de estoque. A lista é o entregável.
A integração com o Claude conquista seu lugar especificamente porque acelera a captura e edição nos casos em que digitar no celular é a ferramenta errada: parado em frente ao fogão com as mãos cheirando a alho, falando em voz alta sobre as refeições da semana, copiando doze itens de um cartão de receita sem redigitar cada um. Delegar esses momentos ao Claude mantém o resto do app pequeno.
Tudo que não for lista, captura, marcação ou essa delegação é um produto diferente. Produtos diferentes pertencem a apps diferentes.
O que não há no Get Bananas.
A maioria dos apps de lista de compras tem um roadmap que termina em "virar a Instacart." Este não. O Get Bananas se recusa a crescer e virar uma plataforma de mercado de propósito. Aqui está a lista explícita do que ele não faz:
- Sem leitura de código de barras
- Sem preços, totais ou orçamento
- Sem importação de receitas ou planejamento de refeições
- Sem navegação por corredores ou mapas de loja
- Sem versão web
- Sem conta, sem login, sem coleta de e-mail
- Sem listas compartilhadas com outros usuários (apenas seu próprio iCloud, em seus próprios dispositivos)
- Sem analytics, nunca
- Sem anúncios, sem assinatura, sem versão Pro
- Sem telas insistentes, sem upsell dentro do app
Get Bananas custa US$ 0,99. Você paga uma vez e ele é seu. O servidor MCP é open source. Os dados são seus e vivem no seu iCloud Drive. O trabalho é captura rápida, marcação rápida e delegar edições ao Claude quando suas mãos estão cheias de coentro. Todo o resto é app de outra pessoa.
Get Bananas.
Disponível agora na App Store para iPhone, iPad, Mac e Apple Watch. Instale a extensão do Claude Desktop diretamente pelo app no Mac.