Centro de mando personal
Panel de productividad con proyectos, tareas, pomodoro y notas sobre Next.js y Supabase.
01 Problema y contexto
Las herramientas de productividad dispersas (tareas en una app, pomodoro en otra, notas en una tercera) fragmentan el día; consolidarlas exige un backend con datos por usuario bien aislados.
Llevar proyectos personales suele terminar repartido entre cuatro o cinco herramientas que no se hablan entre sí. Command Center reúne proyectos, tareas, temporizador pomodoro, notas y bitácora en un solo panel con cuenta propia. El requisito de fondo no es la interfaz sino el aislamiento: es un sistema multiusuario donde cada cuenta ve únicamente sus filas, y esa frontera se hace cumplir en la base de datos, no en el cliente.
02 Solución
Una sola aplicación full-stack: Next.js 16 con App Router y React 19 al frente, Supabase detrás con 8 tablas Postgres y 9 políticas de Row Level Security que aíslan los datos de cada usuario. El pomodoro comparte estado global (Zustand) entre el dashboard y su página dedicada, y las tareas se reordenan con drag and drop persistido.
- Modelado del esquema relacional: ocho tablas con reglas de borrado explícitas, cascada en tareas y anulación de referencia en notas y pomodoros, de modo que eliminar un proyecto no deja huérfanos ni destruye notas.
- Aislamiento por cuenta: row-level security activado en las ocho tablas y nueve políticas escritas sobre auth.uid(). La tabla puente notas-etiquetas resuelve su política por pertenencia de la nota mediante subconsulta.
- Autenticación con Supabase y protección de rutas, con alta de perfil automatizada por trigger en lugar de abrir una política de inserción.
- Estado compartido del temporizador entre el panel y la vista dedicada, para que el pomodoro no se reinicie al navegar.
- Panel con indicadores calculados desde la base, gráfico de tareas completadas en la última semana y feed de actividad.
- Despliegue en Vercel sobre Supabase y verificación manual del recorrido completo.
03 Resultados
Cifras verificables en el repositorio y su documentación:
04 Cómo está construido
Aplicación web de productividad personal tipo "command center" que integra gestión de proyectos y tareas, temporizador pomodoro, notas con etiquetas y un dashboard con KPIs y gráfico de actividad. Construida con Next.js 16 (App Router), React 19, Tailwind CSS 4 y Zustand para estado global, usa Supabase para autenticación (incluye OAuth) y persistencia en Postgres con Row Level Security. Incluye rutas protegidas vía middleware, drag and drop de tareas con persistencia de posición y sincronización de datos mediante hooks personalizados.
05 Decisiones éticas
- La separación entre cuentas se implementó en la capa de datos y no en el cliente: si la interfaz falla o alguien consulta la API directamente, Postgres sigue negando las filas ajenas.
- El alta de perfil se resolvió con un trigger acotado al evento de creación de usuario, para no dejar abierta una política de inserción general sobre datos personales.
- La bitácora registra solo acciones del propio usuario y queda bajo la misma política de propiedad: no hay telemetría con visibilidad cruzada.
06 Aspectos destacados
- Aplicación full-stack con Next.js 16 (App Router), React 19 y Supabase como backend (auth y base de datos Postgres).
- Esquema SQL con 8 tablas y 9 políticas de Row Level Security para aislar los datos de cada usuario.
- Middleware de protección de rutas y autenticación SSR con @supabase/ssr, incluyendo callback OAuth.
- Temporizador pomodoro con estado global compartido (Zustand) entre el dashboard y la página dedicada, con registro de sesiones.
- Gestión de proyectos y tareas con reordenamiento drag and drop persistido y dashboard con gráficos Recharts.
07 Limitaciones
No hay conjunto de datos: el sistema opera sobre información que el propio usuario crea, así que los límites son de verificación y de modelo de seguridad. La comprobación fue manual y guiada por un plan escrito, sin suite automatizada. La tabla de perfiles tiene políticas de lectura y actualización pero no de inserción ni borrado: el alta depende del trigger y dar de baja una cuenta requiere intervención directa. La clave anónima viaja al navegador por diseño del modelo Supabase, lo que concentra toda la seguridad en las políticas: es correcto, y también significa que un error en una política se convierte de inmediato en una fuga.