In a previous post I described handing management of my homelab over to Claude Cowork, checking for software updates, validating config changes, and rolling back when something goes wrong. That’s the day-to-day loop. What I haven’t written about yet is the layer underneath it: a custom “skill” I built that gives Claude a written memory of how my homelab actually works, so it stops re-learning the same lessons the hard way.

What a skill actually is

A skill is just a file, mostly plain markdown, that Claude reads before doing a certain kind of task. Think of it as a runbook, except it’s written for an AI instead of for a person joining the team. You tell Claude when to load it (“before touching this project” or “before editing this config”) and what’s in it, and it uses that as context for the work instead of starting from a blank slate every time.

One reason skills are important: Claude starts from zero every time

This is the part that isn’t obvious if you haven’t spent time thinking about how these tools actually work under the hood. Every new session starts with far less understanding of what’s going on than you’d assume from talking to it. There’s no persistent memory of your specific setup carrying over on its own from one conversation to the next.

It’s a bit like the difference between asking a baker to make a cake and asking someone who has never baked before to do it. The experienced baker needs almost no instruction, they already carry all the context. The person who has never done it needs the recipe, the technique, and probably a few warnings about what goes wrong if you skip a step. Claude, at the start of a new session, is a lot closer to that second person than people tend to assume.

Here’s the mechanical reason why: every request sent to Claude, or any LLM, has to include all of the relevant context for that conversation, every time. There’s no running memory sitting in the background filling in gaps on its own (caching aside, that’s a separate detail and doesn’t change the basic point).

It’s not only new sessions either. Context can also thin out mid-session, once a conversation runs long enough that older parts get compacted to make room for new ones. Either way, the specific details I’d rather not have to repeat, or worse, have quietly dropped partway through a long working session, are exactly what a skill is meant to protect against. I built my home lab skill because I wanted my home lab’s context encoded somewhere durable that I could call on whenever I needed it, rather than trusting that a given session would still have all of it in view the next time I needed something done. Additionally, keeping the home lab context in a file ensures I can call upon the information during any session, whether I started it manually or through a scheduled task.

How I actually built it

Rather than write the skill file by hand, I built it conversationally. I opened a chat with Claude and set the expectation up front: “In this session I am going to describe to you how my home lab is setup. What the major components are, how to access them, and then build out some of the major components involved. The intent in the end is to build out a skill you can use to help me manage my home lab.”

From there I just talked it through, the same way I’d walk a new hire through the environment on their first day:

  • I described my Proxmox cluster, two nodes plus a quorum device running on a small always-on Pi, and that Claude could reach everything over SSH through the macOS shell MCP, with the Proxmox CLI tools available on either cluster member.
  • I explained that once a VM is found, it’s reachable the same way over SSH, and that every VM is provisioned through cloud-init.
  • I walked through the k3s cluster: how to access it, and specifically how to upgrade it.
  • I pointed out that GitLab is reachable the same way, through the same MCP using glab, and that a specific repository, flux-learning, is what actually manages the software running in k3s.
  • I spelled out the upgrade procedure I wanted followed exactly: check whether a Helm chart update requires any configuration changes first. If it does, stop and flag it for me rather than guess. If it doesn’t, upgrade one patch release at a time, confirming the service is still available at each step before moving to the next.
  • I flagged the components that need extra care, especially the CSI drivers that connect to TrueNAS for storage, and made clear that TrueNAS itself is the single most important system in the whole environment. If anything is going to get careful treatment, it’s that.

That one conversation became the seed of the skill file. Claude turned what I described into the actual reference document, and I’ve refined it since as new gotchas turn up.

That’s how I ended up with the specific rules that are actually in the file today, things like:

  • Which SSH key is used for which generation of hosts, and the rule to always verify the actual key fingerprint on the target host rather than trusting a file that maps hosts to key names. This is important because some of my VMs run older operating systems while others run newer versions. The newer versions want ed25519 keys instead of the older RSA based keys.
  • The fact that I run two separate Kubernetes clusters, not one, and which one a given service actually lives in.
  • Conventions for how my reverse proxy is configured, including a couple of gotchas that produce confusing, silent failures if you don’t know to look for them.
  • A blunt reminder, based on real experience, to verify before “correcting” anything that looks like it doesn’t match the rest of the fleet.

None of this is exotic. It’s the accumulated scar tissue of a home lab that’s grown over time and has a few intentional exceptions mixed in with the accidents.

Don’t forget that AI is not human

In this post I have used words like “learn” and “remember” and it’s tempting to picture Claude as something quietly sitting there, mulling things over between conversations. That’s not what’s happening. Claude isn’t awake on a Sunday afternoon wondering how my cluster is doing. It’s a tool that responds to events and nothing more. Something triggers it, a message I send, a scheduled Cowork job kicking off, a webhook firing, and it processes that one event using whatever context comes along with it. Except when a task requires waking up later to check on results, when that request finishes, there’s no computation left running in the background, no thinking happening, no waiting around.

The state does exist though, in various forms, that’s the whole point of the skill file and the rest of the memory system, it just doesn’t live inside Claude the way it would in something with a continuous inner life. It lives externally, in files, in memory during a session, and gets handed back in as part of the context on the next request. So there is an ongoing record of what’s been learned, it’s just sitting in storage rather than being actively thought about while nothing is happening. The difference matters: nothing is being pondered between sessions, but the accumulated understanding hasn’t gone anywhere either, it’s just waiting to be read back in.

I don’t think this makes it less useful. If anything, it makes it easier to reason about. A tool that reacts predictably to whatever input and context it’s given is simpler to trust than one you’ve started imagining has moods, motivations, or a life going on when you’re not looking. It’s not a coworker quietly thinking about my proxy server in the background, it’s closer to a very capable specialist who shows up completely for exactly as long as the job takes, reads the notes that were left for them, does the work, and then is gone until the next event calls them back.

