// juego de palabras en español · estilo Pasapalabra
Juego de vocabulario en castellano: cada carta plantea una regla de letra
(empieza por, contiene o termina en) y el jugador
responde con palabras válidas. Validación tolerante (acentos, espacios, mayúsculas)
y modo multijugador en tiempo real. Ejercicio sobre arquitectura cliente-servidor con
comunicación bidireccional: API REST para datos y WebSocket para partidas.
Frontend
Vue 3
Ionic 8
Capacitor 8
TypeScript strict
Vite 5
vue-i18n
Vitest
Cypress
Backend
Go
PostgreSQL
Redis
REST + WebSocket
JWT passwordless
Infra
VPS
Nginx
systemd
App Store
APK directo
highlights
- Pipeline de normalización determinista: cada respuesta atraviesa la cadena
trim → collapse whitespace → lowercase → strip accents → strip puntuación. La Ñ se preserva como letra distinta del abecedario, no se normaliza a N. La integridad del mazo se valida en carga: regla, target_letter y valid_answers deben ser coherentes.
- Una jugada = trabajo coordinado en BBDD: cada respuesta dispara registro del intento, actualización agregada de estadísticas del jugador autenticado y — en multijugador — emisión del evento a la sala. Las stats se acumulan jugada a jugada: un cierre forzoso de la app no pierde progreso.
- Multijugador vía WebSocket: cada partida es una sala con canal bidireccional persistente. El servidor hace broadcasting de eventos (respuesta acertada, fallida u omitida, fin de turno) a todos los conectados. Redis sostiene presencia online y estado efímero de la sala; PostgreSQL guarda lo durable.
- Backend Go con binario único:
Gin + GORM + PostgreSQL + Redis + JWT HS256 passwordless. Compilación en local y scp al VPS, detrás de Nginx con systemd. Sin Docker en producción. Las goroutines son el modelo de concurrencia natural para sostener muchas partidas en paralelo.
// síntesis de voz · listas compartibles
App de repetición por voz: el usuario crea un "loro", una lista de textos que la app
reproduce con síntesis de voz. El modelo se articula en tres bloques
(Inicio + Loro + Cierre): un texto opcional precede a cada elemento y otro
lo cierra, generando combinaciones del tipo "Odio los Lunes por la mañana".
Ejercicio sobre compartición de recursos con control de privacidad, autenticación
passwordless por email y analítica de descargas.
Frontend
Vue 3
Capacitor 6
Vite 4
vue-i18n
axios
jose (JWT)
native-audio
Backend
FastAPI
Uvicorn
SQLAlchemy
PostgreSQL
PyJWT
Pydantic
SMTP / email
Infra
VPS
Nginx
App Store
Google Play
highlights
- TTS con abstracción dual por plataforma: web e iOS usan Web Speech API nativa (
SpeechSynthesisUtterance) con selección de voz del sistema; Android delega a un plugin Capacitor TTS nativo, porque dentro del WebView Android la API web falla. Misma interfaz speak(text, options) arriba, dos implementaciones distintas debajo.
- Multi-idioma a tres niveles independientes: la UI se traduce con vue-i18n (es/en), cada loro guarda su propio
language en la tabla groups, y el TTS filtra las voces del dispositivo por ese código. Un loro francés se lee con voz francesa aunque la UI esté en castellano.
- Compartición granular con tabla
shared_with: cada loro tiene visibilidad public | private. Los privados se comparten escribiendo emails concretos en una tabla indexada; no hace falta que el destinatario tenga cuenta. El primer login con ese email recupera los loros recibidos. Borrado del padre arrastra texts, shared_with y downloads por cascade delete.
- Backend FastAPI tipado de extremo a extremo:
FastAPI + SQLAlchemy + Pydantic + PostgreSQL + PyJWT. Auth passwordless con código de 6 dígitos por SMTP propio; cada verification_request tiene expires_at y is_used para evitar reuso. La tabla downloads registra cada descarga; el contador agregado download_count vive en groups para queries sin joins.
// acrónimos y términos más utilizados en cloud · AWS + Azure + GCP · 100% offline
App de estudio para certificaciones cloud en castellano que cubre los tres grandes proveedores
(AWS, Azure y Google Cloud). El glosario es la entidad de primer nivel — 548 términos
curados a mano — y el quiz es su capa de evaluación: 905+ preguntas
tipo examen, cada una enlaza al término que la explica. Ejercicio sobre arquitectura offline-first,
modelado multi-cloud con tabla de equivalencias entre servicios (S3 ↔ Blob Storage ↔ Cloud Storage),
y distribución dual en App Store y APK directo.
Frontend
Vue 3
Ionic 8
Capacitor 6
TypeScript
Pinia
Vite 5
Sass
vue-i18n
Datos
SQLite (bundled)
@capacitor-community/sqlite
sql.js
jeep-sqlite
UUID PKs
Aplicación sin conexión
Sin backend
Sin red
Sin telemetría
Sin tracking
highlights
- 5 certificaciones activas — AWS CLF-C02 · SAA-C03 · AIF-C01 · Azure AZ-900 · GCP ACE.
- 5 subtipos de pregunta: definición, acrónimos, casos de uso, diferenciación entre servicios y «entre nubes» (¿qué es S3 en Azure?).
- SQLite empaquetado en el binario: la base viaja con la app y se copia al almacenamiento del dispositivo en el primer arranque vía
copyFromAssets. Cero dependencia de red.
- Distribución dual: App Store para iOS, APK directo para Android. Sin tracking ni analítica de terceros.