<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Michał Jonik</title><description>Notes on enterprise integration, deployment automation and running AI agents safely.</description><link>https://michaljonik.com/</link><item><title>My own photos overruled the benchmark</title><link>https://michaljonik.com/posts/sightline-my-photos-overruled-the-benchmark/</link><guid isPermaLink="true">https://michaljonik.com/posts/sightline-my-photos-overruled-the-benchmark/</guid><description>I built semantic photo search for our 200,000 family photos in Nextcloud. Published benchmarks and an AI research report picked one model. Four hundred of our own photos, judged blind on the home server, picked the other.</description><pubDate>Sun, 25 Oct 2026 00:00:00 GMT</pubDate></item><item><title>A shopping list for a catamaran: start from what people refuse to do</title><link>https://michaljonik.com/posts/shopping-list-for-a-catamaran/</link><guid isPermaLink="true">https://michaljonik.com/posts/shopping-list-for-a-catamaran/</guid><description>Friends on a boat needed one shared shopping list with no accounts. What that requirement decided, what I left out on purpose, and what changes when an AI agent deploys through MCP.</description><pubDate>Sat, 12 Sep 2026 00:00:00 GMT</pubDate></item><item><title>The path is /mcp, or the connector goes silent</title><link>https://michaljonik.com/posts/mcp-path-or-silence/</link><guid isPermaLink="true">https://michaljonik.com/posts/mcp-path-or-silence/</guid><description>My MCP server passed OAuth with two AI clients and then heard nothing from them. Five wrong theories, the measurements that ruled them out, and the one-line fix.</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate></item><item><title>Ten browser tabs and one head: my homelab in August 2026</title><link>https://michaljonik.com/posts/where-my-homelab-started/</link><guid isPermaLink="true">https://michaljonik.com/posts/where-my-homelab-started/</guid><description>My homelab as it stood in August 2026: a house full of services and devices, every setting stored in a web UI or in my memory, and the dependencies I had never written down.</description><pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate></item><item><title>A thermostat is not a safety system</title><link>https://michaljonik.com/posts/heater-safety-layers/</link><guid isPermaLink="true">https://michaljonik.com/posts/heater-safety-layers/</guid><description>My ESPHome sauna controller held its temperature for a year and had one safety setting. What the thermostat does not cover, and the three layers that do.</description><pubDate>Sat, 25 Jul 2026 00:00:00 GMT</pubDate></item><item><title>One button, nine states: a gate that cannot tell you what it is doing</title><link>https://michaljonik.com/posts/gate-state-machine/</link><guid isPermaLink="true">https://michaljonik.com/posts/gate-state-machine/</guid><description>My entrance gate has one button and reports nothing. An ESP32 rebuilds its state from two limit switches and a photocell, and refuses to act when it does not know.</description><pubDate>Sat, 11 Jul 2026 00:00:00 GMT</pubDate></item><item><title>A magnetometer water meter: the hard part is keeping the count</title><link>https://michaljonik.com/posts/water-meter-magnetometer/</link><guid isPermaLink="true">https://michaljonik.com/posts/water-meter-magnetometer/</guid><description>A few-dollar magnetometer taped to a water meter and a dozen lines of ESPHome YAML count every litre. The hard part is a counter that survives reboots, corrections and a security migration.</description><pubDate>Sat, 27 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Firmware-as-Config: devices you declare instead of program</title><link>https://michaljonik.com/posts/esphome-firmware-as-config/</link><guid isPermaLink="true">https://michaljonik.com/posts/esphome-firmware-as-config/</guid><description>ESPHome turns a short YAML file into firmware for a cheap ESP32 board. What follows when you declare a device instead of programming it, and where the declaration ends.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate></item></channel></rss>