Miquel’s homelab

The house that looks after itself.

It’s a Mac Mini the size of a book, tucked in a corner of the house. It keeps the family photos, runs the smart home and organises my day. But the interesting part is what it does when nobody’s watching:

  • The power goes out in the middle of the night. When it comes back, it starts on its own, checks its 51 programs and its disks, and tells me on Telegram what happened.
  • Every night it copies the family photos to two other disks, and in the morning it checks the copy is complete before calling it good.
  • 81 faults fixed on their own in the last month. If one is new, it proposes a fix; after a “yes”, next time it doesn’t ask.
  • Yesterday it stopped 2,175 bot attempts looking for an open door. None of them got to touch anything.

Made to measure

Eight custom portals for what no app did well.

Bento · the start page
Bento, the server’s start page: every service in the house grouped into coloured cards, with the server status at the top.
The Portals folder on the iPhone home screen, with an icon for each portal.

Everything on one screen.Bento is the front door: more than thirty services sorted by theme, with live server status and a search box.

And in my pocket.They live in a folder on my iPhone, each with its own icon, its own login and Face ID. From outside the house, they don’t open.

Yesterday at Amsterdam 9Updated every night · 11 November 2026
2,175bot requests stopped at the door
81faults fixed on their own in the last 30 days
9,683family photos and videos, kept at home
424things watched day and night

In numbers

What runs, and everything that is watched.

Counted from the system itself on 11 November 2026. Every signal is a check that, if it fails, ends up as a Telegram alert or a ticket.

51containerson a single Mac Mini with OrbStack
71automationsbackups, monitors and maintenance, from every minute to once a month
5AI agentsFermín, auto-remediation and three reports that reason over the data
1,115inventoried partsand every day each one is checked for monitoring
26relays into the houseZigbee, Shelly, ESPHome, infrared, amplifier
39devices on the networkan unknown one opens a ticket within minutes
23TBacross three diskslive data, daily copy and history
549,923metric samplesCPU, memory and status of every container every 5 min
424
monitored signalsgrouped by source

What it’s for

What it does for me, in four examples.

In a nutshell: a small computer at home that does what Google Photos, Dropbox, the reminders on my phone or each gadget’s own app used to do, and looks after itself. This is how it shows in everyday life.

01

The family photos, at home.

What it does
Photos and videos from the phone are saved at home automatically, and can be searched by people, places or dates, just like in Google Photos.
What it solves
Paying every month for cloud storage, and having our memories depend on a company.
What I learned
A backup nobody checks is not a backup. Every night everything is copied to other disks, and every morning the copy is checked to be complete.
02

The house takes care of the small stuff.

What it does
The awnings come down when the sun reaches the dining room and go up when it leaves. With a single button, holiday mode locks the door and sets the cameras to watch.
What it solves
Gadgets from different brands, each with its own app, and a list of things to remember before going away.
What I learned
Almost everything is controlled from home, without going through each manufacturer’s cloud: if the Internet goes down, the house keeps working.
03

A watchman that fixes faults on its own.

What it does
It checks hundreds of things day and night. If something fails, it repairs it; if the fault is new, it proposes a fix, I approve it, and next time it knows what to do. Even after a power cut: everything comes back on its own and it tells me on Telegram.
What it solves
A fault going unnoticed for days, and having to be at home to fix it.
What I learned
The danger isn’t what breaks, it’s what looks like it works: after a power cut, some programs started before the disks and looked healthy with empty folders.
04

An assistant that organises my day.

What it does
Every morning I get a message with the day’s appointments, tasks and birthdays, including how old each person turns. If I write “remind me to take the car to the garage on Thursday”, it notes it down.
What it solves
Calendars, reminders and alerts scattered across several apps that don’t talk to each other.
What I learned
An AI is useful when it has clear limits: it can read and take notes, but there are things it never does, such as deleting data.

How it talks to me

I don’t watch dashboards: I get a message.

When something happens, it tells me on Telegram, and I can reply. This is what its messages look like, shortened and with names and tasks changed.

18:58 · After the blackout
A9
Amsterdam 9bot
⚡ Mac Mini restarted without warning — probable power cut. I’m recovering everything; the report comes when I’m done.
🕐 Boot: 18:50 · 🐳 49 containers running 🔧 Fixed on its own: • the dining-room light, which had switched itself on • five programs waiting for the disks 🤖 Fermín is reading the report and will tell you

