<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <id>https://muench.dev/en/feed/atom</id>
    <title type="text">muench.dev Articles (English)</title>
    <subtitle type="text">Christian Münch’s English blog articles about DevOps, Linux, AI and Magento.</subtitle>
    <link xmlns="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="https://muench.dev/en/feed/atom"/>
    <updated>2026-10-07T22:04:15+02:00</updated>
    <generator uri="https://github.com/mitydigital/feedamic" version="3.0.13">Feedamic: the Atom and RSS Feed generator for Statamic</generator>
    <entry>
        <title type="text">magento.watch MCP: Query Magento and Adobe Commerce knowledge directly</title>
        <link href="https://muench.dev/en/post/2026-10-magentowatch-mcp-magento-und-adobe-commerce-wissen-direkt-abfragen"/>
        <id>https://muench.dev/en/post/2026-10-magentowatch-mcp-magento-und-adobe-commerce-wissen-direkt-abfragen</id>
        <published>2026-10-06T11:00:00+00:00</published>
        <updated>2026-10-06T13:56:18+02:00</updated>
        <summary/>
        <content type="html">&lt;p&gt;With the magento.watch MCP, you can query important information about Magento Open Source and Adobe Commerce directly from an AI assistant. I have been using the MCP for a while, mainly to check dependencies. The ability to quickly check whether a shop uses the official patches is also handy.&lt;/p&gt;
&lt;h2&gt;Connect the MCP without credentials&lt;/h2&gt;
&lt;p&gt;The MCP is documented at &lt;a href=&quot;https://magento.watch/mcp&quot;&gt;magento.watch/mcp&lt;/a&gt;. For Claude, for example, you can add it like this:&lt;/p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;notranslate&quot;&gt;claude mcp add magento-watch &lt;span class=&quot;hl-generic&quot;&gt;--transport&lt;/span&gt; http https://magento.watch/mcp/api
&lt;/pre&gt;
&lt;p&gt;In VSCode / CoPilot, you can do this through configuration, for example:&lt;/p&gt;
&lt;pre data-lang=&quot;json&quot; class=&quot;notranslate&quot;&gt;&lt;span class=&quot;hl-property&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;servers&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-property&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;magento-watch&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-property&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;type&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-value&quot;&gt;&amp;quot;http&amp;quot;&lt;/span&gt;,
      &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;url&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-value&quot;&gt;&amp;quot;https://magento.watch/mcp/api&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;hl-property&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;hl-property&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;hl-property&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Neither a password nor a token is required. That makes getting started straightforward: Once it has been added, Claude can use the tools provided to answer specific questions about releases, support periods, dependencies, security bulletins, and patches.&lt;/p&gt;
&lt;p&gt;And here you can see the MCP in action:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-10/screenshot-claude-magento-watch-mcp_2026-10-05.png&quot; alt=&quot;Dark terminal report on Magento security: The installed version 2.4.9 is considered secure and matches the recommended version; the end of support is listed as May 12, 2029.&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Release and dependency information&lt;/h2&gt;
&lt;p&gt;For an overview of versions, the tools include &lt;code&gt;get_all_versions&lt;/code&gt;, &lt;code&gt;get_supported_versions&lt;/code&gt;, and &lt;code&gt;get_eol_versions&lt;/code&gt;. These let you query all recorded versions of a distribution, currently supported releases, and versions that have reached end-of-life. &lt;code&gt;get_version&lt;/code&gt; provides details about an individual version, including its lifecycle and system requirements. If you only need the latest stable version, you can use &lt;code&gt;get_latest_version&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For upgrades and maintenance work, &lt;code&gt;check_compatibility&lt;/code&gt; is particularly useful. The tool checks whether a specific version of PHP, MySQL, or another dependency is compatible with a release. This lets me compare requirements directly against the shop version in use, rather than manually gathering information from several documentation pages.&lt;/p&gt;
&lt;h2&gt;Security bulletins and vulnerabilities&lt;/h2&gt;
&lt;p&gt;Security information is also accessible through dedicated tools. &lt;code&gt;get_security_bulletins&lt;/code&gt; lists Adobe and Magento security bulletins, optionally filtered by severity or publication date. With &lt;code&gt;get_security_bulletin&lt;/code&gt;, you can retrieve a specific bulletin, its CVEs, severity, and the releases that include the fix.&lt;/p&gt;
&lt;p&gt;For a specific shop version, there is &lt;code&gt;check_version_security&lt;/code&gt;. This lets you check whether known bulletins affect the version and which version contains the fix. That is helpful for answering a patch question more specifically: Is the installed version affected, and which release should it be updated to?&lt;/p&gt;
&lt;h2&gt;Check quality patches&lt;/h2&gt;
&lt;p&gt;For quality patches, &lt;code&gt;find_patch&lt;/code&gt; provides a list of patches applicable to a Magento version. The search can also prioritize results based on a described bug. &lt;code&gt;get_patch&lt;/code&gt; provides details about an individual patch, such as variants, restrictions, changed files, and documentation.&lt;/p&gt;
&lt;p&gt;This also makes it possible to check in practice which official patches are relevant to a shop and whether they have already been taken into account. It is a useful addition to release and security queries, especially during the ongoing maintenance of an installation.&lt;/p&gt;
&lt;h2&gt;REST API and n98-magerun2&lt;/h2&gt;
&lt;p&gt;In addition to the MCP, magento.watch also provides a REST API. This API will be used in the next version of n98-magerun2 in a command for checking database compatibility. That means the information is not only available to AI assistants, but can also feed directly into existing command-line workflows.&lt;/p&gt;
&lt;h2&gt;A community project with practical benefits&lt;/h2&gt;
&lt;p&gt;magento.watch is developed by &lt;a href=&quot;https://lbajsarowicz.me&quot;&gt;Łukasz Bajsarowicz&lt;/a&gt;. He has already made many valuable contributions to the Magento community and is a core contributor. I really appreciate his work.&lt;/p&gt;
&lt;p&gt;For me, magento.watch is a compelling project because it makes release, compatibility, security, and patch information accessible through a clear interface. The MCP saves time when checking dependencies and helps answer targeted questions about the state of a shop. If you use Claude, you can try the integration with a single command, without any password or token.&lt;/p&gt;</content>
        <author>
            <name>Christian Münch</name>
        </author>
    </entry>
    <entry>
        <title type="text">herdr: A Terminal Multiplexer for Servers and AI Agents</title>
        <link href="https://muench.dev/en/post/2026-10-herdr-terminal-multiplexer-fuer-server-und-ai-agenten"/>
        <id>https://muench.dev/en/post/2026-10-herdr-terminal-multiplexer-fuer-server-und-ai-agenten</id>
        <published>2026-10-05T09:00:00+00:00</published>
        <updated>2026-10-07T19:28:40+02:00</updated>
        <summary/>
        <content type="html">&lt;p&gt;For me, a terminal multiplexer is a tool for keeping several working contexts in view at the same time. These might be local shells, SSH connections to servers, or sessions with coding agents.&lt;/p&gt;
&lt;p&gt;For this, I use &lt;a href=&quot;https://herdr.dev&quot;&gt;&lt;strong&gt;herdr&lt;/strong&gt;&lt;/a&gt;. It can be used as a regular terminal multiplexer and supports various coding agents out of the box. It also offers persistent sessions and the ability to connect remote machines via SSH. This lets me organize multiple terminals and agent sessions in parallel in a single tool.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-10/screenshot_20261001_164544_herdr.png&quot; alt=&quot;Screenshot of a terminal window with multiple lines of code and workflows displaying information about Home Assistant and system processes. Navigation options appear in the upper left corner, while system and process data dominate the main area.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Even though it is a CLI tool, it is important to know that everything can also be operated with a mouse. All panes can be moved by drag and drop, as can tabs. Menus can also be opened with a mouse click.&lt;br /&gt;
Of course, everything works through the keyboard too.&lt;/p&gt;
&lt;h2&gt;More than terminal windows&lt;/h2&gt;
&lt;p&gt;herdr manages multiple sessions and workspaces. This is useful when, for example, I am developing locally, accessing a server in parallel, and running one or more agents alongside that.&lt;/p&gt;
&lt;p&gt;One important difference from several ordinary terminal windows is the persistent session: herdr is based on a client-server architecture. Processes started in a session continue running even when I leave the connection or terminal. When I return later, I can carry on there and see the current state. This applies not only to coding agents, but to processes in the session in general.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-10/screenshot_20261001_165046_hermes_remote.png&quot; alt=&quot;Screenshot of a terminal interface with colorful “CATPPUCCIN” text and an agent named “Hermes.” Machine and agent menus are visible on the left, while technical information and available tools appear on the right.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This lets me separate tasks without losing track of them: for example, one workspace per project, separate sessions for different agents, and additional terminals for server access.&lt;/p&gt;
&lt;h2&gt;Bringing agents into the terminal workflow&lt;/h2&gt;
&lt;p&gt;Coding agents frequently work directly in the terminal. herdr brings sessions, workspaces and agent integrations into a shared working environment.&lt;br /&gt;
This does not make herdr itself a coding agent. Rather, it organizes the environment in which agents and other processes run. The practical benefit comes when several tasks are being worked on in parallel and I want to switch between the respective sessions.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-10/screenshot_20261001_165926-herdr-integrations.png&quot; alt=&quot;The screenshot shows a user interface with integration settings. It lists various agents, some marked as &amp;quot;not found&amp;quot; and others shown with an &amp;quot;update available&amp;quot; notification.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;There are additional features too, such as Git worktrees for separate working states, plugins, configurable keyboard shortcuts, and tools like Neovim and Lazygit. Which of these are useful depends on how much of your own development environment you want to integrate into this workflow.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-10/screenshot_20261001_181006-herdr-git-worktree-support.png&quot; alt=&quot;Git worktree support in Herdr&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Agentic use&lt;/h2&gt;
&lt;p&gt;Herdr itself can be fully automated through the command line. It therefore makes sense for agents to control Herdr remotely too. For this, the project directly provides a suitable agent skill.&lt;/p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;notranslate&quot;&gt;npx skills add herdrdev/herdr &lt;span class=&quot;hl-generic&quot;&gt;--skill&lt;/span&gt; herdr &lt;span class=&quot;hl-generic&quot;&gt;-g&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The skill contains important CLI commands, for example for window management. In addition, the tool can also be controlled through a &lt;a href=&quot;https://herdr.dev/docs/socket-api/&quot;&gt;socket API&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Remote access and parallel sessions&lt;/h2&gt;
&lt;p&gt;For me, SSH access is an important part of the whole setup. Remote machines can be incorporated into the workflow, keeping local terminals, server access and agent sessions in view together.&lt;/p&gt;
&lt;p&gt;This is particularly helpful when a task involves more than just local code. For example, you can work on a project, execute commands on a remote system, and observe the status of an agent session at the same time. The interface brings these contexts together instead of spreading them across different programs and windows.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I use herdr as a terminal multiplexer for ordinary shell work, SSH access and coding agents. The persistent sessions and the ability to bring multiple workspaces and remote connections together are what make it particularly interesting for my workflow.&lt;/p&gt;
&lt;p&gt;There are other tools too, such as &lt;a href=&quot;https://tuios.dev&quot;&gt;tuios&lt;/a&gt;, which may render more smoothly or look particularly stylish. Personally, I currently feel very comfortable with herdr and am significantly more productive with it.&lt;/p&gt;</content>
        <author>
            <name>Christian Münch</name>
        </author>
    </entry>
    <entry>
        <title type="text">Building My Own Uptime Kuma Widget for KDE Plasma in Around Two Hours</title>
        <link href="https://muench.dev/en/post/2026-10-in-rund-zwei-stunden-zum-eigenen-uptime-kuma-widget-fuer-kde-plasma"/>
        <id>https://muench.dev/en/post/2026-10-in-rund-zwei-stunden-zum-eigenen-uptime-kuma-widget-fuer-kde-plasma</id>
        <published>2026-10-02T08:00:00+00:00</published>
        <updated>2026-10-07T19:28:40+02:00</updated>
        <summary/>
        <content type="html">&lt;p&gt;Sometimes small projects come about not because you particularly want to&lt;br /&gt;
