Jugando aprendemos igualdad 🌟
🚀 Demo en Vivo | 📖 Documentación | 💻 Código Fuente | 🤝 Contribuir
| Servicio | Plataforma | Estado | URL |
|---|---|---|---|
| 🎨 Frontend | Vercel | ✅ Activo | psoc-generic-r-cultural-c.vercel.app |
| ⚡ Backend API | Azure Web App | ✅ Activo | sorokina-c2end0bphkcaf4ab.canadacentral-01.azurewebsites.net/api |
| 🔄 Backend (Alt) | Railway | 🟡 Inactivo* | psoc-genericr-culturalc-production.up.railway.app/api |
| 🗄️ Base de Datos | Supabase | ✅ Activo | PostgreSQL Cloud |
| 🤖 AI Service | Railway | ✅ Activo | Python + Groq API |
* El backend de Railway está inactivo pero se puede activar en cualquier momento como respaldo
- Health Check:
/api - Quiz:
/api/quiz - Leaderboard:
/api/leaderboard - Chat AI:
/api/chat
- Sobre el Proyecto
- Características Principales
- Arquitectura
- Stack Tecnológico
- Instalación
- Uso
- Estructura del Proyecto
- API Endpoints
- Base de Datos
- Seguridad
- Testing
- Despliegue
- Contribuir
- Licencia
- Autores
Gender Quest es una plataforma educativa interactiva que combina gamificación, inteligencia artificial y contenido multimedia para promover la reflexión crítica sobre roles de género, estereotipos y la importancia de la equidad.
El proyecto integra:
- 🎯 Juego web 3D con Three.js y preguntas interactivas
- 🤖 Chatbot educativo AI con Groq (Llama 3.3 70B) sobre roles de género
- 📊 Sistema de ranking en tiempo real
- 📚 8 secciones educativas con contenido multimedia
- 🎵 Música ambiente con controles personalizados
- 💬 Chat flotante minimizable en todas las páginas
- 🔐 Autenticación segura con JWT y verificación HMAC
- ✨ Educar sobre roles de género a través de la gamificación
- 🌍 Promover la igualdad y equidad de género
- 📖 Proporcionar contenido educativo accesible y atractivo
- 🎮 Crear experiencias de aprendizaje interactivas e inmersivas
- 10 Preguntas Educativas: Sobre roles de género
- Experiencia 3D Inmersiva: Visualización con Three.js y React Three Fiber
- Sistema de Puntaje: Puntuación en tiempo real y feedback inmediato
- ⏱️ Temporizador Competitivo: Registra el tiempo de completado para usuarios autenticados
- Códigos HMAC: Verificación criptográfica de resultados con tiempo incluido
- Pantallas Dinámicas: Bienvenida, juego, y resultados animados
- Modo Invitado: Opción para jugar sin registro (sin temporizador)
- Groq API (Llama 3.3 70B): Modelo de lenguaje de última generación
- Interfaz Flotante Minimizable: Disponible en todas las páginas con botón para minimizar
- Chat de Página Completa: Interfaz dedicada con tema oscuro y diseño moderno
- Historial de Conversación: Guarda el contexto de la sesión
- Respuestas Educativas: Enfocadas en equidad e igualdad de género
- Desarrollo Local Opcional: Python AI Service con transformers para desarrollo sin API
- Leaderboard en Tiempo Real: Actualización automática con Supabase
- Top Jugadores: Muestra los mejores puntajes verificados
- ⏱️ Desempate por Tiempo: Usuarios con mismo puntaje se ordenan por menor tiempo
- Columna de Tiempo: Muestra tiempo de completado en formato mm:ss
- Estadísticas: Puntaje, precisión, tiempo y fecha de envío
- Perfiles de Usuario: Avatares y nombres de usuario
- Ordenamiento Inteligente: Score DESC → Tiempo ASC → Fecha ASC
- Registro e Inicio de Sesión: Con validación de formularios
- JWT Tokens: Sesiones seguras con Passport.js
- Protección de Rutas: Guards para páginas privadas
- Hash de Contraseñas: bcrypt con salt rounds
- 8 Secciones Temáticas: Basadas en contenido académico sobre roles de género
- Navegación Intuitiva: Cards con vista previa y animaciones
- Responsive Design: Adaptado a móvil, tablet y desktop
- Material Multimedia: Texto, gráficos y contenido interactivo
- Referencias Bibliográficas: Formato APA 7ma edición con 11 fuentes académicas
- Marco Conceptual: Análisis cultural, factores principales y escalas de interacción
- 🎵 Música Ambiente: Reproductor con controles personalizados en todas las páginas
- 💬 Chatbot Flotante: Minimizable con botón circular en esquina inferior
- 📱 QR Code Modal: Comparte tu puntaje con QR personalizado y links de Azure
- 🌐 Código Abierto: Link prominente al repositorio de GitHub en página principal
- 🎯 Animaciones Fluidas: Framer Motion en toda la aplicación
- 🌙 Tema Oscuro: Diseño moderno con gradientes púrpura/fucsia
graph TB
A[👤 Usuario] -->|Juega| B[🎮 Frontend Next.js]
B -->|API Calls| C[🔧 Backend NestJS]
C -->|Query/Insert| D[(🗄️ Supabase PostgreSQL)]
C -->|AI Chat| E[🤖 Groq API - Llama 3.3 70B]
B -->|Realtime| D
C -->|HMAC Verify| F[🔐 HMAC Service]
C -.->|Dev Only| G[🐍 Python AI Service Local]
style A fill:#667eea
style B fill:#48bb78
style C fill:#ed8936
style D fill:#38b2ac
style E fill:#9f7aea
style F fill:#f56565
style G fill:#ffd700
- Usuario juega en el frontend (Three.js 3D)
- Frontend genera código HMAC con resultados
- Backend valida el código HMAC
- Si es válido, guarda en Supabase
- Leaderboard actualiza en tiempo real
- Chatbot procesa preguntas con Groq API (Llama 3.3 70B)
| Tecnología | Versión | Propósito |
|---|---|---|
| ⚛️ Next.js | 16.0 | Framework React con App Router |
| 📘 TypeScript | 5.3 | Tipado estático |
| 🎨 Tailwind CSS | 3.4 | Estilos utility-first |
| 🎭 Framer Motion | 11.0 | Animaciones fluidas |
| 🎲 Three.js | 0.180 | Gráficos 3D WebGL |
| 🎯 React Three Fiber | 9.4 | React renderer para Three.js |
| 📦 Zustand | 4.5 | State management ligero |
| 📋 React Hook Form | 7.50 | Manejo de formularios |
| ✅ Zod | 3.22 | Validación de esquemas |
| 🎨 Lucide React | 0.330 | Iconos modernos |
| Tecnología | Versión | Propósito |
|---|---|---|
| 🔴 NestJS | 10.0 | Framework Node.js escalable |
| 📘 TypeScript | 5.1 | Tipado estático |
| 🗄️ Supabase | 2.39 | Base de datos PostgreSQL |
| 🔑 JWT | 10.2 | Autenticación con tokens |
| 🛡️ Passport | 0.7 | Estrategias de autenticación |
| 🔐 bcrypt | 5.1 | Hash de contraseñas |
| 🤖 Groq SDK | 0.10 | API para Llama 3.3 70B |
| ✅ class-validator | 0.14 | Validación de DTOs |
| 🔄 RxJS | 7.8 | Programación reactiva |
| Servicio | Estado | Propósito |
|---|---|---|
| 🚀 Groq API | ✅ Producción | Llama 3.3 70B para chatbot |
| 🐍 Python AI Service | 🛠️ Dev Opcional | Transformers local (Flask) |
- 🐘 PostgreSQL (via Supabase)
- 🔒 Row Level Security (RLS)
- ⚡ Realtime subscriptions
- 📈 Indexes optimizados
- 🔄 Migrations versionadas
- 🧪 Jest - Testing unitario
- 🎨 Prettier - Code formatting
- 🔍 ESLint - Linting
- 📝 PostCSS - CSS processing
Antes de comenzar, asegúrate de tener instalado:
- 📦 Node.js 18+ y npm/pnpm
- 🗄️ Cuenta en Supabase (gratis)
- 🔑 Cuenta en Groq para API key (gratis)
- 💻 Git para clonar el repositorio
- 🐍 Python 3.10+ (opcional, solo para desarrollo local con AI service)
git clone https://github.com/AnderssonProgramming/psoc-genericR-culturalC.git
cd psoc-genericR-culturalCcd back
# Instalar dependencias
npm install
# Crear archivo de variables de entorno
cp .env.example .envEdita back/.env con tus credenciales:
# Supabase Configuration
SUPABASE_URL=https://tu-proyecto.supabase.co
SUPABASE_ANON_KEY=tu-anon-key-aqui
SUPABASE_SERVICE_KEY=tu-service-key-aqui
# JWT Configuration
JWT_SECRET=genera-uno-con-openssl-rand-base64-32
# HMAC Secret (para verificar códigos del juego)
HMAC_SECRET=genera-otro-con-openssl-rand-base64-32
# Groq AI Configuration (REQUERIDO para chatbot)
GROQ_API_KEY=gsk_tu-api-key-aqui
# Python AI Service (OPCIONAL - Solo para desarrollo local)
USE_LOCAL_MODEL=false
PYTHON_AI_SERVICE_URL=http://localhost:5000
# Server Configuration
PORT=3001
FRONTEND_URL=http://localhost:3000
NODE_ENV=developmentGenerar secrets seguros:
# En Linux/Mac
openssl rand -base64 32
# En Windows PowerShell
[Convert]::ToBase64String((1..32 | ForEach-Object { Get-Random -Maximum 256 }))- Crea un proyecto en Supabase
- Ve a SQL Editor en el dashboard
- Ejecuta el contenido de
back/supabase/migrations/001_initial_schema.sql - Verifica que las tablas se hayan creado correctamente
cd ../front
# Instalar dependencias
npm install
# Crear archivo de variables de entorno
cp .env.local.example .env.localEdita front/.env.local:
# API Backend URL
NEXT_PUBLIC_API_URL=http://localhost:3001/api
# Supabase Configuration (mismas que el backend)
NEXT_PUBLIC_SUPABASE_URL=https://tu-proyecto.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=tu-anon-key-aquiTerminal 1 - Backend:
cd back
npm run start:dev✅ Backend corriendo en: http://localhost:3001/api
Terminal 2 - Frontend:
cd front
npm run dev✅ Frontend corriendo en: http://localhost:3000
- Abre tu navegador en
http://localhost:3000 - Regístrate como nuevo usuario
- Inicia sesión
- Prueba el juego en
/game - Interactúa con el chatbot (botón flotante)
- Revisa el leaderboard en
/leaderboard - Explora las secciones educativas en
/sections
- Registro/Login: Crea una cuenta o inicia sesión
- Jugar: Ve a
/gamey responde las 10 preguntas - Ver Resultados: Al finalizar, verás tu puntaje y estadísticas
- Ranking: Compite en el leaderboard global
- Chatbot: Pregunta sobre roles de género en cualquier página
- Secciones: Explora contenido educativo adicional
- Asignar Tareas: Pide a estudiantes completar el juego
- Monitorear Progreso: Revisa el leaderboard para ver participación
- Facilitar Discusiones: Usa el chatbot para responder preguntas
- Contenido Complementario: Utiliza las 8 secciones educativas
- Gamificación: Crea desafíos basados en los puntajes
psoc-genericR-culturalC/
│
├── 📁 front/ # Frontend Next.js
│ ├── 📁 app/ # App Router (Next.js 13+)
│ │ ├── page.tsx # 🏠 Landing page
│ │ ├── layout.tsx # Layout global
│ │ ├── globals.css # Estilos globales
│ │ ├── 📁 login/ # 🔐 Página de login
│ │ ├── 📁 register/ # ✍️ Página de registro
│ │ ├── 📁 game/ # 🎮 Juego interactivo
│ │ │ ├── QuizGameClient.tsx # Cliente del juego principal
│ │ │ ├── ThreeScene.tsx # Escena 3D con Three.js
│ │ │ ├── WelcomeScreen.tsx # Pantalla de bienvenida
│ │ │ ├── QuizCard.tsx # Tarjeta de pregunta
│ │ │ └── ResultsScreen.tsx # Pantalla de resultados
│ │ ├── 📁 leaderboard/ # 🏆 Ranking global
│ │ ├── 📁 chat/ # 💬 Página de chat
│ │ └── 📁 sections/ # 📚 Secciones educativas
│ ├── 📁 components/ # Componentes reutilizables
│ │ ├── NavBar.tsx # Barra de navegación
│ │ └── FloatingChatbot.tsx # Chatbot flotante
│ ├── 📁 lib/ # Utilidades y configuración
│ │ ├── api.ts # Cliente API (axios)
│ │ ├── supabase.ts # Cliente Supabase
│ │ ├── auth-context.tsx # Context de autenticación
│ │ ├── theme.ts # Configuración de tema
│ │ └── utils.ts # Helpers y utilidades
│ ├── 📁 public/ # Archivos estáticos
│ ├── package.json # Dependencias frontend
│ ├── tsconfig.json # Configuración TypeScript
│ ├── tailwind.config.ts # Configuración Tailwind
│ └── next.config.js # Configuración Next.js
│
├── 📁 back/ # Backend NestJS
│ ├── 📁 src/ # Código fuente
│ │ ├── main.ts # Entry point
│ │ ├── app.module.ts # Módulo raíz
│ │ ├── 📁 auth/ # 🔐 Módulo de autenticación
│ │ │ ├── auth.service.ts # Lógica de auth (JWT, bcrypt)
│ │ │ ├── auth.controller.ts # Endpoints /register, /login
│ │ │ ├── jwt.strategy.ts # Estrategia JWT Passport
│ │ │ ├── jwt-auth.guard.ts # Guard para rutas protegidas
│ │ │ └── 📁 dto/ # DTOs de autenticación
│ │ ├── 📁 quiz/ # 🎯 Módulo de quiz
│ │ │ ├── quiz.service.ts # Lógica del juego
│ │ │ └── quiz.controller.ts # Endpoints del quiz
│ │ ├── 📁 scores/ # 📊 Módulo de puntajes
│ │ │ ├── scores.service.ts # Verificación HMAC, guardado
│ │ │ ├── scores.controller.ts # POST /scores
│ │ │ └── 📁 dto/ # DTOs de scores
│ │ ├── 📁 leaderboard/ # 🏆 Módulo de ranking
│ │ │ ├── leaderboard.service.ts
│ │ │ └── leaderboard.controller.ts # GET /leaderboard
│ │ ├── 📁 chat/ # 💬 Módulo de chatbot
│ │ │ ├── chat.service.ts # Integración OpenAI
│ │ │ ├── chat.controller.ts # POST /chat
│ │ │ └── 📁 dto/ # DTOs de chat
│ │ ├── 📁 common/ # 🛠️ Servicios compartidos
│ │ │ └── hmac.service.ts # Verificación HMAC-SHA256
│ │ └── 📁 supabase/ # 🗄️ Módulo Supabase
│ │ └── supabase.module.ts # Cliente Supabase provider
│ ├── 📁 supabase/migrations/ # Migraciones SQL
│ │ └── 001_initial_schema.sql # Schema inicial
│ ├── 📁 migrations/ # Migraciones adicionales
│ │ └── 004_create_game_codes.sql
│ ├── package.json # Dependencias backend
│ ├── tsconfig.json # Configuración TypeScript
│ ├── nest-cli.json # Configuración NestJS CLI
│ └── jest.config.js # Configuración Jest
│
├── 📄 README.md # Este archivo
├── 📄 LICENSE # Licencia MIT
└── 📄 sections.txt # Contenido de secciones
| Método | Endpoint | Descripción | Auth |
|---|---|---|---|
POST |
/api/auth/register |
Registrar nuevo usuario | No |
POST |
/api/auth/login |
Iniciar sesión y obtener JWT | No |
GET |
/api/auth/profile |
Obtener perfil del usuario | Sí |
Ejemplo - Registro:
POST /api/auth/register
{
"username": "jugador123",
"email": "jugador@example.com",
"password": "password123"
}Respuesta:
{
"id": "uuid-here",
"username": "jugador123",
"email": "jugador@example.com",
"created_at": "2025-10-27T10:30:00Z"
}| Método | Endpoint | Descripción | Auth |
|---|---|---|---|
GET |
/api/quiz/questions |
Obtener preguntas del quiz | Sí |
POST |
/api/quiz/submit |
Enviar respuestas del quiz | Sí |
| Método | Endpoint | Descripción | Auth |
|---|---|---|---|
POST |
/api/scores |
Enviar y verificar código HMAC | Sí |
GET |
/api/scores/user/:userId |
Obtener puntajes de un usuario | Sí |
Ejemplo - Enviar Score:
POST /api/scores
{
"submission_code": "user123|850|28|30|1730024400|a3d8f9e2c1b0..."
}| Método | Endpoint | Descripción | Auth |
|---|---|---|---|
GET |
/api/leaderboard |
Top 50 jugadores | No |
GET |
/api/leaderboard/stats |
Estadísticas globales | No |
Respuesta Leaderboard:
[
{
"id": "uuid",
"username": "jugador123",
"score": 950,
"correct_answers": 29,
"total_questions": 30,
"submitted_at": "2025-10-27T10:30:00Z"
}
]| Método | Endpoint | Descripción | Auth |
|---|---|---|---|
POST |
/api/chat |
Enviar mensaje al chatbot AI | Sí |
GET |
/api/chat/history |
Obtener historial de chat | Sí |
Ejemplo - Chat:
POST /api/chat
{
"message": "¿Qué son los roles de género?"
}CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
username TEXT UNIQUE NOT NULL,
email TEXT UNIQUE NOT NULL,
password_hash TEXT NOT NULL,
avatar_url TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);CREATE TABLE scores (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
score INTEGER NOT NULL,
correct_answers INTEGER NOT NULL,
total_questions INTEGER NOT NULL,
completion_time_seconds INTEGER, -- ⏱️ Tiempo de completado en segundos (nuevo)
submission_code TEXT UNIQUE NOT NULL,
verified BOOLEAN DEFAULT FALSE,
submitted_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);CREATE TABLE game_codes (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
code TEXT UNIQUE NOT NULL,
user_id UUID REFERENCES users(id),
username TEXT NOT NULL,
score INTEGER NOT NULL,
correct_answers INTEGER NOT NULL,
total_questions INTEGER NOT NULL,
completion_time INTEGER, -- ⏱️ Tiempo de completado en segundos (nuevo)
hmac TEXT NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
expires_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() + INTERVAL '24 hours'
);CREATE TABLE chat_sessions (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
messages JSONB DEFAULT '[]'::jsonb,
started_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);CREATE TABLE analytics_events (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
event_type TEXT NOT NULL,
metadata JSONB DEFAULT '{}'::jsonb,
timestamp TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);CREATE INDEX idx_scores_user_id ON scores(user_id);
CREATE INDEX idx_scores_score ON scores(score DESC);
CREATE INDEX idx_scores_completion_time ON scores(completion_time_seconds); -- ⏱️ Índice para ordenamiento por tiempo
CREATE INDEX idx_scores_verified ON scores(verified);
CREATE INDEX idx_chat_sessions_user_id ON chat_sessions(user_id);
CREATE INDEX idx_analytics_event_type ON analytics_events(event_type);
CREATE INDEX idx_game_codes_code ON game_codes(code);
CREATE INDEX idx_game_codes_expires ON game_codes(expires_at);-- Usuarios pueden leer su propia información
CREATE POLICY "Users can read own data" ON users
FOR SELECT USING (auth.uid() = id);
-- Todos pueden leer scores verificados (leaderboard)
CREATE POLICY "Anyone can read verified scores" ON scores
FOR SELECT USING (verified = true);
-- Usuarios solo pueden insertar sus propios scores
CREATE POLICY "Users can insert own scores" ON scores
FOR INSERT WITH CHECK (auth.uid() = user_id);Algoritmo de Verificación:
-
Frontend genera código:
username|score|correct|total|timestamp|hmac_hash -
Backend verifica:
const payload = `${username}|${score}|${correct}|${total}|${timestamp}`; const expectedHash = crypto .createHmac('sha256', HMAC_SECRET) .update(payload) .digest('hex'); if (hash !== expectedHash) throw new Error('Invalid code');
-
Validaciones adicionales:
- ✅ Timestamp no mayor a 7 días
- ✅ Código único (no usado previamente)
- ✅ Usuario autenticado válido
- 🔑 Tokens firmados con HS256
- ⏰ Expiración: 7 días
- 🛡️ Refresh tokens: Para sesiones largas
- 🔒 Guards: Protección de rutas sensibles
// Registro
const salt = await bcrypt.genSalt(10);
const passwordHash = await bcrypt.hash(password, salt);
// Login
const isMatch = await bcrypt.compare(password, user.password_hash);app.enableCors({
origin: process.env.FRONTEND_URL || 'http://localhost:3000',
credentials: true,
});cd back
# Ejecutar todos los tests
npm run test
# Tests con watch mode
npm run test:watch
# Cobertura de tests
npm run test:cov
# E2E tests
npm run test:e2ecd front
# Unit tests con Jest
npm run test
# Tests con watch mode
npm run test:watch
# E2E tests con Playwright
npm run test:e2e┌─────────────────────────────────────────────────────┐
│ 🌐 USUARIOS FINALES │
└────────────────┬────────────────────────────────────┘
│
┌────────────▼────────────┐
│ Vercel CDN │ ← Frontend (Next.js)
│ psoc-generic-r... │ Optimizado con SSR
└────────────┬────────────┘
│
┌────────────▼────────────────────────┐
│ Azure Web App (Principal) │ ← Backend NestJS
│ sorokina-c2end0bphkc... │ Region: Canada Central
└────────────┬────────────────────────┘
│
├─────► 🗄️ Supabase PostgreSQL (Cloud)
├─────► 🤖 Groq API (Llama 3.3 70B)
└─────► 🐍 Python AI Service (Railway - Opcional)
┌────────────────────────┐
│ Railway (Respaldo) │ ← Backend alternativo
│ 🟡 Inactivo │ (Se puede activar)
└────────────────────────┘
Configuración automática:
- Push a GitHub → Deploy automático
- Variables de entorno configuradas
- Optimización automática con Next.js
Variables de Entorno (Vercel):
NEXT_PUBLIC_API_URL=https://sorokina-c2end0bphkcaf4ab.canadacentral-01.azurewebsites.net/api
NEXT_PUBLIC_SUPABASE_URL=https://bxbwhdbfxfcyukitwsnq.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=tu-anon-keyConfiguración:
- Plataforma: Azure App Service
- Stack: Node.js 18 LTS
- Region: Canada Central
- Plan: B1 (Basic)
- Deploy: GitHub Actions (CI/CD automático)
Variables de Entorno (Azure):
SUPABASE_URL=https://bxbwhdbfxfcyukitwsnq.supabase.co
SUPABASE_KEY=tu-service-role-key
GROQ_API_KEY=tu-groq-api-key
JWT_SECRET=tu-jwt-secret
FRONTEND_URL=https://psoc-generic-r-cultural-c.vercel.app
HMAC_SECRET=tu-hmac-secretHealth Check:
curl https://sorokina-c2end0bphkcaf4ab.canadacentral-01.azurewebsites.net/apiEstado: 🟡 Inactivo pero funcional
- Configurado como respaldo del backend
- Puede activarse en cualquier momento
- Mismas variables de entorno que Azure
- URL:
https://psoc-genericr-culturalc-production.up.railway.app/api
- PostgreSQL 15 en la nube
- Backup automático diario
- SSL/TLS encryption
- Row Level Security (RLS) habilitado
- Modelo: Llama 3.3 70B Versatile
- Tier: Free (30 req/min)
- Latencia: ~200-500ms
- Respaldo: Python AI Service en Railway
1. Crear Web App:
az webapp create \
--resource-group GenderQuest \
--plan GenderQuestPlan \
--name sorokina \
--runtime "NODE|18-lts"2. Configurar variables de entorno:
- Azure Portal → App Service → Configuration → Application settings
3. Configurar CI/CD:
- GitHub → Settings → Secrets → Add repository secrets
- Azure auto-genera el workflow en
.github/workflows/
1. Crear proyecto:
railway init2. Configurar variables:
railway variables set SUPABASE_URL=...
railway variables set GROQ_API_KEY=...3. Deploy:
railway upBackend Dockerfile: FROM node:18-alpine WORKDIR /app COPY back/package*.json ./ RUN npm install COPY back/ ./ RUN npm run build CMD ["npm", "run", "start:prod"]
```dockerfile
# Dockerfile (frontend)
FROM node:18-alpine
WORKDIR /app
COPY front/package*.json ./
RUN npm install
COPY front/ ./
RUN npm run build
CMD ["npm", "run", "start"]
Docker Compose:
version: '3.8'
services:
backend:
build:
context: .
dockerfile: Dockerfile.backend
ports:
- "3001:3001"
env_file:
- back/.env
frontend:
build:
context: .
dockerfile: Dockerfile.frontend
ports:
- "3000:3000"
env_file:
- front/.env.local
depends_on:
- backend¡Las contribuciones son bienvenidas! Este es un proyecto educativo de código abierto.
- Fork el repositorio
- Crea una rama para tu feature:
git checkout -b feature/nueva-funcionalidad
- Haz tus cambios y commitea:
git commit -m '✨ Agrega nueva funcionalidad' - Push a tu rama:
git push origin feature/nueva-funcionalidad
- Abre un Pull Request en GitHub
- ✅ Usa TypeScript para todo el código
- 📝 Agrega comentarios para lógica compleja
- 🧪 Incluye tests para nuevas features
- 🎨 Sigue las convenciones de Prettier y ESLint
- 📖 Actualiza la documentación si es necesario
Si encuentras un bug, por favor abre un issue con:
- 📝 Descripción del problema
- 🔄 Pasos para reproducir
- 💻 Entorno (OS, Node version, navegador)
- 📸 Screenshots si aplica
Este proyecto está licenciado bajo la Licencia MIT - ve el archivo LICENSE para más detalles.
MIT License
Copyright (c) 2025 Gender Quest
Se concede permiso, de forma gratuita, a cualquier persona que obtenga una copia
de este software y archivos de documentación asociados (el "Software"), para
utilizar el Software sin restricciones, incluyendo sin limitación los derechos
a usar, copiar, modificar, fusionar, publicar, distribuir, sublicenciar, y/o
vender copias del Software...
Proyecto desarrollado como parte de una iniciativa educativa sobre igualdad de género.
- 💻 Desarrollo: AnderssonProgramming
- 🎨 Diseño: Equipo Gender Quest
- 📚 Contenido Educativo: Basado en documental sobre roles de género
¿Necesitas ayuda? Aquí hay algunas opciones:
- 📖 Documentación: Lee los READMEs de backend y frontend
- 🐛 Issues: Reporta bugs o solicita features
- 💬 Discusiones: Únete a las discusiones
- 📧 Email: Contacta al equipo (especificar email)
P: ¿El juego funciona en móviles?
R: Sí, el frontend es totalmente responsive, pero para mejor experiencia 3D recomendamos desktop.
P: ¿Necesito pagar por el chatbot AI?
R: No, usamos Groq API con su tier gratuito que incluye Llama 3.3 70B. Solo necesitas crear una cuenta gratuita en console.groq.com y obtener tu API key.
P: ¿Puedo usar esto para mi clase?
R: ¡Absolutamente! El proyecto es open source y está diseñado para uso educativo.
- Sistema de autenticación JWT
- Juego 3D con Three.js
- Chatbot AI con GPT-4
- Leaderboard en tiempo real
- 8 secciones educativas
- Verificación HMAC de códigos
- Diseño responsive
- Tests E2E completos
- Dashboard de analíticas para educadores
- Exportación de datos (CSV/PDF)
- Integración con Unity WebGL para jugar en navegador
- Sistema de logros y badges
- Multi-idioma (i18n - Inglés, Francés, Portugués)
- Modo oscuro completo
- PWA para uso offline
- Sistema de notificaciones push
- Grupos y aulas virtuales
- Estadísticas avanzadas de progreso
- Integración con LMS (Moodle, Canvas)
Gender Quest - Jugando aprendemos igualdad 🎮✨
🏠 Inicio • 📖 Docs • 🐛 Issues • 💬 Discusiones
Hecho con ❤️ para la educación en igualdad de género