EsportsHub
La plataforma esports lista para vestir los colores de tu club. Web pública, portal de gestión por roles y bot de Discord integrado. Stack moderno, enfoque en rendimiento, seguridad y escalabilidad.




Una plataforma, tres capas conectadas
Web pública para fans y sponsors, portal privado para jugadores y staff, y un bot de Discord que une todo en tiempo real.
Web pública
Home con hero interactivo, equipos con su roster completo, calendario, noticias en Markdown y creadores. Diseño responsive y SEO con OG dinámico por equipo.
Portal por roles
Gestión completa de equipos, jugadores, calendario, noticias, creadores, usuarios y documentos. Cada rol ve solo lo que necesita.
Bot Discord integrado
Recordatorios de partidos, DMs a managers cuando falta resultado y monitorización del estado de la web en tiempo real. Cada DM llega en el idioma del usuario.
Autenticación robusta
Sesiones cifradas, contraseñas bcrypt, CSRF, must-change-password en primer login, rate limiting y auditoría. Enlaces de bienvenida con acceso directo que caducan a las 24 h.
Estado en vivo
Integración con APIs de Twitch y YouTube para detectar directos de creadores en tiempo real con caché inteligente.
Firma digital
Sistema completo de envío y firma de PDFs con canvas de firma, recordatorios y trazabilidad legal.
Identidad de marca
Color por juego en cada elemento visual; las plazas libres del roster se tiñen con el color del equipo. Animaciones de partículas respetando preferencias de accesibilidad.
Multidioma
Web, portal y bot en 9 idiomas (ES, EN, FR, PT, IT, DE, NL, SV, TR), con 914 claves por idioma. Sincronizado con el atributo lang del HTML para accesibilidad.
Calendario competitivo
Eventos con sus partidos dentro, calendario público y avisos automáticos pre y post partido vía Discord. En los eventos de un día, la fecha del partido se rellena sola.
VentuBot con IA
Chatbot en toda la web pública que responde solo sobre el club leyendo la base de datos: equipos, calendario, resultados, noticias y creadores. Streaming, preguntas rápidas y una conversación que sobrevive a navegar y recargar.
Traducción automática
Noticias y descripciones de equipo se traducen solas a los 9 idiomas con la API de Claude al crearlas o editarlas. Si cambia el original, la traducción se rehace. Contador de idiomas en el portal.
Hero interactivo
Motor de físicas 2D propio: la pastilla #VentuCorpForever, los tags de juego, los partidos, el logo y los directos se arrastran y se lanzan entre partículas. Respeta prefers-reduced-motion.
6 juegos oficiales
Cada uno con su identidad de color, roles propios y ficha pública dedicada.
Arquitectura técnica
Stack moderno, decisiones razonadas. Cada capa optimizada para coste, rendimiento y mantenibilidad.
Frontend
- ▸Next.js 16 con App Router
- ▸React 19 con hooks modernos
- ▸TypeScript en modo strict
- ▸Tailwind CSS 4
- ▸Motor de físicas 2D propio en el hero
- ▸i18n nativo: 9 idiomas × 914 claves
Backend
- ▸Server Components + 68 API Routes
- ▸iron-session cifrada + bcryptjs
- ▸Zod en runtime crítico
- ▸Noticias en Markdown seguro (sin HTML crudo)
- ▸Rate limiting + CSRF tokens
- ▸API de Claude: traducción y VentuBot
Datos
- ▸PostgreSQL 16 + Drizzle ORM
- ▸19 tablas y 8 enums tipados
- ▸Multi-tenant: tenant_id en 12 tablas
- ▸FKs con CASCADE, SET NULL o RESTRICT
- ▸Triggers updated_at + pool tuneado
- ▸Migraciones versionadas
Infra
- ▸VPS Ubuntu 24.04 + Node 22
- ▸Nginx + PM2 persistente
- ▸SSL Let's Encrypt + HSTS preload
- ▸Dos entornos: develop y producción
- ▸Build en CI (GitHub Actions)
- ▸Deploy atómico con rollback automático
Calidad
- ▸746 tests Vitest
- ▸20 tests E2E con Playwright
- ▸67 tests Python del bot
- ▸Postgres real en tests (pglite)
- ▸ESLint + sonarjs con trinquete de calidad
- ▸Umbrales de cobertura y 9 auditorías
Bot
- ▸Python 3.12 con discord.py
- ▸2.4k líneas de código
- ▸DMs en 9 idiomas
- ▸Webhook bidireccional con web
- ▸Monitor de salud del sitio
- ▸Se despliega junto a la web
Roles diferenciados
Granularidad real. Un jugador no puede tocar a otros equipos. Un staff edita solo lo suyo.
Admin
Acceso completo: usuarios, auditoría, todos los equipos, configuración.
Organización
Acceso total operativo, sin acceso a logs de auditoría.
Staff
Edita jugadores, staff y calendario de los equipos asignados.
Jugador-staff
Aparece como jugador pero gestiona como staff. Doble función.
Jugador
Lectura de su equipo, edita su propio perfil.
Creador
Edita su ficha de creador de contenido.
No es solo una web
Decisiones de ingeniería que normalmente no se ven, pero que dan estabilidad y profesionalidad real.
Sistema de mantenimiento sin downtime
Modo mantenimiento activable desde el portal con polling SSE para que los visitantes lo vean al instante. Al desactivarlo, todos los clientes conectados recuperan la web sin recargar.
Drizzle ORM con type-safety completo
Schema con 19 tablas tipadas, 8 enums Postgres reales, FKs con CASCADE, SET NULL o RESTRICT y triggers updated_at automáticos. Migraciones versionadas y reproducibles, con copia de la base antes de cada despliegue.
Pipeline de auditoría continua
9 auditorías técnicas con IDs trazables (SEC-001, AU-7-002, AU-8…), de la calidad del código a la seguridad de producción y el diseño móvil. Cada hallazgo cierra con commit etiquetado y test anti-regresión.
OpenGraph dinámico por equipo
Cuando se comparte la URL de un equipo en redes, se genera una imagen OG personalizada con colores del juego, jugadores y staff renderizada server-side.
Force-logout y impersonación
El admin puede invalidar sesiones activas al instante e impersonar usuarios para soporte con banner visible y registro completo en audit log.
Accesibilidad WCAG AA
Contraste mínimo verificado, focus traps en modales, htmlFor automático, navegación por teclado completa, respeto a prefers-reduced-motion.
CI/CD con rollback automático
Cada push pasa por lint, typecheck, tests, E2E y un trinquete de calidad antes de desplegar en develop o en producción. El build se prepara aparte y entra de golpe, y una página abierta en mitad del despliegue se recarga sola si le falta un trozo. Si algo falla, el VPS vuelve a la versión anterior.
Changelog versionado y trazable
Cada cambio queda registrado con versión semántica, estado (pendiente/develop/producción), fecha de despliegue y una descripción pública traducida a los 9 idiomas.
Firma digital de documentos en canvas
Editor visual de campos sobre el PDF, firma con canvas (mouse o táctil), recortado al bounding box antes de exportar, recordatorios vía Discord y cron diario.
Multi-cliente por dominio
Cada club se resuelve por el dominio de la petición y todas las consultas filtran por su tenant, con claves foráneas en la base y caché HTTP separada por dominio. Varios clubs en la misma instancia sin cruzar datos.
IA con freno de gasto
VentuBot reserva presupuesto antes de cada llamada y lo ajusta con el consumo real: límite de ráfagas por minuto, cupo diario por IP y tope diario global. No guarda conversaciones y la IP nunca se almacena en claro.
833 tests automatizados
Cobertura desde la lógica de negocio hasta los flujos completos de usuario. Cada push bloquea el despliegue si algún test de la web falla.
API · Autenticación
- login.test.ts8
- logout.test.ts4
- me.test.ts2
- profile.test.ts9
API · CRUD entidades
- users.test.ts13
- teams.test.ts11
- players.test.ts9
- calendar.test.ts8
- calendar-matches.test.ts7
- changelog.test.ts5
- news.test.ts4
- creators.test.ts3
API · Endpoints públicos
- public.test.ts14
- chat.test.ts6
- audit.test.ts6
- setup.test.ts5
- filter.test.ts5
- log-client.test.ts4
- csrf.test.ts2
- health.test.ts1
Uploads y archivos
- uploads.test.ts38
- upload.test.ts7
- uploads-serve.test.ts7
Seguridad, sesión y RGPD
- security.test.ts59
- session.test.ts38
- cookie-consent.test.ts20
- legal.test.ts19
- site.test.ts7
- logger.test.ts4
- no-empty-logger-error.test.ts3
Multitenancy
- db-tenants.test.ts26
- tenant-resolver.test.ts23
- tenant-ctx.test.ts15
- tenant.test.ts13
- tenant-isolation.test.ts3
Capa de datos
- db-documentos.test.ts29
- db-autologin.test.ts20
- db-visibilidad.test.ts19
- db-partidos.test.ts14
- db-traducciones.test.ts6
- db-ids.test.ts4
Integraciones y portal
- liveStatus.test.ts30
- creatorStats.test.ts21
- calendar.test.ts19
- portalSections.test.ts18
- documentNotify.test.ts15
- documents.test.ts14
- env-badge.test.ts12
- maintenanceHub.test.ts11
Contenido, i18n e IA
- i18n-paridad.test.ts11
- NewsMarkdown.test.ts8
- translations.test.ts8
- translate.test.ts6
- changelog-i18n.test.ts6
- ventubot.test.ts5
Motor de físicas y UI
- heroPhysics.test.ts41
- heroParticles.test.ts9
- avatar.test.ts5
- chunk-reload.test.ts4
- names.test.ts3
E2E · Playwright
- error-pages.spec.ts8
- login.spec.ts6
- cookie-banner.spec.ts5
- smoke.spec.ts1
Bot Discord · Python
- test_web_monitor.py33
- test_match.py17
- test_bot.py9
- test_control.py8
¿Qué hay detrás del precio?
Cifras objetivas del proyecto para entender qué costaría construirlo desde cero y qué valor entrega hoy.
Repartidas en ~33 jornadas activas entre web pública, portal de gestión y bot de Discord, con desarrollo asistido por IA.
Lo que costaría rehacer el mismo producto a tarifa freelance senior (50–70 €/h, 2.300–3.300 h).
En producción con un club real, 833 tests, CI/CD, multi-cliente e IA integrada, pero aún sin cartera de clientes SaaS.
Múltiplo 2–5× sobre revenue recurrente si el producto gana tracción comercial.
¿Por qué te enseñamos esto? Porque los precios del plan amateur (19 €/mes) o de la compra completa (19.500 €) sólo tienen sentido si entiendes el coste real de construir algo así. La diferencia entre lo que cuesta producir y lo que se paga por usarlo es nuestra propuesta de valor.
Planes para cada club
Desde clubs amateurs con tesorería ajustada hasta organizaciones que quieren plataforma propia. Elige el que encaje contigo.
Para empezar
Lo justo para tener a tu club en línea. Pensado para escuadras muy pequeñas que arrancan.
- 2 equiposincluido
- 15 usuarios totalesincluido
- 1 creadorincluido
- Setup y brandeo del clubincluido
- Subdominio propioincluido
- Hospedaje en nuestro VPSincluido
- Bot Discord configuradoincluido
- Soporte por emailincluido
Para clubs amateurs
Tu club competitivo con plataforma propia sin arruinar tu cartera.
- 5 equiposincluido
- 50 usuarios totalesincluido
- 4 creadoresincluido
- Setup y brandeo del clubincluido
- Subdominio propioincluido
- Hospedaje en nuestro VPSincluido
- Actualizaciones + backupsincluido
- Bot Discord + soporte emailincluido
Para organizaciones serias
Capacidad amplia, soporte prioritario y subdominio premium para clubs en crecimiento.
- 20 equiposincluido
- 200 usuarios totalesincluido
- 15 creadoresincluido
- Hospedaje dedicadoincluido
- Subdominio o dominio propioincluido
- Soporte prioritario + SLA 99.5%incluido
- Onboarding (2h) + monitorizaciónincluido
- Personalización extrapresupuestada
Quieres ser dueño
Te entregamos el código y lo despliegas en tu infra. Independencia total, sin límites.
- Equipos / usuarios / creadoresilimitados
- Código fuente completoincluido
- Web + portal + botincluido
- Despliegue en tu VPSincluido
- Documentación técnicaincluido
- Onboarding (4h) + soporte 1 mesincluido
- Garantía 90 días bugsincluido
- Transferencia dominioincluido
¿Te apetece ser sponsor del proyecto?
Aplicamos descuento sobre el plan que elijas a cambio de testimonio público y feedback continuo del producto. No es un plan aparte: cualquiera de los tres planes recurrentes de arriba sirve como base.
- ▸Setup −66%: 199€ 65€ · 299€ 99€ · 399€ 135€
- ▸3 primeros meses al 50% sobre la cuota mensual
- ▸Logo en la página de sponsors VentuLabs
- ▸Voz directa en la hoja de ruta del producto
- ▸Testimonio público (texto o vídeo) que podamos mostrar
- ▸Feedback continuo del producto durante los primeros 6 meses
- ▸Compromiso mínimo: 6 meses de uso real
Plazas limitadas por instancia activa. El descuento sponsor se aplica al confirmar el alta.
Stack completo
Solo herramientas modernas, mantenidas y con comunidad activa.
Profesional, estable, propio.
EsportsHub no usa plantillas, no depende de SaaS caros, no tiene vendor lock-in. Es una plataforma con identidad técnica que viste los colores de tu club.
Hablemos · contacto@ventucorp.es