Caso de estudio · 2025

FocusMode.

App de productividad

Diseñé y desarrollé FocusMode de punta a punta: la app nativa SwiftUI, el backend Supabase (auth, base de datos, edge functions, realtime) y las integraciones. Una herramienta que sirve igual para un roadmap de producto, un lanzamiento de marketing o una tesis — y que, por dentro, esconde retos serios: suscripciones StoreKit verificadas, IA con Gemini y un motor de sync con GitHub.

FocusMode
La app en marcha: del día de hoy al detalle de una tarea

El problema

Las apps de productividad obligan a elegir: o son minimalistas y se quedan cortas, o lo hacen todo y te abruman. Y casi ninguna se adapta a ti — la misma app rígida para gestionar un roadmap, planear un lanzamiento o escribir una tesis.

La tesis

Una sola app que se moldea a cómo trabajas tú. Donde tareas, hábitos, foco (Pomodoro) y finanzas conviven, nativas y con el detalle de iOS 26 — y donde el color, los proyectos y el ritmo los pones tú. Que sirva igual a un equipo de producto, a alguien de marketing o a un estudiante de posgrado.

Tres proyectos con temas distintos
Un roadmap de producto, un lanzamiento y una tesis: el mismo producto, tres formas de trabajar

La solución

FocusMode es una suite de productividad nativa en SwiftUI para iPhone y iPad. Jerarquía completa —área, proyecto, sección, tarea, subtarea—, hábitos con analítica, temporizador Pomodoro con Apple Music, finanzas con banca conectada, tema configurable y todo en tiempo real sobre Supabase. Y local-first: la interfaz responde antes de que la red conteste.

Plataforma
iOS 26+
Arquitectura
SwiftUI · @Observable
Backend
Supabase
Apps
iPhone + iPad

Todo lo que incluye

  • Áreas, proyectos, secciones, tareas y subtareas
  • 4 niveles de prioridad, pin y comentarios por tarea
  • Vista Hoy con navegador de semana e inbox
  • Hábitos y rutinas con frecuencia, recordatorios y analítica
  • Pomodoro + cronómetro libre con check-in
  • Presupuesto de tiempo por área y por proyecto
  • Integración con Apple Music (playlist global y por hábito)
  • Finanzas: billeteras, presupuestos, deudas, ahorro y recurrentes
  • Banca conectada (PSD2) con movimientos categorizados al importar
  • Sincronización bidireccional con GitHub Issues
  • Publicaciones por canal: Twitter, LinkedIn y artículo
  • Funciona sin conexión: cola de acciones durable
  • Búsqueda global y notificaciones locales
  • Tema configurable (8 colores de acento, claro y oscuro)
  • Suscripción premium con StoreKit verificado en backend

La jerarquía: área → proyecto → sección → tarea

Con veinte proyectos abiertos, una lista plana se lee como veinte obligaciones. Las áreas son un nivel por encima —una carpeta con nombre, icono y orden, nada más— y las secciones, el «proyecto concreto» dentro de un cliente. Deliberadamente no usé un self-FK en proyectos: la profundidad arbitraria deja sin respuesta qué hace un proyecto-contenedor con sus tareas, su meta económica o su repo. Dos niveles por construcción.

Las secciones existían en la base de datos desde el primer día —tabla, modelo, fetch, incluso el campo en el editor— y ninguna pantalla las creaba: un nivel fantasma. Al sacarlas a la superficie apareció un fallo latente: la clave foránea era ON DELETE CASCADE, así que el primer botón de borrado se habría llevado las tareas de dentro en silencio.

Los proyectos, agrupados
El detalle de una tarea con sus subtareas

El día

Hoy reúne lo vencido, lo de hoy y las rutinas, cada tarea con su proyecto y su duración estimada. El navegador de semana permite moverse día a día sin perder el contexto, y las rutinas —listas de pasos con hora y racha— resuelven lo que se repite igual cada mañana.

Hoy, con lo vencido arriba
La semana, día a día

Foco: Pomodoro y cronómetro

Timer dual —Pomodoro y cronómetro libre— como accesorio inferior del TabView, con historial y reportes por proyecto o hábito. Se integra con Apple Music: playlist global o una por hábito, mostrando lo que realmente suena. La sesión guarda su propio project_id, así que mover una tarea de proyecto ya no reescribe el pasado.

La cuenta atrás de una sesión de foco
El cronómetro libre, contando hacia arriba

Hábitos medibles

Hábitos con frecuencia configurable, icono, color, recordatorios y playlist propia. Analítica premium: heatmap, tasa de completación y gráfico semanal. Cada hábito puede arrancar un Pomodoro y llevar su propio tiempo acumulado.

Los hábitos y las rutinas del día

Finanzas, dentro de la misma app

Billeteras, movimientos, presupuestos, objetivos de ahorro, gastos recurrentes, deudas y wishlist — para que el dinero también sea parte del foco, no otra herramienta aparte. La banca conectada (PSD2, vía TrueLayer) importa los movimientos ya categorizados y sincroniza sola al volver a la app: antes solo se sincronizaba dentro de la pantalla de Bancos, así que quien no entraba ahí nunca veía entrar un movimiento.

El hub de finanzas
Un objetivo de ahorro
ℹ️
Los detalles que se notan a los tres meses

El consentimiento PSD2 caduca a los 90 días y la sincronización moría en silencio: ahora avisa 7 días antes. Y el usuario elige qué cuentas se importan, en vez de tragarse una billetera por cada producto del banco.

