✦ ✦ ✦

CODEXEAR
ROADMAP 2026

// ÚLTIMA VEZ ACTUALIZADO: 25 DE MARZO DE 2026

✦ ✦ ✦
FASE 0
Infraestructura
~1 semana
FASE 1
Core API
~2-3 semanas
FASE 2
Social & Logros
~2 semanas
FASE 3
Tienda & WS
~2 semanas
FASE 4
Web Polish
~3 semanas
Issues API
38
20 resueltas / 18 pendientes
Issues Web
27
15 resueltas / 12 pendientes
Total Issues
65
35 resueltas / 30 pendientes
LÍDER DEL PROYECTO 👑
Daniel Poza

DANIEL POZA

Fullstack Developer — Creador Codexear

20
Issues Resueltas
COLABORADOR
Juan Gómez

JUAN GÓMEZ

Colaborador — Frontend & UX

0
Issues Resueltas
+

¿Quieres colaborar?

// COLECCIONES_MONGODB

users
Auth, perfil, ELO, amigos, progreso
exercises
Catálogo de ejercicios de código
matches
Historial de partidas finalizadas
active_matches
Partidas en curso (in-memory)
✦ achievements
Catálogo de logros (nueva)
✦ store_items
Fondos y marcos de tienda (nueva)
✦ seasons
Temporadas ranked (nueva)
✦ email_verification
Tokens de verificación (nueva)
Colección existenteCampos nuevos a añadir
usersemail_verified · last_seen · is_online · points · equipped_frame · equipped_bg · unlocked_achievements[] · purchased_items[]
exercisespdf_url · language_stubs (JS, Java, C++) · complexity_level
matchesseason_id · is_ranked · points_awarded
// FASE_0 — ISSUES RESUELTAS (HISTORIAL GITHUB)
// API — AUTENTICACIÓN & USUARIOS
#IssueRepoColecciónLabels
#1Sistema de registro de usuario con hash bcrypt — POST /api/auth/registerAPIusersauth
#2Login con JWT de 7 días — POST /api/auth/login con token de accesoAPIusersauth
#3Onboarding de usuario — POST /api/user/onboard con username, lenguajes, nivel y avatarAPIusersfeat
#4Upload de avatar a Cloudinary con ID seguro derivado del emailAPIusersfeat devops
#5Endpoint de perfil propio — GET /api/user/me con ELO, rango calculado y global_rankAPIusersprofile
#6Actualización de perfil — POST /api/user/profile/update con cambio de contraseña y avatarAPIusersprofile
#7CORS abierto para desarrollo — middleware allow_origins=["*"]APIdevops
// API — AMIGOS
#IssueRepoColecciónLabels
#8Búsqueda de usuarios por username — GET /api/friends/search?q= con exclusión de amigosAPIusersfriends
#9Enviar, aceptar, rechazar y cancelar solicitudes de amistadAPIusersfriends
#10Listado de amigos, enviadas y recibidas — GET /api/friendsAPIusersfriends
// API — EJERCICIOS
#IssueRepoColecciónLabels
#11Seed automático de ejercicios al arrancar la API desde exercises_data.pyAPIexercisesexercise devops
#12Endpoint de ejercicios con estado resuelto por usuario — GET /api/exercisesAPIexercises · usersexercise
#13Corrección de ejercicio Python con test cases — POST /api/exercises/{id}/solveAPIexercisesexercise bug
#14First solver tracking — almacenar first_solver_email y lista de solvers[] en ejerciciosAPIexercisesexercise
#15Story mode — capítulos de ejercicios, desbloqueo secuencial por progreso 5/5APIexercises · usersfeat
// API — MATCHMAKING & LEADERBOARD
#IssueRepoColecciónLabels
#16Matchmaking con long-polling 25s — POST /api/matchmaking/join con emparejamiento por tier ELOAPIactive_matchesmatch
#17Polling de estado de partida — GET /api/matchmaking/match/{id}/pollAPIactive_matchesmatch
#18Submit de solución en partida y cálculo de ELO (+25 win / -15 loss)APImatches · usersmatch
#19Leaderboard top-5 por ELO — GET /api/leaderboardAPIusersfeat
#20Stats de dificultad de ejercicios resueltos — GET /api/user/stats con easy/medium/hardAPIexercises · usersfeat
// WEB — PÁGINAS & COMPONENTES
#IssueRepoLabels
#W1Página de Login — Login.html con JWT almacenado en localStorage y redirección automática si ya hay sesión activaWEBauth ui
#W2Registro de usuario — Register.html con formulario de email + contraseña y doble validaciónWEBauth ui
#W3Onboarding multi-paso — Onboarding.html con selección de username, avatar, lenguajes y nivel de experienciaWEBprofile ui
#W4Dashboard principal — Home.html con sidebar de stats: ELO, rango actual, victorias, WR%, clasificación global y donut chart de ejercicios resueltos por dificultadWEBfeat ui
#W5Cards de modos de juego en Home — Modo Offline, Story Mode, Ranked y Unranked con botones de acción directa y feature tagsWEBui
#W6Página de amigos layout 3 columnas — Friends.html: actividad a la izquierda, búsqueda + solicitudes enviadas/recibidas en el centro, lista de amigos a la derechaWEBfriends ui
#W7Gestión dinámica de solicitudes — aceptar y rechazar amistades con actualización inmediata sin recarga de páginaWEBfriends feat
#W8Flujo de matchmaking ranked — Ranked.html con vista de espera animada, avatares en busca de rival, spinner, timer de búsqueda y cancelaciónWEBmatch ui
#W9Barra de progreso al siguiente rango — Ranked.html calcula los LP restantes dinámicamente y rellena la barra visualmenteWEBmatch ui
#W10Pantalla de batalla ranked — RankedBattle.html con battle strip (avatares + VS + ELO de ambos jugadores), reloj de partida en tiempo real y barra de progreso del rivalWEBmatch ui
#W11Editor de código en batalla — selector de lenguaje Python/JS/C++/Java, textarea con botón Comprobar y Guardar desbloqueado solo tras verificar el códigoWEBexercise ui
#W12Modal de resultado de partida — overlay de VICTORIA/DERROTA con ELO ganado/perdido y botón de vuelta a la colaWEBmatch ui
#W13Página de ejercicios offline — Exercises.html con filtros por dificultad y estado, indicador de primer solver y amigos que han resuelto el ejercicioWEBexercise ui
#W14Página de perfil editable — Profile.html con cambio de avatar en Cloudinary, username, descripción (máx 30 chars), stack tecnológico y cambio de contraseña con verificación previaWEBprofile ui
#W15Leaderboard top-5 y Story Mode — Leaderboard.html con ranking ELO global, StoryMode.html con 6 capítulos desbloqueables y progreso 5/5 por capítuloWEBfeat ui
// FASE_1 — MEJORAS API (PENDIENTES)
// ARQUITECTURA
#IssueRepoColecciónLabels
#21Organizar mejor los endpoints y crear un archivo por endpoint — así es más fácil de desarrollar. Dividir main.py en routers: auth.py, exercises.py, friends.py, matchmaking.py, achievements.py, store.pyAPIrefactor arch
#22Crear verificación de correo electrónico — token por email al registrarse, endpoint GET /api/auth/verify-email?token= y campo email_verified en usersAPIusers · email_verificationauth security
#23Refresh token + JWT blacklist — actualmente el token de 7 días no tiene revocación posible. Añadir POST /api/auth/refresh y colección de tokens invalidadosAPIusersauth security
#24Restringir CORS en producción — reemplazar allow_origins=["*"] por dominio real del frontend en variables de entornoAPIsecurity devops
// EJERCICIOS
#IssueRepoColecciónLabels
#25Crear más ejercicios más complejos — añadir al menos 30 nuevos problemas de nivel avanzado: grafos, DP, backtracking y búsqueda binariaAPIexercisesexercise
#26Hacer que los ejercicios sean PDFs no texto sin sentido — generar/subir enunciados en PDF con ejemplos visuales y subirlos a Cloudinary, añadir campo pdf_url en exercisesAPIexercisesexercise ui
#27Corregir que los ejercicios se corrijan bien — hay lenguajes (JS, Java, C++) que actualmente se marcan como correctos con save=true sin ejecutar código real. Implementar sandbox por lenguajeAPIexercisesbug exercise
#28Soporte multi-lenguaje real — añadir language_stubs por ejercicio (JS, Java, C++, Go) y ejecutar código con Docker sandbox o Judge0APIexercisesexercise feat
// AMIGOS & PRESENCIA
#IssueRepoColecciónLabels
#29Corregir que salga "última vez conectado hace 1 hora, 2 días, 1 semana…" — actualmente is_online: True es mock. Guardar last_seen timestamp en users y calcularlo en el endpoint de amigosAPIusersbug friends
#30Corregir el estado online real de los amigos — implementar heartbeat desde el cliente cada 60s a POST /api/user/heartbeat que actualice last_seen; online = last_seen < 2 minutosAPIusersbug friends perf
#31Eliminar amigos — añadir endpoint DELETE /api/friends/{username} que elimine la relación de amistad en ambos documentosAPIusersfriends
// LOGROS
#IssueRepoColecciónLabels
#32Crear los logros — implementar colección achievements con catálogo: "5 ejercicios resueltos", "10 ejercicios resueltos", "5 partidas ganadas", "20 ranked ganadas", "Has llegado a Oro", "Has sido Top 5 de la temporada"APIachievements · usersachievements feat
#33Motor de evaluación de logros post-partida y post-ejercicio — hook en submit que verifique condiciones y añada a users.unlocked_achievements[]APIachievements · users · matchesachievements
#34Endpoint de logros del usuario — GET /api/users/{id}/achievements con estado obtenido/bloqueadoAPIusers · achievementsachievements
// MATCHMAKING & TEMPORADAS
#IssueRepoColecciónLabels
#35Hacer que el matchmaking esté con WebSocket en vez de long-polling para que gaste menos en la API — migrar a WebSockets con FastAPI y eliminar el sistema de 25s asyncio.EventAPIactive_matcheswebsocket perf
#36Persistir active_matches en MongoDB — actualmente están en memoria; si el servidor se reinicia se pierden las partidas en cursoAPIactive_matchesbug arch
#37Sistema de temporadas ranked — colección seasons con fecha de inicio/fin, top 5 al cierre y reset parcial de ELOAPIseasons · usersfeat
// TIENDA DE PUNTOS
#IssueRepoColecciónLabels
#38Crear una tienda de puntos — por partida ganada o ejercicio resuelto gane puntos (users.points) y pueda comprar fondos y marcos para el perfil en POST /api/store/buy/{item_id}APIstore_items · usersstore feat
// FASE_2 — MEJORAS WEB (PENDIENTES)
#IssueRepoLabels
#39Hacer la interfaz responsive — en portátiles más pequeños el panel principal de Home.html se ve feo y mal. Revisar breakpoints para 1280px, 1024px y 768pxWEBresponsive bug
#40Permitir que el usuario busque partida y pueda hacer ejercicios mientras tanto — mostrar un banner de "Buscando partida…" arriba del todo mientras navega; si encuentra rival, cerrar ejercicio e ir al matchmaking. El usuario puede navegar libremente en modo offline mientras esperaWEBfeat ui websocket
#41Permitir que el usuario personalice su perfil mucho más — fondos personalizados, marcos personalizados y cosméticos comprados en la tienda visibles en Profile.htmlWEBprofile store ui
#42Página de tienda — mostrar catálogo de fondos y marcos comprables con puntos, previsualización en tiempo real sobre el avatar del usuarioWEBstore ui
#43Página de logros — galería visual de logros obtenidos/bloqueados con progreso y descripción de condicionesWEBachievements ui
#44Mostrar PDF del enunciado en SolvePage.html — cuando los ejercicios tengan pdf_url, renderizar con un visor PDF en la columna izquierdaWEBexercise ui
#45Banner de logro desbloqueado — toast/notificación animada al recibir un logro nuevo durante la sesiónWEBachievements ui
#46Mostrar "última vez visto" real en la lista de amigos de Friends.html — "Hace 1 hora", "Hace 2 días", "Hace 1 semana" en base a last_seenWEBfriends bug
#47Botón de eliminar amigo en Friends.html — UI con confirmación modal para evitar eliminaciones accidentalesWEBfriends ui
#48Pantalla de verificación de email — página informativa post-registro que pida verificar el correo antes de continuar el onboardingWEBauth ui
#49Panel de temporada ranked — mostrar en Ranked.html la temporada activa, tu posición y el top 5 al cierre anteriorWEBfeat ui
#50Tests end-to-end con pytest + fixtures de MongoDB — cubrir register, login, join matchmaking y submit exercise con datos de prueba aisladosAPItesting docs

