Saltar al contenido
←Proyectos
8 de junio de 20262 min de lecturaEntregado como TFG

Kairos: una app Flutter rehecha para funcionar sin conexión.

Rehíce una app de productividad en Flutter para que funcionara sin conexión: de depender de un servidor FastAPI a guardar los datos en el dispositivo y sincronizarlos con Supabase.

FlutterBlocRealmSupabaseGemini
Kairos - app de productividad
Qué es
App de productividad en Flutter: tareas, modo foco, hábitos y estadísticas.
Mi papel
Proyecto propio: las dos versiones, de la arquitectura a los tests.
Stack
Flutter · Bloc · Realm · Supabase · Gemini
Resultado
Funciona sin conexión y sincroniza al recuperar la red · la clave de Gemini nunca está en el dispositivo · lógica cubierta por tests.
Estado
Entregado como TFG (junio de 2026).
Enlaces
Ver código (se abre en una pestaña nueva)

Kairos nació como proyecto de clase con una idea: tratar el tiempo como algo que se debe. Si dejabas una tarea a medias, sumaba minutos de "deuda productiva" y Gemini escribía una reflexión estoica. Ha tenido dos versiones, y lo interesante es por qué pasé de una a otra.

La primera versión dependía del servidor

Era una app Flutter con Provider que hablaba con un servidor FastAPI. El servidor guardaba tareas y deuda, y un endpoint, "el confesionario", pedía la reflexión a Gemini. También tenía geovallado, para asociar tareas a un sitio. Funcionaba, pero sin conexión no servía, y una app para organizar el día tiene que abrirse sin cobertura.

La reescritura: los datos, primero en el móvil

En la segunda versión, las tareas se guardan en el móvil con Realm, así que se crean y completan sin conexión. Cada una lleva una marca de sincronización, y cuando hay sesión y red, las pendientes suben a Supabase.

Supabase sustituyó a FastAPI: PostgreSQL con Row Level Security, de modo que cada usuario solo lee y escribe lo suyo sin programar esa comprobación en cada petición. El servidor propio ya no aportaba nada.

La clave de Gemini nunca va en el móvil

La IA se llama desde Edge Functions de Supabase. Una recibe las tareas y las devuelve ordenadas por prioridad; si Gemini falla, las devuelve tal cual, así que la app nunca se queda esperando.

Organizada por funcionalidades, testeable sin interfaz

Tareas, modo foco, hábitos y estadísticas, cada una con datos, lógica y pantalla separados. Bloc lleva el estado y GetIt las dependencias, y eso me permite testear la lógica, como los Bloc de tareas y del modo foco, sin levantar la interfaz.

Qué se quedó por el camino

El geovallado y la deuda de tiempo. La base de datos ya tiene la tabla de la deuda y la función de la reflexión, pero la app aún no las usa: preferí una base sólida sin conexión antes que arrastrar funciones del servidor antiguo.

Lo que aprendí: la arquitectura se paga después

Poner el servidor en el centro era lo cómodo al principio; poner el móvil en el centro es lo que hace que la app sirva en el día a día. Rehacerla costó, pero me enseñó a mirar cada decisión por lo que cuesta después.

Construido porIsmael Manzano LeónFull Stack Developer · leo/ · leosoftware.dev
Ver en GitHub→ (se abre en una pestaña nueva)

¿Encaja con lo que buscáis? Escríbeme →