Estudiante de Ingeniería de software con experiencia en desarrollo backend. Me interesa construir aplicaciones web robustas, automatizar despliegues y seguir aprendiendo nuevas tecnologías.
Busco seguir creciendo profesionalmente en un equipo donde pueda aportar con mis conocimientos y aprender de otros.
Portafolio de proyectos personales y profesionales
Sistema de seguimiento de tiempo y tareas integrado con la API de OpenProject, con arquitectura hexagonal
(Ports & Adapters) en 4 capas (Domain, Application, Infrastructure, Web).
Rol principal: diseño y desarrollo de un asistente conversacional (bot) que gestiona tareas por lenguaje natural,
integrando un LLM (Groq) con tool calling nativo para crear, iniciar, pausar y finalizar tareas directamente
contra la API de OpenProject.
Contexto conversacional persistido en Redis con manejo resiliente de fallos, y módulo de generación de reportes
en Excel con historial de horas trabajadas por tarea y día.
Plataforma SaaS multi-barbería (multi-tenant con esquema compartido y tenant_id) para gestión de turnos:
landing pública por barbería (/{slug}), reserva en línea con horario real, cancelación por enlace y panel
de administración. Backend y frontend se empaquetan en un único jar desplegado con Docker.
Rol principal: diseño y desarrollo del aislamiento entre barberías (filtro de tenant por sesión o slug, guardas por
entidad y migraciones versionadas con Flyway) y de la parametrización de contenido por cliente: perfil, textos,
galería de fotos, color del tema, horario semanal con días cerrados y alta de barberías nuevas.
Autenticación dual (JWT propio y OIDC con Keycloak) con sesiones opacas en Redis, almacenamiento de imágenes detrás
de un puerto con adaptadores local y S3/MinIO, y notificaciones por WhatsApp (n8n + Evolution). Pruebas unitarias
con JUnit y Mockito, y pipeline CI/CD con despliegue automático por SSH a un VPS.
Rediseño UX del panel guiado por heurísticas de Nielsen (separación por pestañas, accesibilidad con
aria-live, mensajes de error accionables).
Migración a web de una aplicación de finanzas personales de escritorio (WinForms): API REST con minimal API
en capas (Services y Repository con ADO.NET sin ORM) y frontend en JavaScript con Bootstrap 5 y Chart.js,
desplegado en un homelab con Docker Compose (API + MySQL) y HTTPS vía Tailscale.
Rol principal: diseño y desarrollo de la API: periodos mensuales con ciclo de vida (cierre y reapertura),
ingresos y gastos, presupuestos por "sobres" con consumos y umbrales de bloqueo, y deudas en dos
direcciones (debo / me deben) con abonos y ampliaciones registrados de forma transaccional.
Aislamiento de datos por usuario en todas las consultas, autenticación con cookie de sesión HttpOnly, migración
transparente de hashes SHA-256 a BCrypt, segundo factor TOTP con código QR y login en dos pasos, y
migraciones SQL versionadas. Reglas de negocio verificadas con un self-check (--selftest).
AccesControl (PortalGuard)
Tecnologías: Java 25, Spring Boot 4, PostgreSQL, Flyway, Spring Session, Angular 20, PrimeNG, Docker, GitLab CI/CD
SaaS multi-tenant para el control de visitantes en urbanizaciones, donde el cliente es la empresa de seguridad.
Monolito modular por features (Spring Modulith, verificado con pruebas de arquitectura) con API REST documentada con
OpenAPI y errores en formato ProblemDetail (RFC 9457).
Rol principal: arquitectura y especificación del producto: ADRs y specs por fase, aislamiento entre empresas con
alcance explícito por empresa_id más Row-Level Security de PostgreSQL como segunda capa, y
migraciones con Flyway. Funciones como turnos de garita, carga masiva desde Excel, reportes y planificación por fechas.
Seguridad: sesiones con Spring Session JDBC y CSRF, 2FA con recuperación y recordar dispositivo, auditoría de
seguridad del MVP y verificaciones automáticas de despliegue. Actualizaciones en tiempo real a la garita con
Server-Sent Events.
Pruebas con JUnit 5, Testcontainers (PostgreSQL real) y pruebas de integración bajo RLS. Despliegue en un VPS con
Caddy como proxy, Docker Compose y pipeline CI/CD en GitLab.