✦ ✦ ✦
CODEXEAR
ROADMAP 2026
// ÚLTIMA VEZ ACTUALIZADO: 25 DE MARZO DE 2026
✦ ✦ ✦
FASE 0
Infraestructura
Infraestructura
~1 semana
FASE 1
Core API
Core API
~2-3 semanas
FASE 2
Social & Logros
Social & Logros
~2 semanas
FASE 3
Tienda & WS
Tienda & WS
~2 semanas
FASE 4
Web Polish
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
Fullstack Developer — Creador Codexear
20
Issues Resueltas
COLABORADOR
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 existente | Campos nuevos a añadir |
|---|---|
users | email_verified · last_seen · is_online · points · equipped_frame · equipped_bg · unlocked_achievements[] · purchased_items[] |
exercises | pdf_url · language_stubs (JS, Java, C++) · complexity_level |
matches | season_id · is_ranked · points_awarded |
// FASE_0 — ISSUES RESUELTAS (HISTORIAL GITHUB)
// API — AUTENTICACIÓN & USUARIOS
| # | Issue | Repo | Colección | Labels |
|---|---|---|---|---|
| #1 | Sistema de registro de usuario con hash bcrypt — POST /api/auth/register | API | users | auth |
| #2 | Login con JWT de 7 días — POST /api/auth/login con token de acceso | API | users | auth |
| #3 | Onboarding de usuario — POST /api/user/onboard con username, lenguajes, nivel y avatar | API | users | feat |
| #4 | Upload de avatar a Cloudinary con ID seguro derivado del email | API | users | feat devops |
| #5 | Endpoint de perfil propio — GET /api/user/me con ELO, rango calculado y global_rank | API | users | profile |
| #6 | Actualización de perfil — POST /api/user/profile/update con cambio de contraseña y avatar | API | users | profile |
| #7 | CORS abierto para desarrollo — middleware allow_origins=["*"] | API | — | devops |
// API — AMIGOS
| # | Issue | Repo | Colección | Labels |
|---|---|---|---|---|
| #8 | Búsqueda de usuarios por username — GET /api/friends/search?q= con exclusión de amigos | API | users | friends |
| #9 | Enviar, aceptar, rechazar y cancelar solicitudes de amistad | API | users | friends |
| #10 | Listado de amigos, enviadas y recibidas — GET /api/friends | API | users | friends |
// API — EJERCICIOS
| # | Issue | Repo | Colección | Labels |
|---|---|---|---|---|
| #11 | Seed automático de ejercicios al arrancar la API desde exercises_data.py | API | exercises | exercise devops |
| #12 | Endpoint de ejercicios con estado resuelto por usuario — GET /api/exercises | API | exercises · users | exercise |
| #13 | Corrección de ejercicio Python con test cases — POST /api/exercises/{id}/solve | API | exercises | exercise bug |
| #14 | First solver tracking — almacenar first_solver_email y lista de solvers[] en ejercicios | API | exercises | exercise |
| #15 | Story mode — capítulos de ejercicios, desbloqueo secuencial por progreso 5/5 | API | exercises · users | feat |
// API — MATCHMAKING & LEADERBOARD
| # | Issue | Repo | Colección | Labels |
|---|---|---|---|---|
| #16 | Matchmaking con long-polling 25s — POST /api/matchmaking/join con emparejamiento por tier ELO | API | active_matches | match |
| #17 | Polling de estado de partida — GET /api/matchmaking/match/{id}/poll | API | active_matches | match |
| #18 | Submit de solución en partida y cálculo de ELO (+25 win / -15 loss) | API | matches · users | match |
| #19 | Leaderboard top-5 por ELO — GET /api/leaderboard | API | users | feat |
| #20 | Stats de dificultad de ejercicios resueltos — GET /api/user/stats con easy/medium/hard | API | exercises · users | feat |
// WEB — PÁGINAS & COMPONENTES
| # | Issue | Repo | Labels |
|---|---|---|---|
| #W1 | Página de Login — Login.html con JWT almacenado en localStorage y redirección automática si ya hay sesión activa | WEB | auth ui |
| #W2 | Registro de usuario — Register.html con formulario de email + contraseña y doble validación | WEB | auth ui |
| #W3 | Onboarding multi-paso — Onboarding.html con selección de username, avatar, lenguajes y nivel de experiencia | WEB | profile ui |
| #W4 | Dashboard principal — Home.html con sidebar de stats: ELO, rango actual, victorias, WR%, clasificación global y donut chart de ejercicios resueltos por dificultad | WEB | feat ui |
| #W5 | Cards de modos de juego en Home — Modo Offline, Story Mode, Ranked y Unranked con botones de acción directa y feature tags | WEB | ui |
| #W6 | Pá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 derecha | WEB | friends ui |
| #W7 | Gestión dinámica de solicitudes — aceptar y rechazar amistades con actualización inmediata sin recarga de página | WEB | friends feat |
| #W8 | Flujo de matchmaking ranked — Ranked.html con vista de espera animada, avatares en busca de rival, spinner, timer de búsqueda y cancelación | WEB | match ui |
| #W9 | Barra de progreso al siguiente rango — Ranked.html calcula los LP restantes dinámicamente y rellena la barra visualmente | WEB | match ui |
| #W10 | Pantalla 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 rival | WEB | match ui |
| #W11 | Editor 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ódigo | WEB | exercise ui |
| #W12 | Modal de resultado de partida — overlay de VICTORIA/DERROTA con ELO ganado/perdido y botón de vuelta a la cola | WEB | match ui |
| #W13 | Página de ejercicios offline — Exercises.html con filtros por dificultad y estado, indicador de primer solver y amigos que han resuelto el ejercicio | WEB | exercise ui |
| #W14 | Pá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 previa | WEB | profile ui |
| #W15 | Leaderboard top-5 y Story Mode — Leaderboard.html con ranking ELO global, StoryMode.html con 6 capítulos desbloqueables y progreso 5/5 por capítulo | WEB | feat ui |
// FASE_1 — MEJORAS API (PENDIENTES)
// ARQUITECTURA
| # | Issue | Repo | Colección | Labels |
|---|---|---|---|---|
| #21 | Organizar 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.py | API | — | refactor arch |
| #22 | Crear verificación de correo electrónico — token por email al registrarse, endpoint GET /api/auth/verify-email?token= y campo email_verified en users | API | users · email_verification | auth security |
| #23 | Refresh 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 invalidados | API | users | auth security |
| #24 | Restringir CORS en producción — reemplazar allow_origins=["*"] por dominio real del frontend en variables de entorno | API | — | security devops |
// EJERCICIOS
| # | Issue | Repo | Colección | Labels |
|---|---|---|---|---|
| #25 | Crear más ejercicios más complejos — añadir al menos 30 nuevos problemas de nivel avanzado: grafos, DP, backtracking y búsqueda binaria | API | exercises | exercise |
| #26 | Hacer 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 exercises | API | exercises | exercise ui |
| #27 | Corregir 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 lenguaje | API | exercises | bug exercise |
| #28 | Soporte multi-lenguaje real — añadir language_stubs por ejercicio (JS, Java, C++, Go) y ejecutar código con Docker sandbox o Judge0 | API | exercises | exercise feat |
// AMIGOS & PRESENCIA
| # | Issue | Repo | Colección | Labels |
|---|---|---|---|---|
| #29 | Corregir 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 amigos | API | users | bug friends |
| #30 | Corregir 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 minutos | API | users | bug friends perf |
| #31 | Eliminar amigos — añadir endpoint DELETE /api/friends/{username} que elimine la relación de amistad en ambos documentos | API | users | friends |
// LOGROS
| # | Issue | Repo | Colección | Labels |
|---|---|---|---|---|
| #32 | Crear 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" | API | achievements · users | achievements feat |
| #33 | Motor de evaluación de logros post-partida y post-ejercicio — hook en submit que verifique condiciones y añada a users.unlocked_achievements[] | API | achievements · users · matches | achievements |
| #34 | Endpoint de logros del usuario — GET /api/users/{id}/achievements con estado obtenido/bloqueado | API | users · achievements | achievements |
// MATCHMAKING & TEMPORADAS
| # | Issue | Repo | Colección | Labels |
|---|---|---|---|---|
| #35 | Hacer 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.Event | API | active_matches | websocket perf |
| #36 | Persistir active_matches en MongoDB — actualmente están en memoria; si el servidor se reinicia se pierden las partidas en curso | API | active_matches | bug arch |
| #37 | Sistema de temporadas ranked — colección seasons con fecha de inicio/fin, top 5 al cierre y reset parcial de ELO | API | seasons · users | feat |
// TIENDA DE PUNTOS
| # | Issue | Repo | Colección | Labels |
|---|---|---|---|---|
| #38 | Crear 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} | API | store_items · users | store feat |
// FASE_2 — MEJORAS WEB (PENDIENTES)
| # | Issue | Repo | Labels |
|---|---|---|---|
| #39 | Hacer 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 768px | WEB | responsive bug |
| #40 | Permitir 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 espera | WEB | feat ui websocket |
| #41 | Permitir que el usuario personalice su perfil mucho más — fondos personalizados, marcos personalizados y cosméticos comprados en la tienda visibles en Profile.html | WEB | profile store ui |
| #42 | Página de tienda — mostrar catálogo de fondos y marcos comprables con puntos, previsualización en tiempo real sobre el avatar del usuario | WEB | store ui |
| #43 | Página de logros — galería visual de logros obtenidos/bloqueados con progreso y descripción de condiciones | WEB | achievements ui |
| #44 | Mostrar PDF del enunciado en SolvePage.html — cuando los ejercicios tengan pdf_url, renderizar con un visor PDF en la columna izquierda | WEB | exercise ui |
| #45 | Banner de logro desbloqueado — toast/notificación animada al recibir un logro nuevo durante la sesión | WEB | achievements ui |
| #46 | Mostrar "ú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_seen | WEB | friends bug |
| #47 | Botón de eliminar amigo en Friends.html — UI con confirmación modal para evitar eliminaciones accidentales | WEB | friends ui |
| #48 | Pantalla de verificación de email — página informativa post-registro que pida verificar el correo antes de continuar el onboarding | WEB | auth ui |
| #49 | Panel de temporada ranked — mostrar en Ranked.html la temporada activa, tu posición y el top 5 al cierre anterior | WEB | feat ui |
| #50 | Tests end-to-end con pytest + fixtures de MongoDB — cubrir register, login, join matchmaking y submit exercise con datos de prueba aislados | API | testing 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/mecon 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.pyen archivos por endpoint - Implementar verificación de email
- Corregir
is_onlineylast_seende amigos - Iniciar tienda de puntos y sistema de logros