Gestión de proyectos · SaaS interno
Azirgo KanbanTableros, tareas, avisos y la parrilla semanal de podcasts de una agencia, en un solo panel
Gestor de proyectos interno de Azirgo: tableros kanban, tareas con responsables, avisos y correos automáticos, y las tareas semanales de sus podcasts.
Tecnologías
- Next.js 16
- React 19
- TypeScript
- Supabase (PostgreSQL + Auth + Realtime + RLS)
- Tailwind CSS v4
- shadcn/ui (Radix UI)
- dnd-kit
- Zustand
- Motion
- Resend
- React Email
- node-cron
- DigitalOcean Spaces (AWS SDK S3)
- Docker

19
tablas de Supabase en uso
14
migraciones SQL
16
endpoints de API
3
procesos automáticos por cron
4
plantillas de correo
3
vistas por tablero
Mi rol
Desarrollador web y de aplicaciones: diseñé y programé la aplicación completa - interfaz, modelo de datos y políticas RLS, correos, tareas programadas y el módulo de programas - como único autor del repositorio, en Azirgo SAS.
El problema
Una agencia que desarrolla software y produce podcasts cada semana tiene equipos que casi no se cruzan, pero comparten una misma pregunta al empezar el día: qué vence hoy, quién tiene cada tarea y qué cambió desde ayer. A eso se suma la producción de los programas: cada emisión exige editar, diseñar la miniatura, cortar clips y dejarla programada antes de su hora de publicación, semana tras semana, y una tarea genérica del tipo «emisión del 25 de agosto» no le dice a nadie qué hay que hacer.
Qué construí
- Proyectos (workspaces) con miembros y tableros: cada usuario ve solo los proyectos a los que pertenece, el administrador los ve todos, y un tablero puede acotarse a miembros concretos dentro de su proyecto.
- Tablero kanban con arrastrar y soltar de tareas entre columnas y reordenamiento de columnas; mover una tarea a la columna de hechas la marca como completada y sacarla de ahí la reabre.
- Tres vistas por tablero - Kanban, Lista y Calendario - y tareas con prioridad (Alta, Media, Baja), fecha límite, varios responsables, descripción, adjuntos y comentarios.
- Panel de inicio con lo urgente primero: tareas que vencen hoy, pendientes, vencidas y completadas en la semana; para administradores, además, tableros activos, carga por miembro, tareas delegadas y la actividad reciente.
- Notificaciones dentro de la app - tarea asignada, modificada, movida, comentada o que vence hoy - con contador de no leídas y un panel que separa lo que vence hoy o mañana.
- Correos con Resend y React Email: tarea asignada, tarea completada, un recordatorio diario por persona con sus vencidas y pendientes, y un resumen del equipo para los administradores.
- Módulo de Programas para la parrilla de podcasts: el programa del día con la cuenta regresiva para dejarlo programado, la semana completa con horarios y plataformas, y tareas semanales que se crean solas en el tablero de cada programa.
- Registro de actividad con 22 tipos de acción, por tablero y global, con filtros por tipo de entidad, búsqueda y paginación.
- Gestión de usuarios para administradores: alta de cuentas, roles, bloqueo y eliminación, con pendientes, vencidas, completadas y última actividad de cada persona.
Cómo está estructurado
Una sola aplicación Next.js sobre Supabase: el panel consulta la base directamente con la sesión del usuario, y todo lo que necesita privilegios o servicios externos pasa por rutas de API en el servidor.
- Next.js 16 con App Router y React 19; las pantallas del panel son componentes cliente que leen de Supabase con el RLS aplicado a la sesión de cada usuario.
- 16 rutas de API para lo sensible: alta, bloqueo y detalle de usuarios, inicio y cierre de sesión, restablecimiento de contraseña, miembros de tablero, correos, configuración y generación de programas, subida de archivos y los tres endpoints de cron.
- Supabase como backend: PostgreSQL con 19 tablas en uso y el esquema versionado en 14 migraciones, Auth con correo y contraseña, y Realtime para refrescar el tablero cuando cambian tareas o columnas.
- El middleware renueva la sesión en cada petición y manda al login a quien no la tiene; las rutas de administración comparten una comprobación de rol y usan un cliente con service role solo para las escrituras que deben saltarse el RLS.
- Tareas programadas con node-cron dentro del proceso de Next.js, registradas desde instrumentation.ts en hora de Ecuador.
- Correos con Resend y cuatro plantillas en React Email; adjuntos en DigitalOcean Spaces a través del SDK de S3.
- Proyectos y tableros del menú lateral en un store de Zustand con 30 segundos de vigencia, para no repetir consultas al navegar entre tableros.
- Despliegue como contenedor Docker con la salida standalone de Next.js.
La parrilla de programas
El módulo de Programas conecta el calendario de publicación de los podcasts con el tablero donde trabaja el equipo.
- Seis programas definidos en código con su día, hora de publicación, antelación para dejarlo programado y plataformas: YouTube, Spotify y Apple Podcasts.
- La vista muestra el programa del día con una cuenta regresiva hasta la hora límite, y la semana completa con horarios, plataformas y cuántas personas tiene asignadas cada programa.
- Cada programa se configura con un tablero, una columna de destino y un equipo: esas personas reciben las tareas y obtienen acceso al tablero.
- Las tareas semanales se definen una vez - por ejemplo editar, miniatura, clips y programar la publicación - con su día y hora de aparición, prioridad, responsables y adjuntos; si una no tiene responsables, recae en el equipo del programa.
- Cada 5 minutos se crean las que ya llegaron a su momento, con plazo hasta el día siguiente, y el registro por plantilla y emisión impide duplicarlas.
- Una vista previa de 45 días separa lo ya creado, lo que toca crear ahora y lo que sigue programado, y permite adelantar la creación a mano; si el servidor estuvo caído, la pasada recupera los dos días anteriores.
Avisos y recordatorios
La aplicación avisa por dos canales, dentro del panel y por correo, para que nadie tenga que revisar cada tablero para saber qué le toca.
- Al asignar, modificar, mover, completar o comentar una tarea se notifica a sus responsables, excepto a quien hizo el cambio.
- Cada día a las 7:00 se generan avisos de las tareas que vencen ese día, y al entrar se muestra un aviso si hay notificaciones pendientes.
- De lunes a viernes a las 18:00 y los sábados a las 14:00, hora de Ecuador, cada persona recibe un correo con sus tareas vencidas de los últimos 30 días, sus pendientes y lo que completó en el día; los domingos no se envía.
- Los administradores pueden disparar los recordatorios o un resumen del equipo desde el panel, después de revisar la lista de destinatarios.
Por dentro del sitio

