É um gerenciador de área de transferência para macOS em que os itens copiados vão se acumulando e depois você escolhe o que usar.
Foi feito já pensando em monetização. No primeiro dia o assunto preço já apareceu, e três dias depois eu defini qual modelo de venda usar, então não foi algo feito como hobby e publicado por acaso. Mas, depois de pronto, quem mais usa sou eu mesmo. Essa é a parte que mais me satisfaz.
O ponto em que ele mais brilhou foi ao trabalhar com IA. Se você roda vários prompts ou manda os resultados irem para a área de transferência, tudo vai se acumulando em ordem, e mesmo fazendo outra coisa nesse meio-tempo você não perde nada.
Dá para editar o conteúdo acumulado. A maioria dos gerenciadores de área de transferência mantém um histórico somente leitura, mas aqui você abre o item, edita na hora e salva com ⌘S. Há numeração de linhas, busca com ⌘F e substituição com ⌘R. Acabar com o vai e volta de levar o que foi copiado para um editor, corrigir e copiar de novo tem um impacto maior do que parece.
Enquanto desenvolvia, coloquei lá dentro também várias coisinhas úteis. Formatação de JSON, SQL e Mongo, XML↔YAML, decodificação de JWT, codificação Base64/URL, timestamp Unix, SHA-256, AES, comparação linha a linha escolhendo dois cards com ⌘D. São coisas que fiz porque tinha preguiça de abrir uma aba do navegador.
No estado padrão, ele não pede nenhuma permissão do sistema. Todos os dados são criptografados e salvos apenas localmente, sem análise, rastreamento ou servidor.
Registro de 24 dias
Foi feito com Claude Code. Como o histórico da conversa ficou salvo, fui olhar e vi que foram 310 interações em 24 dias; ao classificar o conteúdo, houve 28 apontamentos de falhas e 15 recusas ou reversões de propostas. Em ordem cronológica, foi assim.
5/7 (30 interações) — A primeira instrução foi: "vá me perguntando os requisitos e detalhando". Ainda naquele dia definimos nome e bundle ID, adicionamos base64 e beautify, e incluímos a visualização detalhada com ⌘⏎. A conversa sobre "não seria um app de US$ 4,99 na App Store?" também surgiu nesse dia. E removi a função de colagem automática. "Parece que isso pode causar colagens não intencionais, então melhor tirar."
6/7~7/7 — A pergunta "onde o conteúdo da área de transferência é armazenado?" acabou levando à adoção de criptografia local. Corrigi um bug em que copiar do Excel fazia o item ser reconhecido como imagem e passei dois dias rastreando por que o atalho ⌘⇧V não funcionava. Foi naquele esquema de rodar log show manualmente e repassar os logs.
8/7 — Defini o modelo de venda. Entre cobrar desde o início ou liberar de graça e cobrar dentro do app, a conversa foi: "será que vendo só como pago desde o começo? Algo como só 30 dias grátis" → e decidi pelo teste de 30 dias. E trouxe de volta a colagem automática, que tinha removido três dias antes. Depois de usar na prática, achei inconveniente que "ao selecionar, ele não cole imediatamente".
11/7 — Criei a função de snippets e depois matei. "A usabilidade está uma porcaria" → "me proponha uma direção de melhoria; se ficar ruim, removemos a função" → "não, tira". A decisão mais difícil foi descartar algo que já estava feito.
12/7~16/7 — Analisei distribuir licenças até por Lemon Squeezy e PayPal, mas no fim organizei tudo pela App Store. Depois disso veio uma sequência de falha na validação de endereço, código bancário, W-8BEN e dúvidas sobre registro empresarial. Levei mais tempo nisso do que escrevendo código.
19/7 — Eu já tinha enviado para revisão, mas, olhando a captura de tela do launcher, percebi que o nome do app estava sendo instalado como DevClip-AppStore. Cancelei a submissão e gerei uma nova build.
25/7 — Rejeição. Foi a Guideline 2.4.5 (Performance: Hardware Compatibility).
Rejeição, e uma decisão encerrada em 24 dias
Por ironia, o motivo da rejeição foi justamente aquela função. O 'colar imediatamente', que eu mesmo tinha removido em 5 de julho por achar arriscado e depois ressuscitado três dias depois por causa da inconveniência no uso. Ele usa a permissão de Acessibilidade, e a Apple entendeu isso como "uso que não tem finalidade de acessibilidade".
Tirar a função seria simples, mas como eu já a havia removido uma vez e restaurado por necessidade, desta vez decidi mantê-la. Em vez disso, mudei a forma de solicitar a permissão.
Ela já vinha desativada por padrão e a solicitação só acontecia quando o usuário a ativava manualmente. O problema era que o revisor não tinha, em lugar nenhum da tela, uma forma de confirmar esse fato. Então fiz com que, ao ativar o toggle, em vez de ir direto para a janela de permissão do sistema, o app mostrasse primeiro uma janela explicativa. Algo como: "isso é usado apenas para enviar um único ⌘V logo após escolher um item e não lê o conteúdo de outros apps"; só ao clicar em "Continuar" é que a janela de permissão do sistema aparece.
Na nota de revisão, escrevi o caminho de reprodução — "você pode verificar manualmente em Configurações > Geral" —, reenviei e foi aprovado.
"Já funcionar assim" e "o usuário conseguir confirmar isso" são problemas diferentes.
Como trabalhei com IA
Quase não escrevi código diretamente. Eu fiquei mais na posição de ler e julgar o que era implementado a partir dos prompts; sou engenheiro, mas desta vez, na prática, foquei em produto e QA.
Não foi tudo tranquilo. Três vezes corrigimos por chute o problema de o arraste de imagens não funcionar, e toda vez a verificação sobrava para mim. Só depois de eu dizer "faz uns testes, para eu não precisar verificar tudo manualmente" é que o processo mudou para validar com dados reais antes de corrigir. Depois disso, cada bug encontrado manualmente passou a virar um teste fixo, e hoje uma parte considerável dos 270 testes nasceu assim.
No fim, foram 87 commits, cerca de 10 mil linhas de Swift e 3.700 linhas de testes.
Por 30 dias, todas as funções são gratuitas. Depois disso, as funções básicas continuam gratuitas, e o Pro não é assinatura, mas compra única.
2 comentários
Parece que quase todos os recursos presentes no Raycast são compatíveis; por acaso, quais seriam as diferenças?
Sim, olhando só para o histórico da área de transferência, há bastante sobreposição. Mas o Raycast tem muitas outras funções além disso, então para mim ele parecia excessivo.
O que eu procurei priorizar foi o seguinte.
Primeiro, deixá-lo leve e focado apenas no gerenciamento do histórico da área de transferência; no momento ele tem cerca de 2 MB.
Além disso, dá para editar o conteúdo salvo na visualização detalhada antes de colar. Achei isso prático para revisar vários prompts e fazer pequenos ajustes antecipadamente.
Também dei bastante atenção à busca e à organização em pastas. Enquanto trabalho, tentei resolver o problema de informações necessárias, coisas de uso único ou itens que é chato ter de procurar de novo.
Fiz com que fosse possível pesquisar por conteúdo, tags, título etc.
Mais para frente, quero permitir adicionar funções ou layouts diretamente por meio de plugins, mas isso ainda não está bem definido.
Também acho que o Raycast é um ótimo app, e quero tentar fazer com que isso seja uma questão de escolha conforme a preferência de cada um.
Obrigado pela opinião.