Disponible para posiciones full-time

Escribo software que ya está en producción

Desarrollador Full Stack · Java / Spring Boot · Angular · Córdoba, Argentina

Todavía no trabajé en relación de dependencia. Sí construí y opero una plataforma real: VientoSur, un job board con ATS y matching por IA que cofundé y del que escribí la totalidad del código — arquitectura, backend, frontend, infraestructura y despliegue.

Java 21 Spring Boot 3.2 Angular 22 · SSR PostgreSQL 17 Docker LLMs aplicados
VientoSur
Cofundador y único desarrollador · 2025 – hoy

Plataforma de empleo y ATS con IA para la Patagonia argentina. En línea y operativa, no una maqueta.

276endpoints REST
79entidades JPA
79componentes Angular
3.600+tests automatizados
Ver la plataforma
Sobre mí

De Río Gallegos a construir software con IA

Técnico Universitario en Programación por la UTN, hoy especializándome en Ciencia de Datos e Inteligencia Artificial.

Soy Luca, desarrollador full stack. Nací en Río Gallegos, Santa Cruz, y vivo en Córdoba. Terminé la Tecnicatura Universitaria en Programación en la UTN y curso la Tecnicatura Superior en Ciencia de Datos e Inteligencia Artificial en el Instituto Politécnico Superior de Córdoba.

Durante la carrera combiné backend en Java/Spring Boot con frontend en Angular, y en paralelo cofundé VientoSur junto a dos socios: un proyecto autofinanciado que empezó como trabajo final de tesis y hoy está en producción. El código lo escribí íntegramente yo — diseñé la arquitectura, implementé backend y frontend, armé la infraestructura de despliegue e integré los servicios de IA.

Esa es la parte que más me interesa contar: no es una demo que corre en mi máquina. Es un sistema que se despliega, se rompe, se arregla y se documenta. Busco una posición full-time donde aportar esa experiencia end-to-end y aprender de un equipo con más trayectoria que yo.

Español
Nativo
Inglés
B2 — Cambridge PET, Pass with Distinction
2026 — hoy Formación
Diplomatura en Ciberseguridad
Córdoba Crea Futuro · beca del Gobierno de la Provincia · en curso
2025 — hoy Proyecto
VientoSur — cofundador y único desarrollador
Proyecto autofinanciado, en producción
2025 — 2027 Formación
Tecnicatura en Ciencia de Datos e IA
Instituto Politécnico Superior de Córdoba · en curso
2024 Proyecto
Sistema de Gestión de Consorcios
Trabajo Práctico Integrador, UTN — módulo de expensas y pagos
2024 Certificación
Machine Learning / Data Science con Python
Udemy · Santiago Hernández
2023 — 2025 Formación
Técnico Universitario en Programación
UTN Facultad Regional Córdoba · finalizado
2020 — 2022 Formación
Ingeniería en Computación
Universidad Nacional de Córdoba · incompleta
Habilidades técnicas

Lo que uso, en un sistema que corre

Todo lo de esta lista está puesto en VientoSur o en el proyecto de la UTN. No hay tecnologías de CV acá.

Backend
Java 21Spring Boot Spring Security · JWTSpring Data JPA HibernateAPIs REST Node.jsMaven
Frontend
AngularTypeScript RxJSSSR SCSSBootstrap JavaScript
Datos e IA
PostgreSQLDiseño de esquemas SQLpgvector Integración de LLMsParsing de documentos Python
Infraestructura
DockerDocker Compose NginxAWS S3 CoolifyGit · GitHub
Testing y calidad
JUnitMockito Jasmine / KarmaProperty-based testing jqwikfast-check OWASP Dependency-Check
Método
Scrum / AgileDesarrollo guiado por specs TDD en bugfixesRegistro de deuda técnica Documentación verificada
Proyecto insignia

VientoSur — reclutamiento con matching por IA

Job board + ATS para la Patagonia argentina. Cofundador, y el único que escribió código.

Contexto honesto: VientoSur es un proyecto propio, cofundado con dos socios y autofinanciado — no lo estoy vendiendo acá. Lo muestro porque es la evidencia más completa de lo que puedo construir en un sistema real: tiene usuarios, tiene despliegue, tiene incidentes resueltos y tiene deuda técnica registrada. Las cifras de abajo salen de un inventario que se genera del código, no de memoria. Última verificación: 11/09/2026.