program something new, but because something is missing from your everyday&lt;br /&gt;
life. That is exactly how my new KDE Plasma widget for Uptime Kuma started.&lt;/p&gt;
&lt;p&gt;I have been running Uptime Kuma for some time to monitor various&lt;br /&gt;
servers and applications. When something goes down somewhere,&lt;br /&gt;
I receive a corresponding notification in Discord.&lt;/p&gt;
&lt;p&gt;That generally works well. However, a Discord message can occasionally&lt;br /&gt;
get lost in the noise. Especially when you receive lots of other&lt;br /&gt;
messages alongside it, a notification is easily overlooked.&lt;/p&gt;
&lt;p&gt;Since I spend most of the day working at my KDE desktop, a simple idea&lt;br /&gt;
occurred to me: &lt;strong&gt;Why not see the current state of my systems directly&lt;br /&gt;
on my desktop?&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Isn’t there already a widget for that?&lt;/h2&gt;
&lt;p&gt;Before building something myself, I naturally searched first.&lt;/p&gt;
&lt;p&gt;What I had in mind was actually pretty simple: a Plasma widget&lt;br /&gt;
connects to my existing Uptime Kuma instance and shows me at a glance&lt;br /&gt;
whether my servers and applications are reachable.&lt;/p&gt;
&lt;p&gt;However, I could not find an existing widget that matched my expectations.&lt;/p&gt;
&lt;p&gt;Developing Plasma widgets was not entirely unfamiliar to me.&lt;br /&gt;
Many years ago, I had already written a KDE Plasmoid myself.&lt;br /&gt;
Back then, of course, in the traditional way and without AI assistance.&lt;/p&gt;
&lt;p&gt;That knowledge had become pretty rusty in the meantime.&lt;br /&gt;
At the same time, that was precisely what made it interesting to me.&lt;/p&gt;
&lt;h2&gt;A good opportunity to try Antigravity CLI&lt;/h2&gt;
&lt;p&gt;I had been wanting to try Antigravity CLI more extensively on a real&lt;br /&gt;
project anyway. Until then, I had used only a small fraction of my&lt;br /&gt;
available token allowance.&lt;/p&gt;
&lt;p&gt;So I thought: why not?&lt;/p&gt;
&lt;p&gt;The project was a nice size for this. It was not an artificial&lt;br /&gt;
“Hello World,” but something I actually wanted to use afterward.&lt;br /&gt;
At the same time, it was manageable enough to observe how well a&lt;br /&gt;
coding agent copes with this kind of project.&lt;/p&gt;
&lt;p&gt;I also wanted to try out how a fast &lt;strong&gt;Gemini Flash model&lt;/strong&gt; performs&lt;br /&gt;
on an agentic coding task like this.&lt;/p&gt;
&lt;p&gt;That turned the little widget into an experiment as well:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How far can I get with Antigravity CLI and a fast Flash model on a&lt;br /&gt;
real KDE Plasma project?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-10/screenshot_uptime_kuma-widget_20260929_104145.png&quot; alt=&quot;Screenshot of a terminal window showing an Antigravity CLI version and commands for configuring an Uptime Kuma server. The display contains Bash commands and paths to various files related to Plasma and KDE.&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;From zero to the first widget&lt;/h2&gt;
&lt;p&gt;I started from scratch.&lt;/p&gt;
&lt;p&gt;Of course, my old Plasma widget gave me a rough idea of how a Plasmoid&lt;br /&gt;
is structured. But I no longer had the specific implementation for&lt;br /&gt;
current Plasma 6 fresh in my mind.&lt;/p&gt;
&lt;p&gt;That was an important part of the experiment for me too. I did not want&lt;br /&gt;
to spend hours reading documentation first and completely relearning the&lt;br /&gt;
current KDE stack. Instead, Antigravity was supposed to take on a large&lt;br /&gt;
part of that work.&lt;/p&gt;
&lt;p&gt;A first working version appeared relatively quickly.&lt;/p&gt;
&lt;p&gt;From then on, the work mainly consisted of iterations: try the widget,&lt;br /&gt;
discover a problem or have a new idea, describe to Antigravity what&lt;br /&gt;
should change, and then test the result again.&lt;/p&gt;
&lt;p&gt;It was precisely in this process that I found using a coding agent&lt;br /&gt;
particularly interesting.&lt;/p&gt;
&lt;h2&gt;The Git history captures the speed quite well&lt;/h2&gt;
&lt;p&gt;I did not time the entire session with a stopwatch. Looking back and&lt;br /&gt;
adding it up, it was roughly &lt;strong&gt;two hours&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Part of that is quite easy to trace through the Git history.&lt;/p&gt;
&lt;p&gt;The first commit visible today was created at &lt;strong&gt;8:13 p.m.&lt;/strong&gt; By that&lt;br /&gt;
point, however, quite a lot had already happened and the widget basically&lt;br /&gt;
existed. I had started about an hour earlier.&lt;/p&gt;
&lt;p&gt;After that, things moved quickly.&lt;/p&gt;
&lt;p&gt;Within just &lt;strong&gt;43 minutes, eleven commits were created&lt;/strong&gt;. By then, this&lt;br /&gt;
was already about much more than simply displaying any data on the desktop.&lt;/p&gt;
&lt;p&gt;Among other things, Plasma 6 compatibility issues were fixed,&lt;br /&gt;
redirect handling and group filtering were improved, nested monitor&lt;br /&gt;
groups were taken into account, and various display options were added.&lt;/p&gt;
&lt;p&gt;A nice example is the header-only mode. The feature was added,&lt;br /&gt;
tried out, and corrected again just a few minutes later.&lt;/p&gt;
&lt;p&gt;That describes my actual workflow with Antigravity quite well:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Idea → have it implemented → try it out → discover a problem → give&lt;br /&gt;
feedback → have it corrected → next idea.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;More than a proof of concept&lt;/h2&gt;
&lt;p&gt;What surprised me a little: after those roughly two hours,&lt;br /&gt;
I did not simply have a technical prototype.&lt;/p&gt;
&lt;p&gt;The widget was already something I could actually use on my desktop.&lt;/p&gt;
&lt;p&gt;It displays the status of services monitored through Uptime Kuma,&lt;br /&gt;
response times and uptime values. Monitors can be displayed by group,&lt;br /&gt;
and heartbeat bars also let you see their history.&lt;/p&gt;
&lt;p&gt;There are different layouts for different places of use. On the desktop,&lt;br /&gt;
for example, I can use a more detailed overview, while the widget can&lt;br /&gt;
be displayed much more compactly in the Plasma panel.&lt;/p&gt;
&lt;p&gt;Multiple widget instances with different monitor groups are possible too.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-10/screenshot_uptime_kuma-widget_20260929_104549.png&quot; alt=&quot;A monitoring application dashboard showing the status of various systems. All systems are operational, with an overview of latency times and availability.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-10/screenshot_uptime-kuma-widget_20260929_080817.png&quot; alt=&quot;The interface of a monitoring dashboard shows the status of various services and applications on the network. All systems are operational, with a list of 61 monitored items, 31 of which are active. A green light indicates that everything is working properly.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;You can also add the widget in a small form to a panel (bar):&lt;br /&gt;
&lt;img src=&quot;/assets/content/blog/2026-10/screenshot_uptime-kuma-widget_20260929_082333.png&quot; alt=&quot;A green icon with the number 61/61 and the word &amp;quot;Up&amp;quot; beside it. It appears to indicate status or progress.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;During development, other things were added that were not necessarily&lt;br /&gt;
on my initial list: search and filtering, different display variants,&lt;br /&gt;
KDE notifications for outages and recoveries, and various ways to&lt;br /&gt;
authenticate against Uptime Kuma.&lt;/p&gt;
&lt;p&gt;A relatively simple idea thus became a fairly complete Plasma widget&lt;br /&gt;
surprisingly quickly.&lt;/p&gt;
&lt;h2&gt;The coding agent does not replace trying things out&lt;/h2&gt;
&lt;p&gt;What I found especially interesting was how my own work changed.&lt;/p&gt;
&lt;p&gt;I did not have to research and implement every QML component and every&lt;br /&gt;
Plasma 6 API myself. My task became much more about evaluating the result.&lt;/p&gt;
&lt;p&gt;Does this really work? Does it look sensible on the desktop?&lt;br /&gt;
What information is missing? What behaves differently than expected?&lt;br /&gt;
Which feature do I want next?&lt;/p&gt;
&lt;p&gt;Especially in a visual project, the agent cannot take over that&lt;br /&gt;
evaluation completely.&lt;/p&gt;
&lt;p&gt;I had to keep starting the widget and actually using it.&lt;br /&gt;
But when something did not work or I did not like it, I could describe&lt;br /&gt;
to Antigravity quite specifically what needed to change.&lt;/p&gt;
&lt;p&gt;This created a very fast feedback loop.&lt;/p&gt;
&lt;h2&gt;Two hours is not the whole story, of course&lt;/h2&gt;
&lt;p&gt;“Developed in two hours” quickly sounds as if AI does all the work&lt;br /&gt;
while you just sit beside it.&lt;/p&gt;
&lt;p&gt;That is not how I would describe it.&lt;/p&gt;
&lt;p&gt;I knew what problem I wanted to solve. I could judge whether the proposed&lt;br /&gt;
solution made sense. Through my earlier Plasma widget, I had at least&lt;br /&gt;
a basic understanding of what was happening. And, above all, throughout&lt;br /&gt;
development I decided what should happen next.&lt;/p&gt;
&lt;p&gt;Antigravity did, however, take a great deal of implementation work and&lt;br /&gt;
research off my hands. I deliberately did not do Agentic Engineering; instead, I did a little vibe coding on the side to see how far you can get even without much prior knowledge.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-10/screenshot_uptime-kuma-widget_20260929_103414.png&quot; alt=&quot;A screenshot of a terminal command line showing the code for an Uptime Kuma widget created to monitor Uptime Kuma servers and services. It includes features such as health monitoring, status banners, performance statistics and notifications.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-10/screenshot_uptime-kuma-widget_20260929_102728.png&quot; alt=&quot;The screenshot shows a software installation interface titled &amp;quot;Uptime Kuma&amp;quot;. There is a short description stating that it is used to monitor servers and services. A rating of 5/10 is displayed.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I had the agent iteratively optimize quite a few things in the configuration.&lt;br /&gt;
I think the result looks pretty good too:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-10/screenshot_uptime_kuma-widget_20260929_104732.png&quot; alt=&quot;Uptime Kuma appearance settings with options for customizing the dashboard, including groups and display types.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;And that is exactly how an idea I might otherwise have written on some&lt;br /&gt;
TODO list became, within one evening, a tool I actually use.&lt;/p&gt;
&lt;h2&gt;My conclusion&lt;/h2&gt;
&lt;p&gt;For me, this project was a pretty good test of agentic coding.&lt;/p&gt;
&lt;p&gt;Not because the result is particularly huge or complex, but precisely&lt;br /&gt;
because it solves a &lt;strong&gt;real, small everyday problem&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I needed an Uptime Kuma widget for my KDE desktop. I could not find one&lt;br /&gt;
that matched my expectations. So I started Antigravity CLI and tried&lt;br /&gt;
out how far I could get with it.&lt;/p&gt;
&lt;p&gt;Roughly two hours later, I had a widget on my desktop that monitors my&lt;br /&gt;
servers and applications and lets me immediately recognize when&lt;br /&gt;
something is wrong somewhere.&lt;/p&gt;
&lt;p&gt;The fact that a fast Gemini Flash model was enough to guide me through&lt;br /&gt;
QML, Plasma 6, Uptime Kuma and numerous small iterations was at least&lt;br /&gt;
as interesting to me as the widget itself.&lt;/p&gt;
&lt;p&gt;Above all, the experiment showed me one thing: coding agents do not&lt;br /&gt;
automatically make your ideas good. But they can make the distance between&lt;br /&gt;
&lt;strong&gt;“That would actually be useful”&lt;/strong&gt; and &lt;strong&gt;“That is now running on my&lt;br /&gt;
computer”&lt;/strong&gt; remarkably short.&lt;/p&gt;
&lt;p&gt;I published the widget’s source code on GitHub.&lt;br /&gt;
&lt;a href=&quot;https://github.com/muench-dev/uptime-kuma-plasma-widget&quot;&gt;https://github.com/muench-dev/uptime-kuma-plasma-widget&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The widget can now also be installed directly through the KDE Store:&lt;/p&gt;</content>
        <author>
            <name>Christian Münch</name>
        </author>
    </entry>
    <entry>
        <title type="text">Home Assistant in My Homelab: Making Existing Data Visible and Optimizing with AI</title>
        <link href="https://muench.dev/en/post/2026-09-home-assistant-im-homelab-bestehende-daten-sichtbar-machen-und-mit-ki-optimieren"/>
        <id>https://muench.dev/en/post/2026-09-home-assistant-im-homelab-bestehende-daten-sichtbar-machen-und-mit-ki-optimieren</id>
        <published>2026-09-29T14:46:00+00:00</published>
        <updated>2026-10-07T19:28:40+02:00</updated>
        <summary/>
        <content type="html">&lt;p&gt;I wanted to get more out of my existing Home Assistant installation. Not because I was missing a new system, but because I realized that quite a lot of information was already being collected around the house. It just was not always arranged usefully or easy to find at a glance.&lt;/p&gt;