One practical consequence of all this, outside of whatever a skill or the broader memory system supplies: two separate chat windows, with no shared skill or memory feeding them the same context, can end up behaving quite differently from each other, even contradicting one another, on what looks like the same question. It’s not being inconsistent in the way a person with a bad memory might be, there’s no single Claude comparing notes with itself in the background. Each window is only as good as the context it happens to be carrying, and if that context differs, the answers reasonably can too. That’s actually another argument for skills and memory being worth the effort, they’re what make behavior consistent across sessions, and even across different people on the same team, rather than leaving it to whatever context each conversation happened to accumulate on its own.

There is an advanced edge case where you can train a model further with your specific data, but that’s beyond what most people would ever need to do.

In general

Claude handles the ongoing maintenance loop. The skill is more like giving Claude the notes I’d hand a new person if they were about to touch this infrastructure for the first time, so it doesn’t have to relearn the same lessons I already paid for. I expect this file to keep growing as new gotchas turn up, which is really just the normal cost of running anything for long enough.

This post was coauthored with Claude. If you have any thoughts or feel I got anything wrong, let me know in the comments.

A few months ago I started a pro subscription to Claude in an effort to learn how to use generative AI. I wanted to understand what it could and couldn’t do well. In this post I will cover a few of the ways I have found to use Claude and generative AI in general. The vast majority of the time I interact with Claude.ai using the desktop app and I leverage plain Chat, Cowork and Code. These are quick and simple examples and not an exhaustive description of how I am using it. My use of AI is centered mostly around “technology” rather than spreadsheets, email or other use cases you routinely see advertised. Being honest, I find AI to be less ideal for those use cases as of today but I also don’t try, your mileage may vary.

If your understanding of what AI can do is based solely what “Apple Intelligence” or from the abundant horror stories you find on the web, I encourage you to consider more full feature solutions like OpenAI’s ChatGPT and related systems or Anthropic’s Claude. These are far more capable AI solutions that, while they may not tie into your data the way Apple Intelligence [poorly] does, are capable of a lot more.

Chat

Claude has nearly completely replaced my use of search engines for most operations that might require reading multiple pages to get an answer. Claude’s ability to take in information, dedupe and summarize it based on what I’m really looking for in a matter of seconds removes a lot of friction and helps answer questions quicker. A recent example of how to utilize Claude was to find parts for my mower. I know that while it is branded “Craftsman” it is actually sold under multiple names and tracing this back can be difficult. Giving Claude the make and model number and asking it to find the correct replacement rear wheels gave me the exact part numbers for various makes as well as the fact the part number mentioned in the owners manual has been superseded with an improved design. Doing this myself would have taken significantly longer.

Through various connectors, capabilities and MCP servers, Claude also helps me to:

  • manage my music collection as well as find new music based on my purchases and listening habits
  • help get unstuck in a game I am playing while avoiding spoilers
  • find and resolve banking discrepancies
  • manage my home lab inventory
  • much more

All of this is done using plain language to tell Claude what I want and it takes care of it. When it is unsure of how to proceed it asks.

Chat is also where I typically work with Claude to help debug issues I run into which can range from simply asking it questions about the best way to get a stain out of something to pasting in large log files to pin point a root cause.

Cowork

To be honest, the distinction between Chat and Cowork in Claude is a bit loose to me as there is a lot of overlap between what each can do. The difference in Cowork is it shows you a plan and you can schedule the tasks to be run periodically. That said, I have largely handed management of my entire home lab over to Cowork. My home lab consists of multiple Proxmox instances running various VMs and a k3s based Kubernetes cluster. I described to Claude Cowork how to access all resources, the location of my FluxCD repository and put it in charge of managing software versions, resolving issues and so on. Claude examines the software that is installed, checks for updated versions, validates the configuration has changed and ensures software upgrades cleanly. If there is an issue where it can rollback it does, if it can’t it alerts me through email of any potential or current issues it can’t cleanly resolve. Claude also has access to my Cloudflare account for Zero Trust and DNS management meaning I can add software using plain language. I describe to Claude what new software I want to add, it adds it to the FluxCD project and configures ingress through Cloudflare.

Code

Code behaves differently from the other two parts in a meaningful way. It has more direct file and remote system access meaning it doesn’t have as strict of requirements for accessing files on the local system or accessing remote systems through ssh. I have used Code extensively to update plugins/themes on this site, resolve font loading issues and more.

I have also used Claude Code to create a few projects including:

  • Raspberry Pi based streaming music player that can stream my music from Plex but give me physical controls like an old CD player.
  • Port my old ControlPlane app from Objective-C to Swift and modernize it.
  • Various small utility apps like a daemon for Linux that sets the RGB lights on my otherwise unsupported keyboard to white and a tone generator for testing audio equipment.

In General

Overall, Claude has proven to be well worth the monthly subscription cost and is not something I want to give up. While I can do a lot of what it can, it can do it more quickly and a lot of the times more accurately than me. It makes mistakes the same way I could and I can guide or redirect it as required. Allowing Claude to manage my home lab frees me from doing more tedious work and gives me time back.

Claude and AI in general can certainly make mistakes. You do still need to validate information it gives you and be aware that, like people, it can get confused and be confidently incorrect. While doing some vehicle research I found that Claude would repeatedly bring in details from a previous model of a vehicle I was looking at. I had to be very specific about the exact year and model name I was looking for and ask it to find sources. This has happened less as models improve but I have also learned how to better prompt the AI for what I am looking for.

In a future post I will dig a bit deeper into how I prompt Claude and ensure it is doing what I want with guardrails in place to stay as safe as I can while still getting real work done.