// NOTAS_TÉCNICAS

WebSocket Matchmaking — Migración planeada

# Actual (long-polling 25s):
await asyncio.wait_for(my_event.wait(), timeout=25.0)

# Target (WebSocket FastAPI):
@app.websocket("/ws/matchmaking")
async def matchmaking_ws(ws: WebSocket, token: str):
    await ws.accept()
    # → conexión persistente, sin timeout, menor coste de API

Sistema de presencia — last_seen

# Heartbeat cada 60s desde el cliente:
# POST /api/user/heartbeat  → { last_seen: datetime.utcnow() }

# Online check en get_friends():
is_online = (datetime.utcnow() - u["last_seen"]).seconds < 120

# Last seen display:
# < 60s   → "En línea"
# < 3600s → "Hace X minutos"
# < 86400s→ "Hace X horas"
# < 604800→ "Hace X días"
# else    → "Hace X semanas"

Sistema de puntos — Tienda

# Al resolver ejercicio:
elo_gain = 1/2/5 (fácil/normal/difícil)
points_gain = same as elo_gain * 10

# Al ganar partida ranked:
await db.users.update_one({...}, {"$inc": {"elo": 25, "points": 50}})

# Compra en tienda:
# POST /api/store/buy/{item_id}
# → verifica users.points >= item.price
# → descuenta puntos, añade a users.purchased_items[]

