<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>fosstog - local-ai</title>
      <link>https://fosstog.com</link>
      <description>Free &amp; Open Source Photography</description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://fosstog.com/tags/local-ai/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Wed, 27 May 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>Down the Agentic AI Rabbit Hole</title>
          <pubDate>Wed, 27 May 2026 00:00:00 +0000</pubDate>
          <author>ganthore</author>
          <link>https://fosstog.com/blog/agentic-ai-rabbit-hole/</link>
          <guid>https://fosstog.com/blog/agentic-ai-rabbit-hole/</guid>
          <description xml:base="https://fosstog.com/blog/agentic-ai-rabbit-hole/">&lt;p&gt;&lt;strong&gt;TL;DR&lt;&#x2F;strong&gt;: I’ve been building out a full agentic AI stack — local GPU compute through &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;lemonade-server.ai&#x2F;&quot;&gt;Lemonade&lt;&#x2F;a&gt; and &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;rocm.docs.amd.com&#x2F;&quot;&gt;ROCm&lt;&#x2F;a&gt;, heavily customized &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;opencode.ai&#x2F;&quot;&gt;OpenCode&lt;&#x2F;a&gt; and &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;claude.ai&#x2F;code&quot;&gt;Claude Code&lt;&#x2F;a&gt; setups, and a web-style agent called &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;GaiaNet-AI&#x2F;gaianet-node&quot;&gt;Gaia&lt;&#x2F;a&gt; running on local hardware. It’s excessive. I love it.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Section&lt;&#x2F;th&gt;&lt;th&gt;Summary&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fosstog.com&#x2F;blog&#x2F;agentic-ai-rabbit-hole&#x2F;#local-compute-lemonade-rocm&quot;&gt;Local Compute: Lemonade + ROCm&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;GPU-accelerated local inference on AMD hardware&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fosstog.com&#x2F;blog&#x2F;agentic-ai-rabbit-hole&#x2F;#opencode&quot;&gt;OpenCode&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;Wiring up a local-model coding agent with MCP&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fosstog.com&#x2F;blog&#x2F;agentic-ai-rabbit-hole&#x2F;#gaia&quot;&gt;Gaia&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;AMD’s local agent platform, packaged for Arch&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fosstog.com&#x2F;blog&#x2F;agentic-ai-rabbit-hole&#x2F;#claude-code&quot;&gt;Claude Code&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;What I’ve been building on top of it&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;At some point I went from “casually interested in AI tooling” to “I have an Ansible playbook managing a local model farm and I’m weirdly proud of it.” Hard to say exactly when that happened. Doesn’t matter. Here’s what I’ve been building.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;local-compute-lemonade-rocm&quot;&gt;Local Compute: Lemonade + ROCm&lt;a class=&quot;post-anchor&quot; href=&quot;#local-compute-lemonade-rocm&quot; aria-label=&quot;Anchor link for: local-compute-lemonade-rocm&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;The foundation is &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;lemonade-server.ai&#x2F;&quot;&gt;Lemonade&lt;&#x2F;a&gt;, an AMD project that serves LLMs locally with full GPU acceleration through &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;rocm.docs.amd.com&#x2F;&quot;&gt;ROCm&lt;&#x2F;a&gt; and &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.vulkan.org&#x2F;&quot;&gt;Vulkan&lt;&#x2F;a&gt;. It runs an OpenAI-compatible API locally, which means anything that talks to OpenAI can be pointed at your own hardware instead. Under the hood it’s &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ggml-org&#x2F;llama.cpp&quot;&gt;llama.cpp&lt;&#x2F;a&gt; doing the actual inference work.&lt;&#x2F;p&gt;