&lt;p&gt;So I had Claude Code and OpenCode review and rework my Home Assistant configuration. OpenAI models were used in both cases. The result is more than a new dashboard: it shows how existing infrastructure can be put to better use, how monitoring lays a foundation for automations, and where coding agents can help maintain a system that has grown over time.&lt;/p&gt;
&lt;h2&gt;Making the existing data easier to read&lt;/h2&gt;
&lt;p&gt;Most of the rework concerned Home Assistant’s “Overview” view. I rebuilt seven other views following a common pattern. Instead of tile collections that had evolved differently, there are now clearly structured sections with headings and icons, consistent tiles, and compact history charts.&lt;/p&gt;
&lt;p&gt;Which measurements appear depends on the area. They include temperature, humidity, radon, electrical power and CO, among others. A tile shows me the current state; a small history chart helps put it into context. Is a temperature unusual, or has it been like that all day? Has a measurement just changed, or is the trend stable? A graph often answers more than another number does.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-09/screenshot_20260924_181143.png&quot; alt=&quot;The optimized dashboard&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The goal was not to fit in as much data as possible at once. A dashboard should answer the questions that actually arise in everyday life. Empty sections and duplicate cards have therefore disappeared. I removed references to devices that no longer exist and a broken camera card. Labels and typos were cleaned up too. That sounds mundane, but it makes an interface easier to read and prevents outdated entries from undermining trust in the display.&lt;/p&gt;
&lt;p&gt;Additional functions complement the existing views: a weather forecast, music controls, options and child lock for the dishwasher, and the battery levels of the smoke and CO detectors. The guest Wi-Fi switch is now in the network section. Its automatic shutdown at 10 p.m. remains in place. This is a small example of how not every improvement needs new sensors. Sometimes it is enough to move an existing function to where you expect it to be.&lt;/p&gt;
&lt;h2&gt;Warnings that appear only when needed&lt;/h2&gt;
&lt;p&gt;A common weakness of smart-home dashboards is the constant presence of status information. When every state is displayed equally prominently, an important message is just one tile among many. I therefore wanted warnings that appear only when there is a specific reason for them.&lt;/p&gt;
&lt;p&gt;Among other things, the views highlight smoke and CO alarms, low batteries, detectors at the end of their service life or outside their normal state. Protective shutdowns of Shelly outlets are also reported, for example due to overheating, overcurrent, overvoltage or overload. There are also notices for low dishwasher salt and rinse aid, and for a finished dishwasher cycle. A detector with a weak wireless signal remains visible for as long as the problem persists. In the case of a smoke or CO alarm, I can silence the detector directly in the corresponding section.&lt;/p&gt;
&lt;p&gt;For the outlets powering refrigerators and freezers, it was also important to me that touching a tile should not accidentally switch off the appliance. This is a small usability change, but an important separation between displaying status and taking action: not every piece of information needs to be a switch at the same time.&lt;/p&gt;
&lt;p&gt;This kind of dashboard is more useful to me than the most complete possible device list. I still see relevant states, but the interface directs my attention toward deviations. For that to work, the underlying entities naturally need to be maintained. A pretty warning is no help if the integration behind it stopped providing reliable data long ago.&lt;/p&gt;
&lt;h2&gt;Measurements become automations&lt;/h2&gt;
&lt;p&gt;A new dashboard now also shows usage of several AI services: costs, requests and token counts for OpenAI, OpenRouter and Opper AI. It also includes an overall total and the current day’s costs. At the time I recorded it, the daily value was US$1.16.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-09/screenshot_20260924_181124.png&quot; alt=&quot;The AI dashboard&quot; /&gt;&lt;/p&gt;
&lt;p&gt;These metrics are interesting not just because they explain a bill. They can also trigger a concrete action. I set up a Home Assistant automation that notifies me through Discord when daily costs exceed US$10. There is a Discord integration and a script for sending the message for this purpose.&lt;/p&gt;
&lt;p&gt;At this point, no generative AI is needed to decide whether costs are “high.” The threshold is clear: if the daily value exceeds it, a message is sent. That makes the rule easy to understand and predictable. AI was helpful when working on the configuration; during regular operation, an ordinary automation makes the decision.&lt;/p&gt;
&lt;p&gt;For me, the sequence matters: first the data must be available, then I can visualize it usefully. Once measurements are reliable, understandable rules can be built on them. Without metrics, I would only be guessing whether a threshold had been reached. With an automation, I also do not have to hope that I happen to look at the right view at the right time.&lt;/p&gt;
&lt;p&gt;The fact that Home Assistant logs to my Discord server also helps me notice messages outside the dashboard. A notification is not an end in itself. It should clearly state what happened and why I should pay attention. To begin with, a single threshold warning is better than a flood of messages that I eventually ignore.&lt;/p&gt;
&lt;h2&gt;Coding agents for the work that otherwise gets left undone&lt;/h2&gt;
&lt;p&gt;Claude Code and OpenCode helped me review and rework the existing Home Assistant configuration. Particularly in a system that has been in use for a while, tasks accumulate that each seem manageable on their own: standardizing views, finding old device references, removing duplicate cards, correcting labels, and building warnings consistently. Taken together, these tasks consume time that everyday life often uses up on other things.&lt;/p&gt;
&lt;p&gt;A coding agent can analyze what is there, identify relationships, and implement proposed changes. That does not mean every suggested change is automatically correct. Home Assistant is connected to real devices and can therefore have real-world consequences. I treat the agents as tools for analysis and configuration work, not as autonomous house managers. Changes must remain traceable and be checked afterward. Particularly with switches and automations, it should be clear which entity is being addressed and what consequences an action has.&lt;/p&gt;
&lt;p&gt;For me, the practical gain is not that AI makes every decision for me. It lowers the barrier to cleaning up a system that has grown over time. Tasks I kept putting off can be tackled more deliberately when an agent helps with searching and structuring. Responsibility for the changes and for operation still remains with me.&lt;/p&gt;
&lt;h2&gt;New information from existing integrations&lt;/h2&gt;
&lt;p&gt;Alongside the dashboard work, the information available from individual integrations has expanded too. After a Home Connect update, there are additional notices about low salt and rinse aid, as well as reminders for machine care and filter cleaning. A separate switch for the screen has been added for the television in the living room. For the photovoltaic system, another sensor shows how long monitoring data has been missing.&lt;/p&gt;
&lt;p&gt;These are not major platform changes. They are additions within infrastructure that already exists. If an integration provides a useful new sensor, it can be added to a dashboard or used as an automation trigger. The prerequisite is that I notice the information and correctly understand its state.&lt;/p&gt;
&lt;h2&gt;Visibility is not troubleshooting&lt;/h2&gt;
&lt;p&gt;The rework did not eliminate every problem. The doorbell integration no longer provides a camera. One device was temporarily unreachable; the log contained around 530 timeout messages about it. There are also individual unreachable devices and still a detector with a weak wireless signal.&lt;/p&gt;
&lt;p&gt;This does not contradict the improved dashboard. Quite the opposite: a good overview should not give the impression that everything is fine merely because the interface looks tidy. It helps make faults and outages easier to recognize. But the cause may lie with an integration, a device, the network connection, or another dependency. That needs to be investigated separately.&lt;/p&gt;
&lt;p&gt;This boundary matters for AI too. An agent can help narrow down a problem using logs and configurations. But it cannot conclude that a device works reliably from a nicely formatted view alone. When data stops arriving, that state must remain visible as a problem rather than silently being treated as normal.&lt;/p&gt;
&lt;h2&gt;An approach you can apply to your own homelab&lt;/h2&gt;
&lt;p&gt;Perhaps the following steps will be interesting for your homelab too:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Inventory existing data.&lt;/strong&gt; What sensors, integrations and states are already available? Before buying new hardware, it is worth looking at what is already being collected.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Organize for everyday usefulness.&lt;/strong&gt; A good overview groups information by purpose and shows trends when history helps put things into context.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Make warnings conditional.&lt;/strong&gt; Only relevant deviations should demand attention. Constant status messages make you tune out.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Measure first, automate second.&lt;/strong&gt; A stable sensor value and a clear rule are a better foundation than a complicated automation built on uncertain data.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use AI for analysis and routine work.&lt;/strong&gt; Coding agents can help search and clean up. Changes, particularly those with real-world consequences, must remain verifiable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do not hide faults.&lt;/strong&gt; A dashboard must not conceal problems. Outdated data, unreachable devices and integration errors need attention too.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My Home Assistant was already an important part of the homelab. The rework has made it more useful to me: information already in the system is easier to find, selected problems stand out sooner, and a new cost overview has led to a concrete Discord warning.&lt;/p&gt;
&lt;p&gt;AI helped me tackle work for which I otherwise had little time. The automations deliberately remain understandable, and Home Assistant executes clearly defined rules. For me, the real value lies in the combination of existing infrastructure, visible metrics and verified AI assistance.&lt;/p&gt;
&lt;p&gt;What data in your homelab or existing IT is already available, but not yet visible where it would really help you?&lt;/p&gt;</content>
        <author>
            <name>Christian Münch</name>
        </author>
    </entry>
    <entry>
        <title type="text">Automatically Tagging LinkDing Bookmarks: My AI Workflow with n8n, Opper AI and kev</title>
        <link href="https://muench.dev/en/post/2026-09-linkding-bookmarks-automatisch-taggen-mein-ki-workflow-mit-n8n-und-opper-ai-und-kev"/>
        <id>https://muench.dev/en/post/2026-09-linkding-bookmarks-automatisch-taggen-mein-ki-workflow-mit-n8n-und-opper-ai-und-kev</id>
        <published>2026-09-25T08:00:00+00:00</published>
        <updated>2026-10-07T19:26:28+02:00</updated>
        <summary/>
        <content type="html">&lt;p&gt;In everyday life, I save links quickly as I go. Finding them again later is another matter. Good search is important. But I also like having tags so I can spot connections and similar links more quickly. That is why I built a workflow for my self-hosted Linkding instance that automatically categorizes new bookmarks and existing ones without tags.&lt;/p&gt;
