Hola. Soy estudiante de medicina y desde hace 2 meses he estado aprendiendo vibe coding por mi cuenta mientras hacía una app para la barra de menú de macOS. ¡Hoy la publico!
MiniAI - Qué hace la app
Puedes seleccionar texto en cualquier lugar y, al presionar el atajo que configures, aparece una pequeña ventana desde la barra de menú donde la IA te lo explica. La clave es eliminar el proceso de ir al navegador, buscar en Google y luego volver.
Originalmente la hice porque me daba flojera buscar términos desconocidos mientras leía papers, pero después de crearla me di cuenta de que también la uso en varias situaciones, como al escribir correos en inglés o al revisar código.
Stack tecnológico
- UI: NSPanel + SwiftUI (floating window de una app de barra de menú)
- Respuestas de IA: efecto de escritura en tiempo real con streaming SSE
- Backend: Supabase Edge Function como proxy de API (para no incrustar la API key en el cliente)
- Rate limiting: límites por usuario basados en PostgreSQL
- Despliegue: firma con Developer ID + notarización completada
La parte que más tiempo me tomó durante el desarrollo
- Detección global de selección de texto (manejo de permisos de la Accessibility API)
- Seguridad de la API key (al principio la había hardcodeado en el cliente, luego me di cuenta y rehice todo)
- Proceso de notarización (como era mi primera vez, perdí 2 días)
Creo que quienes ya hayan distribuido apps para macOS se van a identificar especialmente con el punto 3. Incluso siguiendo la documentación, hubo varias etapas que no salieron a la primera.
Estado actual
- Beta pública, gratis
- La descarga está en la página oficial
Feedback bienvenido
- Si la UX del atajo se siente natural
- Si no hay problemas en una instalación limpia
- Si ven puntos de mejora en la arquitectura
- Consejos de quienes hayan desarrollado apps parecidas
También agradecería que compartan ideas para mejorar la arquitectura o experiencias peleándose con la notarización de macOS.
Y una cosa más: para quienes, como desarrolladores, tienen su trabajo principal por un lado y hacen productos como side project por otro, tengo curiosidad por saber cómo toman la decisión entre
"¿Le sigo metiendo a esto?" vs "Lo cierro como experiencia y paso a lo siguiente".
16 comentarios
Hola, les dejo algunos comentarios.
opt + space. Quizás convendría que el atajo predeterminado fuera otro.Vaya, muchas gracias por revisarlo con tanto detalle 🙏
Atajo de teclado: así es. Entre los usuarios de Alfred/Raycast, el conflicto con ⌥Space
es lo que más nos están reportando. Tenemos presente la función para configurar un atajo personalizado,
y la pondremos dentro de las prioridades de mejora.
Firma/notarización: sí, actualmente está con firma adhoc.
Como todavía estamos en una etapa temprana de desarrollo, el costo de la notarización nos resultaba un poco pesado,
así que lo habíamos dejado en pausa 😅
¡Gracias por revisarlo!
Método de distribución: también estamos considerando distribuirlo por App Store o Homebrew Cask.
Por ahora salió primero en DMG para poder lanzarlo rápido,
pero creo que la dirección que mencionaste es la correcta.
Me emocionó ver que incluso revisaste
codesigndirectamente.¡Muchísimas gracias por apreciar tanto el producto!
Si vuelve a surgir alguna incomodidad, por favor cuéntamelo; de verdad nos anima mucho 😄
A menos que especialmente lo estés vendiendo como algo de nivel producción o algo así, creo que también estaría bien que lo publiques como open source en GitHub para recibir feedback, ¿no?
¡Muchas gracias por sus valiosos comentarios!
Como es la primera vez que hago un negocio relacionado con esto, lo avancé como experiencia, pero creo que también sería una buena idea publicarlo como open source para que muchas personas puedan usarlo directamente 😁
Si llego a publicarlo como open source, ¡tienen que darme su feedback sí o sí!~~ :)
Que sea de código abierto no significa que no puedas venderlo. También hay bastantes apps que van por dos vías. El código abierto es más bien un concepto de construirlo junto con otros desarrolladores interesados en el proyecto, más que con el público general. Si te preocupa que te lo copien, puedes dejar bien definida la licencia, pero... en esta era de la IA, donde abundan los proyectos de clean room, no sé qué tanto sentido tenga. Si lo liberas como código abierto, ¿crees que solo te vamos a dar feedback? jaja
Jajaja, gracias por el consejo del desarrollador senior.
Últimamente el mundo cambia demasiado rápido, así que adaptarse se ha vuelto muy difícil.
Gracias por compartir tanta información, y les agradecería mucho que siguieran pendientes de aquí en adelante 😁
¿Qué modelo de IA será??
Indica que usa la API de Claude.
Como estaba ahí mismo en el texto, me asusté pensando si no habría sido yo quien lo preguntó y me puse a buscar.
Después de instalar el resumen, el artículo original, el sitio y el programa, y de pasar un buen rato buscando, no lo encontré; al final estaba escrito en la política de privacidad.
Normalmente uno no revisa hasta la política de privacidad solo para verificar el stack tecnológico.
La próxima vez, le agradecería que también indicaran dónde aparece.
¡Muchísimas gracias por sus valiosos comentarios!
Estuve pensando si debía escribir una mención relacionada con el modelo, pero como me pareció que la gente en general quizá no conoce bien el concepto de una API, no lo había mencionado.
Como hay personas que tienen dudas al respecto, lo voy a corregir.
Por cierto, ¿han probado la app? Me da curiosidad saber qué les pareció :)
Ah, se lo comenté a jhk0530.
¿En dónde dice que usa la API de Claude?
Fui a ver el texto principal y el sitio web, pero no lo encuentro.
¡Hola! Soy el creador.
¡Actualmente estoy usando el modelo Claude Sonnet 4!
Más adelante planeo implementar una opción para poder elegir directamente BYOK u otros modelos también.
Gracias por su interés :)
¡Gracias por la respuesta!
Solía usar la función de traducción emergente de DeepL, pero creo que probaré esto un rato.
Más adelante, creo que también estaría bueno que soporte el formato de https://www.openresponses.org/ para abrir la posibilidad de usar LLM locales.
¡Veo que planeas usarla principalmente por la función de traducción!
A futuro también pensamos agregar una función de selección de modo, para avanzar en la dirección de ofrecer una función de traducción un poco más especializada :)
¡Gracias también por sugerir una forma de usar un modelo local además de APIs externas! Lo agregaré a los planes de implementación a futuro.
Gracias por tu valioso feedback, y si llegas a tener cualquier inconveniente, por favor avísanos 😄
Lo he estado usando durante una semana y la experiencia de uso ha sido tan buena que sigo usándolo. Gracias.
¡Creo que sería aún mejor si se resolviera el problema del método de distribución de los atajos, como han comentado otras personas! Tengo muchas expectativas.