<ndg> </ndg>
nonsensedevelopmentgroup.com
Side projects · proceso · arquitectura
[ndg] el nombre es una broma; el código no.

Software end-to-end, como side project.

Con una larga trayectoria en el sector IT, los últimos años los he pasado más en planificaciones y reuniones de producto que en el editor. Nonsense Development Group es mi laboratorio personal: las apps que mantengo en paralelo a mi trabajo principal, disponibles para iOS y Android, con su propio backend e infraestructura. Algunas son medio absurdas a propósito — lo que hacen importa menos que cómo están hechas. Una sola persona, todas las capas.

01
Análisis
Definir el problema antes de tocar una línea de código.
02
Arquitectura
Modelar el dominio, los datos y la integración entre capas.
03
Desarrollo
Implementación completa: frontend, backend y despliegue.

Proyectos

Tres desarrollos activos. Cada uno aborda un dominio distinto y un patrón arquitectónico distinto.

VoBo · Vocabulario Borde
vobo.es ↗
// 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.
LoroParrot
loroparrot.com ↗
// 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.
CumuloNimbo
cumulonimbo ↗
// 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.

Contacto

¿Hablamos? Cuéntame brevemente la idea, el proyecto o la consulta. Respondo en uno o dos días.