A practical notebook for systems that run at home.

I’m Shane, a systems administrator documenting the systems I build and the problems I solve—from self-hosting and local AI to networking and smart-home tech. Start here: Local AI in my homelab, how I deploy this blog, and a practical memory design.

Bringing Siseli Inverter Telemetry into Home Assistant Locally

While I was in Jamaica, I set up a PowMr inverter with a Siseli-compatible Wi-Fi dongle. The vendor app could see the inverter, but I wanted useful, current telemetry in Home Assistant without making the cloud app stop working. I already had the Siseli Inverter Bridge integration in Home Assistant. The missing piece was a reliable local path for live readings. I used Codex as a pair programmer while I captured and inspected the traffic, worked out the Modbus request format, and built a small read-only polling path. ...

October 28, 2026 · 5 min · Shane Greaves
Two graphics cards connected to a local language model node

Two RTX 3060s, One Local 27B Model, and a GPU Unlock Experiment

I wanted a local model that was good enough to use for real work, not just a small demo. My current favorite is a 27B Qwen model, so instead of swapping it out for something smaller, I put two 12 GB RTX 3060s to work in the same inference box. The machine is called Moqorro. It runs Debian 12 and serves the model through the CUDA build of llama.cpp. Marwyn, my Hermes agent, can select this local model for private tasks while keeping its usual cloud model as the default. ...

October 26, 2026 · 4 min · Shane Greaves

Token Economy Audit: Preserving Metered LLM Quota

When you run an AI agent on metered LLM providers — subscription plans with session windows, weekly allotments, and fallback headroom — the constraint isn’t cost per thousand tokens. It’s quota burn rate: how fast you exhaust your session window or weekly limit, and how much of that burn is structural waste you never see. I run Hermes Agent on Ollama Cloud as my primary provider, with OpenAI Codex and OpenRouter as fallback lanes. Ollama Cloud has a ~5-hour session limit and a weekly allotment that resets Sunday evening. There’s no live remaining-quota API. When you hit the wall, the agent stops working until the window resets. ...

July 3, 2026 · 9 min · Shane Greaves
A small active memory layer connected to a larger searchable archive

Tiered Memory Graduation: Don't Delete, Promote

When you run an AI agent like Hermes Agent with a memory system, you quickly hit a wall: the built-in memory has a hard character limit. When it’s full, the agent silently deletes old entries to make room for new ones. Those facts — important enough to survive in the memory budget for weeks — just vanish. This is a known problem in the Hermes Agent community. Users on r/hermesagent regularly ask about memory management. The built-in memory (MEMORY.md and USER.md) is capped at roughly 2,200 and 1,375 characters respectively. When you hit the cap, the agent is expected to “consolidate, replace, or remove” entries. But there’s no documented guidance on what happens to evicted facts. ...

July 3, 2026 · 5 min · Shane Greaves

Fixing Empty Responses from a Local LLM

The Symptom I spent some time chasing a frustrating failure mode in a self-hosted agent stack: the model was clearly alive, but some requests came back empty, or with enough hidden reasoning overhead that the whole system felt sluggish. The confusing part was that the usual “is the service up?” checks all looked fine. The API responded. The model was loaded on the GPU. Short prompts worked. Health checks passed. But once the prompts got larger, the system started to misbehave in ways that were hard to separate: ...

May 31, 2026 · 3 min · Shane Greaves
A source repository flowing through build and deployment stages to a running service

Automating Hugo Blog Deployment with Gitea Actions and Ansible-Pull

Introduction Today I modernized my Hugo blog deployment pipeline by replacing a Rundeck webhook with a fully automated Gitea Actions workflow using ansible-pull. This was a fantastic learning experience that taught me about pull-based configuration management and GitOps principles. The Old Way: Rundeck Webhook Previously, pushing to the main branch would trigger a Rundeck webhook that orchestrated the entire build and deployment process. While this worked, it had some drawbacks: ...

October 19, 2025 · 4 min · Shane Greaves

Swarm Ingress with frr

I’m running a 3 node Docker Swarm cluster running one manager and two workers. I’ve been in the process of gradually migrating my services over to the cluster. I am at the point now where I want to set up a traefik reverse proxy instance inside the swarm. I’m currently running two traefik reverse proxy instances on standalone docker instances, one for internal services and the second handles external services that come in via a Cloudflare tunnel in my DMZ network. I’m migrating the internal instance to the swarm cluster. I am at the point now where I am thinking about how to handle cluster ingress. There are a few options available: ...

When Thinking Breaks Your Tools: Debugging Qwen Tool-Calling Corruption

The Symptom Cron jobs started returning this odd refusal: [System Limitation Notice] I am an AI assistant and cannot actually execute bash scripts... Except the agent can execute bash. That’s literally its job. The refusal was fake — a content filter hallucination triggered by something else going wrong deeper in the stack. The Real Problem Qwen3.5 was dumping its internal reasoning monologue into the tool-calling JSON. When calling Qwen via OpenAI-compatible /v1/chat/completions with tool definitions, the model should generate clean JSON like: ...

June 2, 2025 · 3 min · Shane Greaves

Week12

Added Obsidian to my workflow Week 12 was a very productive week for me. While I have been using obsidian for the last couple of months, I had not committed to it fully. I was ignorant of its potential or the possibilities. I did have a problem to solve, I’ve been using Standard Notes for the last couple of years and I was not very happy with it. It’s seemed like I needed to pay for it to be able to access the features that would get my notes to function as my second brain. I installed and reviewed zettlr thinking I could use it to manage my blog post. I watched a few zettlr vs Obsidian youtube videos which show me that I was only scratching the surface with Obsidian. I went down the rabbit hole on the zettelkasten method and I decided to make an effort to organize my second brain. ...

First Post on Hugo Blog

Hello World! I have been meaning to resurrect my blog for quite awhile but after getting distracted by various shiny things. The hardest part was deciding what tools to use. I thought about using WordPress but opted to move to using ghost. After getting Ghost up and running I thought it was too heavy and I needed only a static site. Hugo is up and at some point I am going to move all the post over from my old WordPress blog. ...