&lt;p&gt;It brings together two browser extensions, the Linkding REST API, n8n, and a small model through Opper AI. The crucial part is not simply “AI creates tags,” but the classification system that determines how those tags are assigned.&lt;/p&gt;
&lt;h2&gt;Collecting and finding links in the browser&lt;/h2&gt;
&lt;p&gt;I use two extensions that perform different jobs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LinkDing Extension&lt;/strong&gt; (&lt;a href=&quot;https://chromewebstore.google.com/detail/linkding-extension/beakmhbijpdhipnjhnclmhgjlddhidpe&quot;&gt;Chrome Store&lt;/a&gt;) saves a link in my Linkding instance. The extension also displays Linkding search results in the background on search pages such as Google. So when searching, I can see whether a link is already in my collection.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-09/screenshot_linkding_bookmark_extension_20260925_125930.png&quot; alt=&quot;A screenshot of a browser showing a window for adding a bookmark. At the top left is an input field for the URL and various options such as &amp;quot;Tags&amp;quot; and &amp;quot;Mark as unread&amp;quot;. A red arrow points to an icon near the top of the window.&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LinkDing Bookmark Sync&lt;/strong&gt; (&lt;a href=&quot;https://chromewebstore.google.com/detail/linkding-bookmark-sync/ofcdpgnkoljnfilmnmkjfihmnhfjppdj&quot;&gt;Chrome Store&lt;/a&gt;) synchronizes my tags as folders in the browser and places the matching bookmarks beneath them. This lets me access saved links through the familiar folder structure too.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-09/screenshot_linkding_tags_in_bookmarks_20260925_130109.png&quot; alt=&quot;A screenshot of a user interface showing an organized list of categories and subcategories, including topics such as agriculture, climate change, cybersecurity and art. The numbers beside the categories indicate the number of corresponding entries.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I run Linkding self-hosted. For login, I use SSO through Authentik. That keeps the collection under my control while still making it searchable through the web interface.&lt;/p&gt;
&lt;h2&gt;The n8n workflow handles untagged bookmarks&lt;/h2&gt;
&lt;p&gt;The automation runs in n8n. Through the Linkding REST interface, I retrieve bookmarks that do not yet have a tag. The workflow therefore does not reprocess the entire collection on every run, but focuses on the outstanding entries.&lt;/p&gt;
&lt;p&gt;I pass the bookmark data to a small, separate n8n workflow. Its input parameter is called &lt;code&gt;body&lt;/code&gt; and is simply a string. This keeps the component independent of the original workflow: it receives the information about a bookmark, classifies it, and ultimately produces a tag list.&lt;/p&gt;
&lt;p&gt;For classification, I use Opper AI as a model router and the &lt;a href=&quot;https://opper.ai/community/kev-4b#get-started&quot;&gt;&lt;strong&gt;kev 4b&lt;/strong&gt;&lt;/a&gt; model. The component calls the API twice. Classification takes place in two stages and is based on a classification system I developed together with Gemini. It is more a kind of worldview than a loose collection of individual topic words: the tags should place links into a structure that fits the way I organize knowledge and interests.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-09/screenshot_ai_tagging_sub_workflow_20260925_125054.png&quot; alt=&quot;A screenshot of a user interface showing a workflow. The workflow includes steps such as preparing questions, classifying categories and formatting results. Various categories, including technology, art, science and sport, are listed in the right-hand column.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I deliberately do not describe these two steps as some magical “AI understands everything” feature. The model receives the bookmark information and the classification system’s instructions; it returns the tags that I use for tagging.&lt;/p&gt;
&lt;h2&gt;Why a small model is enough here&lt;/h2&gt;
&lt;p&gt;For this task, I do not need a model that argues at length or produces an elaborate text. It should quickly categorize a link according to a predefined taxonomy. This is a narrowly defined classification task, for which a fast System 1 model suits me better than a large model with elaborate reasoning.&lt;/p&gt;
&lt;p&gt;The cost also supports this choice. On the plan I use for kev 4b, the charge is &lt;strong&gt;US$0.04 per one million input tokens&lt;/strong&gt;; output tokens cost nothing. Because the workflow accesses the API twice, input is naturally the relevant cost factor. For the amount of text associated with a bookmark, that remains very inexpensive. This specific price refers to the plan I use and may change.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-09/screenshot_opper_ai_traces_kev_4b_system1_model_20260925_124934.png&quot; alt=&quot;A programming or debugging tool displaying code and terminal output. Time and token information is visible at the top. The main content shows JSON-like data structures.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;In practice, processing is also fast enough that automatic tagging does not become a task of its own. A link arrives in Linkding, the workflow classifies it in the background, and the tags are then available for search and synchronization.&lt;/p&gt;
&lt;h2&gt;The existing collection gets new tags too&lt;/h2&gt;
&lt;p&gt;The workflow was useful for more than just new bookmarks. I also used it to retag all my existing bookmarks once. That was important, because a good taxonomy only shows its value when it includes not just today’s links, but also the archive built up over the years.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-09/screenshot_n8n_linkding_bookmark_tagging_20260925_125156.png&quot; alt=&quot;A flowchart showing various data-processing steps, including data collection, classification with an AI tool and merging. The steps are connected graphically, and some indicate specific actions.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Since then (okay, only since yesterday), tagging has become noticeably faster and more consistent for me. Having simply had all the tags reassigned, I can clearly see the difference compared with before. I do not have to rethink which tag I used for a similar link every time. And because the tags are subsequently visible as browser folders too, the same organization works in Linkding and in the browser.&lt;/p&gt;
&lt;h2&gt;What I need to keep in mind&lt;/h2&gt;
&lt;p&gt;Automatic tagging does not automatically make classification correct. If the taxonomy changes or a bookmark is ambiguous, a tag may be missing or inappropriate. The system therefore stands or falls with a clear, well-maintained tag structure. The two classification steps do not replace this work; they simply apply the structure more consistently.&lt;/p&gt;
&lt;p&gt;The data path also deserves attention: Linkding is self-hosted, but the bookmark information I pass to the classification component is forwarded to Opper AI for model processing. Self-hosting alone therefore does not mean that every processing step stays local. For private or confidential links, I need to consider what data I send to the router and the selected model.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;For me, this workflow is a good example of where a small model can make more sense than the largest possible one: the task is clearly bounded, the tag structure is defined by me, and the result should be available quickly and cheaply.&lt;/p&gt;
&lt;p&gt;With Linkding as a self-hosted archive, the two browser extensions for collecting and accessing links, and n8n for automation, this has become a process that organizes new and existing bookmarks more consistently. The biggest effort was not the two API calls, but developing a classification system that actually works for my collection.&lt;/p&gt;
&lt;p&gt;I also use Readeck to collect material for articles or as a “read it later” tool. It (deliberately) comes without AI tagging. I have integrated the same tagging logic there too. But that is a topic for a separate blog article.&lt;/p&gt;</content>
        <author>
            <name>Christian Münch</name>
        </author>
    </entry>
    <entry>
        <title type="text">My Hermes Agent Takes Care of Our Minecraft Server</title>
        <link href="https://muench.dev/en/post/2026-09-orbitalstrike-auf-meinem-minecraft-server-plugin-und-update-hygiene"/>
        <id>https://muench.dev/en/post/2026-09-orbitalstrike-auf-meinem-minecraft-server-plugin-und-update-hygiene</id>
        <published>2026-09-24T15:00:00+00:00</published>
        <updated>2026-10-07T19:26:28+02:00</updated>
        <summary/>
        <content type="html">&lt;p&gt;My son wanted me to install a Minecraft plugin on our server. I was at work at the time. Instead of putting the task off until later, I handed it to my “Homelab” Hermes profile. The agent already knows the server from its inventory and manages it for me.&lt;/p&gt;
&lt;p&gt;It handled the installation and discovered a problem with the update source during setup: the updater pointed to a different project with a similar name. The agent brought this to my attention and suggested an appropriate correction. We agreed on the change together and implemented it. We also adjusted the settings for safe operation together.&lt;/p&gt;
&lt;h2&gt;From assignment to verification&lt;/h2&gt;
&lt;p&gt;The agent did more than install the plugin file. It checked the server’s state, identified the issue with the update source, suggested an improvement, and carried out the agreed changes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-09/screenshot-hermes-minecraft-server-plugin-installation-2026-09-27_151709.png&quot; alt=&quot;A text document describes the installation and configuration of the OrbitalStrike Cannon plugin for Minecraft. It contains technical details such as recommended minimum requirements, verification guidance and risks.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Afterward, it restarted the server in an orderly manner and checked that the plugin was active, the server started cleanly, and the updater correctly recognized the configured plugins. The checks were successful.&lt;/p&gt;
&lt;h2&gt;An agent with context about my homelab&lt;/h2&gt;
&lt;p&gt;The difference from a one-off chat response: my Homelab profile already knew the server and had access to the information needed to administer it. I did not first have to explain which machine I meant or carry out the individual steps myself. I could hand over the task and also received feedback when the agent encountered a problem.&lt;/p&gt;
&lt;p&gt;The agent handled the routine technical work. We agreed together on changes that affected the server. It then verified the result. That is exactly the combination I care about: the agent can complete tasks independently in a familiar environment, flags problems, and involves me when a decision is needed.&lt;/p&gt;
&lt;p&gt;For me, this was practical relief while I was at work. My son got the plugin he wanted sooner, and I could keep working.&lt;/p&gt;</content>
        <author>
            <name>Christian Münch</name>
        </author>
    </entry>
    <entry>
        <title type="text">Hindsight: An Agent Memory System That Really Impressed Me</title>
        <link href="https://muench.dev/en/post/2026-08-hindsight-ein-agent-memory-system-das-mich-begeistert-hat"/>
        <id>https://muench.dev/en/post/2026-08-hindsight-ein-agent-memory-system-das-mich-begeistert-hat</id>
        <published>2026-08-27T07:00:00+00:00</published>
        <updated>2026-10-07T19:25:37+02:00</updated>
        <summary/>
        <content type="html">&lt;p&gt;Anyone who works with Claude Code, Codex CLI or opencode every day knows the problem: at the end of every session, the agent is back to square one. You explain the tech stack, the team conventions, and why you abandoned Redis caching three months ago for what feels like the tenth time. Notes in system prompts or CLAUDE.md files help, but they do not scale—they capture only a static snapshot, not a growing, evolving knowledge base.&lt;/p&gt;
&lt;p&gt;I have been using &lt;strong&gt;Hindsight&lt;/strong&gt;, an open-source memory system from Vectorize.io, for a few weeks, and I am pretty taken with it. Or let us call it what it is: for the first time in a long while, a software solution has genuinely excited me. It does exactly what you imagine “agent memory” should do when you do not reduce it to the naive vector database solution. It has opened up new worlds for me, both conceptually and technically.&lt;/p&gt;
&lt;h2&gt;Why should you use Hindsight?&lt;/h2&gt;
&lt;p&gt;Before I get into the technical details, here are the three reasons that tipped the balance for me:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Greater context continuity&lt;/strong&gt;: Agents retain relevant prior knowledge across sessions, delivering consistent, personalized recommendations instead of starting from scratch with every new session.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better accuracy on complex questions&lt;/strong&gt;: Temporal and graph retrieval combined with automatic observation consolidation noticeably improve the hit rate, particularly for historical or indirectly connected facts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Controlled, explainable memory logic&lt;/strong&gt;: Missions and directives create safety and compliance guardrails, while evidence tracking makes it clear what an answer is actually based on.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What Hindsight is—and what it is not&lt;/h2&gt;
&lt;p&gt;The most important point first: Hindsight is not simply a vector database with a pretty API wrapped around it. Anyone who throws in raw data and hopes cosine similarity will produce the right answer is regularly disappointed by naive RAG approaches. Once you have a few hundred memories covering different topics and time periods, the principle of “embed everything, retrieve Top-K” often breaks down.&lt;/p&gt;
&lt;p&gt;Hindsight takes a different approach. &lt;strong&gt;PostgreSQL with the pgvector extension&lt;/strong&gt; provides storage in the background, but what gets used is not the raw data. It is the result of an extraction process: structured facts, resolved entities (“Alice” and “my colleague Alice” become the same entity), timestamps for temporal analysis, and a knowledge graph mapping relationships between entities. If you are now worried about your data... okay, the documents are still stored in the Postgres database as “Document” too. But the raw documents are not the interesting part of the overall process; the processed data is.&lt;/p&gt;
&lt;p&gt;Everything connects via &lt;strong&gt;MCP&lt;/strong&gt;—Claude Code, Codex, opencode, Cursor, VS Code, practically any MCP-capable client can connect. For internal processing (fact extraction, entity resolution, reflect operations), Hindsight needs its own LLM provider, independently of the model the actual agent uses. That is a detail I like: you can deliberately use a cheap, fast model here because this processing runs in the background and does not affect the quality of the actual agent responses. I used the GPT-5.6 Luna model for my tests because, initially, I was paying out of my own pocket. Despite the inexpensive model, I got really good results. You can also use multiple models in Hindsight and fine-tune everything. Honestly, I have probably tried only 30–40% of the features so far. But that is fine. You get results quickly, can work with the data, and can improve it yourself. How? That is coming next.&lt;/p&gt;
&lt;h2&gt;The three core operations&lt;/h2&gt;
&lt;p&gt;Hindsight offers three central operations, available as MCP tools:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;retain&lt;/code&gt;&lt;/strong&gt;—Store. You feed Hindsight text (a single fact, an entire conversation, a document), and an LLM extracts structured facts, resolves entities, generates embeddings, and indexes everything for later searches in the background. Important: you should &lt;strong&gt;not&lt;/strong&gt; summarize or extract facts yourself beforehand—Hindsight needs the full context of a conversation, otherwise “yes, exactly” or “I will take option 2” becomes meaningless text.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;recall&lt;/code&gt;&lt;/strong&gt;—Search. Four retrieval strategies run in parallel: semantic search, BM25 keyword matching, graph traversal across the knowledge graph, and temporal filtering. The results are then sorted using cross-encoder reranking. This is the real advantage over a simple vector search: a question such as “What did we decide about caching?” finds the right answer even when the original memory uses different terminology.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;reflect&lt;/code&gt;&lt;/strong&gt;—Synthesize. Reflect goes beyond simple retrieval and lets an LLM draw conclusions across multiple memories—for example, in response to “Which tech stack would you recommend based on my previous decisions?”&lt;/p&gt;
&lt;div class=&quot;mermaid-diagram not-prose&quot;&gt;&lt;pre class=&quot;mermaid&quot;&gt;flowchart LR    
    subgraph YourApp[&amp;quot;Your Application&amp;quot;]
        A[&amp;quot;AI Agent&amp;quot;]
    end

    subgraph Hindsight[&amp;quot;Hindsight&amp;quot;]
        API[&amp;quot;API Server&amp;quot;]

        subgraph MemoryBank[&amp;quot;Memory Bank&amp;quot;]
            direction TB
            MM[&amp;quot;Mental Models&amp;quot;]
            OBS[&amp;quot;Observations&amp;quot;]
            ME[&amp;quot;Memories &amp;amp; Entities&amp;quot;]
            CH[&amp;quot;Chunks&amp;quot;]
            DOC[&amp;quot;Documents&amp;quot;]

            MM --&amp;gt; OBS
            OBS --&amp;gt; ME
            ME --&amp;gt; CH
            CH --&amp;gt; DOC
        end
    end

    A --&amp;gt;|retain| API
    A --&amp;gt;|recall| API
    A --&amp;gt;|reflect| API

    API --&amp;gt; ME
&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Extraction strategies and tagging&lt;/h2&gt;
&lt;p&gt;One point that is underestimated in practice: not every data source should be processed the same way. Hindsight offers named retain strategies for this—for example, &lt;code&gt;verbatim&lt;/code&gt; for content that should be stored word for word, or &lt;code&gt;chunks&lt;/code&gt; for larger documents split into sections. These strategies can be defined in the bank configuration and selected explicitly in the &lt;code&gt;retain&lt;/code&gt; call depending on the source.&lt;/p&gt;
&lt;p&gt;There is also a tagging system with so-called entity labels: controlled vocabularies following the &lt;code&gt;key:value&lt;/code&gt; pattern, such as &lt;code&gt;user:christian&lt;/code&gt; or &lt;code&gt;topic:architektur&lt;/code&gt;, which can be extracted automatically during storage. For purely content-based searches, you often do not need this at all—entities end up in the knowledge graph anyway and drive graph-based search. For explicit filtering on entity-like values, however, tags are worth their weight in gold, especially when you want to keep multiple projects or customers clearly separated within a bank.&lt;/p&gt;
&lt;h2&gt;Mental Models: living documents&lt;/h2&gt;
&lt;p&gt;What convinced me most were the &lt;strong&gt;Mental Models&lt;/strong&gt;. You define a question—for example, “Which architectural decisions were made for project X?”—and Hindsight generates a document that updates automatically whenever new memories are added or existing documents change. You therefore do not have to run a full &lt;code&gt;reflect&lt;/code&gt; across the entire memory collection for every request. Instead, you get a kind of precomputed, always up-to-date summary.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-08/mental_models_20260828_162916.png&quot; alt=&quot;Mental Models&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Technically, this runs asynchronously through a queue: the actual LLM-assisted generation happens in the background, an API call initially returns only an operation ID, and the finished result is available after a few seconds. This is thoroughly thought through, but it also has a downside—more on that shortly.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-08/hindsight_queue_20260828_170103.png&quot; alt=&quot;Everything is processed asynchronously in a queue&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Scaling is not a problem either, because the architecture also includes worker instances that can be scaled using Kubernetes. All of that is possible. In my homelab setup, a single worker in a fixed Docker container does the job.&lt;/p&gt;
&lt;h2&gt;Visualization&lt;/h2&gt;
&lt;p&gt;The Control Plane—Hindsight’s admin UI—includes the &lt;strong&gt;Constellation View&lt;/strong&gt;: an interactive, zoomable graph visualization of entity relationships with heat-gradient coloring, also usable in dark mode. For me, this is more than just a nice feature. With a growing knowledge graph, the visual overview is enormously helpful for getting a feel for what your memory bank actually “knows” and where extraction might have gone wrong.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-08/memory_view_world_facts_20260828_134418.png&quot; alt=&quot;Graph visualization&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Of course, you can also filter, zoom, and inspect the individual underlying documents.&lt;/p&gt;
&lt;h2&gt;Feature overview&lt;/h2&gt;
&lt;p&gt;A few points from the full feature list that have not come up in this article yet but are part of the picture:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hierarchical memory types&lt;/strong&gt;: Alongside Mental Models (curated, self-defined summaries), there are Observations—evidence-backed beliefs automatically consolidated from raw facts—as well as World Facts and Experience Facts. This separation ensures that reflect checks Mental Models first when answering a question, then Observations, and only turns to raw facts as a last step.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-strategy retrieval (TEMPR)&lt;/strong&gt;: The four parallel search strategies in &lt;code&gt;recall&lt;/code&gt;—Semantic, Keyword/BM25, Graph, Temporal—operate under the name TEMPR and are merged using reciprocal rank fusion before cross-encoder reranking takes over. This makes retrieval robust even for questions involving temporal or graph-based connections.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Observation consolidation&lt;/strong&gt;: After every &lt;code&gt;retain&lt;/code&gt; call, a consolidation process runs automatically in the background, comparing new facts against existing Observations, deduplicating them, and adding evidence references. Observations that may have been superseded by newer, not-yet-consolidated facts are marked “stale” and verified against the raw facts before use.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Temporal reasoning&lt;/strong&gt;: Queries such as “last spring” or “in June” are resolved not just semantically but explicitly by time—a field in which pure vector search typically fails.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mission and policy configuration&lt;/strong&gt;: At bank level, you can define a mission specifying which knowledge should be prioritized, along with immutable directives as compliance guardrails and disposition traits such as skepticism, literalness, or empathy that influence how &lt;code&gt;reflect&lt;/code&gt; weighs arguments. Important: these settings affect only &lt;code&gt;reflect&lt;/code&gt;, not &lt;code&gt;recall&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evidence-backed answers&lt;/strong&gt;: Observations refer to their source memories, including quoted evidence and proof counts. This makes an answer’s derivation understandable rather than something you accept as a black box.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clients &amp;amp; SDKs&lt;/strong&gt;: Official SDKs for Python, TypeScript and Go, plus a CLI and HTTP API—making integration into existing agent stacks beyond MCP straightforward.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deployment options&lt;/strong&gt;: Alongside the local Docker setup I use in my homelab, there are Helm charts for Kubernetes, a pip installation for quick local testing, and an integration hub for connected data sources.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;How does data get into the system?&lt;/h2&gt;
&lt;p&gt;Data can enter memory in several ways. When using the MCP server, you can simply store something through the &lt;code&gt;retain&lt;/code&gt; tool. Tags and a unique document ID can be defined for each captured document. Defining the document ID is optional. If none is supplied, the system creates a UUID.&lt;br /&gt;
If you want to store raw data, such as chat histories, using the generated UUID is sufficient. For data such as the content behind a web page, the document ID can also be a URL. If a new document is submitted with the same document ID, Hindsight updates the existing entry too.&lt;br /&gt;
Hindsight also lets you define different data extraction strategies for different sources. You can influence RAG-specific parameters such as chunk size as well.&lt;/p&gt;
&lt;p&gt;Because Hindsight was designed consistently so that everything the UI does communicates through a REST API, using that same API to import data is straightforward too.&lt;br /&gt;
As an example, I installed an n8n community plugin that simply exposes the three basic operations in an n8n node.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-08/n8n_example_process_20260828_165134.png&quot; alt=&quot;Example n8n workflow with the Hindsight community node&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;My homelab setup&lt;/h2&gt;
&lt;p&gt;I set everything up in my homelab rather than the cloud—two LXC containers, one for the API and one for the admin UI, or Control Plane. I did not have to set up a new database server: I already had a PostgreSQL server with the pgvector extension running and only needed to create an additional database there. That made setup considerably simpler. Anyone already running a Postgres instance with pgvector is ready in minutes, rather than having to wrestle with the embedded PostgreSQL variant from the Docker quickstart.&lt;/p&gt;
&lt;p&gt;For the internal processing LLM provider, I quickly connected OpenRouter and chose &lt;strong&gt;GPT-5.6 Luna&lt;/strong&gt;—the inexpensive, latency-optimized variant from OpenAI’s GPT-5.6 series, intended for precisely these high-frequency but not particularly demanding background tasks such as fact extraction. The model can easily be swapped out, though: Hindsight supports a broad selection of providers, from OpenAI, Anthropic and Gemini to local models through Ollama or llama.cpp. Anyone who prefers to keep internal processing completely offline, without external API calls, can now do that too.&lt;/p&gt;
&lt;h2&gt;Integration with other systems&lt;/h2&gt;
&lt;p&gt;Via MCP, Hindsight can connect practically anywhere a client speaks the standard—Claude Code, Codex CLI, opencode and other coding agents are supported directly, in some cases even with automatic ingestion without an additional setup step.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-08/claude_code_hindsight_mcp_tool_20260828_163755.png&quot; alt=&quot;Claude Code MCP tool&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The MCP server is built directly into Hindsight and can be configured separately for each memory bank. You can also restrict the MCP tools.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-08/mcp_tool_restriction_20260828_163932.png&quot; alt=&quot;MCP tool settings&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I have not restricted anything in my setup because I already have a LiteLLM gateway in between anyway.&lt;/p&gt;
&lt;h2&gt;Use cases&lt;/h2&gt;
&lt;p&gt;The most obvious use case for me personally is not primarily technical at all: I want to prepare data about the football club &lt;strong&gt;Wormatia Worms&lt;/strong&gt; to lighten the workload of the office staff. Instead of answering every request manually, an agent could draw on a Hindsight bank containing historical information, club rules, and recurring questions, genuinely taking on some of the communication burden.&lt;/p&gt;
&lt;p&gt;Alongside that, I am currently building a second bank of my own: I am adding the club’s history, season results, and player profiles. The interesting part here is not simply retrieving individual facts, but having the system independently discover statistical peculiarities and relationships across the imported data—for example, that a particular season had an unusually high number of draws, or that a player scored disproportionately often across multiple seasons. That is precisely what &lt;code&gt;reflect&lt;/code&gt; is for: not just retrieving facts, but drawing conclusions across the entire dataset. This becomes especially interesting for the club’s archivist, who wants to ask questions such as “When was the longest winning streak?”—questions that no individual record answers, and that emerge only from considering many season results together.&lt;/p&gt;
&lt;p&gt;In technical project environments, I see at least two more useful scenarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Architecture and policy memory&lt;/strong&gt;: An agent that keeps track of software architecture decisions, coding guidelines, and project conventions and is available to developers as a question-and-answer resource directly in their coding tool—without first having to search a wiki.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Requirements completeness checks&lt;/strong&gt;: In projects where requirements are captured continuously, an agent with access to the accumulated memories can check whether all necessary documents and information are available and specifically highlight gaps. Especially in business contexts with many stakeholders, this is a scenario that delivers real value.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Assessment&lt;/h2&gt;
&lt;p&gt;What works well: getting started is pleasantly straightforward, especially if—as in my case—a Postgres/pgvector instance is already available. MCP as the connection standard means you do not have to build a separate integration for every client. In practice, the combination of multi-strategy retrieval and reranking produces noticeably better results than a simple vector search, particularly with larger memory collections spanning many topics.&lt;/p&gt;
&lt;p&gt;Are there things about this approach that bother me? Not really, but you should be aware that as the amount of information grows, and with every Mental Model, the effort required to keep everything up to date increases too. Token costs can certainly add up.&lt;br /&gt;
Every &lt;code&gt;retain&lt;/code&gt; operation means additional LLM calls for internal processing, which accumulate at high volumes. And the ecosystem’s maturity is not set in stone yet. Integrations can change at relatively short notice.&lt;/p&gt;
&lt;p&gt;It really comes down to whether you have recognized context/memory as something valuable for yourself.&lt;/p&gt;
&lt;h2&gt;Business outlook&lt;/h2&gt;
&lt;p&gt;For a project environment like the one I know at valantic, I see the greatest leverage in agents retaining project context, customer preferences, and architectural decisions across sessions. That means less time spent repeatedly explaining context and more time available for actual value creation. It is a tangible productivity gain, particularly in longer projects with changing points of contact.&lt;/p&gt;
&lt;p&gt;At the same time, governance cannot be ignored: where do the extracted facts end up, who has access to the memory bank, and how cleanly can customers or projects be separated? Self-hosting via Docker or, as in my case, LXC containers in your own homelab is a valid answer here—you retain full control of the data instead of entrusting it to a cloud provider.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Hindsight is the first agent memory system that immediately and genuinely excited me, because it does not reduce memory to “throw text into a vector database.” Instead, it combines structured facts, entities, temporal context, and a knowledge graph. Setup in my own homelab was surprisingly straightforward thanks to the existing Postgres/pgvector infrastructure, and the combination of the MCP standard and flexible LLM provider selection makes the system interesting for very different scenarios—from day-to-day club work at Wormatia Worms to architecture memory in technical projects. I will continue expanding this over the coming weeks and report back once concrete workflows emerge.&lt;/p&gt;</content>
        <author>
            <name>Christian Münch</name>
        </author>
    </entry>
    <entry>
        <title type="text">mage-remote-run with JSON Body Support and Other New Features</title>
        <link href="https://muench.dev/en/post/2026-06-mage-remote-run-mit-json-body-support-in-virtual-commands"/>
        <id>https://muench.dev/en/post/2026-06-mage-remote-run-mit-json-body-support-in-virtual-commands</id>
        <published>2026-06-25T07:00:00+00:00</published>
        <updated>2026-10-07T19:24:42+02:00</updated>
        <summary/>
        <content type="html">&lt;p&gt;Two releases in one day — that happens when features are ready. On June 17, 2026, I released v1.9.0 and v1.10.0 of &lt;a href=&quot;https://github.com/muench-dev/mage-remote-run&quot;&gt;mage-remote-run&lt;/a&gt;. The highlight in v1.9: Virtual Commands now support JSON request bodies — making POST and PUT requests against the Magento REST API possible without writing your own JavaScript code. v1.10 brings cleaner plugin infrastructure: incompatible plugins are now detected during loading and rejected with a clear error message.&lt;/p&gt;
&lt;h2&gt;v1.9.0: Virtual Commands with JSON Body, Choices, and Interactive Prompts&lt;/h2&gt;
&lt;p&gt;Virtual Commands have been a central extensibility feature since v1.4: define REST requests through configuration, without having to write JavaScript. Until now, they were limited to GET requests. That is now history.&lt;/p&gt;
&lt;h3&gt;JSON Body Templates&lt;/h3&gt;
&lt;p&gt;With &lt;code&gt;body&lt;/code&gt; in the command definition, POST and PUT requests can be sent directly from the configuration. The body is a JSON template. Options are embedded as placeholders and substituted at runtime.&lt;/p&gt;
&lt;pre data-lang=&quot;json&quot; class=&quot;notranslate&quot;&gt;&lt;span class=&quot;hl-property&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-value&quot;&gt;&amp;quot;customer update-email&amp;quot;&lt;/span&gt;,
  &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;method&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-value&quot;&gt;&amp;quot;PUT&amp;quot;&lt;/span&gt;,
  &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;endpoint&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-value&quot;&gt;&amp;quot;/V1/customers/:id&amp;quot;&lt;/span&gt;,
  &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;description&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-value&quot;&gt;&amp;quot;Update customer email address&amp;quot;&lt;/span&gt;,
  &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;body&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-property&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;customer&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-property&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;id&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-value&quot;&gt;&amp;quot;:id&amp;quot;&lt;/span&gt;,
      &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;email&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-value&quot;&gt;&amp;quot;:email&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;hl-property&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;hl-property&quot;&gt;}&lt;/span&gt;,
  &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;options&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-property&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;id&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-property&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;type&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-value&quot;&gt;&amp;quot;string&amp;quot;&lt;/span&gt;,
      &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;required&amp;quot;&lt;/span&gt;: true,
      &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;description&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-value&quot;&gt;&amp;quot;Customer ID&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;hl-property&quot;&gt;}&lt;/span&gt;,
    &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;email&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-property&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;type&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-value&quot;&gt;&amp;quot;string&amp;quot;&lt;/span&gt;,
      &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;required&amp;quot;&lt;/span&gt;: true,
      &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;description&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-value&quot;&gt;&amp;quot;New email address&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;hl-property&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;hl-property&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;hl-property&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;notranslate&quot;&gt;mage-remote-run customer update-email &lt;span class=&quot;hl-generic&quot;&gt;--id&lt;/span&gt; &lt;span class=&quot;hl-number&quot;&gt;42&lt;/span&gt; &lt;span class=&quot;hl-generic&quot;&gt;--email&lt;/span&gt; new@example.com
