Next.js 14TypeScript StrictTailwindSupabaseService Role KeyRLSDark Neon
01 · El proyecto
El centro de mando del torneo
El panel admin es la herramienta que usa el equipo interno del torneo para operar día a día: armar el fixture, aprobar pre-inscripciones, gestionar descargos, mantener al día equipos, jugadoras, categorías y sedes. Es el único lugar desde el que se modifica la base de datos del torneo.
Lo que se carga acá es exactamente lo que ven la app y la web pública en tiempo real, sin procesos batch ni jobs nocturnos. Una sola fuente de verdad, tres consumidores en vivo. La separación entre planificación (panel) y operación en cancha (app) está pensada para que cada herramienta haga una sola cosa, y la haga bien.
"Tres frontends, una sola fuente de verdad."
8
secciones de gestión
1 panel
3 frontends sincronizados
Service Role
operaciones admin server-side
100%
TypeScript strict
02 · Arquitectura
Cómo está construido
Frontend
Next.js 14 App Router
→Next.js 14 App Router
→TypeScript estricto
→Tailwind CSS
→Identidad: dark mode + violeta neon
→Sidebar fijo + área principal
Backend
Supabase
→Supabase compartido con app y web
→Cliente con SUPABASE_SERVICE_ROLE_KEY para operaciones admin
→Auth email/password sin registro abierto
→Una sola cuenta con permisos org_admin
Infraestructura
VPS Hostinger
→Deploy en gestion.thebullgroove.tech
→VPS Hostinger con Easypanel
→Variables de entorno propias
→HTTPS automático
03 · Roles que operan acá
Dos perfiles de gestión
El panel está pensado para los perfiles que toman decisiones sobre el torneo, no para los que operan en cancha.
La separación entre el panel admin y la app no es solo técnica: es de diseño. La operación en vivo (carga de eventos durante el partido) vive en la app, donde la veedora la necesita. La planificación y la gestión administrativa viven acá, en un panel separado, accesible desde escritorio o tablet.
Dueña / org_admin
Toma decisiones de configuración, aprobaciones y resolución final de descargos.
→Configuración del torneo (colores, logo, temporadas)
→Aprobación de pre-inscripciones
→Resolución de descargos
→Acceso a métricas generales
Delegada
Carga el fixture semana a semana, gestiona equipos y jugadoras y administra el día a día del torneo.
→Carga y edición del fixture
→Asignación de veedoras a partidos
→Gestión de equipos y jugadoras
→Aprobación de logos subidos por equipos
04 · Secciones del panel
Diez secciones de gestión
Dashboard
Centro de operaciones · Métricas
Centro de operaciones con métricas generales y atajos a las acciones más frecuentes.
→Métricas generales del torneo
→Equipos activos, jugadoras, partidos jugados
→Próximos partidos y descargos pendientes
Fixture
CRUD · Importación · Resultados
CRUD completo del calendario de partidos con importación masiva y carga de resultados.
→CRUD completo de partidos
→Importación desde Excel
→Carga de resultados con sincronización a posiciones
→Asignación de veedora por partido
→Aprobación / desaprobación individual de partidos
→Filtros por fecha y número de fecha
Equipos
CRUD · Logos
Gestión completa de equipos y aprobación de logos subidos por las delegadas.
→CRUD completo
→Aprobación de logos subidos por las delegadas
Jugadoras
CRUD · CSV · Pre-inscripciones
Padrón completo del torneo con importación masiva y aprobación de pre-inscripciones.
→CRUD completo
→Importación masiva CSV
→Aprobación de pre-inscripciones
→Edición y eliminación dentro de pre-inscripciones pendientes
Categorías
CRUD · Order index
Gestión de categorías del torneo con orden personalizable.
→CRUD con order_index
→Sincronización inmediata con app y web
Sedes
CRUD · Canchas
Padrón de canchas donde se juegan los partidos.
→CRUD de canchas
→Asociación con partidos del fixture
Descargos
Bandeja · Resolución · PDF
Bandeja de entrada de denuncias y reclamos con resolución y exportación PDF.
→Bandeja con filtros
→Gestión y resolución
→Exportación PDF
Configuración
Identidad · Temporada
Identidad visual del torneo y configuración de temporada.
→Colores del torneo
→Logo del cliente
→Datos de temporada
→Configuración visual sincronizada con app y web
Inscripciones
Formularios · Onboarding · Email
Recepción de formularios desde la web pública y onboarding completo de nuevos equipos.
→Recepción de formularios de la web
→Aprobar / rechazar / desaprobar
→Aprobación crea equipo + jugadoras automáticamente
→Invitación por email vía inviteUserByEmail
Galería
Fotos · Hero · Drive
Gestión visual del torneo: hero, álbumes y vínculos a Drive.
→Subida de fotos al bucket gallery
→Hero del torneo en la web
→Álbumes por fecha con link a Drive
05 · Sincronización
Una base, tres consumidores
Cualquier cambio en el panel admin se refleja en menos de un segundo en la app y en la web pública. No hay procesos batch ni jobs nocturnos: una sola base de datos, tres consumidores en vivo. Esto se logra apoyándose en Supabase Realtime para suscripciones, RLS para resolver permisos y Service Role Key para las operaciones que requieren bypass administrativo.
Realtime nativo
Cualquier UPDATE o INSERT desde el panel se propaga al instante a app y web.
RLS resuelve permisos
Las políticas a nivel de fila controlan qué ve cada cliente, sin lógica duplicada en frontend.
Service Role server-side
Operaciones administrativas (crear equipos, invitar jugadoras) se ejecutan con privilegios elevados solo desde el server.
Sin endpoints intermedios
Los tres frontends hablan directamente con Supabase. Cero capa intermedia, cero deuda.
06 · Seguridad
Capas de protección
Acceso restringidoUna sola cuenta admin creada manualmente. Sin endpoint público de registro.
Service Role Key aisladaLa key con privilegios elevados nunca llega al cliente. Solo Route Handlers server-side la usan.
Variables de entornoCredenciales en .env.local, jamás en el repositorio. Configuración por entorno.
HTTPS forzadoCertificado SSL automático vía Easypanel y Let's Encrypt.
RLS heredadoEl panel respeta las mismas políticas RLS del resto del sistema. Sin atajos.
TypeScript estrictoSin any en todo el proyecto. Errores capturados en build, no en producción.
07 · Cliente y desarrollador
Información del cliente
Empresa
Superliga Hockey
Torneo de hockey amateur femenino · Córdoba, Argentina