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. ...
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. ...
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. ...
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: ...
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: ...
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: ...
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. ...
Freenas and CyberPower UPS
I got a CyberPower UPS to protect my Freenas box. I connected the included UPS cable and I noticed these errors in dmesg and the UPS service would not start. ugen2.4: at usbus2 (disconnected) ugen2.4: at usbus2 ugen2.4: at usbus2 (disconnected) ugen2.4: at usbus2 ugen2.4: at usbus2 (disconnected) ugen2.4: at usbus2 ugen2.4: at usbus2 (disconnected) ugen2.4: at usbus2 ugen2.4: at usbus2 (disconnected) ugen2.4: at usbus2 ugen2.4: at usbus2 (disconnected) ugen2.4: at usbus2 ugen2.4: at usbus2 (disconnected) ugen2.4: at usbus2 ugen2.4: at usbus2 (disconnected) ugen2.4: at usbus2 ugen2.4: at usbus2 (disconnected) ugen2.4: at usbus2 ugen2.4: at usbus2 (disconnected) ugen2.4: at usbus2 ugen2.4: at usbus2 (disconnected) ugen2.4: at usbus2 ...