<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tools on Home</title><link>/categories/tools/</link><description>Recent content in Tools on Home</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Sun, 14 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="/categories/tools/" rel="self" type="application/rss+xml"/><item><title>Tank OS: Running OpenClaw locally in a safe and open way</title><link>/2026/tank-os-running-openclaw-locally-in-a-safe-and-open-way/</link><pubDate>Sun, 14 Jun 2026 00:00:00 +0000</pubDate><guid>/2026/tank-os-running-openclaw-locally-in-a-safe-and-open-way/</guid><description>&lt;figure&gt;&lt;img src="/images/posts/post_37/overview.png"data-src="/images/posts/post_37/overview.png"
/&gt;&lt;figcaption&gt;
&lt;h4&gt;Tank OS packages OpenClaw as a rootless Podman workload inside a Fedora bootc VM - AI generated&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In this post, I want to describe how to run OpenClaw on a laptop using &lt;a href="https://github.com/LobsterTrap/tank-os"&gt;Tank OS&lt;/a&gt;, a Fedora bootc image that packages OpenClaw as a rootless workload inside an immutable operating system. This is a different path from the approach in the previous post on &lt;a href="/2026/deploying-openclaw-on-openshift/"&gt;Deploying OpenClaw on OpenShift&lt;/a&gt;. Tank OS runs on a regular machine through a virtual machine. The result is the same agent, running locally without any cluster dependency.&lt;/p&gt;
&lt;h2 id="what-is-tank-os"&gt;What is Tank OS&lt;/h2&gt;
&lt;p&gt;Tank OS was created by &lt;a href="https://github.com/sallyom"&gt;Sally O&amp;rsquo;Malley&lt;/a&gt;, a principal software engineer at Red Hat and one of the OpenClaw maintainers. The project was published in April 2026, shortly after OpenClaw&amp;rsquo;s rise to the most-starred software repository in GitHub&amp;rsquo;s history. In the &lt;a href="https://techcrunch.com/2026/04/28/red-hats-openclaw-maintainer-just-made-enterprise-claw-deployments-a-lot-safer/"&gt;TechCrunch article&lt;/a&gt; that accompanied the release, O&amp;rsquo;Malley was direct about the risk: OpenClaw is &amp;ldquo;an incredibly powerful application&amp;rdquo; but one that can be &amp;ldquo;dangerous&amp;rdquo; without proper configuration. &amp;ldquo;It&amp;rsquo;s not a tool that you can use easily unless you do have some sort of technical experience,&amp;rdquo; she said. Tank OS is her response to that gap.&lt;/p&gt;
&lt;p&gt;Tank OS packages OpenClaw inside a Fedora bootc image, which is a complete Linux operating system distributed as a container image. You do not install Tank OS on top of your existing OS. Instead, you build a QCOW2 disk image from the bootc image and boot it in a virtual machine. OpenClaw runs inside that VM as a rootless Podman container, isolated from the host.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;The following steps have been tested on a Apple Silicon MacBook. Before starting, the following must be in place:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Homebrew&lt;/strong&gt; - the package manager for macOS, used to install QEMU&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QEMU&lt;/strong&gt; version 11 or later - the open source machine emulator used to run the Tank OS virtual machine: &lt;code&gt;brew install qemu&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Podman&lt;/strong&gt; version 5 or later — the container engine used by the smoke-test script to pull the Tank OS image and run &lt;code&gt;bootc-image-builder&lt;/code&gt; to produce the QCOW2 disk image&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;An SSH key pair&lt;/strong&gt; at &lt;em&gt;~/.ssh/&lt;/em&gt;. The Tank OS image locks the default user&amp;rsquo;s password, so this key is the only way in.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you do not have a key at that path, generate one:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh-keygen -t ed25519 -f ~/.ssh/github -C &lt;span class="s2"&gt;&amp;#34;tank-os&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="getting-started"&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;The entry point to Tank OS is slightly unconventional, and worth explaining before running anything.&lt;/p&gt;
&lt;p&gt;Rather than providing a traditional setup script, the &lt;a href="https://github.com/LobsterTrap/tank-os"&gt;Tank OS GitHub repository&lt;/a&gt; includes an agent prompt at the bottom of its README. The idea is that you copy that prompt, paste it into a coding agent such as Claude Code, and the agent handles the bootstrap: it clones the repository, inspects the structure, and produces the &lt;code&gt;smoke-test.sh&lt;/code&gt; script that drives the actual workflow. Instead of reading through setup instructions and editing configuration by hand, you hand the prompt to the agent and get a runnable script back.&lt;/p&gt;
&lt;p&gt;This is an uncommon way to explore a new project. The approach makes sense here because the setup involves several environment-specific details, including QEMU firmware paths, the difference between rootful and rootless Podman, and SSH key locations. An agent can adapt these to your machine setup without requiring manual edits to a configuration file.&lt;/p&gt;
&lt;h2 id="building-booting-and-running-openclaw"&gt;Building, Booting, and Running OpenClaw&lt;/h2&gt;
&lt;p&gt;Once the agent has produced the &lt;code&gt;smoke-test.sh&lt;/code&gt; script, the rest of the workflow runs through that script in four phases.&lt;/p&gt;
&lt;h3 id="phase-1-building-the-disk-image"&gt;Phase 1: Building the Disk Image&lt;/h3&gt;
&lt;p&gt;First, make sure the default Podman machine is running:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;podman machine init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;podman machine start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then run the build phase:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./smoke-test.sh build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This phase does several things automatically. It reads your SSH public key from &lt;code&gt;~/.ssh/github.pub&lt;/code&gt; and writes a &lt;code&gt;config.json&lt;/code&gt; file that embeds the key into the disk image at build time. Without this step, the VM boots with no login path because the &lt;code&gt;openclaw&lt;/code&gt; user password is locked in the default image.&lt;/p&gt;
&lt;p&gt;Next, the script establishes a rootful Podman connection, required by the &lt;em&gt;bootc-image-builder&lt;/em&gt; to write to the container storage, pulls the Tank OS image into the rootful store, and runs the &lt;em&gt;bootc-image-builder&lt;/em&gt; as a privileged container to produce the QCOW2 disk image.&lt;/p&gt;
&lt;p&gt;The output is then resized to 20 GB. The default 10 GB is not enough once the 3.5 GB OpenClaw container image and the OS are both on disk.&lt;/p&gt;
&lt;p&gt;The build takes a few minutes. When it finishes, the QCOW2 file is in the output directory &lt;em&gt;out-tank-os&lt;/em&gt;, ready to boot.&lt;/p&gt;
&lt;figure&gt;&lt;img src="/images/posts/post_37/build_step.png"data-src="/images/posts/post_37/build_step.png"
/&gt;&lt;figcaption&gt;
&lt;h4&gt;Terminal output once the build step completes.&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="phase-2-starting-the-vm"&gt;Phase 2: Starting the VM&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./smoke-test.sh vm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This starts QEMU with Apple&amp;rsquo;s Hypervisor Framework for acceleration, four virtual CPUs, 4 GB of RAM, and port forwarding from &lt;code&gt;localhost:2222&lt;/code&gt; to port 22 inside the VM. The VM boots using the UEFI firmware that Homebrew installs alongside QEMU.&lt;/p&gt;
&lt;p&gt;The terminal shows the VM console as the OS starts. The OpenClaw Podman service launches automatically as a systemd user unit.&lt;/p&gt;
&lt;h3 id="phase-3-connecting-to-openclaw"&gt;Phase 3: Connecting to OpenClaw&lt;/h3&gt;
&lt;p&gt;Open a second terminal and wait for the VM&amp;rsquo;s SSH daemon to accept connections, then log in:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;until&lt;/span&gt; ssh -o &lt;span class="nv"&gt;ConnectTimeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; -o &lt;span class="nv"&gt;StrictHostKeyChecking&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;no &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -i ~/.ssh/github -p &lt;span class="m"&gt;2222&lt;/span&gt; openclaw@localhost &lt;span class="nb"&gt;true&lt;/span&gt; 2&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Waiting for VM...&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; sleep &lt;span class="m"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ssh -o &lt;span class="nv"&gt;StrictHostKeyChecking&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;no -i ~/.ssh/github -p &lt;span class="m"&gt;2222&lt;/span&gt; openclaw@localhost
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once logged into the VM, verify the agent is running with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;podman ps
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;&lt;img src="/images/posts/post_37/vm_connection.png"data-src="/images/posts/post_37/vm_connection.png"
/&gt;&lt;figcaption&gt;
&lt;h4&gt;Terminal output shows OpenClaw running as Podman container inside the Fedora VM&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Once inside the VM, retrieve the gateway authentication token:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;jq -r &lt;span class="s1"&gt;&amp;#39;.gateway.auth.token&amp;#39;&lt;/span&gt; ~/.openclaw/openclaw.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If the command returns nothing, generate a token first, then repeat:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openclaw doctor --generate-gateway-token
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In a third terminal, open the SSH tunnel so the OpenClaw web interface is reachable from your browser:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -N -o &lt;span class="nv"&gt;StrictHostKeyChecking&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;no -i ~/.ssh/github -p &lt;span class="m"&gt;2222&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -L 18789:127.0.0.1:18789 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -L 18790:127.0.0.1:18790 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; openclaw@localhost
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Open &lt;code&gt;http://127.0.0.1:18789&lt;/code&gt; in a browser. Paste the gateway token when prompted. The OpenClaw dashboard appears and the agent is ready.&lt;/p&gt;
&lt;figure&gt;&lt;img src="/images/posts/post_37/openclaw_gateway.png"data-src="/images/posts/post_37/openclaw_gateway.png"
/&gt;&lt;figcaption&gt;
&lt;h4&gt;OpenClaw Gateway Dashboard running locally&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="adding-a-model-provider"&gt;Adding a Model Provider&lt;/h3&gt;
&lt;p&gt;Tank OS stores API keys as Podman secrets rather than in configuration files. From inside the VM, create a secret for your provider:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;%s&amp;#39;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; podman secret create anthropic_api_key -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;%s&amp;#39;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$OPENAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; podman secret create openai_api_key -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;%s&amp;#39;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$GEMINI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; podman secret create gemini_api_key -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;%s&amp;#39;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$OPENROUTER_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; podman secret create openrouter_api_key -
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then sync it to the OpenClaw configuration and restart the service:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tank-openclaw-secrets
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl --user restart openclaw.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This updates the OpenClaw configuration and restarts the service.&lt;/p&gt;
&lt;figure&gt;&lt;img src="/images/posts/post_37/openclaw_dashboard.png"data-src="/images/posts/post_37/openclaw_dashboard.png"
/&gt;&lt;figcaption&gt;
&lt;h4&gt;OpenClaw Dashboard running locally, configured to use Anthropic Claude Sonnet model&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Tank OS is a practical way to get OpenClaw running on a laptop without modifying the host system. The agent runs inside a virtual machine on an immutable Fedora base, which limits what a misconfigured agent can reach on the host. Updating is also clean: pull a new bootc image and reboot, and the system reflects the new state.&lt;/p&gt;
&lt;p&gt;For teams that already have OpenShift running, the claw-installer approach from the &lt;a href="/2026/deploying-openclaw-on-openshift/"&gt;previous post&lt;/a&gt; is faster to deploy and integrates with cluster authentication out of the box. Tank OS is the right choice when you want a self-contained local setup that does not depend on a cluster, a cost-effective way to explore OpenClaw, or a portable environment to run a demo.&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Tank OS - GitHub repository - &lt;a href="https://github.com/LobsterTrap/tank-os"&gt;link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Deploying OpenClaw on OpenShift - &lt;a href="/2026/deploying-openclaw-on-openshift/"&gt;link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sally O&amp;rsquo;Malley - GitHub Profile - &lt;a href="https://github.com/sallyom"&gt;link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Red Hat&amp;rsquo;s OpenClaw maintainer just made enterprise Claw deployments a lot safer - TechCrunch - &lt;a href="https://techcrunch.com/2026/04/28/red-hats-openclaw-maintainer-just-made-enterprise-claw-deployments-a-lot-safer/"&gt;link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Running the Red Hat AI Inference Server on OpenShift - &lt;a href="/2026/running-the-red-hat-ai-inference-server-on-openshift/"&gt;link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fedora bootc documentation - &lt;a href="https://fedora.gitlab.io/bootc/docs/"&gt;link&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Mirroring Red Hat Documentation Locally with rh-mastery</title><link>/2026/mirroring-red-hat-documentation-locally-with-rh-mastery/</link><pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate><guid>/2026/mirroring-red-hat-documentation-locally-with-rh-mastery/</guid><description>&lt;figure&gt;&lt;img src="/images/posts/post_22/overview.png"data-src="/images/posts/post_22/overview.png"
/&gt;&lt;figcaption&gt;
&lt;h4&gt;Workflow diagram of rh-mastery process - AI generated&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In this post, I want to describe a tool built by my team mate &lt;strong&gt;Francisco J. Lopez Grüber&lt;/strong&gt; that solves a problem most people quietly live with: Red Hat product documentation is comprehensive and well-maintained, but it lives on the internet. Accessing it requires a browser, a connection, and knowing where to look. For offline environments, air-gapped labs, or anything beyond casual browsing, that dependency quickly becomes friction.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;rh-mastery&lt;/em&gt; addresses this directly. It mirrors &lt;em&gt;Red Hat&lt;/em&gt; product documentation from &lt;a href="https://docs.redhat.com"&gt;docs.redhat.com&lt;/a&gt; as PDF files into a local directory tree, and optionally can convert those PDFs to Markdown. The Markdown output is where things get particularly interesting: combined with tools like &lt;a href="https://github.com/tobi/qmd"&gt;qmd&lt;/a&gt; from Shopify CEO &lt;a href="https://github.com/tobi"&gt;Tobias Lütke&lt;/a&gt;, the converted documentation becomes a local knowledge base that AI agents can query directly — no internet access required, no context switching, and no copy-pasting from browser tabs. For anyone building AI-assisted developer workflows, having structured access to accurate, version-tracked product documentation is a meaningful step up.&lt;/p&gt;
&lt;p&gt;The tool is available on GitHub at &lt;a href="https://github.com/flg-redhat/rh_mastery"&gt;flg-redhat/rh_mastery&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="what-rh-mastery-does"&gt;What rh-mastery Does&lt;/h2&gt;
&lt;p&gt;At its core, rh-mastery handles two tasks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sync:&lt;/strong&gt; For a given product alias or slug, it probes docs.redhat.com, resolves the current documentation version, and downloads all available PDFs into a structured local directory tree: &lt;code&gt;{download_base}/{slug}/{version}/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Convert:&lt;/strong&gt; Once PDFs are present, the &lt;code&gt;convert&lt;/code&gt; command transforms them into Markdown files using &lt;em&gt;PyMuPDF4LLM&lt;/em&gt; (default) or &lt;em&gt;Docling&lt;/em&gt; as an optional heavier-weight alternative. Each Markdown file includes a short YAML front matter block with provenance metadata — title, source, version, and conversion timestamp.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Individual products can be targeted using short aliases such as &lt;code&gt;--ocp&lt;/code&gt; or &lt;code&gt;--ansible&lt;/code&gt;, or by passing the full Red Hat documentation slug directly. To download the complete documentation for all tracked products at once, &lt;code&gt;rh-mastery sync --all&lt;/code&gt; handles that in a single invocation.&lt;/p&gt;
&lt;p&gt;The recommended way to run rh-mastery is via its container image, which keeps dependencies isolated and makes the workflow reproducible.&lt;/p&gt;
&lt;h2 id="setting-up-the-environment"&gt;Setting Up the Environment&lt;/h2&gt;
&lt;p&gt;The image is built from &lt;em&gt;Red Hat Universal Base Image 10 Init&lt;/em&gt; and includes systemd, allowing for optional scheduled syncs via timers or cron inside the container. Build it from the repository root:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/flg-redhat/rh_mastery
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; rh_mastery
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;podman build -f Containerfile -t rh-mastery:latest .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create a local &lt;code&gt;data/&lt;/code&gt; directory to hold the downloaded files. This directory will be mounted into the container, so its contents persist across container restarts and recreations.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p data
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="the-workflow"&gt;The Workflow&lt;/h2&gt;
&lt;p&gt;The end-to-end workflow from a fresh image to a set of Markdown files ready for distribution follows five steps.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Start the container&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;podman run -d --name rh-mastery &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --systemd&lt;span class="o"&gt;=&lt;/span&gt;always --rm &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v ./data:/var/lib/rh-mastery:Z &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; rh-mastery:latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This starts the container in detached mode and mounts the local &lt;code&gt;data/&lt;/code&gt; directory into &lt;code&gt;/var/lib/rh-mastery&lt;/code&gt; inside the container. All downloads and converted files will appear under &lt;code&gt;data/&lt;/code&gt; on the host.&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Open an interactive shell&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;podman &lt;span class="nb"&gt;exec&lt;/span&gt; -it rh-mastery bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;Sync the documentation&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rh-mastery sync --all
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This downloads the current documentation for all tracked products into the mounted volume. Individual products can be synced using their alias, for example &lt;code&gt;rh-mastery sync --ocp&lt;/code&gt; or &lt;code&gt;rh-mastery sync --ansible&lt;/code&gt;. Run &lt;code&gt;rh-mastery --help&lt;/code&gt; inside the container to see the full alias table.&lt;/p&gt;
&lt;ol start="4"&gt;
&lt;li&gt;Convert PDFs to Markdown&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rh-mastery convert --all
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This converts every synced PDF into a Markdown file alongside it. Both the original PDFs and the converted Markdown files are present after this step. The conversion uses PyMuPDF4LLM by default, which handles most layouts well. For documents with complex tables or multi-column layouts, the &lt;code&gt;--engine docling&lt;/code&gt; option is available but requires installing additional dependencies.&lt;/p&gt;
&lt;ol start="5"&gt;
&lt;li&gt;Exit the container and clean up PDFs (optional step)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once conversion is complete, exit the container shell. Depending on the use case, the original PDF files may no longer be needed, if Markdown is the target format, removing the PDFs reduces the total size of the data directory significantly:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find ./data/RHDocumentation -name &lt;span class="s2"&gt;&amp;#34;*.pdf&amp;#34;&lt;/span&gt; -delete
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The Markdown files in &lt;code&gt;data/RHDocumentation&lt;/code&gt; are now ready for local use, distribution, or ingestion by an AI agent.&lt;/p&gt;
&lt;h2 id="from-markdown-to-ai-agent-knowledge"&gt;From Markdown to AI Agent Knowledge&lt;/h2&gt;
&lt;p&gt;The Markdown output from rh-mastery is structured and annotated, which makes it well-suited for ingestion by AI agents and local language model tooling. Each file carries front matter metadata that allows agents to identify the product, version, and source, and the content retains the section hierarchy of the original documentation.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/tobi/qmd"&gt;qmd&lt;/a&gt;, built by Tobias Lütke, is a lightweight tool for querying local Markdown files. Pointed at the directory tree produced by rh-mastery, it gives AI agents fast, accurate access to the full Red Hat documentation corpus, entirely offline and without relying on external APIs or web retrieval. The combination is particularly effective in environments where internet access is restricted, or when a development workflow benefits from a self-contained, version-locked knowledge source.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;rh-mastery turns what would otherwise be an ongoing manual effort into a single repeatable command. The container image keeps the setup clean, and the Markdown output opens up practical AI-assisted use cases that go beyond what a standard documentation browser can offer. Francisco&amp;rsquo;s tool fills a gap that is easy to overlook until you actually need it.&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;rh-mastery - GitHub repository by Francisco J. Lopez Grüber - &lt;a href="https://github.com/flg-redhat/rh_mastery"&gt;link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;qmd - GitHub repository by Tobias Lütke - &lt;a href="https://github.com/tobi/qmd"&gt;link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Red Hat product documentation - &lt;a href="https://docs.redhat.com"&gt;link&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Hermes Agent: A Personal AI That Gets More Useful Over Time</title><link>/2026/hermes-agent-a-personal-ai-that-gets-more-useful-over-time/</link><pubDate>Sat, 02 May 2026 00:00:00 +0000</pubDate><guid>/2026/hermes-agent-a-personal-ai-that-gets-more-useful-over-time/</guid><description>&lt;figure&gt;&lt;img src="/images/posts/post_28/overview.png"data-src="/images/posts/post_28/overview.png"
/&gt;&lt;figcaption&gt;
&lt;h4&gt;How Hermes Agent Works: From Closed-Loop Learning to Multi-Platform Deployment - AI generated&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I came across the &lt;a href="https://github.com/nousresearch/hermes-agent"&gt;&lt;em&gt;Hermes Agent project&lt;/em&gt;&lt;/a&gt; in early March 2026 and deployed it a couple of days later. A couple of weeks in I am still using it daily, and the use cases keep expanding rather than converging. Most tools settle into a narrow routine or fall off altogether. What keeps this one going is that the agent gets more useful the longer you run it. The project is young and moving fast, with new releases every few days. The initial setup requires patience: getting the configuration to a point where it actually saves time takes effort, and the frequent updates occasionally introduce breaking changes. That said, it is genuinely fun to use, and you learn a fair amount along the way.&lt;/p&gt;
&lt;p&gt;Hermes Agent is an open-source, self-hosted AI agent framework built by &lt;a href="https://nousresearch.com/"&gt;&lt;em&gt;Nous Research&lt;/em&gt;&lt;/a&gt;, an independent AI research lab based in New York. Nous Research is best known for the Hermes model family, a series of open-weight models fine-tuned on Llama that are used widely in the open-source AI community. The agent framework shares the name but is a separate project. It is MIT-licensed, model-agnostic, and runs on your own infrastructure, either as a self-hosted Python service or as a containerized deployment.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How It Works&lt;/h2&gt;
&lt;p&gt;The part that makes Hermes Agent different from most agent frameworks is the skill system. The agent ships with a set of preconfigured skills covering common tasks. Beyond that, you can ask it to create a skill from something it just did: it writes a structured Markdown document capturing the approach, what worked, and describes possible edge cases. The next time a similar task appears, the agent loads the relevant skill rather than starting from scratch. Skills can be triggered directly by asking Hermes to run one, or set on a schedule and executed automatically at defined intervals. Over time this turns completed work into a growing library of reusable operating knowledge. Version v0.12.0 added an Autonomous Curator to keep that library from growing unwieldy. It runs on a seven-day cycle by default, grades skills by usage, consolidates overlapping ones, and removes those that have stopped being useful. A short report is written after each run, so you can see what changed and why.&lt;/p&gt;
&lt;p&gt;Alongside the skill system, the agent maintains three layers of memory: a persistent store for completed tasks and notes, a full-text search index across prior sessions, and a user model that accumulates preferences over time, coding style, communication tone, timezone, tools. The idea is that the agent gets more useful the longer you run it, not just better at individual tasks in isolation.&lt;/p&gt;
&lt;h2 id="my-setup"&gt;My Setup&lt;/h2&gt;
&lt;p&gt;Hermes Agent runs in my &lt;a href="/2026/my-homelab-a-traefik-centered-self-hosting-setup/"&gt;homelab&lt;/a&gt; as a service on a dedicated Linux host. Keeping it on a separate machine gives me direct control over what the agent has access to. Incoming traffic is routed through Traefik. I access it through three entry points depending on where I am and what I am doing. The primary interface is the &lt;a href="https://matrix.org/"&gt;&lt;em&gt;Matrix&lt;/em&gt;&lt;/a&gt; chat protocol, which means I can reach the agent from any Matrix client on any device. I also connected it to a dedicated email inbox, so it can handle certain tasks asynchronously. For longer sessions at my desk I use &lt;em&gt;Open WebUI&lt;/em&gt;, which gives a more comfortable interface for extended conversations.&lt;/p&gt;
&lt;p&gt;The model configuration is versatile: the agent supports various AI services and model providers.&lt;/p&gt;
&lt;h2 id="what-i-gave-it-access-to"&gt;What I Gave It Access To&lt;/h2&gt;
&lt;p&gt;I gave the agent access to three local knowledge sources: my bookmarks, a structured knowledge base, and a local mirror of Red Hat&amp;rsquo;s product documentation.&lt;/p&gt;
&lt;p&gt;The first is my bookmarks folder. I have been saving links as Markdown files in Obsidian for several years. The agent can search and cross-reference that collection when doing research, which means it draws on context I actually care about rather than training data alone.&lt;/p&gt;
&lt;p&gt;The second is a knowledge base built on the &lt;a href="https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f"&gt;LLM Wiki&lt;/a&gt; principle described by Andrej Karpathy. The idea is to maintain a curated set of structured Markdown files that an AI agent helps write and update over time. Topics, entities, comparisons, each in its own file. The agent both contributes to this knowledge base and draws from it when working on research tasks.&lt;/p&gt;
&lt;p&gt;The third is a local mirror of Red Hat&amp;rsquo;s product documentation. A team mate built a tool called &lt;em&gt;rh-mastery&lt;/em&gt; that pulls documentation from &lt;em&gt;docs.redhat.com&lt;/em&gt;, converts it to Markdown, and stores it in a structured local directory. Pointed at that directory, Hermes can query accurate, version-tracked product documentation without touching the internet. For someone who spends a lot of time with Red Hat products, this closes a gap that is easy to overlook until you actually need it. More on rh-mastery in an upcomming post.&lt;/p&gt;
&lt;h2 id="practical-uses"&gt;Practical Uses&lt;/h2&gt;
&lt;p&gt;The combination of bookmarks, structured knowledge, Red Hat&amp;rsquo;s product documentation, and the skill system makes the agent genuinely useful for research. When I ask it to investigate a topic, it starts with what I have already collected: prior notes, bookmarks, and documentation. If that is not enough, and when asked, it reaches out to the web to fill the gaps. The result is something grounded in material I collected and curated myself, which makes the output in most cases very useful.&lt;/p&gt;
&lt;p&gt;One use I did not expect to find as useful: slide generation. I integrated &lt;em&gt;Marp&lt;/em&gt;, a Markdown-based presentation framework, into the workflow. When I need to put together a presentation and am staring at a blank file, I can ask the agent to draft an initial structure. Getting past that first empty screen is often the hardest part. Whether I keep most of what it produces is a different question, but having something to react to is worth more than nothing to start from.&lt;/p&gt;
&lt;h2 id="skills-and-subagents"&gt;Skills and Subagents&lt;/h2&gt;
&lt;p&gt;The agent can develop and add skills on its own as it works, but skills can also be added manually or loaded from the community hub at &lt;a href="https://agentskills.io"&gt;agentskills.io&lt;/a&gt;. More interesting to me is the subagent capability: the agent can delegate tasks to specialized subagents, each backed by a specific AI service or holding a particular context. This makes it possible to compose workflows where different parts of a task go to the most appropriate model.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Several weeks in is not a long track record, and the project is still moving fast enough that some things will break between releases. That said, the architecture is sound and the development pace is truly impressive. Whether I will keep running it long-term, I genuinely do not know. For now, it is pulling its weight. For anyone already running a homelab and looking for a self-hosted agent that gets more useful over time rather than staying flat, Hermes Agent is worth the setup time.&lt;/p&gt;
&lt;p&gt;Peter Steinberger, the creator of &lt;em&gt;OpenClaw&lt;/em&gt;, another widely-used AI agent framework, put it well in a recent &lt;a href="https://www.youtube.com/watch?v=7rzYDM6vMtI"&gt;TED talk&lt;/a&gt;: &amp;ldquo;The bottleneck is no longer typing. It&amp;rsquo;s thinking.&amp;rdquo; That observation fits. The agent handles the mechanical parts of research and structuring. The judgment about what matters and what to do with it still has to come from someone. For now, a human in the loop is still necessary.&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Hermes Agent on GitHub - &lt;a href="https://github.com/nousresearch/hermes-agent"&gt;link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hermes Agent Documentation - &lt;a href="https://hermes-agent.nousresearch.com/docs/"&gt;link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Nous Research - &lt;a href="https://nousresearch.com/"&gt;link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Matrix - &lt;a href="https://matrix.org/"&gt;link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;OpenRouter - &lt;a href="https://openrouter.ai/"&gt;link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Andrej Karpathy LLM Wiki concept - &lt;a href="https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f"&gt;link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Marp - &lt;a href="https://marp.app/"&gt;link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;agentskills.io - &lt;a href="https://agentskills.io/"&gt;link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Peter Steinberger TED talk - &lt;a href="https://www.youtube.com/watch?v=7rzYDM6vMtI"&gt;link&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>