AI engineer · PhD, sensing and measurement · Barcelona
I make AI systems fast on real hardware, and I measure every change.
Nine years of optical sensing taught me to distrust a number I have not measured. I now apply that to local language models, AI agents and the engines underneath them.
800 nm pulsed laser→mirror→objective→sample→1270 nm emission→InGaAs spectrometer
Step inside
three projects
Each project, as an experience
An AI agent runs a physics experiment
Walk a 3D optics bench, replay the agent's 28 tool calls, and see the photophysics it got wrong.
Enter the lab → Case study · llama.cppA 3-second pause, taken apart
Eight measurements, one reverted change and one failed patch, down to a single line of C++.
Watch the diagnosis → PhD and postdocSinglet oxygen, from a mouse to a molecule
Zoom from an animal to a molecule, count 1270 nm photons one by one, and see the fibre lab of my thesis.
Start the zoom → jarvis-chess · newChess commentary that cannot make things up
Replay one of my games with Stockfish's verdicts and the facts it verified at each turning point.
Open the board →Signature piece
photonics-lab-mcp
An AI agent runs a physics experiment, inside limits it cannot override
An MCP server gives a local 35B model an optics bench. One question, no procedure: is the 1270 nm emission excited by one photon or two? The answer is hidden in the server. Below is the agent's real run, call by call.
Right twice. The control run uses a one-photon sample under the same 800 nm question, and the agent measured 1.003. It read the slope instead of reciting the textbook answer.
Wrong twice, too. Both closing explanations got the photophysics wrong: the sensitiser absorbs, and its triplet state passes the energy to oxygen. So the server owns safety and statistics, and a person owns interpretation.
Case study
llama.cpp · Vulkan
A 20x stall, found one measurement at a time
Every reply from my local assistant stalled for over a second. The cause: the CPU was reading model snapshots straight out of GPU memory it cannot cache. The animation runs at the measured speeds.
Same output word for word at temperature 0, before and after. The same fix had been merged upstream two weeks earlier (llama.cpp #30049), so this is an independent diagnosis, not a contribution.
The system
Odysseus-Jarvis
one laptop, 64 GB
A private assistant on one laptop, every path measured
Voice, an agent and a chat hub share one local model server, so one engine fix sped up every local path. Claude Code handles typed work.
- Observability
- Live latency dashboard and OpenTelemetry traces for every voice turn
- Evals
- 13 real tasks with deterministic scoring, used to pick settings from evidence
- Think harder
- A 284B model streamed from disk on demand, about 0.5 tokens per second
- Brain choice
- Code with Claude Code, or for free with OpenCode on the local model or free cloud models
The day job
AI engineering roles
What these roles do every day, and where I have done it
To show I can do the daily work, not just describe it, I ran one engagement end to end, from client brief to handover. The client is simulated; the code, evaluation and numbers are real.
Flagship · simulated engagementLabDesk: a support assistant that answers only from the docs
A lab-automation team asked for PyVISA answers they could trust. Brief, testable requirements, BM25 retrieval with checked citations, a refusal rule, a read-only power-meter tool, FastAPI service with telemetry, a 41-question eval run on a local model, ADRs and a handover runbook.
| Role | What they do daily | Where I have done it | Fit |
|---|---|---|---|
| AI engineer | Build retrieval and agent systems, wire models to tools, write evals, ship them as services | LabDesk; the local Jarvis stack; photonics-lab-mcp; jarvis-chess | Shown |
| Forward-deployed engineer | Sit with a customer, turn a messy problem into requirements, deploy on their infrastructure, hand it over | LabDesk, brief to handover, on on-premises hardware; customer-facing technical work at Sensofar | Shown |
| AI agent ops | Monitor agents in production: traces, latency, cost, failures, incident runbooks | Tracing and latency dashboard for Jarvis; LabDesk telemetry, metrics endpoint and runbook | Shown |
| AI requirements analyst | Translate business needs into testable requirements and acceptance metrics | LabDesk requirements, each with a target and how it is verified | Partly shown |
| Product engineer | Own a feature end to end, including the interface people use | This site; the in-browser chess analysis board with Stockfish | Partly shown |
| Experience design | User research, interaction design, usability testing | No formal user research yet | Gap |
Engineering log
October 2026
Every change, measured, including the ones I rejected
| Date | Change | Measured result | Decision |
|---|---|---|---|
| 20 Oct | LabDesk docs assistant, 41-question eval on a local model | 31/33 correct, 6/6 refusals, p95 5.6 s; 2 real failures left untuned | Shipped |
| 20 Oct | Instrument-control MCP server, agent runs an experiment | Hidden answer found in both runs; closing physics wrong both times | Kept |
| 20 Oct | Agent code tool moved into a Docker sandbox | Code task 7.9 s instead of blocked; host writes fail inside | Kept |
| 20 Oct | Tracing, latency dashboard, evals in Inspect AI | 13/13 tasks in 45 s; one trace per voice turn | Kept |
| 20 Oct | A 284B model streamed from disk as a "think harder" mode | Correct on a reasoning test, 0.4 to 0.6 tokens/s on CPU | On demand |
| 20 Oct | Context compression proxy in front of the model | 0 tokens saved on real tool outputs, three test designs | Rejected |
| 20 Oct | Snapshot read fix in the Vulkan backend | 0.61 s to 0.03 s, identical output | Kept |
| 20 Oct | Snapshots turned off entirely | Voice 0.5 s, but agent turns 21 s | Reverted |
| 20 Oct | Agent prompt trimmed by usage data | 13,718 to 11,560 tokens, tools still work | Kept |
About
From measuring light to measuring models
- 2024 to nowKey Account Manager and Product Specialist, Sensofar. Optical metrology for semiconductors, medical devices and aerospace. Built an internal LLM assistant for product knowledge.
- 2022 to 2024Postdoctoral Researcher, IQS, Universitat Ramon Llull. Biomedical photonics and sensing; EU project Light4Lungs.
- 2017 to 2022PhD, Intelligent Sensing and Measurement, University of Edinburgh. Two-photon detection in hollow-core photonic crystal fibres.
- 2014 to 2017MSc Nanoscience, University of Copenhagen; MSc Engineering, University of Glasgow.
Now: an eight-week C++ and GPU systems lab, an official llama.cpp build with the upstream fix, and the instrument server on real hardware.
Contact
Open to AI engineering roles
Applied AI, LLM systems, inference performance and evaluation. Based in Barcelona; Spanish and English.