9 pontos por medidevlab 2026-04-15 | 16 comentários | Compartilhar no WhatsApp

Olá. Sou estudante de medicina e, estudando vibe coding por conta própria há 2 meses, criei um app de barra de menus para macOS. Estou lançando hoje!

MiniAI - o que o app faz

Em qualquer lugar, você seleciona um texto e aperta o atalho definido; uma pequena janela aparece na barra de menus e a IA explica para você. O ponto principal é eliminar o processo de pular para o navegador, pesquisar no Google e voltar.

No começo, fiz isso porque era chato ficar procurando termos desconhecidos enquanto lia artigos científicos, mas depois de pronto percebi que acabei usando em várias situações, como ao escrever e-mails em inglês ou ao analisar código.

Stack técnica

  • UI: NSPanel + SwiftUI (floating window do app de barra de menus)
  • Resposta da IA: streaming via SSE com efeito de digitação em tempo real
  • Backend: Supabase Edge Function como proxy da API (para não embutir a chave de API no cliente)
  • Rate limiting: limitação por usuário baseada em PostgreSQL
  • Deploy: assinatura com Developer ID + notarização concluída

A parte que mais me tomou tempo durante o desenvolvimento

  1. Detecção global de seleção de texto (tratamento de permissões da Accessibility API)
  2. Segurança da chave de API (no início eu tinha hardcoded no cliente, descobri depois e refiz tudo)
  3. Processo de notarização (como era minha primeira vez, perdi 2 dias nisso)

Acho que especialmente o item 3 vai ser bem compreendido por quem já distribuiu app para macOS. Mesmo seguindo a documentação, havia várias etapas que não funcionavam de primeira.

Estado atual

  • Beta pública, gratuita
  • Download no site oficial

Feedback é bem-vindo

  • Se a UX do atalho parece natural
  • Se não há problemas em uma instalação limpa
  • Se há pontos de melhoria na arquitetura
  • Conselhos de quem já desenvolveu app parecido

Também aceito de bom grado sugestões de melhoria de arquitetura ou relatos de perrengues com a notarização no macOS.

E mais uma coisa: para quem, como desenvolvedor, tem um trabalho principal e cria produtos paralelamente como side project,
como vocês tomam a decisão entre "vale a pena explorar mais isso" vs "encerrar como aprendizado e partir para o próximo"?

16 comentários

 
t7vonn 2026-04-17

Olá, deixo algumas sugestões!

  • Pelo que sei, entre os usuários de Mac há muita gente que usa ferramentas como Alfred / Raycast, e o atalho padrão desses apps é opt + space. Talvez fosse melhor escolher outro atalho padrão.
  • Parece que não há assinatura/notarização.
(1) codesign  
$ codesign -dv --verbose=4 MiniAi.app  
Executable=/Users/.../Downloads/MiniAi.app/Contents/MacOS/MiniAi  
Identifier=com.miniai.app  
Format=app bundle with Mach-O thin (arm64)  
CodeDirectory v=20400 size=8551 flags=0x2(adhoc) hashes=257+7 location=embedded  
VersionPlatform=1  
VersionMin=917504  
VersionSDK=1704960  
Hash type=sha256 size=32  
CandidateCDHash sha256=c60ed7e37e533d09cf5365d97bf6428c8d42f2dd  
CandidateCDHashFull sha256=c60ed7e37e533d09cf5365d97bf6428c8d42f2dd94cdca992cd3f61e8e6554a3  
Hash choices=sha256  
CMSDigest=c60ed7e37e533d09cf5365d97bf6428c8d42f2dd94cdca992cd3f61e8e6554a3  
CMSDigestType=2  
Executable Segment base=0  
Executable Segment limit=1556480  
Executable Segment flags=0x1  
Page size=16384  
CDHash=c60ed7e37e533d09cf5365d97bf6428c8d42f2dd  
Signature=adhoc  
Info.plist entries=24  
TeamIdentifier=not set  
Sealed Resources version=2 rules=13 files=7  
Internal requirements count=0 size=12  
  
(2) gatekeeper  
$ spctl -a -vvv -t execute MiniAi.app  
MiniAi.app: rejected  
  
(3) Notary staple  
$ xcrun stapler validate MiniAi.dmg  
Processing: /Users/.../Downloads/MiniAi.dmg  
MiniAi.dmg does not have a ticket stapled to it.  
  
$ xcrun stapler validate MiniAi.app  
Processing: /Users/.../Downloads/MiniAi.app  
MiniAi.app does not have a ticket stapled to it.  
  • Em vez de distribuir como arquivo dmg, seria ótimo se desse para instalar via App Store / Homebrew.
 
medidevlab 2026-04-18