&lt;p&gt;The machine behind all of this is a &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.amd.com&#x2F;en&#x2F;products&#x2F;processors&#x2F;desktops&#x2F;ryzen&#x2F;7000-series&#x2F;amd-ryzen-9-7950x3d.html&quot;&gt;Ryzen 9 7950X3D&lt;&#x2F;a&gt; paired with a &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.amd.com&#x2F;en&#x2F;products&#x2F;graphics&#x2F;desktops&#x2F;radeon&#x2F;9000-series&#x2F;amd-radeon-rx-9070-xt.html&quot;&gt;Radeon RX 9070 XT&lt;&#x2F;a&gt;. The 7950X3D handles CPU inference and anything that doesn’t need the GPU; the 9070 XT takes everything ROCm can throw at it. One wrinkle: the board also has an integrated GPU, and ROCm’s idea of a good time is apparently enumerating both and then crashing. A one-line config isolating the dGPU fixed it, but it’s the kind of thing you only find out about after you’ve already stared at a crash log for longer than you’d like to admit.&lt;&#x2F;p&gt;
&lt;p&gt;Getting ROCm working on &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;archlinux.org&#x2F;&quot;&gt;Arch Linux&lt;&#x2F;a&gt; is the kind of experience that makes you briefly consider a career in farming, but once it finally clicked — aye god — I had a local inference server actually using my GPU instead of farming the work out to a data center somewhere in Virginia.&lt;&#x2F;p&gt;
&lt;p&gt;The current roster of models I’m actually using:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;huggingface.co&#x2F;Qwen&#x2F;Qwen3.5-9B&quot;&gt;Qwen3.5-9B&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; — the main workhorse, solid general-purpose performance at a size that doesn’t require a prayer before each inference&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;huggingface.co&#x2F;Qwen&#x2F;Qwen3.5-4B&quot;&gt;Qwen3.5-4B&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; (via vLLM) — when you want Qwen but faster and cheaper&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;ai.google.dev&#x2F;gemma&quot;&gt;Gemma 4 4B&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; — Google’s efficient 4B, punches above its weight for general tasks&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;huggingface.co&#x2F;HuggingFaceTB&#x2F;SmolLM3-3B&quot;&gt;SmolLM3-3B&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; — HuggingFace’s 3B model, absurdly capable for its size&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Tongyi-MAI&#x2F;Z-Image&quot;&gt;Z-Image-Turbo&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; — Alibaba TongYi’s image generation model, currently sitting at #1 open-source on the text-to-image leaderboard; yes I’m generating images locally too&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Laid out as a table, because that’s the kind of thing a table is for:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Model&lt;&#x2F;th&gt;&lt;th&gt;Size&lt;&#x2F;th&gt;&lt;th&gt;Backend&lt;&#x2F;th&gt;&lt;th&gt;Where it earns its keep&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;huggingface.co&#x2F;Qwen&#x2F;Qwen3.5-9B&quot;&gt;Qwen3.5-9B&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;9B&lt;&#x2F;td&gt;&lt;td&gt;llama.cpp&lt;&#x2F;td&gt;&lt;td&gt;The workhorse — general-purpose, big enough to trust on most things&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;huggingface.co&#x2F;Qwen&#x2F;Qwen3.5-4B&quot;&gt;Qwen3.5-4B&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;4B&lt;&#x2F;td&gt;&lt;td&gt;vLLM&lt;&#x2F;td&gt;&lt;td&gt;Qwen quality at higher throughput when latency matters&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;ai.google.dev&#x2F;gemma&quot;&gt;Gemma 4 4B&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;4B&lt;&#x2F;td&gt;&lt;td&gt;llama.cpp&lt;&#x2F;td&gt;&lt;td&gt;Punches above its weight on general tasks&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;huggingface.co&#x2F;HuggingFaceTB&#x2F;SmolLM3-3B&quot;&gt;SmolLM3-3B&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;3B&lt;&#x2F;td&gt;&lt;td&gt;llama.cpp&lt;&#x2F;td&gt;&lt;td&gt;Absurdly capable for 3B — the small-and-fast slot&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Tongyi-MAI&#x2F;Z-Image&quot;&gt;Z-Image-Turbo&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;—&lt;&#x2F;td&gt;&lt;td&gt;diffusion&lt;&#x2F;td&gt;&lt;td&gt;Local text-to-image&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;The whole thing is managed as a &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;docs.podman.io&#x2F;en&#x2F;latest&#x2F;markdown&#x2F;podman-systemd.unit.5.html&quot;&gt;Podman quadlet&lt;&#x2F;a&gt; and deployed via Ansible, because consistency matters and I’ve already written about my feelings on running containers the right way.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;opencode&quot;&gt;OpenCode&lt;a class=&quot;post-anchor&quot; href=&quot;#opencode&quot; aria-label=&quot;Anchor link for: opencode&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;opencode.ai&#x2F;&quot;&gt;OpenCode&lt;&#x2F;a&gt; is my primary coding agent when I’m not using Claude Code, and I’ve been building it out — all pointing at Lemonade as the backend. I’ve got local models set up for different task sizes, language server support for the things I actually write, and a growing list of MCP servers handling everything from documentation to tooling integration.&lt;&#x2F;p&gt;
&lt;p&gt;The MCP side of things has gotten a bit out of hand in the best possible way. I’ve connected it to several tools and services I use regularly, which has turned a code editor into something that can reach well beyond just writing code.&lt;&#x2F;p&gt;
&lt;p&gt;I also have my personal knowledge base hooked into the MCP ecosystem, which gives agents access to notes, project context, and references. Both OpenCode and Claude Code draw from the same memory layer. Agents forget things between sessions by default; pointing them at shared notes is one way to patch the hole.&lt;&#x2F;p&gt;
&lt;p&gt;No API costs, no rate limits, nothing leaving the machine. That’s the pitch and it holds up. The catch is that local models aren’t Claude — they’re better than you’d have believed two years ago, but they have a ceiling and I’m not going to pretend otherwise.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;gaia&quot;&gt;Gaia&lt;a class=&quot;post-anchor&quot; href=&quot;#gaia&quot; aria-label=&quot;Anchor link for: gaia&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;amd&#x2F;gaia&quot;&gt;Gaia&lt;&#x2F;a&gt; is AMD’s local AI agent platform — essentially a web-style interface for running agents on your own hardware. I packaged it for Arch (&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;aur.archlinux.org&#x2F;packages&#x2F;gaia-amd&quot;&gt;gaia-amd on AUR&lt;&#x2F;a&gt;) and pointed it at Lemonade. It’s less CLI, more browsable — a different way to interact with the local model stack. Still figuring out where it slots in, but it’s interesting enough to keep around.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;claude-code&quot;&gt;Claude Code&lt;a class=&quot;post-anchor&quot; href=&quot;#claude-code&quot; aria-label=&quot;Anchor link for: claude-code&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Claude Code is the other half of the daily setup. I’ve been extending it heavily — tooling for session continuity, workflow automation, multi-agent coordination, and making agent instructions portable across tools. The goal throughout has been making it feel less like a one-shot assistant and more like something that actually belongs to your workflow — persistent context, repeatable patterns, agent instructions portable enough to take anywhere.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Local AI is actually useful now — not “useful if you squint” but useful for real work. The models are good, the tooling has matured, and the ROCm situation on AMD hardware is dramatically better than it was a year ago.&lt;&#x2F;p&gt;
&lt;p&gt;For the hard stuff, Claude is still carrying it. The local models earn their keep on the stuff where keeping things on-prem matters more than raw capability — background jobs, quick questions, anything you’d rather not pipe through someone else’s API.&lt;&#x2F;p&gt;
&lt;p&gt;That gap is closing though. Slowly, but it’s moving.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;open-questions&quot;&gt;Open Questions&lt;a class=&quot;post-anchor&quot; href=&quot;#open-questions&quot; aria-label=&quot;Anchor link for: open-questions&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Things I don’t have answers to yet. Where does Gaia actually fit — is a browsable web-style agent worth keeping once the CLI tooling does most of what I need, or is it solving a problem I don’t have? The local-vs-Claude gap is closing, but is it closing because local models are getting better or because I’m getting better at picking tasks they can already do? And the shared memory layer between OpenCode and Claude Code — at what point does “persistent context” become a liability, where the agent confidently remembers something that stopped being true three weeks ago?&lt;&#x2F;p&gt;
&lt;p&gt;I’ve been in tech since I was five years old. I’ve watched enough “this changes everything” moments to know which ones to ignore. This isn’t one of those.&lt;&#x2F;p&gt;
</description>
      </item>
    </channel>
</rss>