&lt;/pre&gt;
&lt;p&gt;This opens up the entire Magento REST API to Virtual Commands — not just read operations, but write workflows as well, without custom plugin code.&lt;/p&gt;
&lt;p&gt;You can find the full documentation here: &lt;a href=&quot;https://mage-remote-run.muench.dev/extensibility/virtual-commands&quot;&gt;mage-remote-run.muench.dev/extensibility/virtual-commands&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Choices for Option Definitions&lt;/h3&gt;
&lt;p&gt;Options can now have predefined choices. This makes commands more user-friendly and prevents invalid input:&lt;/p&gt;
&lt;pre data-lang=&quot;json&quot; class=&quot;notranslate&quot;&gt;&lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;options&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-property&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;status&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-property&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;type&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-value&quot;&gt;&amp;quot;string&amp;quot;&lt;/span&gt;,
    &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;required&amp;quot;&lt;/span&gt;: true,
    &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;description&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-value&quot;&gt;&amp;quot;Order status&amp;quot;&lt;/span&gt;,
    &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;choices&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-property&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-value&quot;&gt;&amp;quot;pending&amp;quot;&lt;/span&gt;, &lt;span class=&quot;hl-value&quot;&gt;&amp;quot;processing&amp;quot;&lt;/span&gt;, &lt;span class=&quot;hl-value&quot;&gt;&amp;quot;complete&amp;quot;&lt;/span&gt;, &lt;span class=&quot;hl-value&quot;&gt;&amp;quot;canceled&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-property&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;hl-property&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;hl-property&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;In interactive mode, &lt;code&gt;choices&lt;/code&gt; appear as a selection menu. Via the CLI, invalid values are rejected immediately.&lt;/p&gt;