Presupuesto de tiempo: avisar, nunca impedir

El área pone el techo («hoy 5h a Trabajo») y cada proyecto reserva dentro («de esas 5h, 2h30 a Sardina»). Son dos niveles a propósito: quien reparte su día no piensa siempre en el mismo nivel, y con objetivo solo en el área acabaría creando un área por cliente para poder asignarle horas, destruyendo justo el nivel que las áreas aportan.

Si las reservas se pasan del techo, el editor lo dice y el área pinta su badge en naranja. Guardar funciona igual. No hay ningún CHECK en la base de datos que relacione ambos números: la coherencia aquí es producto, no integridad.

Un planificador que discute con quien planifica se abandona en tres días.

Nota de diseño, agosto 2026

Local-first: la interfaz no espera a la red

Toda mutación es instantánea: muta el array local, escribe en caché y encola la operación; la red sincroniza en segundo plano. Detrás hay una cola durable por usuario con coalescing, backoff y dead-letter, un monitor de red y un asignador de ids temporales — porque una tarea creada sin conexión nace con un id negativo que hay que reconciliar después en arrays, claves foráneas y operaciones ya encoladas.

El detalle que lo hace usable

Un merge anti-wipe en cada lectura: realtime y refetch ya no pisan el estado optimista ni provocan parpadeo. Cubre tareas, proyectos, secciones, hábitos, Pomodoro, ahorro, recurrentes e ideas — sin un solo cambio de esquema.

GitHub Issues, en los dos sentidos

Bajo la misma app simple hay un motor serio: tus repos se vuelven proyectos y tus issues, tareas. Sub-issues como subtareas y comentarios sincronizados en ambos sentidos. Arquitectura backend-first: triggers de base de datos encolan el sync, edge functions procesan la cola, pg_net notifica al instante y Supabase Realtime empuja los cambios de GitHub a la app sin polling.

La pantalla de GitHub con los repos vinculados
Tiempo real de verdad

5 tablas, 7 edge functions y un webhook que acepta issues, comentarios y sub-issues. El badge de sync (verde/naranja/rojo) refleja el estado de cada tarea al instante.

Publicaciones: un backend, dos apps

Las ideas se generan en ideas365 —la segunda app del ecosistema— y FocusMode las lee: hilo de Twitter, versión de LinkedIn y artículo, cada canal con su fecha y su estado de publicado. Comparten proyecto de Supabase y tabla, así que no hay sincronización que mantener entre ambas: es la misma fila vista desde dos apps.

Personalización

Ocho colores de acento, claro y oscuro, moneda por defecto y densidad de las filas. No es decoración: es lo que permite que la misma app sirva para un roadmap y para una tesis sin que ninguna de las dos se sienta prestada.

El stack

SwiftUI con el macro @Observable (no ObservableObject), patrón MVVM y modelos por el entorno. Backend Supabase: Auth (Apple Sign-In), PostgREST, edge functions, Realtime y Storage. StoreKit con verificación de recibos en backend y RevenueCat. IA con Gemini para generar subtareas. El mismo backend alimenta la app iOS, una segunda app cross-platform en React Native + Expo, la web en Next.js e ideas365.

App iOS
226 archivos Swift
Backend
22 edge functions
Esquema
26 migraciones
Clientes
4 sobre un backend

Cómo evolucionó

  1. 2025
    Primera versión en la App Store

    Tareas, proyectos y suscripción con StoreKit verificado en backend.

  2. Feb 2026
    Hábitos, Pomodoro y jerarquía real

    Subtareas anidadas con parent_id, prioridades, pin y analítica de hábitos. El timer entra como accesorio del TabView.

  3. Feb 2026
    Sincronización con GitHub Issues

    Bidireccional y backend-first, con cola en base de datos y Realtime hacia la app.

  4. Jun 2026
    Local-first

    Cola de acciones durable offline, ids temporales y merge anti-wipe. Sin cambios de esquema.

  5. Ago 2026
    Finanzas de verdad y áreas

    Banca conectada con sync automático, deudas, presupuestos con imputación manual, áreas, secciones y presupuesto de tiempo.

La misma app, tres vidas

Estas tres capturas salen de la misma versión: cambian el contenido y el acento, no la app. A la izquierda, quien lleva un producto —feedback de beta, specs del paywall, roadmap—. En medio, quien estudia: prácticas, parciales y el capítulo 2 del TFG. A la derecha, la casa: el recibo de la luz, el colegio y una lavadora. Es la tesis del principio, dicha con la propia interfaz en vez de con un adjetivo.

La semana de quien lleva un producto
La semana de quien estudia
La semana de quien lleva una casa
Product lead, estudiante y casa: mismo binario, mismo día, tres formas de vivirlo

Resultado

FocusMode está publicada en la App Store (iOS 26+) y es la app principal del ecosistema focusmode.net. Lo que empezó como un gestor de tareas es hoy una herramienta donde el trabajo, el tiempo y el dinero se miran en el mismo sitio — y que sigue creciendo por donde la usan, no por donde estaba planeado.

Estado
En App Store
Plataforma
iOS 26+
Rol
Diseño + desarrollo
Ecosistema
focusmode.net

Pantalla a pantalla

Toda la app, sin sorpresas: la misma cinta que recorre la home de focusmode.net.

Pantalla Hoy con las tareas del día
Vista de la semana
Lista de proyectos
Detalle de una tarea
Hábitos y rutinas del día
Temporizador pomodoro

¿Construimos algo juntos?