Logros — Condiciones de desbloqueo

ACHIEVEMENTS = [
  { "id": "ex_5",    "title": "Primeros pasos",      "condition": "solved_exercises >= 5"  },
  { "id": "ex_10",   "title": "Programador",          "condition": "solved_exercises >= 10" },
  { "id": "w_5",     "title": "En racha",             "condition": "wins >= 5"              },
  { "id": "rk_20",   "title": "Leyenda ranked",       "condition": "ranked_wins >= 20"      },
  { "id": "oro",     "title": "Ascendido al Oro",     "condition": "elo >= 301"             },
  { "id": "top5",    "title": "Top 5 de la temporada","condition": "season_rank <= 5"       },
]

// REGISTRO_SEMANAL_DE_AVANCE

Historial de las últimas semanas — progreso hacia versión estable.

SEMANA 1 01 Ene 2026 FASE 0 — Setup

✅ Completado

  • Inicializar repositorio Git — CodexarFastApi y CodexarWeb
  • Setup Python venv, FastAPI, Motor, PyJWT, bcrypt, Cloudinary
  • Estructura base de carpetas en /app
  • Conexión a MongoDB Atlas — startup_db_client
  • Primera web HTML5 con páginas base y CSS reset

→ Próxima semana

  • Endpoints de registro y login
  • Primera integración web ↔ API