Panel de inicio: vencen hoy, pendientes, vencidas y resumen del equipo (datos de ejemplo). 
Detalle de una tarea con prioridad, fecha límite, responsables, adjuntos y comentarios (datos de ejemplo). 
Vista de calendario con las tareas por fecha límite (datos de ejemplo). 
Vista de lista con estado, prioridad, fecha y responsables (datos de ejemplo). 
Usuarios con rol, última actividad y tareas pendientes, vencidas y completadas (datos de ejemplo). 
Programas: el del día con su cuenta regresiva y la parrilla semanal (datos de ejemplo).
El panel de administración
Cada módulo resuelve una parte de la operación diaria del negocio, sin salir del panel.
Inicio
Lo que vence hoy, pendientes, vencidas y completadas; para administradores, tableros activos, miembros, carga por persona, tareas delegadas y actividad reciente.
Proyectos y tableros
Proyectos con sus miembros y tableros con descripción; los tableros se duplican solo con sus columnas o también con sus tareas.
Tareas
Prioridad, fecha límite, varios responsables, descripción, adjuntos y comentarios; las completadas de hace más de 8 días se archivan de la vista.
Programas
La parrilla semanal de podcasts con cuenta regresiva, plataformas y equipo por programa, y tareas semanales que se crean solas en su tablero.
Notificaciones
Avisos de asignación, cambios, movimientos, comentarios y vencimientos, con contador de no leídas y lo que vence hoy o mañana arriba.
Correos y recordatorios
Tarea asignada, tarea completada, recordatorio diario por persona y resumen del equipo para administradores, con Resend y React Email.
Registro de actividad
22 tipos de acción, por tablero y global, filtrables por tareas, columnas, tableros, proyectos, usuarios y comentarios.
Usuarios
Alta de cuentas, rol de administrador o usuario, bloqueo y eliminación, con las métricas de tareas y la última actividad de cada persona.
Acceso y seguridad
Políticas RLS por proyecto y por tablero, sesión renovada en el middleware, cuentas bloqueadas que no pueden entrar y endpoints de cron con secreto propio.
Decisiones técnicas
- La seguridad vive en la base de datos: políticas RLS con funciones como is_admin, is_workspace_member y can_access_board deciden qué tableros, columnas y tareas ve cada usuario, y editar una tarea queda restringido a sus responsables o a un administrador.
- Los miembros de un tablero acotan dentro del proyecto en lugar de reemplazarlo: un tablero sin miembros explícitos sigue visible para todo el proyecto, así los tableros que ya existían siguieron funcionando igual.
- Los recordatorios corren dentro del propio proceso de Next.js con node-cron, registrados desde instrumentation.ts, sin infraestructura extra. Como con varias instancias cada una enviaría los mismos correos, una variable los apaga para dispararlos desde un planificador externo.
- Los endpoints de cron quedan fuera del middleware de sesión y se autentican con un secreto compartido en cabecera, comparado en tiempo constante; si el secreto no está configurado, rechazan toda petición.
- La parrilla - día, hora de publicación, antelación y plataformas de cada programa - vive en el código porque es estable; la base solo guarda a qué tablero y columna van las tareas, quién las recibe y las plantillas de cada semana.
- Los adjuntos de una plantilla se suben una sola vez y cada tarea generada apunta al mismo archivo, en lugar de duplicarlo cada semana; las subidas van a DigitalOcean Spaces y solo aceptan imágenes y PDF de hasta 10 MB.
Retos
- Pasar de una tarea genérica por emisión, que no decía qué había que hacer, a una lista de tareas por programa - editar, miniatura, clips, publicar - con sus propios responsables, día y hora, instanciada cada semana con la fecha de esa emisión.
- Hacer la generación idempotente y puntual: un registro único por plantilla y emisión impide duplicar tareas aunque el proceso corra varias veces, y la pasada cada 5 minutos evita que una tarea configurada para las 11:45 tarde hasta una hora en aparecer.
- Corregir en producción el esquema de los miembros de tablero: la tabla ya existía con un esquema antiguo, la creación no tuvo efecto y las altas fallaban; una migración posterior agregó el id autogenerado, las restricciones NOT NULL y UNIQUE y las llaves foráneas en cascada, segura tanto sobre la tabla vieja como sobre una base limpia.
- Compatibilizar el borrado lógico con RLS: al marcar una columna como eliminada, el RETURNING implícito de PostgREST chocaba con la política de lectura, y se resolvió con una política de lectura separada para administradores.
Resultado
Azirgo Kanban está en producción como la herramienta interna de Azirgo para organizar su trabajo por proyecto y por tablero. Los recordatorios por correo y los avisos de lo que vence hoy salen solos, cada movimiento queda registrado, y las tareas semanales de cada programa aparecen en su tablero a la hora configurada, con sus responsables ya asignados.