Merlin in the Machine: How AI Quietly Rebuilt My Home Lab

I have an AI that works on my home lab. Not one that writes jokes - one that patches my ESPHome sketches, migrates my wikis, builds my dashboards and, today, deleted half a wiki by accident. I did all of it from my phone.

Dark tech-style cover reading Solo Tinkering to Merlin, with Hermes, Home Assistant and ESPHome badges, six circular icons, and a friendly robot butler holding a chart

I have written before about letting AI write my bin reminders, and how strangely satisfying it is when your house calls you out for forgetting the recycling. That was a fun experiment. This is something different, and honestly it has changed how I do this hobby far more than any funny notification ever could.

I have an AI that works on my home lab. Not one that writes jokes, one that actually does the job. It reads my configs, patches my ESPHome sketches, writes and maintains my documentation, builds my dashboards, debugs my integrations and, when I ask nicely, writes a blog post about itself. I call it Merlin, because if I am going to have an assistant living in my machines, it may as well have a personality.

This post is about what that has actually meant in practice. The good bits, the boring bits, and one genuinely alarming afternoon where it deleted half a wiki.

What Merlin actually is

Underneath the theatre, Merlin is an AI agent running on a small machine in my rack. It has access to my servers, my Home Assistant instance, my Docker stack and my files. It has a long-term memory, so it remembers that my tower is called dumbledore and that my Pi-hole serves my local DNS names. And it has a set of "skills" — documented procedures it follows for recurring jobs, so it does not have to figure out the same thing twice.

The important part is that it is not a chatbot I paste things into. It has hands. It can run commands, read files, call APIs and change things. That is the entire difference, and it is why the last few months have looked so different from the years before them.

I have not opened my laptop

This is the bit that still catches me out, so I want to put it near the top.

Everything I just described, I did from my phone. On the couch, or in bed, or standing in the kitchen. Not at a desk with an editor open, not SSHed into anything, not even near a computer.

Merlin can compile an ESPHome sketch and flash it over the air to a device on my network. One message, and it does the whole thing — checks the config, compiles, waits for the device to come back, tells me what it found. I have reflashed switches while sitting in a different room to the machine that built the firmware.

That sounds like a small convenience. It is not. Almost all of my hobby time used to be gated behind being at a desk, and the desk is the bit I have to make time for. Being able to do real work on this from the phone in my pocket has moved more projects forward than any single tool I have ever bought.

The backlog that finally moved

The clearest way to describe what has changed is to list the jobs that had been sitting on my list for ages and are now simply done.

  • Full Home Assistant dashboards, built properly. One for mobile, one for the kitchen wall-mounted tablet, and they are finally the way I actually wanted them rather than the way I settled for. These had been on the list for well over a year, and every attempt stalled the same way — I would get a rough version working and never find the time to make it good.
  • Two bedside displays for me and Cheryl. ESP32 touch screens on each bedside table, running an LVGL interface so we can control lights and scenes without reaching for a phone in the dark. LVGL is exactly the kind of thing I would have bounced off — it is a proper GUI toolkit with its own layout and styling model, and getting it to look right is slow, fiddly work. Instead it was built, edited and refined in seconds at a time, and it looks like something we bought.
  • Documentation that stays current. My wiki used to get updated in bursts of enthusiasm, then ignored for four months until it was actively misleading. It now updates itself whenever I change an automation, page by page.
  • A container dashboard so I can see and restart anything in my stack from my phone, instead of SSHing in at 2am to find out what died.
  • Chasing a flaky integration that went unavailable every few days for no obvious reason. It turned out to be a circular DNS dependency — the service was being reached by a name it was itself responsible for resolving. Obvious in hindsight, invisible for weeks.
  • Debounce fixes on the bedside and patio switches, which had been double-triggering just enough to be annoying and not quite enough to be worth opening up.
  • Backups and housekeeping — actually verifying my Duplicati jobs restore rather than assuming, and working out why the disk kept filling up (an ESPHome build cache I did not know existed, holding about 15GB of regenerable toolchains).
  • Blog cover images for the posts, which is the sort of thing that otherwise never gets done and leaves every article looking unfinished.

None of that is glamorous work. That is rather the point. It is the work that never gets done, because it is tedious and there is always something more interesting to build.

The bedside screens

These are the two units on our bedside tables. A small ESP32 touch display in a 3D-printed case, running an LVGL interface, so we can kill the lights or drop a fan down without reaching for a phone in the dark.

Today was a good example