276Endpoints REST en 50 controllers
79Entidades en el modelo de datos
92Servicios en el backend
79Componentes standalone en el frontend
3.600+Tests automatizados, suite en verde
4Roles con control de acceso

Motor de afinidad en dos etapas

Un heurístico con pesos por señal (área, tecnologías, modalidad, jornada, ubicación, salario) puntúa todas las ofertas sin costo de IA; sólo las mejores llegan al LLM, que emite el score final leyendo perfil y oferta como texto. El mismo heurístico es el fallback cuando el LLM no está disponible.

Heurístico + chat LLM

Entrevista de screening con IA, por voz

Screening de pre-selección en dos modos: cuestionario escrito por oferta, o entrevista en vivo por WebRTC contra Gemini Live, con token efímero acuñado en el backend y el guion viajando completo en la instrucción de sistema. Si la clave de Google no está, degrada al modo escrito en vez de romperse.

WebRTC · Gemini Live

ATS con pipeline Kanban

El pipeline de selección completo: etapas y sub-estados configurables, movimiento por arrastre, acciones masivas y plantillas por industria para que una empresa no arranque con un tablero vacío.

ATS / Kanban

Parseo automático de CV

Extracción de experiencia, formación, tecnologías e idiomas desde el PDF con PDFBox, Tika e iText, para completar el perfil sin formularios eternos — que es exactamente el punto de fricción donde se cae la mitad de los registros.

PDF a perfil estructurado

Chatbot diferenciado por rol

Subsistema con patrón estrategia: un clasificador de intención enruta cada mensaje a un handler propio por rol, cada uno con su preámbulo y su base de conocimiento, para que el contexto de una empresa no se filtre a un postulante.

Patrón estrategia · intent routing

Entrevistas, chat y notificaciones

Agendado desde el pipeline con sincronización a Google Calendar (OAuth2) y recordatorios por email, más mensajería directa empresa–candidato con adjuntos y polling adaptativo: más frecuente con la ventana abierta, más espaciado en reposo.

Google Calendar API
Búsqueda: Técnico Electromecánico · Área: Búsqueda Así se ve una contratación adentro de VientoSur
Publicadahoy
Técnico Electromecánico
Austral Servicios Industriales
PresencialFull-time
Publicada en el portal
En revisión2
Diego Ramírez
Mantenimiento industrial
88% hace 2 h
Sofía Molina
Técnica electricista
61% hace 5 h
Entrevista1
Julián Torres
Técnico electromecánico
92% ayer
Jueves 10:30, sincronizada
Oferta1
Valentina Cruz
Supervisora de planta
95% hace 3 d
Puesto cubierto
Backend
  • Java 21 + Spring Boot 3.2.4
  • Spring Security — JWT stateless (access + refresh)
  • PostgreSQL 17 — 79 entidades JPA, 71 repositorios
  • Cohere (chat LLM) · Gemini (voz y transcripción)
  • Rate limiting con Bucket4j
  • Apache PDFBox · Tika · iText
  • OWASP Dependency-Check integrado al build
Frontend
  • Angular 22 — 79 componentes standalone
  • TypeScript · lazy loading por ruta
  • SSR sobre Node en las rutas públicas
  • Sistema de diseño propio en SCSS
  • RxJS · Bootstrap 5
  • Sincronización con Google Calendar
Infraestructura
  • Docker Compose — base, backend y frontend
  • Desplegado sobre Coolify
  • Nginx en el borde, Node renderizando detrás
  • Almacenamiento de archivos en AWS S3
  • Variables de entorno por ambiente
Demo en vivo

El motor de matching, corriendo en tu navegador

Armá un perfil y una oferta, y mirá el score de afinidad recalcularse señal por señal.

No es una captura ni un video: es una reimplementación en JavaScript del heurístico real de SuggestionService.java, con los mismos pesos por señal que corren en producción. En la plataforma esta capa hace dos trabajos — puntúa y ordena todas las ofertas activas antes de gastar una sola llamada al LLM, y es el fallback completo cuando Cohere no está disponible. Sobre las mejores candidatas, el chat de Cohere emite el score final.

Perfil del candidato
Oferta laboral
Score de afinidad
0 / 110 pts
Desafíos y decisiones

Problemas reales que tuve que resolver

Las decisiones técnicas que más me costaron — incluida una que estuvo mal tres despliegues seguidos.

Matching con contexto, sin quemar el presupuesto de IA

Problema