&lt;h3&gt;Interactive Prompts for Missing Required Options&lt;/h3&gt;
&lt;p&gt;Virtual Commands now prompt interactively for missing required options instead of aborting with an error message. The behavior depends on the context: a prompt appears in the terminal; in CI/CD pipelines, the error is reported as before. Where possible, variables already defined by default by CI/CD systems such as Gitlab-CI or Github Actions (such as &lt;code&gt;CI=1&lt;/code&gt;) are detected automatically, so interactive mode cannot block the pipeline.&lt;/p&gt;
&lt;p&gt;For pipelines, interactive mode can also be disabled explicitly:&lt;/p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;notranslate&quot;&gt;NON_INTERACTIVE=&lt;span class=&quot;hl-number&quot;&gt;1&lt;/span&gt; mage-remote-run my-command
&lt;span class=&quot;hl-comment&quot;&gt;# alternativ:&lt;/span&gt;
NONINTERACTIVE=&lt;span class=&quot;hl-number&quot;&gt;1&lt;/span&gt; mage-remote-run my-command
&lt;/pre&gt;
&lt;p&gt;Both environment variables are accepted as aliases, in the spirit of Homebrew conventions for shell scripting.&lt;/p&gt;
&lt;h3&gt;Other Changes in v1.9&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Performance&lt;/strong&gt;: Config I/O now runs fully asynchronously (&lt;code&gt;fs.promises&lt;/code&gt; instead of synchronous &lt;code&gt;fs&lt;/code&gt;) — noticeable when switching profiles frequently&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance&lt;/strong&gt;: &lt;code&gt;findRegisteredPluginIndex&lt;/code&gt; uses &lt;code&gt;Promise.all&lt;/code&gt; for parallel checks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt;: Swallowed errors in catch blocks have been fixed — errors are now visible instead of silently ignored&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Refactoring&lt;/strong&gt;: Duplicated filter-matching logic has been extracted into &lt;code&gt;parseFilterOption&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deps&lt;/strong&gt;: axios, zod, inquirer, and @modelcontextprotocol/sdk updated to current versions&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;v1.10.0: Plugin Compatibility Checks via peerDependencies&lt;/h2&gt;
&lt;p&gt;Plugins have declared a &lt;code&gt;peerDependency&lt;/code&gt; on &lt;code&gt;mage-remote-run&lt;/code&gt; since v1.6. Starting with v1.10, it is actually evaluated during loading.&lt;/p&gt;
&lt;p&gt;If a plugin requires a version of &lt;code&gt;mage-remote-run&lt;/code&gt; that does not match the installed version, loading aborts with a clear error message — rather than inexplicable runtime behavior.&lt;/p&gt;
&lt;p&gt;This is the usual principle: explicitly bad is better than silently wrong. Anyone developing or using plugins declares the &lt;code&gt;peerDependency&lt;/code&gt; in the plugin's &lt;code&gt;package.json&lt;/code&gt;:&lt;/p&gt;
&lt;pre data-lang=&quot;json&quot; class=&quot;notranslate&quot;&gt;&lt;span class=&quot;hl-property&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-value&quot;&gt;&amp;quot;my-mage-remote-run-plugin&amp;quot;&lt;/span&gt;,
  &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;peerDependencies&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-property&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;hl-keyword&quot;&gt;&amp;quot;mage-remote-run&amp;quot;&lt;/span&gt;: &lt;span class=&quot;hl-value&quot;&gt;&amp;quot;&amp;gt;=1.10.0&amp;quot;&lt;/span&gt;
  &lt;span class=&quot;hl-property&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;hl-property&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The check runs during plugin loading — before commands are registered. Incompatible plugins are skipped and the error is logged.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Update&lt;/h2&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;notranslate&quot;&gt;npm update &lt;span class=&quot;hl-generic&quot;&gt;-g&lt;/span&gt; mage-remote-run
