AI Agents, Self-Hosting, and Learning to Let Go of the Code
It’s been a busy few weeks. Between launching the website, testing new models, and handing more and more of my infrastructure over to AI agents, there’s a lot to write up. So here’s a bit of a grab-bag update.
Prompt Caching Works… Mostly
I learned that prompt caching is a real thing, and when it works, it works well — noticeably faster responses and lower costs on repeated context. The catch: if you’re running Anthropic’s models through OpenRouter, caching appears to be broken, or at least it needs some agent-side configuration I haven’t cracked yet. If anyone’s figured out the right flags to get this working through OpenRouter, I’d love to hear about it.
The Website Is Live
I finally pulled the trigger and released the site: ajvc.dev
The fun part isn’t just that it’s live — it’s how it’s being run. The site is maintained by a dedicated instance of Hermes (my AI agent harness). It pulls articles from RSS feeds, summarizes them, and posts links to the ones it finds interesting.
Working on the site has honestly been a joy. I tell Hermes what I want in plain English, it goes off, makes the changes, and deploys them straight to production. It’s like having a small team of developers and DevOps engineers on call — except I never have to review a PR at 11pm. It’s freed me up to focus on what the site should do rather than how it’s built.
The Self-Hosted Stack
I got some good feedback on earlier posts asking me to add more detail and links to the projects and systems I self-host. Here’s the current lineup:
- Tiny Tiny RSS — self-hosted RSS reader, feeds the article pipeline
- Ollama — local LLM runtime for models I run on my own hardware
- Home Assistant — home automation hub
- Joplin — my note-taking app of choice
- Joplin Server — the self-hosted sync backend for Joplin
- Hermes — my personal AI agent harness that ties a lot of this together (more on it below)
- Honcho — memory/context layer I’m experimenting with for agent state
- Hugo — static site generator powering ajvc.dev
- Fly.io — hosting for the site and a few of the services above
I’ll probably do a dedicated post on how these all fit together at some point, since a few people asked for that specifically.
Skills Are Portable
Been testing more things on a spare Hermes install. One nice discovery: migrating skills between instances is trivial — just copy the relevant folder from .hermes/skills over to the new instance. No export/import dance, no config wrangling. It just works.
Prompting as the Next Abstraction Layer
The more I do this, the more prompting feels like just another layer in the same stack we’ve always had: assembly, then compilers and interpreters, and now prompting — with the added twist that it also handles deployment and execution.
I keep coming back to something Linus Torvalds has said: we don’t say an app was “developed with compilers,” so why do we insist on saying it was “developed with AI”? At some point this stops being a novelty and just becomes how software gets built.
Testing MiniMax M3
Found MiniMax M3 and it looks promising — testing is ongoing. Early impressions:
- Slower than DeepSeek V4 Pro
- Needs more hand-holding overall
- Got stuck in a loop once when I asked it to make some fairly simple changes to the website
- Much cheaper than even DeepSeek, which counts for a lot
A Confession: I Started Vibe Coding
I’ll be honest — vibe coding has pulled me away from my original intent of using AI to learn broadcasting principles. What started as “let AI help me understand the fundamentals” has drifted into “let AI just build the thing.” Not necessarily a bad outcome, but worth naming, since it’s a different goal than the one I started with.
Case in point: I spent the past month vibe-coding an app to help me analyze logs, mostly using MiniMax M3, and ended up with a working app.
Then I Brought in Claude Code
A few days ago I switched over to Claude Code with Sonnet 5 to review the log-analysis codebase for issues. In under five minutes it found a number of problems — and then just went ahead and fixed them.
Some observations comparing the two:
- Autonomy: Claude needs a lot less hand-holding than MiniMax. MiniMax keeps asking for permission before it does things; Claude just goes ahead and does them.
- Editing style: Claude edits code directly. MiniMax M3 tends to write helper scripts to make the edits instead, which is slower and leaves scripts sitting around on the filesystem afterward. I eventually gave it strict instructions to always clean those up when it’s done.
- Token usage: The biggest downside with Claude is that it burns through tokens much faster. But it gets to the result faster too, and more often than not you get a working result on the first prompt.
The Joplin Notes API: A Case Study
This one’s worth its own section. I wanted a way for Hermes to read my Joplin notes. MiniMax M3’s best solution was a port redirect of the Web Clipper running on a Windows VM with the Joplin client installed — functional, but very resource-hungry.
I asked Claude to solve the same problem. In under five hours, I had a working API running in a Docker container right next to the Joplin Server — a fraction of the resource footprint.
Claude wrote the entire thing. I gave it a test VM to build and run against, installed Docker and the dependencies, and let it iterate until everything was tested and working. Once satisfied, it committed the code to a GitHub repo on its own, then walked me through configuring the Docker Hub API so it could set up GitHub Actions to auto-deploy the container to Docker Hub.
Links if you’re interested:
The Catch
The biggest downside with Claude right now is access. Using it on Hermes requires API access, and that doesn’t appear to be included in the Pro plan as far as I can tell. So for day-to-day agent work I’m still on MiniMax M3 — now through OpenRouter, since I cancelled my direct MiniMax plan.
That’s the state of things for now. More to come as I keep pushing on the Hermes setup and figure out what else I can hand off.