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.

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.

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.
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.


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.


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.


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.

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 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.
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.

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.
Cómo evolucionó
- 2025Primera versión en la App Store
Tareas, proyectos y suscripción con StoreKit verificado en backend.
- Feb 2026Há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.
- Feb 2026Sincronización con GitHub Issues
Bidireccional y backend-first, con cola en base de datos y Realtime hacia la app.
- Jun 2026Local-first
Cola de acciones durable offline, ids temporales y merge anti-wipe. Sin cambios de esquema.
- Ago 2026Finanzas 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.



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.
Pantalla a pantalla
Toda la app, sin sorpresas: la misma cinta que recorre la home de focusmode.net.