&lt;/pre&gt;
&lt;p&gt;Or straight to the current version:&lt;/p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;notranslate&quot;&gt;npm install &lt;span class=&quot;hl-generic&quot;&gt;-g&lt;/span&gt; mage-remote-run@latest
&lt;/pre&gt;
&lt;p&gt;Feedback and bug reports via &lt;a href=&quot;https://github.com/muench-dev/mage-remote-run/issues&quot;&gt;GitHub Issues&lt;/a&gt;, as always. If you use Virtual Commands in production or develop plugins... I would love to hear about your experiences.&lt;/p&gt;</content>
        <author>
            <name>Christian Münch</name>
        </author>
    </entry>
    <entry>
        <title type="text">valantic Becomes an Anthropic Partner — and I Was Part of It</title>
        <link href="https://muench.dev/en/post/2026-06-valantic-wird-anthropic-partner-und-ich-war-dabei"/>
        <id>https://muench.dev/en/post/2026-06-valantic-wird-anthropic-partner-und-ich-war-dabei</id>
        <published>2026-06-18T08:46:00+00:00</published>
        <updated>2026-10-07T19:24:42+02:00</updated>
        <summary/>
        <content type="html">&lt;p&gt;valantic has officially become a &lt;a href=&quot;https://www.valantic.com/de/blog/valantic-tritt-claude-partner-network-von-anthropic-bei/&quot;&gt;&lt;strong&gt;Select Partner in Anthropic's Claude Partner Network (Services Track)&lt;/strong&gt;&lt;/a&gt; — one of the very first consulting and solutions companies in Europe to do so. I had the opportunity to contribute to the substance of this process and was personally part of the training required for it.&lt;/p&gt;