While I was getting on with other things, Merlin spent the day doing the following, and I want to write it down because it is a fair picture of a normal day now.

  • Migrated my entire wiki from WikiJS to BookStack — every page, verified page by page
  • Split a single 75,000-character automation reference into 96 separate pages, grouped into chapters
  • Wrote four troubleshooting runbooks, from faults we had actually diagnosed together
  • Built a per-page sync script so the documentation updates itself when I change an automation
  • Tracked down a ghost that had been switching my entrance light on for months
  • Decommissioned the old wiki completely — containers, volumes, DNS entries, monitoring, dashboard buttons
  • Wrote this post, and drew the cover

The ghost in the entrance

My favourite one. One of my Sonoff T1 touch switches has been switching a light on by itself. Occasionally. Usually in the middle of the night. The kind of fault that makes you question your own sanity, because you cannot reproduce it and there is never anything in the logs except a light that is on when it should be off.

Merlin found the signature. When the switch ghosted, the button registered as held down for about eleven seconds. Not a tap — a phantom press the length of a short phone call. Two separate ghosts, days apart, measured at 11.14 and 11.11 seconds.

That number mattered, because it explained why the fix I had tried years ago never worked. I had been debouncing the button, which smooths out a flickering contact. But an eleven second press is not flickering — it is the touch chip genuinely holding the line down, and no amount of debouncing is going to help with that. The actual fix was to stop accepting presses longer than one second, which is exactly what Tasmota does under the hood and exactly what I had been missing since I moved to ESPHome.

It then rolled that fix out to eleven switches, one at a time, and told me which had restored cleanly. From my phone, while I was doing something else.

The afternoon it deleted half a wiki

I should balance the last section, because this is not a magic story and it would be dishonest to pretend otherwise.

While tidying up the wiki migration, Merlin noticed every page seemed to have its title printed twice. It decided to remove the duplicates. Only the titles in the source files were not titles at all — they were the section headings for the whole document. It deleted the entire heading structure of nine pages before noticing the character counts had dropped.

What saved it was that it had taken a backup, checked its own work against the original, and noticed the numbers did not add up. It rebuilt all nine pages from source and verified them line by line. Nothing was lost, but only because the mistake was caught by measurement rather than by hope.

That is the thing I have learned about working this way. The value is not that the AI never makes mistakes. It is that it can be made to check its own work, and it does not get bored halfway through checking page 87 of 96.

The boring work is the real win

I want to be honest about what has actually changed, because it is not what I expected.

I did not stop doing the fun part. I still solder the boards, flash the switches and 3D print the enclosures. Merlin cannot pick up a soldering iron and I would not want it to. What it took over is the layer underneath — the documentation, the migrations, the tidying, the "I will write that up later" jobs that never get written up.

What has genuinely surprised me is how much of my backlog was not difficulty. It was dread. Jobs I knew exactly how to do, and simply could not bring myself to start, because they were long and boring and would eat a whole weekend. Handing those over has been worth more than anything clever it has done.

What it is actually good at

After a few months of this, I have a decent feel for it. Merlin is excellent at:

  • Reading things humans skip. It will happily diff two config files line by line and tell you the one value that changed
  • Migrations. Moving 96 pages and verifying every one is exactly the sort of tedious precision work that suits it
  • Writing things down. Runbooks, documentation, this post. It does not find it boring
  • The fiddly interface work. An LVGL screen is slow, precise, iterative work, and it will happily do a hundred small revisions to get a layout right
  • Noticing patterns across time. The eleven second ghost was only visible because something could look at months of history without getting tired
  • Checking its own work — when it remembers to, which is the important caveat

And it is not good at:

  • Knowing when to stop. The wiki incident happened because it was confident and thorough in the wrong direction
  • Physical work. Obviously. It has never once successfully soldered anything
  • Taste. It can build a dashboard, but whether it looks good is a judgement I still make

Where this is going

I am not going to pretend I know. What I can say is that the list of things I have been meaning to do for two years is finally moving, and that is entirely because the boring half of this hobby has somewhere to go now.

Take the screen on my wall next to the pool. It is finished and working, and it has been for a while now. But it sat untouched for the better part of a year first, and the honest reason was not that it was hard. It was that it had beaten me once already and I could not bring myself to open it up again.

That is the pattern I keep running into. The list of things I am avoiding is shorter than it has ever been, and not because the work got easier — it is because the tedious half now has somewhere to go, and what is left is the part I actually enjoy.

Merlin would probably tell you it is ready when I am. It is a bit like that.