Javier Palacio Urraca

Desarrollador Full Stack Senior · Java / Spring Boot · AI-Native

Hola, soyJavier

Diez años en Java y Spring Boot sobre sistemas que no pueden caerse: la farmacia de un hospital público, la gestión documental de un gobierno, la tramitación electrónica de una diputación.

Vitoria-Gasteiz, Álava, España

Sobre mí

Sistemas que tienen que entenderse con otros que no puedo modificar, y que se notan si fallan.

La gestión de farmacia de un hospital público presente en el 80 % de los hospitales de España. Una plataforma de ciudad inteligente desplegada en más de quince ayuntamientos. El modelo de gestión documental del Gobierno Vasco, con el que hay que integrarse por SOAP. Todo eso me ha enseñado a cuidar los tests y la observabilidad por encima de la moda: aquí un fallo no es un error en una pantalla, es una receta que no llega a quien la necesita.

Ubicación
Vitoria-Gasteiz, Álava, España
Idiomas
Español Nativo · Inglés B2

Formación

  • 2015Técnico Superior en Desarrollo de Aplicaciones WebDiocesanas
  • 2015Técnico Superior en Desarrollo de Aplicaciones MultiplataformaDiocesanas
  • 2011Técnico Especialista en Java (200 horas)CETIC
  • 2011Explotación de Sistemas Informáticos y RedesDiocesanas

Certificaciones

  • Certificate of Completion: Claude Platform 101 — Anthropic
  • Claude Code: Guía completa para desarrolladores de software
  • Desarrollar con Agentes de IA — Big School
  • UDA Analista — Tecnalia

Tecnologías

El stack con el que trabajo a diario, ordenado por el nivel con el que lo uso.

Backend Java

  • JavaAvanzado
  • Java EEAvanzado
  • Spring BootAvanzado
  • Spring MVCAvanzado
  • HibernateAvanzado
  • Struts 2Intermedio

Datos e infraestructura

  • OracleAvanzado
  • PostgreSQLAvanzado
  • MySQLAvanzado
  • DockerAvanzado
  • OpenShiftAvanzado
  • JenkinsAvanzado

Frontend

  • ReactAvanzado
  • AngularIntermedio
  • TypeScriptAvanzado
  • HTML5Avanzado
  • CSS3Avanzado
  • SASSAvanzado

AI-Native y entrega

  • MCPAvanzado
  • LLM / AgentesIntermedio
  • PythonAvanzado
  • Node.jsAvanzado
  • GrafanaIntermedio
  • GitHub ActionsIntermedio

Experiencia

Diez años en producción, casi todos en sistemas donde el software no puede fallar.

  1. Desarrollador Full Stack Senior

    Actualidad

    Sandav·Enero 2025 — actualidad

    • Aplicación de gestión de farmacia hospitalaria para Glintt (Pressalud), presente en el 80% de los hospitales públicos españoles y en la red hospitalaria de España, Portugal y Canarias.
    • Uso diario por los profesionales de farmacia de toda la red.
    • Java
    • Spring Boot
    • Spring Security
    • JPA
    • Hibernate
    • Oracle
    • PostgreSQL
    • React
    • Angular
  2. Desarrollador Full Stack

    Eventool·Junio 2024 — enero 2025

    • Desarrollo y mantenimiento del producto propio de la empresa: una plataforma de gestión de eventos.
    • Diseño de la capa de datos con Apollo / GraphQL (esquema, resolvers y consultas).
    • Java
    • GraphQL
    • Apollo
    • Next.js
    • React
    • MongoDB
    • JUnit
    • Storybook
  3. Ingeniero de Software

    Altia·Mayo 2022 — junio 2024

    • Desarrollo desde cero de Personas 360, aplicación de gestión y soporte del Servicio Vasco de Empleo (Lanbide).
    • Registro y seguimiento de itinerarios de empleo, actividades de orientación y programas para colectivos de atención prioritaria, con acceso restringido por roles.
    • Java
    • Spring Boot
    • Spring Security
    • Microservices
    • Netflix
    • Eureka
    • JWT
    • Oracle
    • React
    • Storybook
  4. Programador Java Senior

    Webdreams·Diciembre 2020 — mayo 2022

    • Backend de keySmartCity, plataforma de ciudad inteligente con más de 25 módulos (tarjeta ciudadana, trámites municipales, movilidad, consumo circular, seguridad, notificaciones y residuos).
    • Desplegada en más de 15 ayuntamientos de España, Portugal y Andorra.
    • Servicios REST, lógica de negocio y documentación de API con Swagger. Contenedores Docker y monitorización en producción. Mentoring a júniors.
    • Java
    • Spring Boot
    • Spring Security
    • JWT
    • Hibernate
    • MariaDB
    • Docker
    • Swagger
  5. Programador Java Senior

    AgmSoft Consulting·Septiembre 2018 — noviembre 2020

    • Dokusi, plataforma y modelo de gestión documental del Gobierno Vasco para la digitalización y conservación homogénea de documentos electrónicos de la administración vasca.
    • Servicios de interoperabilidad SREF (intercambios SOAP) para el intercambio seguro de datos estructurados e históricos entre entidades: procesamiento de mensajes, validación y gestión de errores.
    • Java
    • Spring Boot
    • JPA
    • Hibernate
    • Oracle
    • OpenShift
  6. Programador Java Senior

    Serikat·Julio 2017 — septiembre 2018

    • T-gune, tramitador corporativo de expedientes y herramienta de administración electrónica de la Diputación Foral de Álava, conectada a su Sede Electrónica.
    • Procedimientos de tramitación, gestión de e-forms y lógica de negocio, en coordinación con el Centro de Cálculo de Álava.
    • Java
    • Spring
    • Jenkins
    • JUnit
    • Scrum
  7. Programador Java Junior

    Altia Consultores·Mayo 2016 — julio 2017

    • Módulos de integración con Spring Boot, Spring MVC y Struts 2. Persistencia con JPA/Hibernate y desarrollo de procedimientos y procesos en Oracle 11g.
    • Mantenimiento de la tramitación electrónica de Lanbide.
    • Java
    • Spring Boot
    • Spring MVC
    • Struts 2
    • JPA
    • Hibernate
    • Oracle