&lt;h2&gt;What This Partnership Means&lt;/h2&gt;
&lt;p&gt;A partnership with Anthropic is not just a marketing agreement. To become a Select Partner, you have to demonstrate that you really understand the subject: Claude, the Anthropic ecosystem, the architecture behind agent systems. And you have to be able to pass on that knowledge — internally to colleagues, but also in customer projects and training sessions.&lt;/p&gt;
&lt;p&gt;The thinking behind this makes sense: Anthropic wants to ensure that implementation partners do not just sell licenses, but deliver genuine added value. That requires the people advising customers to know what they are talking about.&lt;/p&gt;
&lt;h2&gt;London: Training to Become a Trainer&lt;/h2&gt;
&lt;p&gt;Part of demonstrating this was a training course in London that I attended together with my colleague Alexander Weinfurter. The goal was clear: we were to acquire the knowledge needed to train others — both internally at valantic and for customers.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-06/anthropic-partner-bootcamp-london-collage.png&quot; alt=&quot;Two people smile at the camera while sitting in a room. In the background, a man and a table with drinks are visible. Next to them is a sign reading &amp;quot;Welcome to Partner Basecamp&amp;quot; with information about a program. In the lower corner, the Thames and the London Eye can be seen in the background.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;In terms of content, it was an intensive format. We explored &lt;strong&gt;evaluating prompt results&lt;/strong&gt; in depth — a topic often underestimated in practice. It is not enough to build a prompt that works at first glance. You need to be able to measure systematically whether a model responds consistently, correctly, and appropriately for the use case at hand. There are methods and frameworks for this, which we worked through in London.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-06/anthtropic-exercices-terminal-2026-06-18-um-10.05.36.png&quot; alt=&quot;Directory tree with subfolders for a project. Contains folders for 'day1' and 'day2' with various exercises, as well as a README.md file. User permissions and modification dates are displayed.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Another focus was &lt;strong&gt;building and deploying agents in the cloud&lt;/strong&gt;. We covered how to set up production-ready AI agents, what infrastructure is behind them, and where the typical pitfalls lie. This is precisely the area that determines success or failure in many projects: not the model itself, but how it is embedded and used.&lt;/p&gt;
&lt;p&gt;We also compared various Anthropic models and developed a sense of which model makes sense for which purpose, and when.&lt;/p&gt;
&lt;p&gt;What I personally enjoyed most: the direct exchange with Anthropic employees, AI architects, and my valantic colleague. Alexander, for example, was much better at optimizing prompts. That is how you learn from each other. Formats like this give you a different perspective from documentation and blog posts. Questions you cannot easily ask in everyday work can be answered directly there.&lt;/p&gt;
&lt;h2&gt;What This Means for Customers&lt;/h2&gt;
&lt;p&gt;When I look at valantic's page on &lt;a href=&quot;https://www.valantic.com/de/ki/claude-implementierung/&quot;&gt;Claude implementation&lt;/a&gt;, I see exactly what we worked on in London reflected there. The approach is not &amp;quot;switch on AI and you're done,&amp;quot; but a structured process: from initial exploration through a pilot with a measurable business case to a company-wide rollout.&lt;/p&gt;
&lt;p&gt;I find one aspect valantic explicitly mentions particularly important: many companies fail when moving from individual tests to production use. Not because the model is bad, but because strategy, governance, and integration are missing. That matches what I experience in projects. The technology is rarely the problem.&lt;/p&gt;
&lt;p&gt;As a concrete starting point, valantic offers &lt;strong&gt;Claude Code workshops&lt;/strong&gt; for development teams — a direct, practical route into Anthropic's agentic coding capabilities. For developers who want to understand what AI-assisted software development looks like in practice, this is a good first step.&lt;/p&gt;
&lt;p&gt;Select Partner status also means that valantic has direct access to Anthropic expertise and roadmaps. In a field evolving this quickly, that is no small matter. Getting earlier access to information or models is a competitive advantage, especially right now.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I am glad valantic took this step — and even more glad that it involved genuine, substantive effort. Training in London, in-depth work on evaluation, deployment, and architecture, direct contact with Anthropic. This is not a badge on the website, but a foundation for projects that actually work.&lt;/p&gt;
&lt;p&gt;Anyone wanting to take Claude seriously in an enterprise context now has a contact at valantic who knows what they are talking about.&lt;/p&gt;</content>
        <author>
            <name>Christian Münch</name>
        </author>
    </entry>
    <entry>
        <title type="text">Google Cloud Summit DACH 2026</title>
        <link href="https://muench.dev/en/post/2026-06-besuch-beim-google-cloud-summit-dach-2026-in-frankfurt"/>
        <id>https://muench.dev/en/post/2026-06-besuch-beim-google-cloud-summit-dach-2026-in-frankfurt</id>
        <published>2026-06-15T08:25:00+00:00</published>
        <updated>2026-10-07T19:24:42+02:00</updated>
        <summary/>
        <content type="html">&lt;p&gt;Last week I attended the Google Cloud Summit DACH in Frankfurt for valantic. The journey was relaxed: by train with the Deutschlandticket, climate-friendly and without the stress of finding parking. Even the supporting program set the tone for the two days — large-scale, professional, well thought out. Several thousand attendees, a free event including food and drinks. Google is spending real money on this.&lt;/p&gt;
&lt;h2&gt;Day 1: The AI Experience Walk&lt;/h2&gt;
&lt;p&gt;For me, the first day revolved around the &lt;strong&gt;AI Experience Walk&lt;/strong&gt; — a kind of walk-through AI exhibition where Google presented its solutions along the entire value chain. Everything was represented, from the first customer contact to internal process automation.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-06/google-cloud-summit-emea-2026-collage.png&quot; alt=&quot;Google Cloud Summit 2026 - Impressions&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Google itself shared insights into how development has changed through the use of AI. More and more developers work exclusively with prompts and no longer really use the IDE itself.&lt;br /&gt;
&lt;img src=&quot;/assets/content/blog/2026-06/ai-replaces-developers_20260609_101513660.jpg&quot; alt=&quot;AI isn't going to replace developers. But a develop using AI will replavce a developer sho isn't.&quot; /&gt;&lt;br /&gt;
What kept coming through for me was that &amp;quot;grounding&amp;quot; simply needs to be taken much more seriously. Tests need to repeatedly and automatically verify the results, particularly when working with your own data. Test-driven development is back, but different from how it used to be.&lt;/p&gt;
&lt;p&gt;What impressed me most: &lt;strong&gt;live remote video translation into 15 languages&lt;/strong&gt;, in real time, directly in the video stream. This was not a demo video or a &amp;quot;coming soon&amp;quot; — it worked. Moments like that show where AI really stands right now. Not everything is still just a promise.&lt;/p&gt;
&lt;p&gt;A second major topic on the first day was &lt;strong&gt;digital sovereignty&lt;/strong&gt;. This is not a new topic, but it was striking how prominently Google positioned it. Who controls the infrastructure, who has access to the data, where do the models run? For many companies, these are no longer academic questions but concrete decision criteria when choosing a platform.&lt;/p&gt;
&lt;h2&gt;Day 2: Hands-on Rather Than Hype&lt;/h2&gt;
&lt;p&gt;Day 2 was more valuable for me. Less stage, more workshop. In the hands-on sessions, you could get straight to work yourself — and that makes a difference.&lt;/p&gt;
&lt;p&gt;I &lt;strong&gt;migrated an MCP server to Google ADK live&lt;/strong&gt; — right at the event, not prepared beforehand, not in a controlled demo environment. It worked, and that was a good sign. The ADK is practical enough to work with spontaneously.&lt;/p&gt;
&lt;p&gt;A talk on &lt;strong&gt;RAG (Retrieval-Augmented Generation)&lt;/strong&gt; using a specific use case — legal texts — was particularly interesting. The challenge with legal documents is not just finding the right passage — but also citing it correctly, with a reference to the relevant section and in the right context. That is exactly what was demonstrated. A use case with real requirements, where poor results would have real consequences. RAG needs to work more than just &amp;quot;most of the time&amp;quot; here.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/content/blog/2026-06/rag-is-hard_20260610_090752659.jpg&quot; alt=&quot;RAG is hard&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Google as the Only Full-Stack AI Provider&lt;/h2&gt;
&lt;p&gt;One observation runs through both days: Google is the only provider that delivers &lt;strong&gt;hardware, software, and platform&lt;/strong&gt; for AI from a single source. Its own TPUs, its own models (Gemini), its own cloud infrastructure, its own developer tools. That is a different starting position from providers that rely on external chip manufacturers or third-party infrastructure.&lt;/p&gt;
&lt;p&gt;Whether that is an advantage depends on what you are looking for. Anyone wanting to go deep into the Google ecosystem gets a consistent stack experience. Those prioritizing independence and portability may see it differently. Still, I find it remarkable that no other hyperscaler can offer this combination at this depth.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Two days, several thousand attendees, no admission fee. Google is visibly investing in community and visibility — and it pays off. You do not leave an event like this with finalized decisions, but with a good sense of where things are heading.&lt;/p&gt;
&lt;p&gt;For me personally: day 2 delivered more than day 1. Not because the AI Experience Walk was uninteresting — but because nothing can replace hands-on experience. Migrating an MCP server live and getting immediate feedback is worth more than ten slides on the same topic.&lt;/p&gt;
&lt;p&gt;If you have the opportunity to attend the next Google Summit: it is worth it.&lt;/p&gt;</content>
        <author>
            <name>Christian Münch</name>
        </author>
    </entry>
</feed>