4 November, after flipping the main switch. And a lesson: the disk enclosure doesn’t switch itself back on when the power returns; that part is still my job.

10:00 · Every morning
A9
Amsterdam 9bot
📅 Today’s reminders: • Car service • 🎂 Laura turns 41 (1985) ✅ Tasks for today: • Call the insurer — 12:00 · Personal ⏰ Overdue: • Water the orchid — yesterday · Home
remind me to take the car to the garage on Thursday at 9
✅ Added to Personal: “Take the car to the garage”, Thursday at 9:00.

Appointments, tasks and birthdays, with how old each person turns. And if I ask for something, it notes it down.

17:49 · A fault
A9
Amsterdam 9bot
📝 New recipe for “the monitoring panel” Cause: the disk came back and the program was left with an empty folder. 1. Restart it To save it, tell Fermín “confirm recipe 22”.
confirm recipe 22
🔧 Monitoring panel repaired in 1 min 43 s, with recipe #22.

The first time, it asks. After that, it fixes it on its own and tells me.

Nobody on call.

Not at night, not on holiday, not when the power goes out.

An ordinary day

Twenty-four hours with nobody on call.

Scroll slowly: the clock moves with you. This is what the server does on a normal day, while I sleep, work or travel.

02:00Backups

Copies everything to another disk.

Photos, documents and every program’s settings go to a second disk. If the first one dies tomorrow, nothing is lost.

03:00AI

The agent reviews the day.

Fermín rereads the day’s conversations and tidies up what it has learned, like someone writing up their notes.

04:15Backups

Takes a snapshot.

A snapshot of the backup goes to a third disk. If I ever delete something by mistake, I can go back to how it was yesterday, a week ago or a month ago.

06:30Backups

Checks the backup actually works.

Seventeen checks: that it’s complete, that it’s from last night and that the disks are healthy. If anything is off, I get an alert.

MorningHome

The awnings come down.

When the sun starts reaching the dining room, the awnings come down on their own. In the afternoon, when it leaves, they go up.

09:00Monitoring

Tells me how the night went.

A summary on Telegram: what was backed up, what failed and whether there’s anything I need to look at.

10:00AI

Organises my day.

Appointments, pending tasks and birthdays, with how old each person turns.

Every 5 minMonitoring

Takes the register.

Checks that every program is running and healthy. If one falls over, it brings it back up without even telling me.

Every 30 sAI

Looks for new faults.

If something turns up that it can’t fix, it studies it, proposes a fix and asks me. The next time, it doesn’t ask.

Around the clockSecurity

Stops the bots.

Programs arrive from the Internet looking for open doors. They’re stopped at the entrance, before they touch anything.

00:00

And round again.

Nobody on call. Nobody got out of bed. Tomorrow, the same again.

The agent

Fermín has the house keys, within limits.

A personal AI agent (Hermes) on Telegram that knows the homelab, searches my notes, controls the house and consolidates its memory every night. But everything important works without it: if it goes down, all that is lost is the chat.

ModelGPT, with DeepSeek as fallback and an alert if it switches
Memory1,998 indexed notes, hybrid search
Home26 Home Assistant actions
Neverfinances or health to the cloud

When the power comes back

0 s
The Mac boots by itself

Automatic login and restart after a power cut, because nobody will be in front of it.

≈1 min
It waits for the disks

If the containers start before the USB disks, they end up with empty folders and still look healthy.

≈4 min
The script checks everything

Containers, mounts, disk errors, lights, cameras in privacy mode, relays, DNS and the Internet edge.

≈6 min
It redoes what the outage interrupted

If the power went out at three, it runs the missing backup, snapshot and verification, in order.

≈7 min
It wakes the agent

The agent gets the report and messages me on Telegram with what happened and what it needs me to do.

Part two

For the curious: how it’s built.

From here on, the technical part: the architecture and how I put it to the test so it learns from every fault.

Architecture

A request passes five doors before it touches any data.

The router only lets the web and the VPN through. Everything else lives inside the house and is reached over Tailscale.