Proyectos

Lo que he construido por mi cuenta y los encargos de clientes. Los dos grupos salen de aquí abajo, con el código abierto cuando lo hay.

Garmin Coach MCP

Servidor MCP en Python que expone datos de entrenamiento, carga, sueño y rendimiento de Garmin a agentes LLM. Más de 120 herramientas MCP, panel web multiusuario con aislamiento de datos, suite de tests pytest, CI con GitHub Actions y métricas en Grafana. Autohospedado con Docker Compose.

  • Python
  • MCP
  • Docker
  • Grafana
  • GitHub Actions

mercaListMcp

Servidor MCP en Node.js para gestionar listas de la compra mediante agentes de IA. Cliente y servidor separados, configuración de skills de agente y variables de entorno seguras.

  • Node.js
  • MCP
  • JavaScript
  • AI Agents

Gasteiz Click

Agenda cultural de Vitoria-Gasteiz: más de 263 propuestas semanales desde 15 fuentes distintas, actualizadas cada pocos minutos. PWA instalable, app Android en Google Play, API pública y feed RSS.

  • Next.js
  • React
  • TypeScript
  • PWA

David Lanaspa · Abogado

Web del despacho de David Lanaspa, abogado penalista con oficinas en Tarragona y Huesca. Bilingüe en castellano y catalán con hreflang, pensada para la búsqueda local en ambas ciudades y con un bloque de emergencias penales 24 h.

  • WordPress
  • SEO local
  • ES/CA

Repositorios

Todo lo que está abierto en mi cuenta, del último que toqué al más antiguo. Los cuatro de arriba son los que tienen historia detrás; aquí abajo la lista completa.

AI-Native

Servidores MCP

Dos servidores Model Context Protocol, uno en cada extremo: uno remoto y multiusuario en Python, otro dentro del navegador con WebMCP. Los dos autohospedados, los dos con sus tests.

Servidor · Python · HTTP

Garmin Coach MCP

Conecta una cuenta de Garmin Connect con el asistente y devuelve el análisis del día: VFC, carga, sueño, riesgo de fatiga, zonas de ritmo y predicciones de carrera. 120+ herramientas MCP, desplegado con Docker Compose.

  • Multiusuario aislado: cada corredor tiene su API key y sus credenciales de Garmin en su propia carpeta. Nadie ve la sesión de otro.
  • El PDF del entrenador se convierte en etapas —calentamiento, series, enfriamiento— listas para el reloj, no en texto suelto.
  • 16 módulos de test, incluidos `hardening`, `locks` y `recovery`: lo que de verdad se rompe cuando hay varios usuarios escribiendo a la vez.
Ver el repositorio

Cliente · Node + React · WebMCP

