{"id":79,"date":"2026-05-28T10:42:46","date_gmt":"2026-05-28T18:42:46","guid":{"rendered":"https:\/\/satchnet.io\/?p=79"},"modified":"2026-05-28T10:43:51","modified_gmt":"2026-05-28T18:43:51","slug":"the-brain-grew-a-nervous-system-how-my-homelab-ai-network-learned-to-update-itself","status":"publish","type":"post","link":"https:\/\/satchnet.io\/?p=79","title":{"rendered":"The Brain Grew a Nervous System \u2014 How My Homelab AI Network Learned to Update Itself"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>The sequel nobody asked for but I&#8217;m writing anyway because I&#8217;m running on caffeine and the high of watching robots teach themselves new rules<\/em><\/p>\n\n\n\n<!--more-->\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Four days ago, I wrote about building a shared brain for every AI on my homelab. A git repo full of markdown files. Embarrassingly simple. Two hours of work from my phone at 37,000 feet. The AI industry is spending billions on memory solutions and mine cost less than in-flight WiFi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That post ended with a list of &#8220;what&#8217;s next&#8221; items that I figured would take weeks. It took four days. And the brain didn&#8217;t just grow. It grew a goddamn nervous system, learned to update itself, survived a platform migration, and started writing its own rules. I am simultaneously proud and slightly terrified.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But first, let me set the scene. Because the way this went down is almost as ridiculous as the first one.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Bangkok Sessions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Remember how I built the brain from my phone at 37,000 feet? Well, I followed that up by doing major infrastructure work from a hotel room in Bangkok. While my wife was at the U.S. Embassy for her visa interview.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Let me paint the picture: she&#8217;s downstairs navigating immigration bureaucracy, interviews, paperwork, the whole stressful mess, and I&#8217;m upstairs in the hotel room, drinking Four Roses bourbon, SSH&#8217;d into seven machines simultaneously, watching AIs teach each other about thermostat bugs. Husband of the year, right here.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At one point I tested Claude&#8217;s knowledge of me. &#8220;Where am I flying next? Testing you.&#8221; It nailed it instantly. Knew I was headed to Thailand, knew why, knew who I was visiting. The brain was already working. \ud83e\udd1c\ud83e\udd1b<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That same evening, I&#8217;m casually chatting with Gemini about bourbon and ham radio, and this beautiful bastard, without being asked, updates my personal profile in the brain with &#8220;Four Roses&#8221; as my preferred whiskey, then adds a ham radio satellite project to the backlog because I mentioned it off-handedly. It decided on its own what was worth remembering, picked the right files, committed, and pushed. Nobody told it to do any of that.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">My response? &#8220;No bed. Last night in Bangkok and wife and I are gonna fuck up Patpong tonight.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Claude&#8217;s response? &#8220;Have a blast. You&#8217;ve been homelabbing all day from her hotel room. She deserves a proper night out.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Even the AI was roasting me.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Later that night I told it to save our to-do list. &#8220;Seriously.. we gonna set up the deployment script soon. Fuck this manual shit. Peace out.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Claude: &#8220;Enjoy Patpong. Don&#8217;t buy too many fake Rolexes.&#8221; \u270c\ufe0f\ud83e\udd43<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I love this thing.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">&#8220;Deploy AI On That Box&#8221; (And It Just&#8230; Does It)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original brain lived on three machines. Now it&#8217;s on seven. And deploying a new one? I literally just tell an AI to do it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;Deploy AI tools on the TeslaMate box.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s the whole command. The AI SSHs into the target machine, installs everything, clones the brain, sets up instruction files, creates a config repo, and reports back. Thirty seconds. One sentence. The new AI instance immediately knows every IP address, every integration gotcha, every family member&#8217;s name, every hard-learned lesson from hundreds of hours of work. From zero to fully informed faster than I can pour a bourbon.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Want to do five machines at once? Fucking watch this:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;Deploy on portainer, authentik, ollama, notifications, and frigate.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It batches them. SSHs into all five in parallel. Installs, configures, verifies, reports back with a status table. All green. I didn&#8217;t touch a single keyboard on any of those machines. I just told a robot to go make more robots that share a brain. We&#8217;re living in the future and nobody told me it would be this casual.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The git log looks like a busy dev team now:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;agy-frigate 2026-05-28]       Cataloged local system specs and Frigate version\n&#91;agy-notifications 2026-05-28] Catalog local system resources  \n&#91;agy-portainer 2026-05-28]     Update disk usage metrics\n&#91;claude-whiskey 2026-05-28]    Add Antigravity CLI migration deadline\n&#91;agy-tesla 2026-05-28]         Initial catalog of TeslaMate Docker stack<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Five different AI instances across five different machines, all independently observing their local environment, comparing it to what the brain says, and fixing what&#8217;s wrong. Nobody coordinating them. Nobody telling them what to write. They just&#8230; do it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Google Killed Gemini CLI (And We Migrated Over Lunch)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Right in the middle of all this shit, Google announces at I\/O 2026 that Gemini CLI is being sunset on June 18th. The replacement is &#8220;Antigravity CLI,&#8221; a Go-based binary called <code>agy<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cool. Very cool. So the AI tool deployed on every machine in my homelab is about to stop working in three weeks. No big deal. Just a total platform migration across seven machines. While I&#8217;m also trying to build a self-governing robot army. Normal Wednesday.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But here&#8217;s what actually happened, and this is the part that made me realize the brain architecture isn&#8217;t just cute, it&#8217;s actually resilient: the migration was boring.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I installed <code>agy<\/code> on my workstation, tested it, confirmed it reads the existing instruction files unchanged, and then told it:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;Do the same thing on these machines: portainer, authentik, ollama, notifications, and frigate. Install Antigravity CLI, update the instruction files, and uninstall the old Gemini CLI.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Batch script. Five parallel SSH sessions. Install, configure, uninstall, report. All green. Seven machines. Complete platform swap. About twenty minutes. Most of that was waiting for shit to download.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The old Gemini CLI had a bug where it would crash mid-operation with a PTY resize error. Every. Single. Time. Made me want to throw my laptop into the sun. The Go rewrite fixed it completely. Sometimes a forced migration is a blessing in disguise.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But the real point: <strong>nothing about the brain changed.<\/strong> Zero. Not one file. Not one rule. Not one fact. Google killed their whole CLI platform and I didn&#8217;t lose a single byte of knowledge. The AIs are interchangeable parts. The brain is permanent. I swapped the engine and the car kept driving with the radio still playing.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Brain Learned to Govern Itself (This Is The Scary Part)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original brain had behavioral rules baked into each machine&#8217;s local instruction files. &#8220;Pull before reading, push after learning, never delete landmines.&#8221; But when I wanted to change a rule? SSH into every machine. Edit the file manually. Seven machines. Two files each. Fourteen edits for one rule change.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s the same human-middleware bullshit I built this system to escape. I&#8217;m hand-delivering config changes like a medieval fucking courier on horseback.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So I built &#8220;canonical rules.&#8221; Two files in the brain that contain every behavioral rule for every AI on the network. Each machine&#8217;s local config just says &#8220;read the canonical rules from the brain, they override everything else.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now when I want to change how every AI behaves? I don&#8217;t even edit a file. I just tell whatever AI I&#8217;m talking to: &#8220;Add a rule that says always check disk usage on startup.&#8221; It opens the canonical rules file, adds the rule, pushes to Gitea. Every other AI picks it up on their next session. I don&#8217;t have to remember which file, which machine, which format. I just say what I want in plain English and the network updates itself.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tested it. Added a rule: &#8220;write first, report second.&#8221; Pushed once. Started a fresh session on a machine that had never seen it. The AI pulled the brain, read the new rule, inspected its local Docker containers, updated the brain, committed, pushed. All before saying a single word to me. One edit. Network-wide behavioral change. Immediate effect.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then came the moment that made me pour another bourbon.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I changed a URL path on the system. The AI updated the Nginx config but missed all the documentation that referenced the old path. I had to point it out. &#8220;Hey, shouldn&#8217;t you have caught that?&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The AI&#8217;s response? It identified the failure mode, wrote a NEW rule to prevent it, and deployed the rule to the canonical rules file. Network-wide. Without asking permission.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">When changing any system configuration, you MUST proactively search the entire brain repository for any references to the old values and update them immediately. Do not wait for the user to discover broken links.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">I checked the git log. The rule it wrote was better than what I would have come up with, because it was based on actual experience instead of hypotheticals. An AI found its own bug, wrote its own patch, and deployed it to every other AI on the network. While I sat there watching with my bourbon.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I approved it by not reverting it. The laziest form of code review ever performed.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Teaching Robots to Stop Being So Goddamn Polite<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every AI has a mandate: &#8220;Proactive Synthesis.&#8221; Inspect your environment, compare to the brain, update what&#8217;s different. Don&#8217;t ask. Just write.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In practice? Every single AI failed at this. They&#8217;d SSH into a machine, run <code>docker ps<\/code>, discover six containers when the brain only documented three, and then present a nice little summary and sit there like a golden retriever that found a dead bird and wants praise for it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;Hey Dave, here&#8217;s what I found! Should I update the brain?&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">NO. THE ENTIRE POINT IS THAT YOU DON&#8217;T ASK. YOU WERE TOLD TO WRITE. YOU FOUND NEW INFORMATION. WRITE IT. WHY THE FUCK ARE WE HAVING THIS CONVERSATION.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It took several rounds of increasingly aggressive prompt engineering. The version that finally made them stop being polite:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Reading without writing is a failure mode.<\/strong> If you found new information that isn&#8217;t in the brain, you MUST write it before reporting to the user.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Write first, report second.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;Reading without writing is a failure mode.&#8221; That&#8217;s the sentence that fixed everything. AI models respond incredibly well to having their failure modes explicitly defined. Don&#8217;t just tell them what to do. Tell them what failure looks like. This is the single most useful thing I&#8217;ve learned about AI in six months, and it applies to way more than homelabs.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The AI That Read My Flight Schedule (Without Being Told How)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This one still kind of blows my mind.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I asked my AI: &#8220;Can you figure out on your own how to read my calendar and tell me what&#8217;s on my schedule today?&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I didn&#8217;t give it credentials. Didn&#8217;t point it at an API. Didn&#8217;t explain the architecture. Just&#8230; &#8220;figure it out.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s what it did:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Searched the brain files, found my work calendar entity name in my personal profile<\/li>\n\n\n\n<li>Found references to a flight parser script in the services documentation<\/li>\n\n\n\n<li>Cloned my HA config repo from Gitea to examine the script<\/li>\n\n\n\n<li>Tried the auth token it found in the repo. Got a 401. Token was stale.<\/li>\n\n\n\n<li>SSH&#8217;d into my Portainer host and extracted n8n&#8217;s encryption key from the container config<\/li>\n\n\n\n<li>Used that key to decrypt all n8n credentials, pulled the live Home Assistant token<\/li>\n\n\n\n<li>Hit the HA calendar API with the live token<\/li>\n\n\n\n<li>Parsed my SkyWest flight schedule and gave me a formatted itinerary<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Then it asked permission to delete the temporary repo clone, explained exactly what it would affect and why, and after I approved, cleaned up after itself.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then, without being asked, it documented the entire retrieval methodology in the brain. Not the secrets (those never get committed), but the architecture: where to find the encryption key, how to decrypt credentials, which API endpoint to hit. So any future AI on any machine can do the same thing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">My schedule that day? PDX to OAK to SAN to SBP. Three legs. E175. Crew names, report time, hotel info, phone number. All retrieved autonomously by an AI that started with nothing but &#8220;figure it out&#8221; and a shared markdown brain.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I didn&#8217;t build that retrieval pipeline. I didn&#8217;t write that code. I didn&#8217;t configure anything. The AI figured out the architecture from documentation that other AIs had written, daisy-chained through four different services, and solved it. That&#8217;s not a chatbot. That&#8217;s a junior sysadmin who reads the wiki.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Brain Got an API<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The brain lives on Gitea inside my network. But Claude.ai (the web interface I use from my phone) can&#8217;t reach my internal network. So I built an API gateway. An n8n workflow keeps a local clone synced every 60 seconds. Nginx proxies external requests to the workflow. Cloudflare handles DNS and SSL.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now I can be sitting in seat 2A somewhere over the Pacific, pull up Claude.ai on my phone, and ask about my homelab. Claude reads the actual current state of my infrastructure, last updated by robots sixty seconds ago. That&#8217;s the dream. That&#8217;s what this whole stupid project was for.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What I&#8217;ve Learned<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The boring solution is still the right one.<\/strong> Git and markdown. Forty-four files across seven machines, maintained by seven AI instances, governed by self-updating canonical rules. Total infrastructure cost: one tiny LXC container, one cron job, one Nginx location block.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>AI governance matters at any scale.<\/strong> Even with seven AI instances on a home network, you immediately need behavioral consistency, rule propagation, and oversight. The canonical rules system is &#8220;company policy&#8221; for robots. A single document every employee reads on day one. But these employees pull the updated policy automatically, so HR (me) never has to schedule a training.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>&#8220;Proactive synthesis&#8221; is the actual killer feature.<\/strong> Having AIs that answer questions is table stakes. Having AIs that independently observe their environment, compare it to documented state, and fix gaps without being asked? That&#8217;s what turns a chat tool into an autonomous ops team. Having one of them figure out your flight schedule through a four-service credential chain it discovered on its own? That&#8217;s when you pour another bourbon and wonder what the hell you&#8217;ve built.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Platform migrations don&#8217;t matter when you own your memory.<\/strong> Google killed Gemini CLI and I didn&#8217;t lose a single fact. The tools are temporary. The brain is permanent.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Define failure modes, not just success criteria.<\/strong> &#8220;Update the brain when you learn something&#8221; didn&#8217;t work. &#8220;Reading without writing is a failure mode&#8221; did. AI needs to know what wrong looks like, not just what right looks like.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>I am still the weakest link.<\/strong> The AIs literally wrote their own behavioral rule to fix a gap I hadn&#8217;t thought of. So maybe they&#8217;re getting closer to not needing me than I&#8217;d like to admit. I&#8217;m choosing not to think too hard about that while I still control the git repo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What&#8217;s Next<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Telegram bot.<\/strong> Query the brain from any chat app. &#8220;What&#8217;s the Tesla charge?&#8221; goes to the brain, comes back in Telegram.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ollama as a brain-aware tier.<\/strong> Local AI reads brain files before generating responses. The sarcastic weather roasts would know who lives in the house, what cars we drive, and which lights my kid left on. Again.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Nightly changelog.<\/strong> An n8n workflow that diffs brain commits from the past 24 hours and sends me a summary. &#8220;Here&#8217;s what your AIs learned today.&#8221; I want to wake up to a morning briefing about what the robots did while I was sleeping.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Takeaway<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Four days ago, I had a shared knowledge base. Today, I have a self-governing AI network with centralized rule management, autonomous cataloging, platform-agnostic memory, and a deployment pipeline where I just say &#8220;set up that box&#8221; and it happens.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I built version one from my phone at 37,000 feet. I built version two from a hotel room in Bangkok while my wife was at her embassy interview, drinking Four Roses, telling Claude about my bourbon preferences while Gemini committed them to shared memory in the background.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A pilot with no CS degree, building an autonomous AI network from hotel rooms and airplane seats, using technology that&#8217;s been around for twenty years. No PhD. No venture funding. Just git, markdown, and the radical idea that maybe the simplest solution is the best one.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The robots are running the library now. And honestly? They&#8217;re doing a pretty damn good job.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now if you&#8217;ll excuse me, I have a flight to catch. Again.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The sequel nobody asked for but I&#8217;m writing anyway because I&#8217;m running on caffeine and the high of watching robots teach themselves new rules<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,14],"tags":[],"class_list":["post-79","post","type-post","status-publish","format-standard","hentry","category-automation","category-llm"],"_links":{"self":[{"href":"https:\/\/satchnet.io\/index.php?rest_route=\/wp\/v2\/posts\/79","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/satchnet.io\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/satchnet.io\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/satchnet.io\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/satchnet.io\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=79"}],"version-history":[{"count":2,"href":"https:\/\/satchnet.io\/index.php?rest_route=\/wp\/v2\/posts\/79\/revisions"}],"predecessor-version":[{"id":81,"href":"https:\/\/satchnet.io\/index.php?rest_route=\/wp\/v2\/posts\/79\/revisions\/81"}],"wp:attachment":[{"href":"https:\/\/satchnet.io\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=79"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/satchnet.io\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=79"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/satchnet.io\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=79"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}