Profile
The engineer behind the notebook.
I'm José Manuel, a firmware and software engineer based in Valencia, Spain, with an R&D background. I write firmware in C for industrial hardware and developer tooling in Go, and I maintain 29 public repositories of my own on GitHub (60 counting forks), which have collected 396 stars between them. Since May 2026 I have been looking for my next role in firmware, software or QA, on-site, remote or hybrid.
I came to engineering from acoustics and instrumentation — a degree in Telecommunication Engineering and a Master's in Acoustical Engineering, followed by four years of predoctoral research at the UPV (2019–2023) on ultrasound and acoustic metamaterials, before redirecting toward software. That period left 14 academic publications behind it: one journal article, eleven conference papers and two theses. I still gravitate to problems that sit where signal, system and software meet.
Between 2023 and 2026 I built industrial embedded firmware in C on STM32 and FreeRTOS for solar inverters and battery storage: low-level optimization, industrial communications (Modbus) and hardware test automation. The open-source half of the work is the measurable one: my two MCP servers have been pulled more than 7,500 times from Docker Hub, gitlab-mcp-server has published more than 50 versions to the official Model Context Protocol registry, and more than 15 of my papers, theses and software releases are archived with a DOI on Zenodo.
This site is my notebook: what I learn I write down, what I build I publish.

// EDITORIAL & CORRECTIONS
Everything published here comes from work actually done: commands run on real hardware and real servers, configuration quoted from systems that are running it, and, where a guide depends on a specific software version, that version stated in the article. Claims that are not mine to make — protocol behavior, cryptographic properties, vendor defaults — are checked against primary sources (RFCs, standards bodies, vendor documentation) and cited, and links are re-checked automatically in CI, except for a documented list of domains that reject automated checkers.
Each post carries an AI-assistance disclosure, so here is exactly what it means. AI tools help with drafting, structure, copy-editing and the Spanish translation. They do not decide what is true: every command, configuration snippet and measurement is executed and verified by me before it ships, and nothing is published straight from a model's output. The Spanish version is a translation of the same verified material, not a separately generated article.
If something here is wrong, tell me. A short email with the article and the problem is enough — no account, no form. Vulnerability reports have their own channel and PGP key in security.txt.
Corrections are made in the article itself rather than in a comment thread. The revision date shown on the page and in its structured data is not maintained by hand: it is computed at build time as the most recent of four things — when the article was published, any date I set on it deliberately, the last time I re-tested it against the software versions it names, and the last commit that changed its substance — so it cannot fall behind the text, including when the change is a small one. Mechanical changes — a formatting pass, a link attribute, a typo — leave the dates alone. The ones that predate this rule are listed by commit hash, each with the reason it qualifies, in the module that computes the date (src/utils/post-dates.ts); any later one declares itself in its own commit message. There is no per-article changelog; the record of what changed, and when, is the full edit history of this site, which is public in its repository.
mail jmrp io security.txt