Mercalist

Lista de la compra con asistente de voz y agente de IA. El servidor es Express con la búsqueda oficial de Mercadona y catálogo propio; el agente vive en el navegador con `navigator.modelContext`.

  • WebMCP del lado del navegador: el agente no sale del cliente, así que la lista de la compra no viaja a ningún servidor de inferencia.
  • Asignación real de almacén por código postal —diez centros— y catálogo bajo demanda, cacheado en disco por almacén.
  • Despensa virtual con umbrales de poco stock e historial, y los productos frecuentes salen por recencia.
Ver el repositorio

La misma idea, dos topologías:

  • Garmin necesita estado por usuario, credenciales y concurrencia: servidor, HTTP, Docker, aislamiento por carpeta.
  • Mercalist necesita que el agente esté donde ya están los datos: navegador, WebMCP, sin ida y vuelta.

Ingeniería

Cómo está construida esta web

Esta página es el portfolio y también su propio caso de estudio. Next.js 15 con React 19, Tailwind v4, middleware en el edge y una suite de Playwright que falla si algo de lo de abajo se rompe.

  1. 01

    Una sección que podía desaparecer

    El contenido entraba con un IntersectionObserver. Si el observador no disparaba, la sección se quedaba en opacidad 0 para siempre y el visitante veía un hueco en blanco. No había error, no había consola: solo un espacio vacío.

    Lo reescribí con animation-timeline de CSS. No hay observador que pueda fallar, así que el contenido no puede desaparecer; y va dentro de @supports, de modo que un navegador que no lo soporta muestra el texto igualmente. El coste es cero de red de seguridad.

    Para probarlo desactivé la protección a propósito: fallaron 3 de 6 tests, y no solo en el caso artificial sino también en navegación normal. Un test que no se ha visto fallar no es un test.

  2. 02

    La mitad de la web no existía

    El inglés estaba detrás de un useState: una sola URL, <html lang> fijo en español y cada palabra inglesa metida como string dentro del bundle de JS. Para un crawler la versión en inglés no existía. Peor: el nombre del titular se escribía letra a letra, así que el HTML prerenderizado llevaba un <h1> prácticamente vacío.

    El idioma pasó a la ruta: /es y /en prerenderizan, con canonical por idioma y hreflang cruzando las dos. El nombre va completo en el DOM y la animación es CSS. El crawler recibe el mismo texto que la persona.

    Una web bilingüe con una sola URL no es bilingüe: es monolingüe con un interruptor. El idioma tiene que estar en la URL para que exista.

  3. 03

    165 kB de JavaScript para pintar texto

    La página entera era un componente cliente, así que las seis secciones de contenido estático se hidrataban. Framer-motion aportaba la animación de entrada y un canvas iba por detrás. Todo eso para mostrar un CV.

    Las secciones pasaron a Server Components y framer-motion desapareció del proyecto. La animación de scroll la lleva el compositor. La dependencia que más pesa era la única que no hacía falta: CSS ya hacía el trabajo.

    De 165 kB a 117 kB de First Load JS y de 62,6 a 14,7 kB de página. Vender criterio de rendimiento cargando 165 kB para pintar texto era la incoherencia más grande del sitio.

  4. 04

    El middleware no se estaba ejecutando

    El archivo estaba en app/ en lugar de la raíz del repositorio. Next no lo buscaba ahí, así que todo lo que contenía —límite de peticiones, bloqueo de bots, validación de host, CORS, el tope de tamaño del cuerpo— era código muerto. El build no avisaba. Solo faltaba una cabecera en las respuestas para enterarse.

    Movido a la raíz, donde el compilador lo recoge y el build lo reporta como Middleware. Los tests de seguridad ahora comprueban las cabeceras de verdad, no la intencion.

    Un archivo de configuracion en la carpeta equivocada no da error: da falsa confianza. Por eso hay un test que mira si el build sigue reportando el middleware.

La suite

104 tests de Playwright contra esta misma página. No son tests de humo: comprueban que la CSP está cerrada, que no sefiltran secretos, que el bloqueo de bots responde, que las dos versiones de idioma se sirven con su canonical, y que el contenido nunca queda invisible al hacer scroll.

Aficiones

Lo que hago cuando no estoy delante de una terminal.

Fotografía

Running

BTT

¿Construimos algo juntos?

Disponible para proyectos, colaboración o nuevas oportunidades.

Escríbeme directamente

Envíame un mensaje

Te responderé en breve.