Nossa, muito obrigado por analisar com tanto detalhe 🙏

  1. Atalho: isso mesmo. O problema de conflito com ⌥Space é o feedback que mais recebemos dos usuários de Alfred/Raycast.
    Estamos cientes da necessidade de uma função para configurar atalhos personalizados e vamos colocá-la na prioridade de melhorias!

  2. Assinatura/notarização: sim, no momento está com assinatura ad hoc.
    Como o projeto ainda está no início do desenvolvimento, o custo da notarização acabou pesando um pouco, então estávamos adiando isso 😅
    Obrigado por conferir e apontar isso!

  3. Forma de distribuição: também estamos considerando distribuir pela App Store ou pelo Homebrew Cask.
    Por enquanto, lançamos primeiro em DMG para agilizar a distribuição,
    mas acho que a direção que você sugeriu faz sentido,,

Fiquei até emocionado ao ver que você conferiu até o codesign diretamente.
Muito, muito obrigado pelo carinho com o produto!
Se aparecer qualquer outro incômodo, por favor me avise — esse apoio é uma grande força pra gente 😄

 
kurthong 2026-04-16

A menos que você esteja realmente vendendo isso em nível de produção, acho que também não teria problema publicar como open source no GitHub e receber feedback, né?

 
medidevlab 2026-04-16

Muito obrigado pela sua opinião valiosa!

Como é a minha primeira vez com um negócio relacionado a isso, toquei o projeto mais como experiência, mas acho que distribuí-lo como open source para que muitas pessoas possam usá-lo diretamente também parece uma ótima ideia 😁

Se eu lançá-lo como open source, vocês vão ter que me dar feedback, hein~~ :)

 
kurthong 2026-04-16

Ser open source não significa que você não possa vender, não. Há bastante app que segue essa estratégia de dois caminhos. Open source é mais um conceito de construir junto com outros desenvolvedores interessados no projeto do que com o público em geral. Se a sua preocupação é alguém copiar, dá para resolver definindo bem a licença, mas... nesta era da IA, com projetos clean room surgindo aos montes, nem sei se isso faz tanta diferença. Se você liberar como open source, acha mesmo que a gente vai só dar feedback? haha

 
medidevlab 2026-04-16

kkkkkkk obrigado pelos conselhos do desenvolvedor veterano
Hoje em dia o mundo está mudando rápido demais, então está muito difícil conseguir se adaptar!
Obrigado por compartilhar tanta informação, e eu agradeço se vocês continuarem acompanhando e demonstrando interesse daqui para frente 😁

 
ly0738 2026-04-15

Qual modelo de IA é?

 
jhk0530 2026-04-15

Diz que usa a API da Claude.

 
ly0738 2026-04-15

Como isso estava claramente escrito no texto, fui procurar meio assustado, pensando: será que eu não fui quem perguntou isso?

Depois de perder um bom tempo procurando no resumo, no texto original, no site e até instalando o programa, acabei encontrando isso na política de privacidade.
Normalmente ninguém vai fuçar até a política de privacidade só para verificar a stack técnica.

Da próxima vez, eu agradeceria se você também informasse onde isso está escrito.

 
medidevlab 2026-04-15

Muito obrigado pelo feedback valioso!

Pensei em mencionar a parte do modelo, mas achei que o público em geral talvez não conhecesse bem o conceito de API, então acabei não mencionando.

Como há pessoas com dúvidas sobre isso, vou fazer essa correção.

Por acaso você chegou a usar o app? Fiquei curioso para saber o que achou :)

 
ly0738 2026-04-15

Ops, eu disse isso ao jhk0530.

 
ly0738 2026-04-15

Onde diz que usa a API do Claude?
Fui ver o texto e o site, mas não encontrei.

 
medidevlab 2026-04-15

Olá! Sou o criador.
Estou usando o modelo Claude Sonnet 4!

No futuro, pretendo implementar uma opção para que vocês possam escolher diretamente entre BYOK ou outros modelos.

Obrigado pelo interesse :)

 
ly0738 2026-04-15

Obrigado pela resposta!
Eu costumava usar o recurso de tradução em popup do DeepL, então acho que vou testar este por um tempo.
No futuro, talvez também seja uma boa ideia oferecer suporte ao formato https://www.openresponses.org/ para permitir o uso de LLMs locais!

 
medidevlab 2026-04-15

Parece que você pretende usar principalmente o recurso de tradução!

No futuro, também planejamos adicionar uma função de seleção de modo, para avançar na direção de oferecer recursos de tradução um pouco mais especializados :)

Obrigado também pela sugestão de formas de usar modelos locais, além de APIs externas! Vou adicionar isso aos planos de implementação futuros.

Agradeço muito pelo seu valioso feedback e, se surgir qualquer incômodo, por favor nos avise 😄

 
ly0738 2026-04-23

Usei por uma semana e a experiência de uso foi tão boa que continuo usando. Obrigado.
Acho que seria ainda melhor se resolvessem apenas o problema do método de distribuição dos atalhos de teclado, como outras pessoas comentaram! Estou animado para ver o que vem por aí.