Plataforma de esports estilo torneos (referencia de UX: strafe.com): calendario de torneos por juego y estado, partidas en vivo, ranking, brackets, equipos, jugadores, noticias, búsqueda, tienda y membresías — con login Auth0, datos en Neon Postgres y despliegue automático en Cloudflare Workers.
Web: https://vants.vants.workers.dev Plataforma de torneos: https://vants.vants.workers.dev/es/tournaments/valorant/upcoming/
├── index.html ← home (layout strafe: tabs EN CURSO/PRÓXIMOS/ARCHIVO)
├── equipos.html ← equipos de la arena (API /api/teams)
├── noticias.html, noticia.html ← noticias + ficha de artículo (API /api/articles)
├── busqueda.html ← búsqueda global (API /api/search)
├── torneos.html / torneo.html ← inscripción real + ficha de torneo
├── partidos/ranking/jugadores/llaves/clips/membresías/tienda/…
├── research/ ← F1: análisis real de la referencia (strafe.com)
├── product/ ← F2: requisitos, flujos, criterios de aceptación
├── architecture/ ← F3: sistema, esquema BD, API, seguridad
├── PROJECT_STATUS.md ← estado vivo de la misión (fases con evidencia)
├── IMPLEMENTATION_PLAN.md ← plan de 16 fases
├── DECISIONS.md ← decisiones técnicas y sus motivos
├── db/migrations/ ← SQL idempotente (01…29; 28 = plataforma pt_*, 29 = pt_players)
├── vants-server/
│ ├── worker.js ← Worker Cloudflare: seguridad, rutas /es|en/tournaments/…,
│ │ API pública JSON, Discord events, inscripciones
│ ├── plataforma-core.js ← lógica pura compartida Worker↔tests (ESM)
│ └── public/ ← frontend servido (espejo ×3 con raíz y public/)
├── neon-functions/ ← vantsdata (proxy lectura), mm, vantsbot, stripe…
├── services/ ← agent-service (cerebro agéntico GLM), matchmaking
├── bot/ ← bot ORION de Discord (Python)
├── desktop-electron/ ← HUB/launcher Electron con auto-update
├── scripts/ ← tests (test_plataforma, test_agente, …), auditoría,
│ build-webapp.mjs (sincroniza/verifica el espejo ×3),
│ scraper_vlr.py (vlr.gg → vlr_matches, idempotente)
├── docs/ ← TESTING.md, DEPLOYMENT.md, content-island.md, …
├── webapp/ ← Astro 7: home compilada + islas React (Explore) y
│ Vue+Three (Emblema3D, IntroJett) — ver docs/content-island.md
├── mcp/ ← server MCP stdio sin dependencias (4 tools)
├── docker-compose.yml ← api-gateway (Express :8080) + matchmaking (:8081)
└── .github/workflows/ ← tests, neon-migrate, neon-deploy-functions,
cloudflare-deploy, fullstack, agente, faceit-*,
electron, android (deploy-prod en cola; actions SHA-pinned)
- Node 20+ (para tests y wrangler).
- Cuenta Cloudflare con el Worker
vantsconfigurado (deploy automático por CI). - Proyecto Neon con las migraciones aplicadas (CI las aplica en cada cambio).
- Opcional en local:
wrangler(npm i -g wranglero usar el devants-server).
# clonar y entrar
git clone https://github.com/feispla/Vants.git && cd Vants
# servidor local del Worker (sirve el frontend + API con las rutas reales)
cd vants-server
npm install
npx wrangler dev --port 8787
# → http://127.0.0.1:8787No hay build del frontend: los archivos estáticos se sirven tal cual (espejo ×3:
raíz / public/ / vants-server/public/ — mantener los tres sincronizados).
Todo lo sensible va en GitHub Secrets / Secretos del Worker (ver docs/DEPLOYMENT.md).
Referencia sin secretos: vants-server/.env.example, bot/.env.example,
services/*/.env.example. El Worker NO guarda credenciales de la base: lee por el proxy
público vantsdata y reenvía el JWT del usuario cuando hay sesión.
node scripts/test_plataforma.js # 90 asserts (lógica de la plataforma + integración)
node scripts/test_agente.js # 61 asserts (agente)
node scripts/test_mm_fase4.js # 54 asserts (matchmaking)
node scripts/test_llm_agente.js # 30 asserts · test_sandbox_agente.js 60 · test_vantsbot.js 36 · test_mm_neon.js 16
node scripts/audit_enlaces.js # crawler interno (752 enlaces, 0 rotos)
# total de asserts: 347 verdes en las 7 suites
# webapp Astro (islas): tipos + build reproducible (bundles _astro byte-idénticos)
cd webapp && npx astro check && npm run build && cd ..
# Docker: api-gateway (Express :8080) + matchmaking (Fastify :8081), multi-stage USER node
docker compose build
# MCP: server stdio sin dependencias, 4 tools de solo lectura (smoke en fullstack.yml)
node mcp/server.mjs
# suite completa: ver docs/TESTING.mdLas aplica el CI (neon-migrate.yml) en orden por nombre de archivo; son idempotentes.
En manual: ejecutar los db/migrations/NN-*.sql en orden contra la rama principal de Neon.
- Auth0 (
vants.eu.auth0.com): login SPA; el JWT decide RLS en Neon. - Neon Postgres + Data API/proxy: torneos, equipos, jugadores, artículos, presencia.
- FACEIT Data API (
FACEIT_API_KEY): pipeline de resultados/RR (webhook + poller). - Discord: events endpoint del Worker (Ed25519) + bot ORION.
- Stripe: membresías (checkout + webhook en Neon Functions).
- vlr.gg/HenrikDev: agenda esports Valorant y panel EN VIVO.
Push a main → CI (tests → migraciones → funciones → Worker). Detalles y verificación
post-deploy: docs/DEPLOYMENT.md. Rollback: git revert + push.
- Datos del calendario: mientras no existan torneos reales publicados, la plataforma muestra la semilla DEMO claramente etiquetada (chip DEMO + prefijo "DEMO ·"); nunca presenta datos ficticios como reales.
- i18n: la interfaz está traducida es/en; el contenido editorial (artículos) se publica en el idioma en que el equipo lo escriba.
- Sin analítica/publicidad de terceros por decisión de producto (
DECISIONS.mdD6).