SEMANA 2-3 08 Ene 2026 FASE 0 — Auth & Profile

✅ Completado

  • Register, Login, JWT 7 días — issues #1 y #2
  • Onboarding con avatar upload a Cloudinary — issue #3 y #4
  • Endpoint /api/user/me con ELO, rango y rank global — issue #5
  • Update de perfil con cambio de contraseña — issue #6
  • Seed inicial de ejercicios Python desde exercises_data.py

→ Próxima semana

  • Sistema de amigos completo
  • Matchmaking con long-polling
SEMANA 4-6 22 Ene 2026 FASE 0 — Friends & Match

✅ Completado

  • Sistema de amigos completo (buscar, enviar, aceptar, rechazar, cancelar) — issues #8-10
  • Matchmaking long-polling con emparejamiento por tier — issue #16-18
  • Corrección del solver Python con test cases dinámicos — issue #13
  • Story mode con 6 capítulos y desbloqueo secuencial — issue #15
  • Leaderboard top-5 ELO y stats de ejercicios — issues #19-20

→ Próxima semana

  • Refactorizar main.py en routers
  • Verificación de email
  • Inicio de migración WebSocket matchmaking
SEMANA ACTUAL 25 Mar 2026 FASE 1 — Planning

📋 Estado Actual

  • Core API funcional — 20 issues resueltas
  • 30 issues futuras identificadas y priorizadas
  • 2 colaboradores activos: Daniel Poza + Juan Gómez

→ Objetivos inmediatos

  • Refactorizar main.py en archivos por endpoint
  • Implementar verificación de email
  • Corregir is_online y last_seen de amigos
  • Iniciar tienda de puntos y sistema de logros