Las plataformas tradicionales buscan por palabras exactas y pierden contexto: «desarrollador» y «software engineer» son el mismo rol y nunca matchean. Pero mandar cada par candidato/oferta a un LLM no escala — el costo crece con el producto de las dos listas.

Solución

Partí el problema en dos etapas. Un heurístico determinista y sin costo puntúa todas las ofertas activas por siete señales y las ordena. Recién sobre las mejores el chat de Cohere lee perfil y oferta como texto, con un tope de 5 llamadas por request, y el resultado se cachea 15 días por par candidato/oferta.

Máx. 5 llamadas al LLM por request, con caché de 15 días

Tres despliegues rotos por el mismo error de diseño

Problema

En la entrevista de voz, el backend era dueño de la secuencia y le inyectaba al modelo una pregunta por turno. Tres despliegues seguidos rompieron igual: micrófono mudo, asistente que no hablaba, tres preguntas encimadas sobre una sola respuesta. La inyección corría una carrera contra el turno del modelo y contra la latencia de la transcripción.

Solución

Devolverle el guion al modelo: el set de preguntas con sus criterios viaja completo en la instrucción de sistema del token efímero, y el backend deja de competir por el turno. El aprendizaje que me llevé no es sobre WebRTC — es que cuando tres arreglos distintos fallan igual, el defecto no está en el arreglo.

Se eliminó la clase de bug, no cada instancia

Archivos con datos personales, accesibles sólo a quien corresponde

Problema

Los CVs, las fotos de perfil y los adjuntos de chat contienen datos personales. Una URL pública y permanente a un CV es una filtración esperando a que alguien la comparta.

Solución

Los archivos viven en S3 y en la base sólo queda la clave. Un controlador dedicado valida el rol de quien pide, emite una URL firmada de corta duración y redirige con un 302. Nada del bucket es accesible por sí solo.

S3 + URLs firmadas + control de acceso por rol

Un chatbot que no mezcla los roles

Problema

Postulantes, empresas y reclutadores necesitan comportamientos totalmente distintos — coaching de entrevistas contra analítica de reclutamiento — y el contexto de uno no puede filtrarse al otro. Un único prompt genérico alucinaba funcionalidades que no existen.

Solución

Patrón estrategia: un clasificador de intención enruta cada mensaje a un handler por rol, cada uno con su preámbulo, su presupuesto de tokens y una base de conocimiento propia sobre lo que la plataforma realmente hace.

Menos alucinaciones, límites duros entre roles
Cómo trabajo

El método importa tanto como el código

Trabajar solo en un sistema grande obliga a inventar los controles que en un equipo ya existen. Estos son los que me sirvieron.

01
Spec antes que código

Toda feature no trivial pasa por requisitos en notación EARS, diseño con contrato de API explícito y tareas atómicas antes de la primera línea. Los bugfixes van por TDD: primero el test que reproduce el bug.

02
La documentación se verifica, no se cree

El inventario del proyecto lo genera un script del código y hay un --check que avisa cuando quedó viejo. Aprendí a desconfiar después de encontrar que a la documentación le faltaba un tercio del backend.

03
La deuda se anota, no se olvida

Lo que encuentro y no corresponde arreglar ahí queda registrado con su ubicación y su costo. Un TODO sin dueño es una nota que nadie va a leer.

04
Terminado significa suite en verde

No «con los mismos fallos que antes»: en verde, con la build pasando. Más de 3.600 tests entre backend y frontend, incluyendo property-based testing con jqwik y fast-check para las reglas que no alcanza a cubrir un caso de ejemplo.

Otro proyecto

Sistema de Gestión de Consorcios

Trabajo Práctico Integrador · UTN Facultad Regional Córdoba · 2024

Módulo de gestión de expensas y pagos

En equipo, metodología Scrum con sprints de 15 días

Implementé el módulo de gestión de gastos: facturación, procesamiento de pagos con integraciones a Stripe y MercadoPago (API y webhooks) y generación de recibos en PDF. Fue mi primera experiencia trabajando contra APIs de terceros con dinero real de por medio, y donde aprendí que un webhook sin idempotencia es un cobro duplicado esperando su turno.

Java 17Spring BootNode.js AngularTypeScriptDocker Stripe APIMercadoPago API
Buscando mi primera posición full-time

¿Me sumo a tu equipo?

Busco un rol donde aportar lo que ya construí de punta a punta y aprender de gente con más recorrido. Full-time, en Córdoba —presencial o híbrido— o remoto.

Córdoba, Argentina · lucazuninod@gmail.com · +54 2966 331057