Javier Palacio Urraca

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

Hi, I'mJavier

Ten years of Java and Spring Boot on systems that cannot go down: a public hospital's pharmacy, a government's document management, a provincial council's electronic procedures.

Vitoria-Gasteiz, Álava, Spain

About me

Systems that have to talk to others I cannot modify, and that show it when they fail.

Pharmacy management for a public hospital network present in 80% of Spain's hospitals. A smart-city platform deployed across more than fifteen city councils. The Basque Government's document management model, which has to integrate over SOAP. All of it taught me to care about tests and observability above anything fashionable: here a failure is not an error on a screen, it is a prescription that never reaches the patient who needs it.

Location
Vitoria-Gasteiz, Álava, Spain
Languages
Spanish Native · English B2

Education

  • 2015Higher Vocational Certificate in Web Application DevelopmentDiocesanas
  • 2015Higher Vocational Certificate in Multiplatform Application DevelopmentDiocesanas
  • 2011Java Specialist Technician (200 hours)CETIC
  • 2011Computer Systems and Network OperationDiocesanas

Certifications

  • Certificate of Completion: Claude Platform 101 — Anthropic
  • Claude Code: A complete guide for software developers
  • Building with AI Agents — Big School
  • UDA Analyst — Tecnalia

Technologies

The stack I work with daily, ordered by how much I actually use it.

Java Backend

  • JavaAdvanced
  • Java EEAdvanced
  • Spring BootAdvanced
  • Spring MVCAdvanced
  • HibernateAdvanced
  • Struts 2Intermediate

Data & Infrastructure

  • OracleAdvanced
  • PostgreSQLAdvanced
  • MySQLAdvanced
  • DockerAdvanced
  • OpenShiftAdvanced
  • JenkinsAdvanced

Frontend

  • ReactAdvanced
  • AngularIntermediate
  • TypeScriptAdvanced
  • HTML5Advanced
  • CSS3Advanced
  • SASSAdvanced

AI-Native & Delivery

  • MCPAdvanced
  • LLM / AgentesIntermediate
  • PythonAdvanced
  • Node.jsAdvanced
  • GrafanaIntermediate
  • GitHub ActionsIntermediate

Experience

Ten years in production, most of it in systems where the software must not fail.

  1. Senior Full Stack Developer

    Current

    Sandav·Jan 2025 — present

    • Hospital pharmacy management application for Glintt (Pressalud), present in 80% of Spanish public hospitals and across the hospital network in Spain, Portugal and the Canary Islands.
    • Used daily by pharmacy professionals across the whole network.
    • Java
    • Spring Boot
    • Spring Security
    • JPA
    • Hibernate
    • Oracle
    • PostgreSQL
    • React
    • Angular
  2. Full Stack Developer

    Eventool·Jun 2024 — Jan 2025

    • Development and maintenance of the company's own product: an event management platform.
    • Designed the data layer with Apollo / GraphQL (schema, resolvers and queries).
    • Java
    • GraphQL
    • Apollo
    • Next.js
    • React
    • MongoDB
    • JUnit
    • Storybook
  3. Software Engineer

    Altia·May 2022 — Jun 2024

    • Built Personas 360 from scratch, a management and support application for the Basque Employment Service (Lanbide).
    • Employment itinerary registration and tracking, guidance activities and programmes for priority groups, with role-restricted access.
    • Java
    • Spring Boot
    • Spring Security
    • Microservices
    • Netflix
    • Eureka
    • JWT
    • Oracle
    • React
    • Storybook
  4. Senior Java Developer

    Webdreams·Dec 2020 — May 2022

    • Backend for keySmartCity, a smart-city platform with more than 25 modules (citizen card, municipal procedures, mobility, circular consumption, security, notifications and waste).
    • Deployed across more than 15 city councils in Spain, Portugal and Andorra.
    • REST services, business logic and API documentation with Swagger. Docker containers and production monitoring. Mentoring junior developers.
    • Java
    • Spring Boot
    • Spring Security
    • JWT
    • Hibernate
    • MariaDB
    • Docker
    • Swagger
  5. Senior Java Developer

    AgmSoft Consulting·Sep 2018 — Nov 2020

    • Dokusi, the Basque Government's document management platform and model for the digitisation and homogeneous preservation of electronic records.
    • SREF interoperability services (SOAP exchanges) for secure exchange of structured and historical data between entities: message processing, validation and error handling.
    • Java
    • Spring Boot
    • JPA
    • Hibernate
    • Oracle
    • OpenShift
  6. Senior Java Developer

    Serikat·Jul 2017 — Sep 2018

    • T-gune, a corporate procedure manager and electronic administration tool for the Provincial Council of Álava, connected to its electronic headquarters.
    • Procedure workflows, e-form handling and business logic, in coordination with the Álava computing centre.
    • Java
    • Spring
    • Jenkins
    • JUnit
    • Scrum
  7. Junior Java Developer

    Altia Consultores·May 2016 — Jul 2017

    • Integration modules with Spring Boot, Spring MVC and Struts 2. Persistence with JPA/Hibernate and workflow development on Oracle 11g.
    • Maintenance of Lanbide's electronic processing system.
    • Java
    • Spring Boot
    • Spring MVC
    • Struts 2
    • JPA
    • Hibernate
    • Oracle

Projects

What I have built on my own, plus client work. Both are below, with the source open where there is any.

Garmin Coach MCP

