Mingüini es una plataforma de productividad personal todo en uno —hábitos, tareas, proyectos, sesiones de foco, seguimiento de tiempo, y mucho más, todo en un solo lugar en vez de cinco suscripciones separadas. Está en vivo hoy, en alpha, en minguini.com.
La propuesta es simple: reemplazar todo tu stack de productividad con una sola app. Pero una propuesta simple esconde un problema de ingeniería difícil —trece módulos de funcionalidades compartiendo un mismo límite de autenticación y una misma base de datos es exactamente el tipo de superficie que se vuelve un quilombo si no todos los módulos están construidos de la misma forma.
Este caso de estudio cubre las dos caras de esa apuesta: la decisión de producto de ir por el todo en uno en vez de lanzar una app más de propósito único, y la arquitectura que evita que tantos módulos se desalineen entre sí.
El Desafío
La versión cotidiana del problema es la que el propio producto responde: la mayoría de la gente maneja su día repartido entre cinco apps distintas —un gestor de tareas, un timer Pomodoro, un tracker de hábitos, un gestor de proyectos, un tracker de tiempo— cada una con su propia suscripción, su propio modelo de datos, y sin contexto compartido entre ellas.
La versión difícil es la que tuvimos que resolver para construirlo. "Todo en uno" es exactamente donde la mayoría de los productos de productividad se caen, ya sea en una app-de-todo inflada o en una superficial que no hace nada bien del todo. Trece áreas de funcionalidad —tareas, hábitos, pomodoro, proyectos, notas, seguimiento de tiempo, estudio, lecturas, entrenamientos, finanzas, recordatorios, facturación y artículos— compartiendo un mismo límite de autenticación, una misma base de datos y un mismo lenguaje de interfaz es una superficie que se vuelve un quilombo si no todos los módulos se construyen de la misma forma desde el primer día.
El Enfoque
Nos decidimos por un solo modelo de datos, un solo límite de autenticación, un solo sistema de diseño, y exactamente una forma de leer o escribir datos. Cada módulo, de Tareas a Finanzas, es una porción vertical delgada sobre las mismas primitivas, así que agregar uno nuevo es el mismo tipo de trabajo que el anterior, no una integración a medida.
Una sola base compartida
Cada módulo es una porción vertical delgada sobre las mismas primitivas, así que agregar uno es el mismo tipo de trabajo que el anterior.
agregar un módulo es el mismo tipo de trabajo que el anterior
La otra decisión fue dejar que el producto creciera a la vista de todos sin volverse complicado. Los módulos se lanzan detrás de una capa de feature flags global que los admins pueden apagar al instante, y cada usuario puede ocultar los módulos que no usa personalmente —así el sidebar de una app todo en uno nunca es más grande que el stack que esa persona realmente quiere.
Un Solo Modelo de Datos, Trece Módulos
Next.js 16 con App Router, React Server Components y React 19. Los Server Actions son el único camino de acceso a datos —21 módulos de acciones, unas 10.200 líneas, cada uno siguiendo el mismo contrato: chequeo de sesión, validación con Zod, una escritura en Prisma, una revalidación de caché, y un resultado tipado de éxito o error. No hay ninguna capa REST para los datos de la app, y eso es justo lo que evita que trece módulos se desalineen entre sí.
Chequeo de sesión
Valida la cookie de sesión httpOnly antes de correr cualquier otra cosa.
Validación con Zod
Parsea y valida el input contra un schema tipado.
Escritura en Prisma
Lee o escribe en Postgres a través del adaptador nativo del driver de pg.
Revalidación de caché
Invalida las rutas de caché de Next.js afectadas.
Resultado tipado
Devuelve un resultado tipado de éxito o error —nunca una excepción lanzada.
21 módulos de acciones · ~10.200 líneas · sin capa REST para los datos de la app
PostgreSQL a través de Prisma 7 sobre el adaptador nativo del driver de pg: un schema de 808 líneas, 36 modelos y 14 enums, 43 migraciones ordenadas, y una política estricta de cero drift —cada cambio de schema es una migración real, nunca un push. Índices compuestos sostienen la UI más pesada, como el tablero de tareas de cinco días con drag-and-drop y reordenamiento optimista. La autenticación es email/contraseña más OAuth de Google, emitiendo cookies de sesión httpOnly validadas en cada ruta y cada acción.
El control de funcionalidades corre en dos capas. Un flag global nos deja apagar un módulo para todos al instante si algo se rompe, y una preferencia por usuario le permite a cada persona ocultar los módulos que no usa personalmente —así el sidebar de una app todo en uno nunca tiene por qué sentirse así. El control de plan se apoya sobre eso, con webhooks del proveedor de pagos manteniendo sincronizado el estado de la suscripción en el plan pago.
Flag global · Controlado por admin
Apaga un módulo para todos al instante si algo se rompe.
Filtro de plan · Sincronizado por webhook
Los webhooks del proveedor de pagos mantienen sincronizado el estado de la suscripción en el plan pago.
Preferencia de usuario · Por persona
Cada persona oculta los módulos que no usa personalmente.
Sidebar
Nunca es más grande que el stack que esa persona realmente quiere.
el sidebar de una app todo en uno nunca tiene por qué sentirse así
Las partes que corren sin que nadie las esté mirando: un cron chequea los recordatorios de cada usuario una vez por minuto, resuelve cada uno contra la zona horaria propia de ese usuario, y lo entrega como una notificación push real a través de un service worker, en vez de un toast dentro de la app. Mingüini se instala como PWA con una página offline en vez de lanzar una app nativa, y una integración de calendario trae las reuniones del día directo al dashboard. Toda la interfaz corre sobre un solo sistema de color perceptualmente uniforme que se adapta a claro, oscuro, y un puñado de paletas elegidas por el usuario, servido en inglés y español desde el mismo código.
Cron cada minuto
Chequea los recordatorios de cada usuario una vez por minuto.
Zona horaria por usuario
Resuelve cada recordatorio contra la zona horaria propia de ese usuario.
Push por service worker
Lo entrega como una notificación push real, no como un toast dentro de la app.
Lo Que Construimos
Hoy hay trece módulos de funcionalidades viviendo detrás de un solo sidebar:
Tareas
Un tablero de cinco días con drag-and-drop y reordenamiento optimista, fechas límite y URLs auto-detectadas, además de un dashboard de tarjetas reordenables y ocultables
Hábitos y Pomodoro
Una grilla mensual de hábitos con rachas, y sesiones de foco/descanso configurables con sonidos, notificaciones push y un registro de sesiones que se puede completar retroactivamente
Proyectos, Notas y Seguimiento de Tiempo
Fijado y borrado suave, notas vinculadas a proyectos, y horas registradas contra ellos con filtros y resúmenes
Estudio, Lecturas y Entrenamientos
Temas y programación de exámenes con mazos de flashcards y un modo de estudio, una lista de lecturas por categorías, y una biblioteca de ejercicios con rutinas personalizadas
Finanzas
Ingresos y gastos multi-moneda con cuotas, tipos de cambio, préstamos con tablas de amortización, y proyecciones a largo plazo
Recordatorios, Facturación y Operaciones
Una consola de admin con flags globales de módulos más las colas de reportes de bugs y solicitudes de funcionalidades, un changelog dentro de la app, y una biblioteca de artículos
Resultados
Mingüini está en desarrollo continuo desde hace unos seis meses, construido y testeado de la misma forma en que construiríamos cualquier producto de producción:
437
commits desde el primer scaffold (feb 2026)
~56.000
líneas de TypeScript en 330 archivos
232
componentes de React
36
modelos de base de datos en 43 migraciones
941
tests unitarios en 27 suites
~149
tests E2E con Playwright, desktop y mobile
Un gate completo antes de cada push
Corre localmente antes de que cualquier cambio llegue a la rama compartida, con 100% de cobertura de funciones exigida en la capa de server actions.