Internet people and bots Home network phones and laptops Router 2 open ports HAProxy passes the real IP CrowdSec bans attackers Traefik TLS and routing PROXY protocol v2 decides every 60 s home DNS goes straight to Traefik Mac Mini M4 Pro · 64 GB 48 containers on OrbStack Cloud, photos and documents Music and audiobooks Home automation (Home Assistant) 8 custom portals Agent memory (RAG) Monitoring and metrics Fermín, AI agent 55 scheduled tasks monitors every 1–15 min The house Zigbee, Shelly, ESPHome, IR remotes, amplifier, awnings, irrigation and a current clamp on the fuse board 24 socat relays NVMe 2 TB live data Storage 10 TB daily copy Backup 11 TB history 6 copies 02:00 → 04:15 → verified at 06:30 Outside the Mac Raspberry Pi with DNS and filtering Raspberry Pi watching from outside Telegram: the alert channel checks the Mac is still alive
From the Internet only the encrypted web is visible. Each door does one thing: the router filters ports, HAProxy keeps track of who you are, CrowdSec decides whether you are a known attacker and Traefik takes you to your service or tells you it doesn’t exist.
Three disks, three roles

Live data sits on an NVMe drive. Every night it is copied to a 10 TB disk, and from there to a third one that keeps three days, two weeks and a month.

Home automation without the cloud

Home Assistant talks to every device through relays on the Mac itself. Lights, awnings and irrigation keep working even if the Internet goes down.

Watchdogs off the disk

The data disk’s watchdog lives on the system disk. If the disk it watches disappears, it stays up and raises the alarm.

Sensitive data stays home

Finances, health and security are computed here. The AI only receives summaries, with no IPs, paths or accounts.

Antifragility

I break it on purpose so it learns.

A robust system survives the blows. An antifragile one comes out of each one better. That is why there is a catalogue of 100 resilience tests: I switch off, kill, freeze or disconnect a component on purpose, measure whether the server notices, whether it fixes itself and how long it takes, and every failure becomes an improvement. It is the chaos engineering of the big platforms, in a home edition.

1Does it notice?

How long it takes for an alarm to go off once something breaks. What nobody sees is the most dangerous part.

2Does it heal itself?

And who does it: Docker itself, the macOS service manager, container remediation or the AI agent.

3In time?

Every test has its own target, from 30 seconds for the proxy to 24 hours for rebuilding everything from backups.

4Does it learn?

A new recipe, a missing watchdog or a corrected setting, so next time goes better.

A hundred tests across five levels

passed healed, but late blind spot found not tested yet

An index earned one blow at a time

0

Nobody noticed.

0.25

The alarm went off, but a person fixed it.

0.6

It healed itself, but late.

0.9

It healed itself, in time.

1

By itself, in time, and nobody at home noticed a thing.

The index runs from 0 to 100, and it started at zero.

It is the average of each test’s latest result, and a catastrophe weighs five times as much as a single component. A test that has never been run counts as zero, so the index cannot be inflated: it measures both how well the system responds and how much of it has been put to the test.

On top of that there is a reward: two points for every test that used to fail and, after the fix, passes. That is exactly what separates antifragile from robust: the system gains from every blow.

100current index, 10 of those points from improvements
99/100tests run so far
56lessons recorded
2:20average minutes to detect the fault
6:37average minutes to repair it

The agent that learns from every fault

Fixed repairs only cover what someone foresaw. For everything else there is an apprentice: it watches every fault, keeps the evidence and proposes how to fix it. A person approves the recipe once; from then on it applies itself, always within a list of things it may never do, such as deleting data or touching security.

  1. 1st time

    It observes and proposesIt keeps the state, the logs and what changed. An AI model, given the data stripped of addresses and secrets, proposes a recipe of at most four steps.

  2. Me

    A person approves itThe agent shows it to me on Telegram and a “yes” saves it, for that component or for every one of the same kind.

  3. 2nd time

    It repairs itselfThe agent applies the steps one by one, checks that it worked and tells me what it did. If it fails three times in a day, it stops and raises the alarm.

Real data is never destroyed.

Things are switched off, killed, frozen or disconnected; corruption and restore tests run on copies, never on the originals.

A failure is a win.

Every test that fails opens a ticket with the lesson learned, gets fixed and is run again. Catastrophes, such as a power cut or a disappearing disk, only with someone present.

Contact

Curious how I built it?

Happy to tell you. Message me on LinkedIn, or have a look at the code: almost all of it is on GitHub.