A Python MCP server that feeds Garmin training, load, sleep and performance data to LLM agents. Over 120 MCP tools, a multi-user web panel with data isolation, a pytest suite, CI with GitHub Actions and Grafana metrics. Self-hosted with Docker Compose.

  • Python
  • MCP
  • Docker
  • Grafana
  • GitHub Actions

mercaListMcp

A Node.js MCP server for managing shopping lists through AI agents. Separated client and server, agent skill configuration and secure environment variables.

  • Node.js
  • MCP
  • JavaScript
  • AI Agents

Gasteiz Click

Cultural agenda for Vitoria-Gasteiz: over 263 weekly listings from 15 different sources, refreshed every few minutes. Installable PWA, Android app on Google Play, public API and RSS feed.

  • Next.js
  • React
  • TypeScript
  • PWA

David Lanaspa · Abogado

Site for David Lanaspa's practice, a criminal defence lawyer with offices in Tarragona and Huesca. Bilingual Spanish and Catalan with hreflang, built for local search in both cities, with a 24 h criminal emergency block.

  • WordPress
  • SEO local
  • ES/CA

Repositories

Everything open on my account, from the most recently touched to the oldest. The four above are the ones with a story behind them; here is the full list.

AI-Native

MCP servers

Two Model Context Protocol servers, one at each end: a remote, multi-user one in Python, and one inside the browser with WebMCP. Both self-hosted, both with their tests.

Server · Python · HTTP

Garmin Coach MCP

Connects a Garmin Connect account to the assistant and returns the day's analysis: HRV, training load, sleep, fatigue risk, pace zones and race predictions. 120+ MCP tools, deployed with Docker Compose.

  • Isolated multi-user: each runner has their own API key and Garmin credentials in their own folder. Nobody sees anyone else's session.
  • The coach's PDF becomes warm-up, intervals and cool-down stages ready for the watch, not loose text.
  • 16 test modules, including `hardening`, `locks` and `recovery`: what actually breaks when several users write at once.
See the repository

Client · Node + React · WebMCP

Mercalist

A shopping list with voice assistant and AI agent. The server is Express using Mercadona's official search plus its own catalogue; the agent lives in the browser on `navigator.modelContext`.

  • WebMCP in the browser: the agent never leaves the client, so the shopping list does not travel to any inference server.
  • Real warehouse assignment from the postcode —ten centres — with the catalogue built on demand and cached on disk per warehouse.
  • A virtual pantry with low-stock thresholds and purchase history, with frequently bought products boosted by recency.
See the repository

One idea, two topologies:

  • Garmin needs per-user state, credentials and concurrency: server, HTTP, Docker, folder isolation.
  • Mercalist needs the agent where the data already lives: browser, WebMCP, no round trip.

Engineering

How this site is built

This page is both the portfolio and its own case study. Next.js 15 with React 19, Tailwind v4, edge middleware, and a Playwright suite that fails if any of the below breaks.

  1. 01

    A section that could vanish

    Content faded in on an IntersectionObserver. If the observer never fired, the section stayed at opacity 0 permanently and the visitor saw a blank gap. No error, no console output: just empty space.

    I rewrote it with CSS animation-timeline. There is no observer to fail, so content cannot disappear, and it sits inside @supports so a browser without support shows the text anyway. No JS safety net needed.

    To verify it I disabled the protection on purpose: 3 of 6 tests failed, and not only in the artificial case but in ordinary navigation too. A test you have never seen fail is not a test.

  2. 02

    Half the site did not exist

    English lived behind a useState: one URL, <html lang> pinned to Spanish, and every English word living as a string inside the JS bundle. To a crawler the English version did not exist. Worse, the headline was typed letter by letter, so the prerendered HTML shipped a nearly empty <h1>.

    Language moved into the route: /es and /en prerender, each with its own canonical and hreflang pointing at the other. The name is whole in the DOM and the animation is CSS. The crawler gets the same text the visitor does.

    A bilingual site on one URL is not bilingual: it is monolingual with a switch. Language has to be in the URL for it to exist.

  3. 03

    165 kB of JavaScript to render text

    The whole page was a client component, so six static content sections were being hydrated. Framer-motion handled the entrance animation and a canvas sat behind it. All of that to display a CV.

    Sections became Server Components and framer-motion left the project. Scroll animation now runs on the compositor. The heaviest dependency was the one that was never needed: CSS already did the job.

    From 165 kB to 117 kB First Load JS, and from 62.6 to 14.7 kB for the page. Selling performance judgement while shipping 165 kB to render text was the site's biggest inconsistency.

  4. 04

    The middleware was never running

    The file sat in app/ instead of at the repo root. Next never looked there, so everything in it — rate limiting, bot blocking, host validation, CORS, the body size cap — was dead code. The build said nothing. One missing response header was the only clue.

    Moved to the root, where the compiler picks it up and the build reports it as Middleware. The security tests now assert the real headers, not the intention.

    A config file in the wrong folder raises no error: it gives false confidence. That is why there is a test that checks the build still reports the middleware.

The suite

104 Playwright tests against this very page. Not smoke tests: they check that the CSP is closed, that no secrets leak, that bot blocking responds, that both language versions are served with their canonical, and that content is never left invisible on scroll.

Interests

What I do when I'm not in front of a terminal.

Photography

Running

Mountain biking

Let's build something together?

Available for projects, collaboration, or new opportunities.

Email me directly

Send me a message

I'll get back to you shortly.