<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Pascal Matthiesen</title>
    <description>The latest articles on DEV Community by Pascal Matthiesen (@pmdroid).</description>
    <link>https://dev.to/pmdroid</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F867015%2F1e4c4461-c6c7-4b51-9856-e18ac1e7db99.jpeg</url>
      <title>DEV Community: Pascal Matthiesen</title>
      <link>https://dev.to/pmdroid</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pmdroid"/>
    <language>en</language>
    <item>
      <title>I Catch Up a Tesla BLE Library the Way I Run Agents 🚗</title>
      <dc:creator>Pascal Matthiesen</dc:creator>
      <pubDate>Tue, 08 Sep 2026 16:41:55 +0000</pubDate>
      <link>https://dev.to/pmdroid/i-catch-up-a-tesla-ble-library-the-way-i-run-agents-25np</link>
      <guid>https://dev.to/pmdroid/i-catch-up-a-tesla-ble-library-the-way-i-run-agents-25np</guid>
      <description>&lt;p&gt;Hey tech adventurers! 👋&lt;/p&gt;

&lt;p&gt;I maintain a little C++ / Arduino library that talks to Teslas over Bluetooth — unlock, climate, charging, the fun stuff. One wrong byte and the car just ignores you. Charming. 🫠&lt;/p&gt;

&lt;p&gt;Repo went quiet for a long time. Catching it up &lt;strong&gt;by hand&lt;/strong&gt;? That's weeks of careful suffering. Not because the typing is hard — because you never quite know if you broke something until you're standing next to a real car looking silly.&lt;/p&gt;

&lt;p&gt;So I didn't do it by hand.&lt;/p&gt;

&lt;h3&gt;
  
  
  How I actually work 🐕
&lt;/h3&gt;

&lt;p&gt;Plan first. Get a couple of independent takes so I'm not vibing alone. Make the checks real — automated tests that have to go green — &lt;em&gt;then&lt;/em&gt; let an agent grind.&lt;/p&gt;

&lt;p&gt;I pointed my Ageent at the library with that shape. Plan the catch-up. Put checks in place. Agent does the busywork. Fail, fix, keep moving. I don't babysit every tiny change.&lt;/p&gt;

&lt;p&gt;Same day: what used to feel like &lt;strong&gt;weeks&lt;/strong&gt; became &lt;strong&gt;hours&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Tesla bit is the example 🧾
&lt;/h3&gt;

&lt;p&gt;Before the agent ran wild, I added a small host test suite — known-good messages the car expects, so a change either passes or it doesn't. Short receipts. Just enough so my Agent can fail, fix, and keep going without me re-learning the whole protocol from vibes every time.&lt;/p&gt;

&lt;p&gt;Funny part is I finally touched a library I'd been avoiding by refusing to touch it myself. Peak me. 🍕&lt;/p&gt;




&lt;p&gt;Repo: &lt;a href="https://github.com/pmdroid/tesla-vehicle-command" rel="noopener noreferrer"&gt;https://github.com/pmdroid/tesla-vehicle-command&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>opensource</category>
      <category>tesla</category>
      <category>productivity</category>
    </item>
    <item>
      <title>My Wife’s Steam Deck Is a Server Now. She Doesn’t Know Yet. 🫠</title>
      <dc:creator>Pascal Matthiesen</dc:creator>
      <pubDate>Mon, 07 Sep 2026 22:45:01 +0000</pubDate>
      <link>https://dev.to/pmdroid/my-wifes-steam-deck-is-a-server-now-she-doesnt-know-yet-288c</link>
      <guid>https://dev.to/pmdroid/my-wifes-steam-deck-is-a-server-now-she-doesnt-know-yet-288c</guid>
      <description>&lt;p&gt;Hey tech adventurers! 👋&lt;/p&gt;

&lt;p&gt;What if the hardware you already own could become part of your homelab?&lt;/p&gt;

&lt;p&gt;That spare Linux box. An old Mac. A mini PC sitting under the TV.&lt;/p&gt;

&lt;p&gt;Or, in my case, my wife’s Steam Deck. 😅&lt;/p&gt;

&lt;p&gt;She can’t play 24/7, so when the Deck is idle, I figured its CPU might as well do something useful.&lt;/p&gt;

&lt;p&gt;So I installed BarkVisor on SteamOS and turned it into another Device in my Home. It can run VMs, join my other Mac and Linux machines, and even run small local AI models with Ollama.&lt;/p&gt;

&lt;p&gt;And yes, it still plays games. I’m not that terrible of a husband.&lt;/p&gt;

&lt;p&gt;This post is the “I actually did it on a Steam Deck” walkthrough: practical, step-by-step, and no kernel seminar.&lt;/p&gt;

&lt;p&gt;The bigger idea, though, is simple:&lt;/p&gt;

&lt;p&gt;You probably already have a machine that could run BarkVisor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F25m464zhqoc6bjxyzqf2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F25m464zhqoc6bjxyzqf2.png" alt=" " width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What you end up with 🍕
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Machine&lt;/th&gt;
&lt;th&gt;Listens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Home&lt;/strong&gt; (UI + control)&lt;/td&gt;
&lt;td&gt;Mac/Linux on the LAN&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;:7777&lt;/code&gt; HTTP, &lt;code&gt;:7778&lt;/code&gt; mTLS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Device&lt;/strong&gt; (this tutorial)&lt;/td&gt;
&lt;td&gt;Steam Deck (or similar SteamOS / handheld Linux)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;:7777&lt;/code&gt; API only, &lt;code&gt;:7778&lt;/code&gt; agent, Ollama &lt;code&gt;:11434&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Example LAN: Home &lt;code&gt;192.168.10.10&lt;/code&gt;, Deck &lt;code&gt;192.168.8.133&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You &lt;strong&gt;never&lt;/strong&gt; open the Deck’s &lt;code&gt;:7777&lt;/code&gt; in a browser. Pair once. Then lives in BarkVisor.&lt;/p&gt;

&lt;p&gt;Same class of machine: Steam Deck and Lenovo Legion Go–style handhelds running SteamOS / Arch-ish Linux. The unlock + &lt;code&gt;pacman&lt;/code&gt; bits below are &lt;strong&gt;SteamOS / Deck-specific&lt;/strong&gt;. Adjust paths (&lt;code&gt;/home/deck&lt;/code&gt;) if your user isn’t &lt;code&gt;deck&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Prep the Deck (Desktop Mode) 🛠️
&lt;/h2&gt;

&lt;p&gt;Switch to &lt;strong&gt;Desktop Mode&lt;/strong&gt;. Set a sudo password if you haven’t (&lt;code&gt;passwd&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;SteamOS root is tiny (~5GB). BarkVisor, models, and VM disks go under &lt;strong&gt;&lt;code&gt;/home&lt;/code&gt;&lt;/strong&gt;. Do not fill the root partition. Future-you will thank present-you.&lt;/p&gt;

&lt;p&gt;Unlock the OS and trust SteamOS package keys (once — when &lt;code&gt;pacman&lt;/code&gt; complains about unknown trust / GitLab CI Package Builder):&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Click to expand: SteamOS unlock + pacman keys
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;steamos-readonly disable
&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman-key &lt;span class="nt"&gt;--init&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman-key &lt;span class="nt"&gt;--populate&lt;/span&gt; archlinux
&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman-key &lt;span class="nt"&gt;--populate&lt;/span&gt; holo
&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman-key &lt;span class="nt"&gt;--lsign-key&lt;/span&gt; 889B5EBDDD505A683621900DAF1D2199EF0A3CCF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Install the VM stack. Arch/SteamOS splits QEMU — &lt;code&gt;qemu-base&lt;/code&gt; alone is &lt;strong&gt;not&lt;/strong&gt; enough for BarkVisor’s &lt;code&gt;virtio-gpu-pci&lt;/code&gt;, and cloud-init needs &lt;code&gt;mkisofs&lt;/code&gt; from &lt;code&gt;cdrtools&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Click to expand: QEMU + OVMF + cdrtools + swtpm
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; qemu-base edk2-ovmf &lt;span class="se"&gt;\&lt;/span&gt;
  qemu-hw-display-virtio-gpu qemu-hw-display-virtio-gpu-pci &lt;span class="se"&gt;\&lt;/span&gt;
  cdrtools swtpm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Sanity check (you want a line with &lt;code&gt;virtio-gpu-pci&lt;/code&gt; and a writable &lt;code&gt;/dev/kvm&lt;/code&gt;):&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Click to expand: host sanity checks
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; qemu-system-x86_64 qemu-img mkisofs
qemu-system-x86_64 &lt;span class="nt"&gt;-device&lt;/span&gt; &lt;span class="nb"&gt;help&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;virtio-gpu-pci
&lt;span class="nb"&gt;ls&lt;/span&gt; /usr/share/edk2/x64/OVMF_CODE.4m.fd
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; /dev/kvm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Install BarkVisor agent only (no UI) 🐕
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do not&lt;/strong&gt; pipe &lt;code&gt;install.sh&lt;/code&gt; into &lt;code&gt;sudo&lt;/code&gt; on SteamOS. Use the Linux tarball under home. Agent mode = no SPA on the Deck. The Deck is a worker, not a kiosk.&lt;/p&gt;

&lt;p&gt;Current release at time of writing: &lt;strong&gt;&lt;code&gt;1.0.0-alpha.3&lt;/code&gt;&lt;/strong&gt; (check &lt;a href="https://github.com/pmdroid/barkvisor/releases" rel="noopener noreferrer"&gt;GitHub releases&lt;/a&gt; if you’re reading this from the future).&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Click to expand: download + verify + install agent under ~/.local
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1.0.0-alpha.3   &lt;span class="c"&gt;# or whatever current release is&lt;/span&gt;
&lt;span class="nv"&gt;PREFIX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.local/opt/barkvisor"&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.local/share/barkvisor"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.local/bin"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.config/barkvisor"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.config/systemd/user"&lt;/span&gt;

&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp
curl &lt;span class="nt"&gt;-fL&lt;/span&gt; &lt;span class="nt"&gt;-O&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/pmdroid/barkvisor/releases/download/v&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/barkvisor-&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-linux-x86_64.tar.gz"&lt;/span&gt;
curl &lt;span class="nt"&gt;-fL&lt;/span&gt; &lt;span class="nt"&gt;-O&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/pmdroid/barkvisor/releases/download/v&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/barkvisor-&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-linux-x86_64.tar.gz.sha256"&lt;/span&gt;
&lt;span class="nb"&gt;sha256sum&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"barkvisor-&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-linux-x86_64.tar.gz.sha256"&lt;/span&gt;

&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xzf&lt;/span&gt; &lt;span class="s2"&gt;"barkvisor-&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-linux-x86_64.tar.gz"&lt;/span&gt;
&lt;span class="nv"&gt;SRC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"barkvisor-&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-linux-x86_64/root/usr/local"&lt;/span&gt;
&lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; 0755 &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SRC&lt;/span&gt;&lt;span class="s2"&gt;/bin/barkvisor"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt;&lt;span class="s2"&gt;/bin/barkvisor"&lt;/span&gt;
&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-sfn&lt;/span&gt; barkvisor &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt;&lt;span class="s2"&gt;/bin/barkvisor-agent"&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SRC&lt;/span&gt;&lt;span class="s2"&gt;/lib/barkvisor"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt;&lt;span class="s2"&gt;/lib/"&lt;/span&gt;
&lt;span class="c"&gt;# skip share/barkvisor/frontend — agent mode, no SPA&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;/p&gt;

&lt;p&gt;CLI wrapper (sets the bundled Swift &lt;code&gt;LD_LIBRARY_PATH&lt;/code&gt; — yes, Swift on a Steam Deck, we’re living deliciously):&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Click to expand: ~/.local/bin/barkvisor wrapper + PATH
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.local/bin/barkvisor"&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
#!/usr/bin/env bash
PREFIX="&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;/.local/opt/barkvisor"
export LD_LIBRARY_PATH="&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PREFIX&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;/lib/barkvisor/swift:&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PREFIX&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;/lib/barkvisor/compat&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;:+:&lt;span class="nv"&gt;$LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"
exec -a "&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;basename&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;" "&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PREFIX&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;/bin/barkvisor" "&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="sh"&gt;"
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.local/bin/barkvisor"&lt;/span&gt;
&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-sfn&lt;/span&gt; barkvisor &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.local/bin/barkvisor-agent"&lt;/span&gt;

&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s1"&gt;'.local/bin'&lt;/span&gt; ~/.bashrc &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export PATH="$HOME/.local/bin:$PATH"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.local/bin:&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Env + user systemd service (data on home, no frontend dir):&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Click to expand: barkvisor.env + barkvisor-agent.service
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.config/barkvisor/barkvisor.env"&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
BARKVISOR_PORT=7777
BARKVISOR_DATA_DIR=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="sh"&gt;/.local/share/barkvisor
BARKVISOR_SOCKET_DIR=&lt;/span&gt;&lt;span class="nv"&gt;$XDG_RUNTIME_DIR&lt;/span&gt;&lt;span class="sh"&gt;/barkvisor
HOME=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="sh"&gt;
LD_LIBRARY_PATH=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="sh"&gt;/.local/opt/barkvisor/lib/barkvisor/swift:&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="sh"&gt;/.local/opt/barkvisor/lib/barkvisor/compat
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.config/systemd/user/barkvisor-agent.service"&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
[Unit]
Description=BarkVisor API-only Device daemon
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
WorkingDirectory=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="sh"&gt;/.local/share/barkvisor
EnvironmentFile=-&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="sh"&gt;/.config/barkvisor/barkvisor.env
ExecStart=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="sh"&gt;/.local/opt/barkvisor/bin/barkvisor-agent
Restart=on-failure
RestartSec=3
TimeoutStopSec=8
KillMode=mixed
RuntimeDirectory=barkvisor
LimitNOFILE=65536

[Install]
WantedBy=default.target
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; daemon-reload
systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; barkvisor-agent.service
curl &lt;span class="nt"&gt;-sS&lt;/span&gt; http://127.0.0.1:7777/api/health
barkvisor-agent doctor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Health should be &lt;code&gt;"status":"ok"&lt;/code&gt;. &lt;code&gt;GET http://127.0.0.1:7777/&lt;/code&gt; returning JSON &lt;strong&gt;404&lt;/strong&gt; is correct for agent-only. You’re not broken. You’re disciplined.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SteamOS / Desktop Mode note:&lt;/strong&gt; Desktop Mode already has a user session, so the service starts with that session. It will &lt;strong&gt;not&lt;/strong&gt; start in Game Mode unless you enable lingering (&lt;code&gt;loginctl enable-linger deck&lt;/code&gt;, needs root).&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Pair the Deck to Home 🔗
&lt;/h2&gt;

&lt;p&gt;On &lt;strong&gt;Home&lt;/strong&gt; (the machine that already finished BarkVisor setup):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;code&gt;http://&amp;lt;home-ip&amp;gt;:7777&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Settings → Pairing → Add a Device&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Pick the LAN address the Deck can reach (e.g. &lt;code&gt;192.168.10.10&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Copy the &lt;strong&gt;full&lt;/strong&gt; offer: &lt;code&gt;barkvisor://pair/v1?code=…&amp;amp;host=…&amp;amp;port=7777&amp;amp;agentPort=7778&amp;amp;hostId=…&amp;amp;fp=…&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The short printed code is &lt;strong&gt;not&lt;/strong&gt; enough. Ask me how I know. 😅&lt;/p&gt;

&lt;p&gt;On the Deck, with the agent already up:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Click to expand: join with full barkvisor:// offer
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;barkvisor-agent &lt;span class="nb"&gt;join&lt;/span&gt; &lt;span class="nt"&gt;--code&lt;/span&gt; &lt;span class="s1"&gt;'barkvisor://pair/v1?code=…&amp;amp;host=192.168.10.10&amp;amp;port=7777&amp;amp;agentPort=7778&amp;amp;hostId=…&amp;amp;fp=…'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Or set &lt;code&gt;BARKVISOR_JOIN_CODE&lt;/code&gt; in &lt;code&gt;barkvisor.env&lt;/code&gt; &lt;strong&gt;before first start only&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;With a current build, Home should hop immediately. Refresh Home: the Deck appears reachable, workload counts populate. Join talks HTTP to Home &lt;code&gt;:7777&lt;/code&gt;; ongoing control is mTLS to the Deck &lt;code&gt;:7778&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Confirm on the Deck:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Click to expand: confirm 7777 + 7778 listening
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ss &lt;span class="nt"&gt;-ltn&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'7777|7778'&lt;/span&gt;
&lt;span class="c"&gt;# LISTEN 0.0.0.0:7777 and 0.0.0.0:7778&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Ollama on the Deck (optional) 🧠
&lt;/h2&gt;

&lt;p&gt;Want Home’s &lt;strong&gt;Models&lt;/strong&gt; UI to point at the handheld? Keep Ollama under &lt;code&gt;~/.local&lt;/code&gt; too — not &lt;code&gt;/usr/local&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Click to expand: install Ollama under ~/.local
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/.local ~/.ollama/models
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://ollama.com/download/ollama-linux-amd64.tar.zst &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;--zstd&lt;/span&gt; &lt;span class="nt"&gt;-xf&lt;/span&gt; - &lt;span class="nt"&gt;-C&lt;/span&gt; ~/.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Listen on &lt;strong&gt;all interfaces&lt;/strong&gt; so Home and guest VMs can reach it. Example user unit knobs:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Click to expand: ollama.service env hints + start
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# ~/.config/systemd/user/ollama.service&lt;/span&gt;
&lt;span class="c"&gt;# Environment=OLLAMA_HOST=0.0.0.0:11434&lt;/span&gt;
&lt;span class="c"&gt;# Environment=OLLAMA_MODELS=/home/deck/.ollama/models&lt;/span&gt;
&lt;span class="c"&gt;# Environment=OLLAMA_IGPU_ENABLE=1&lt;/span&gt;
&lt;span class="c"&gt;# ExecStart=/home/deck/.local/bin/ollama serve&lt;/span&gt;

systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; ollama.service
curl &lt;span class="nt"&gt;-sS&lt;/span&gt; http://127.0.0.1:11434/api/version
curl &lt;span class="nt"&gt;-sS&lt;/span&gt; http://192.168.8.133:11434/api/version   &lt;span class="c"&gt;# use your Deck LAN IP&lt;/span&gt;
ollama pull llama3.2   &lt;span class="c"&gt;# example&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Steam Deck iGPU is ignored unless &lt;code&gt;OLLAMA_IGPU_ENABLE=1&lt;/code&gt;. Then from Home: Settings / Models pointed at &lt;code&gt;http://&amp;lt;deck-ip&amp;gt;:11434&lt;/code&gt;. Guest VMs on NAT see the Deck as &lt;code&gt;10.0.2.2:11434&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. First Ubuntu VM from Home 🚀
&lt;/h2&gt;

&lt;p&gt;On Home, with the Deck selected (or &lt;strong&gt;Create VM → this Device&lt;/strong&gt;):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Images&lt;/strong&gt; — download Ubuntu 24.04 LTS (or 26.04) cloud image for x86_64. Wait until status is ready.&lt;/li&gt;
&lt;li&gt;Create VM / Ubuntu Server template.&lt;/li&gt;
&lt;li&gt;Place it on the &lt;strong&gt;steamdeck&lt;/strong&gt; Device.&lt;/li&gt;
&lt;li&gt;Disk 16–64 GB; NAT is enough.&lt;/li&gt;
&lt;li&gt;Create, wait until provisioning finishes (clone + cloud-init ISO).&lt;/li&gt;
&lt;li&gt;Start.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;NAT SSH: add a port forward (e.g. host &lt;code&gt;2222&lt;/code&gt; → guest &lt;code&gt;22&lt;/code&gt;) on that VM, then from your laptop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-p&lt;/span&gt; 2222 ubuntu@192.168.8.133
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Guest default user is &lt;code&gt;ubuntu&lt;/code&gt; if you used the Ubuntu template. Swap in your Deck’s LAN IP.)&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Everyday commands (on the Deck) 🧰
&lt;/h2&gt;

&lt;p&gt;&lt;/p&gt;
  Click to expand: status, logs, doctor, disk usage
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; status barkvisor-agent ollama
journalctl &lt;span class="nt"&gt;--user&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; barkvisor-agent &lt;span class="nt"&gt;-f&lt;/span&gt;
barkvisor-agent doctor

&lt;span class="c"&gt;# disks / images live here&lt;/span&gt;
&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; ~/.local/share/barkvisor/&lt;span class="o"&gt;{&lt;/span&gt;disks,images,efivars&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Home is the UI: VMs, VNC, serial, images, pairing. The Deck just works (or complains in &lt;code&gt;journalctl&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Good at / not great at ⚖️
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Good:&lt;/strong&gt; extra QEMU capacity on the LAN. Ollama on the Deck iGPU (~16GB visible VRAM on a Z2 Go-class machine). Agent-only so you’re not burning cycles on a SPA nobody will open.&lt;/p&gt;

&lt;h2&gt;
  
  
  If something looks wrong 🧯
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Home: TLS handshake failed&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;:7778&lt;/code&gt; up; join completed; restart &lt;code&gt;barkvisor-agent&lt;/code&gt; once if you’re on an older build&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;virtio-gpu-pci&lt;/code&gt; is not a valid device&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pacman -S qemu-hw-display-virtio-gpu qemu-hw-display-virtio-gpu-pci&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;mkisofs&lt;/code&gt; / &lt;code&gt;genisoimage&lt;/code&gt; not found&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pacman -S cdrtools&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BdsDxe no bootable option&lt;/td&gt;
&lt;td&gt;Cloud clone must leave GPT EFI PART at LBA 1; never run &lt;code&gt;sgdisk&lt;/code&gt; on a &lt;code&gt;.qcow2&lt;/code&gt; file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pacman “unknown trust”&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pacman-key --lsign-key 889B5EBDDD505A683621900DAF1D2199EF0A3CCF&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ollama only on localhost&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;OLLAMA_HOST=0.0.0.0:11434&lt;/code&gt; and restart the user unit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Closing / pizza 🍕&lt;br&gt;
Steam Deck as a headless BarkVisor Device: agent tarball in $HOME, SteamOS QEMU plus virtio-gpu and cdrtools, pair with a full barkvisor:// offer, optional Ollama on 0.0.0.0:11434. Control everything from Home on the LAN. The Deck just runs VMs and models.&lt;/p&gt;

&lt;p&gt;Was this a responsible use of a gaming handheld? Debatable. Does it make my LAN slightly more overbuilt? Absolutely. Built with ❤️ and questionable infrastructure decisions.&lt;/p&gt;

&lt;p&gt;P.S. Don’t want to click through every step yourself? Paste this post to your agent. They’ll have no problem doing it. 🤖&lt;/p&gt;

&lt;p&gt;More: barkvisor.dev · github.com/pmdroid/barkvisor&lt;/p&gt;

</description>
      <category>ai</category>
      <category>homelab</category>
      <category>linux</category>
      <category>qemu</category>
    </item>
    <item>
      <title>QEMU Got a Dashboard. Then It Got Out of Hand. 🫠</title>
      <dc:creator>Pascal Matthiesen</dc:creator>
      <pubDate>Sun, 06 Sep 2026 17:35:06 +0000</pubDate>
      <link>https://dev.to/pmdroid/qemu-got-a-dashboard-then-it-got-out-of-hand-2k3c</link>
      <guid>https://dev.to/pmdroid/qemu-got-a-dashboard-then-it-got-out-of-hand-2k3c</guid>
      <description>&lt;p&gt;I have too many computers.&lt;/p&gt;

&lt;p&gt;A Mac here. A Linux box there. A few VMs. Some local AI models. And apparently I was supposed to SSH into all of them like a responsible adult.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;BarkVisor&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It's an open-source QEMU dashboard that lets you turn your &lt;strong&gt;Macs and Linux boxes into one Home&lt;/strong&gt; and manage the whole thing from one place.&lt;/p&gt;

&lt;p&gt;They don't need to be identical. They don't even need to run the same OS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mac mini in the office? Add it. Linux server in the closet? Add it. Another machine under the TV because you have a problem? Add it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One Home. One dashboard. All your machines.&lt;/p&gt;

&lt;p&gt;And maybe Windows gets invited to the party next. 👀&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://barkvisor.dev" rel="noopener noreferrer"&gt;https://barkvisor.dev&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  One Home. Different machines. 🏠
&lt;/h2&gt;

&lt;p&gt;This is probably the part I didn't explain well enough before.&lt;/p&gt;

&lt;p&gt;A BarkVisor install is a &lt;strong&gt;Device&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Your Mac can be a Device. Your Linux server can be another Device. Add both to the same &lt;strong&gt;Home&lt;/strong&gt;, and BarkVisor gives you one place to manage them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 🏠 My Home
                      │
          ┌───────────┼───────────┐
          │           │           │
      🍎 Mac mini   🐧 Linux    🍎 MacBook
          │           │           │
        VMs + AI    VMs + AI     VMs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Different hardware. Different operating systems. Same Home.&lt;/p&gt;

&lt;p&gt;From there you can create workloads, decide which Device should run them, manage networking, run local models, and see what's happening across the whole setup.&lt;/p&gt;

&lt;p&gt;And importantly, &lt;strong&gt;Home isn't a cluster.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There's no quorum keeping your machines alive. If the Linux box disappears, your Mac doesn't suddenly care. Workloads stay on the Device where they're running.&lt;/p&gt;

&lt;p&gt;BarkVisor just gives all those independent machines a shared control plane.&lt;/p&gt;

&lt;p&gt;It's less:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"I have three random computers."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And more:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Apparently I have infrastructure now."&lt;/em&gt; 😅&lt;/p&gt;

&lt;h2&gt;
  
  
  Local AI across the Home 🧠
&lt;/h2&gt;

&lt;p&gt;This gets more interesting when those Devices have different strengths.&lt;/p&gt;

&lt;p&gt;Maybe the Mac mini is always on. Maybe the Linux box has the big GPU. Maybe another Device is mostly there for VMs.&lt;/p&gt;

&lt;p&gt;Models can live on different Devices while BarkVisor gives you &lt;strong&gt;one front door for completions across the Home&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So instead of remembering:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;192.168.1.42:11434
192.168.1.73:11434
wait... which box had Qwen?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you talk to BarkVisor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One Home. One endpoint. Multiple machines.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Basically a tiny inference router that escaped from my homelab.&lt;/p&gt;

&lt;h2&gt;
  
  
  Networking with an undo button 🧯
&lt;/h2&gt;

&lt;p&gt;Host networking is where confidence goes to die.&lt;/p&gt;

&lt;p&gt;Bridges are useful right up until the moment you accidentally remove the network connection you're currently using to configure the bridge.&lt;/p&gt;

&lt;p&gt;Ask me how I know.&lt;/p&gt;

&lt;p&gt;So BarkVisor assumes you're going to do something stupid and gives you a way back before the change sticks.&lt;/p&gt;

&lt;p&gt;NAT is there when you want boring.&lt;/p&gt;

&lt;p&gt;Bridges are there when you want power.&lt;/p&gt;

&lt;p&gt;And rollback is there when you discover you wanted boring after all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alpha on top. QEMU underneath. 🪨
&lt;/h2&gt;

&lt;p&gt;BarkVisor itself is &lt;strong&gt;Alpha&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The dashboard will change. The API will change. I will probably rename something five minutes after you learn it.&lt;/p&gt;

&lt;p&gt;But the actual virtualization layer isn't an experiment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;QEMU is QEMU.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Battle-tested virtualization. Real VMs. Boring, reliable infrastructure.&lt;/p&gt;

&lt;p&gt;BarkVisor is the opinionated layer I bolted on top because apparently typing &lt;code&gt;ssh&lt;/code&gt; one more time was my breaking point.&lt;/p&gt;

&lt;h2&gt;
  
  
  And yes, there's a phone app 📱
&lt;/h2&gt;

&lt;p&gt;Because obviously this got out of hand.&lt;/p&gt;

&lt;p&gt;There's a native SwiftUI console aimed at Mac and iOS, and phone sign-in already works.&lt;/p&gt;

&lt;p&gt;I'm not giving you an App Store date.&lt;/p&gt;

&lt;p&gt;"Soon" is the most accurate unit of time available.&lt;/p&gt;

&lt;h2&gt;
  
  
  This is only the beginning 🛠️
&lt;/h2&gt;

&lt;p&gt;The idea behind BarkVisor isn't really &lt;em&gt;"put a UI on QEMU."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It's:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;make the computers you already own feel like one Home.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today that's macOS + Linux.&lt;/p&gt;

&lt;p&gt;Tomorrow? Maybe Windows joins too. 👀&lt;/p&gt;

&lt;p&gt;And the roadmap gets progressively more unreasonable from there: failover, live migration, distributed storage, backups, cross-Device networking, portable workloads, Tailscale/WireGuard and more.&lt;/p&gt;

&lt;p&gt;No promises on dates. Plenty of questionable ideas.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://barkvisor.dev/docs/roadmap/" rel="noopener noreferrer"&gt;See the roadmap&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it. Break it. Add another box. 🚀
&lt;/h2&gt;

&lt;p&gt;BarkVisor is open source, MIT licensed, and very much being built in public.&lt;/p&gt;

&lt;p&gt;If you've got &lt;strong&gt;a Mac, a Linux machine, or preferably both&lt;/strong&gt;, give it a spin.&lt;/p&gt;

&lt;p&gt;Install BarkVisor on them.&lt;/p&gt;

&lt;p&gt;Put them in the same Home.&lt;/p&gt;

&lt;p&gt;Create a VM. Run a model. Add another Device. Break the networking. Hopefully recover the networking.&lt;/p&gt;

&lt;p&gt;Then open an issue and tell me what I got wrong.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://barkvisor.dev" rel="noopener noreferrer"&gt;https://barkvisor.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built with ❤️, QEMU, and the kind of overengineering that starts with:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"I just want one dashboard."&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>qemu</category>
      <category>homelab</category>
      <category>virtualization</category>
    </item>
    <item>
      <title>My Agents Don't Get to Vibe 🤖</title>
      <dc:creator>Pascal Matthiesen</dc:creator>
      <pubDate>Sat, 05 Sep 2026 04:15:48 +0000</pubDate>
      <link>https://dev.to/pmdroid/my-agents-dont-get-to-vibe-207p</link>
      <guid>https://dev.to/pmdroid/my-agents-dont-get-to-vibe-207p</guid>
      <description>&lt;p&gt;Hey tech adventurers! 👋&lt;/p&gt;

&lt;p&gt;I use coding agents a lot. Probably an irresponsible amount.&lt;/p&gt;

&lt;p&gt;My current favorite is &lt;strong&gt;Grok Build&lt;/strong&gt;. 🤖❤️&lt;/p&gt;

&lt;p&gt;But I don't want my workflow tied to one agent. Models change, shiny new robots appear, benchmarks go brrrr, and everyone changes their mind by Tuesday. 😂&lt;/p&gt;

&lt;p&gt;So my setup is intentionally boring and &lt;strong&gt;agent agnostic&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skills describe the workflow. Hooks enforce it.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Plan before you cook 🏛️
&lt;/h2&gt;

&lt;p&gt;I don't like giving an agent:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Build feature X."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's how you get 2,000 lines of beautifully implemented misunderstanding. 🫠&lt;/p&gt;

&lt;p&gt;Instead, I use a &lt;strong&gt;council skill&lt;/strong&gt;. Multiple agents independently look at the problem, challenge the architecture, and turn the result into a technical issue.&lt;/p&gt;

&lt;p&gt;And I mean &lt;strong&gt;technical&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SQL schemas • migrations • structs • types • classes • APIs • files • edge cases • acceptance criteria&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If we need a table, put the schema in the issue.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;pizzas&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;topping&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;delicious&lt;/span&gt; &lt;span class="nb"&gt;BOOLEAN&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Build a robust and scalable pizza management solution."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ah yes. &lt;strong&gt;Robust and scalable.&lt;/strong&gt; Now I know exactly what to build. 😂&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let the agents argue while changing the architecture is still cheap.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Then let the robot cook 👨‍🍳🤖
&lt;/h2&gt;

&lt;p&gt;Once the issue is sharp, I hand it to the builder.&lt;/p&gt;

&lt;p&gt;Right now that's usually &lt;strong&gt;Grok Build&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The architecture is there. The types are there. The acceptance criteria are there.&lt;/p&gt;

&lt;p&gt;Go cook. 🍕&lt;/p&gt;

&lt;p&gt;After implementation comes &lt;strong&gt;autoreview&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;review → findings → fix → review&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Much better than letting the same robot write the code, review itself, congratulate itself, and ship.&lt;/p&gt;

&lt;p&gt;I use variations of this across things I'm building like &lt;a href="https://acpbot.app?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;acpbot.app&lt;/a&gt;, &lt;a href="https://gegenlesen.app?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;gegenlesen.app&lt;/a&gt;, and &lt;a href="https://barkvisor.dev?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;barkvisor.dev&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Different projects. Same little robot factory. 🏭🤖&lt;/p&gt;

&lt;h2&gt;
  
  
  No receipt, no ship 🧾🚢
&lt;/h2&gt;

&lt;p&gt;This is probably the most useful thing I've added lately.&lt;/p&gt;

&lt;p&gt;Agents love saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tests pass. Should work. ✅&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Should.&lt;/strong&gt; 🫠&lt;/p&gt;

&lt;p&gt;So I stopped &lt;em&gt;asking&lt;/em&gt; them to verify.&lt;/p&gt;

&lt;p&gt;I &lt;strong&gt;enforce proof before they can push&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Each project has a verification skill that knows how to prove the real thing works:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;run it • click it • call it • query it • screenshot it • show evidence&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tests are great.&lt;/p&gt;

&lt;p&gt;But &lt;strong&gt;"tests pass"&lt;/strong&gt; and &lt;strong&gt;"I used the thing and here is proof it works"&lt;/strong&gt; are not the same thing.&lt;/p&gt;

&lt;p&gt;Then a hook enforces it.&lt;/p&gt;

&lt;p&gt;No proof?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No push. 🚫🤖&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Preflight runs before pushing or opening the PR too.&lt;/p&gt;

&lt;p&gt;The robot can be creative while working. When it approaches the exit, we check the luggage. 🛂&lt;/p&gt;

&lt;h2&gt;
  
  
  That's basically my loop 🔁
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;💡 Idea&lt;/strong&gt; → &lt;strong&gt;🏛️ Council&lt;/strong&gt; → &lt;strong&gt;📝 Technical issue&lt;/strong&gt; → &lt;strong&gt;👨‍🍳 Build&lt;/strong&gt; → &lt;strong&gt;🛡️ Review + fix&lt;/strong&gt; → &lt;strong&gt;🧾 Verify + proof&lt;/strong&gt; → &lt;strong&gt;🛂 Preflight&lt;/strong&gt; → &lt;strong&gt;🚀 PR&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;I'm not trying to build the perfect mega-agent.&lt;/p&gt;

&lt;p&gt;I'm trying to make the &lt;strong&gt;process around the agent&lt;/strong&gt; reliable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agents are replaceable. Skills are portable. Hooks keep the minions honest.&lt;/strong&gt; 🤖&lt;/p&gt;

&lt;h2&gt;
  
  
  Credit where credit is due 🙌
&lt;/h2&gt;

&lt;p&gt;A lot of this workflow is inspired by &lt;strong&gt;Lauren Tan&lt;/strong&gt;, &lt;strong&gt;Peter Steinberger&lt;/strong&gt;, and &lt;strong&gt;Matt Pocock&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Lauren's work around skills and agent workflows, Peter's autoreview approach, and Matt's work around planning, specs, and engineering skills all heavily influenced my setup.&lt;/p&gt;

&lt;p&gt;I mostly mixed the parts I liked with my own questionable engineering decisions and added the rule that's been most useful lately:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No proof? No push.&lt;/strong&gt; 🧾🚫&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>agents</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Clickjitsu: The Art of Delegating Browser Tasks to AI Minions 🤖</title>
      <dc:creator>Pascal Matthiesen</dc:creator>
      <pubDate>Thu, 14 Aug 2025 11:13:00 +0000</pubDate>
      <link>https://dev.to/pmdroid/clickjitsu-the-art-of-delegating-browser-tasks-to-ai-minions-4fa7</link>
      <guid>https://dev.to/pmdroid/clickjitsu-the-art-of-delegating-browser-tasks-to-ai-minions-4fa7</guid>
      <description>&lt;p&gt;Hey tech adventurers! 👋 Ready to turn the mundane world of browser automation into something that would make science fiction jealous? Let's dive into Clickjitsu - a project that proves sometimes the best ideas come from the most questionable engineering decisions! 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  The Abstract Vision 🔮
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Challenge 🤔&lt;/strong&gt;: You need to automate web tasks, but traditional browser automation is about as secure as leaving your front door open with a "Free Stuff Inside" sign.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution 💡&lt;/strong&gt;: Spawn completely fresh, isolated browser environments in Kubernetes, hand control to AI agents, and watch the digital magic unfold with military-grade security.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why You'll Love This:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Watch AI work in real-time via WebRTC streaming 📺&lt;/li&gt;
&lt;li&gt;Zero security contamination between sessions 🛡️&lt;/li&gt;
&lt;li&gt;Scalable cloud-native architecture that handles enterprise workloads 📈&lt;/li&gt;
&lt;li&gt;Fresh browser instances for every single task 🧹&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Imagine saying "go buy me those fancy headphones" and watching a &lt;strong&gt;completely isolated browser environment&lt;/strong&gt; materialize in the cloud, execute your mission, and vanish without a trace. That's Clickjitsu – where browser automation meets paranoid-level security! 🕵️‍♂️&lt;/p&gt;

&lt;h2&gt;
  
  
  The Security-First Philosophy 🛡️
&lt;/h2&gt;

&lt;p&gt;Here's where things get &lt;strong&gt;seriously smart&lt;/strong&gt;: Every single session creates a &lt;strong&gt;brand new browser instance&lt;/strong&gt; from scratch. No cookies, no history, no digital fingerprints from previous adventures. It's like having a perfectly clean rental car for every trip, except the car also self-destructs when you're done! 🚗💥&lt;/p&gt;

&lt;h3&gt;
  
  
  Why This Security Model Is Genius:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero Cross-Contamination&lt;/strong&gt;: Your Amazon shopping spree can't accidentally leak into your banking session 🏦&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fresh Identity Every Time&lt;/strong&gt;: Each AI agent starts with a completely blank slate 🧹
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Isolated Kubernetes Namespaces&lt;/strong&gt;: Every browser session lives in its own fortress 🏰&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ephemeral by Design&lt;/strong&gt;: When the task ends, everything vanishes like it never existed 💨&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observable Operations&lt;/strong&gt;: Real-time streaming means you can supervise your AI minions 👁️&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Technical Magic Behind the Curtain 🎭
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Architecture That Actually Makes Sense 🏗️
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fresh Browser Request → Isolated K8s Namespace → Virgin Browser + AI Agent
                              ↓
                    Live Stream ← WebRTC ← Secure Monitoring  
                              ↓
                         Results + Cleanup + Self-Destruct
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each session is like hiring a &lt;strong&gt;digital temp worker&lt;/strong&gt; who:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Gets a completely clean computer 💻&lt;/li&gt;
&lt;li&gt;Follows your exact instructions 📋&lt;/li&gt;
&lt;li&gt;Reports back with results 📊&lt;/li&gt;
&lt;li&gt;Shreds everything when done 🗂️&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The Tech Stack That Makes It Possible ✨
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🎬 &lt;strong&gt;&lt;a href="https://github.com/browser-use/browser-use" rel="noopener noreferrer"&gt;browser-use&lt;/a&gt;&lt;/strong&gt;: The AI agent doing all the clicking wizardry&lt;/li&gt;
&lt;li&gt;📺 &lt;strong&gt;&lt;a href="https://github.com/m1k1o/neko" rel="noopener noreferrer"&gt;neko&lt;/a&gt;&lt;/strong&gt;: Streams the browser chaos via WebRTC so you can watch the show&lt;/li&gt;
&lt;li&gt;☸️ &lt;strong&gt;Kubernetes&lt;/strong&gt;: Because why make things simple when you can make them distributed and bulletproof?&lt;/li&gt;
&lt;li&gt;🐹 &lt;strong&gt;Go&lt;/strong&gt;: The glue holding this beautiful controlled chaos together&lt;/li&gt;
&lt;li&gt;🧠 &lt;strong&gt;OpenAI&lt;/strong&gt;: Powers the AI that (hopefully) won't accidentally order 500 rubber ducks&lt;/li&gt;
&lt;li&gt;🗄️ &lt;strong&gt;Redis&lt;/strong&gt;: Session state management that doesn't judge your automation choices&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Code That Makes You Go "Wow" ⚙️
&lt;/h3&gt;

&lt;p&gt;The session manager is where the real magic happens. Check out this beautiful orchestration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Manager&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;CreateSession&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateSessionRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;sessionID&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;namespace&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"browser-session-%s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sessionID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Session&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;          &lt;span class="n"&gt;sessionID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;ExternalURL&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://%s.%s?usr=neko&amp;amp;pwd=neko&amp;amp;embed=1&amp;amp;volume=1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                &lt;span class="n"&gt;sessionID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BrowserDomain&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;Status&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;      &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StatusCreating&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Prompt&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;      &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;ExpiresAt&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BrowserSessionTTL&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;createSessionResources&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Background&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each session gets its own Kubernetes namespace – talk about resource isolation! It's like giving every AI agent their own private mansion that gets demolished after the party 🏰&lt;/p&gt;

&lt;h3&gt;
  
  
  The AI Runner: Where Dreams Meet Reality 🤖
&lt;/h3&gt;

&lt;p&gt;The Python runner executing inside each pod is delightfully elegant:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PROMPT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;ChatOpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;o4-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;browser_session&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;browser_session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;history&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;history&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;final_result&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's literally: "Hey AI, here's a pristine browser and a task. Go nuts, but do it securely!" 🥜&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Applications (That Actually Matter) 🌍
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Enterprise Use Cases That'll Impress Your Boss:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automated Testing&lt;/strong&gt;: Fresh browsers for every test run, eliminating flaky tests caused by session contamination 🧪&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Market Research&lt;/strong&gt;: Clean environments for competitive analysis without revealing your digital fingerprints 🔍
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance Checking&lt;/strong&gt;: Isolated sessions for regulatory verification with complete audit trails ✅&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Gathering&lt;/strong&gt;: Secure web scraping without contamination or detection 🕷️&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Form Automation&lt;/strong&gt;: Fill repetitive enterprise forms without data leakage 📝&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Personal Use Cases That'll Change Your Life:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Price Monitoring&lt;/strong&gt;: AI checks deals without accumulating tracking cookies 💰&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Research Tasks&lt;/strong&gt;: Clean browsing for sensitive investigations 🔬&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;E-commerce Automation&lt;/strong&gt;: Let AI handle your shopping without compromising your privacy 🛒&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Social Media Management&lt;/strong&gt;: Automate posts and interactions with complete isolation 📱&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The "What Could Go Right" Scenarios 🎯
&lt;/h2&gt;

&lt;p&gt;Unlike traditional browser automation that accumulates digital baggage like a hoarder's basement, Clickjitsu's &lt;strong&gt;ephemeral approach&lt;/strong&gt; means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No Session Hijacking&lt;/strong&gt;: Fresh browser = fresh start every time 🔄&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No Data Persistence&lt;/strong&gt;: Sensitive info never lingers around like a bad smell 🚫&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No Cross-Task Interference&lt;/strong&gt;: Yesterday's shopping can't affect today's banking 🏪➡️🏦&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Perfect Audit Trail&lt;/strong&gt;: Every session is logged, isolated, and traceable 📊&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalable Security&lt;/strong&gt;: Want 100 AI agents? Just scale the pods without security concerns! 📈&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Security Wins That Actually Matter 🏆
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Container-Level Fort Knox 🏰
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Network Segmentation&lt;/strong&gt;: Kubernetes networking keeps sessions separated like VIP sections at a concert 🕸️&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource Limits&lt;/strong&gt;: AI can't consume infinite resources or accidentally bankrupt you 💸&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean Slate Guarantee&lt;/strong&gt;: Every session starts with zero previous context, like digital amnesia 🧼&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Monitoring&lt;/strong&gt;: Watch exactly what your AI agent is doing, no surprises! 👁️&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Taking Security to Ludicrous Speed 🚀
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;For Production Environments&lt;/strong&gt;, you could take this paranoia to the next level with some seriously hardcore isolation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;gVisor&lt;/strong&gt;: Run containers in a user-space kernel for that extra "nope, you're not touching my host OS" feeling 🛡️&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kata Containers&lt;/strong&gt;: Each container gets its own lightweight VM because why trust anything? 🏰&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firecracker MicroVMs&lt;/strong&gt;: AWS-style microVMs that boot faster than your morning coffee ☕
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Because regular containers are for peasants&lt;/span&gt;
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; - &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
apiVersion: v1
kind: Pod
spec:
  runtimeClassName: kata-containers  # Or gvisor, or firecracker
  containers:
  - name: paranoid-browser
    image: clickjitsu/browser:latest
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why Go Full Paranoid? 🕵️‍♂️&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kernel-Level Isolation&lt;/strong&gt;: AI agent escapes? Still trapped in VM-land! &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardware-Assisted Security&lt;/strong&gt;: CPU features working overtime to keep you safe&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance Gold Star&lt;/strong&gt;: Auditors will weep tears of joy at your isolation levels ⭐&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sleep Better at Night&lt;/strong&gt;: Because knowing your AI can't accidentally root your cluster is priceless 😴&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Infrastructure Patterns That Impress 🎯
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Each session gets its own isolated environment&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Namespace&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;browser-session-uuid-here&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="c1"&gt;# Browser container with Chrome DevTools + MicroVM isolation&lt;/span&gt;
&lt;span class="c1"&gt;# AI runner container with browser-use + gVisor sandboxing&lt;/span&gt;
&lt;span class="c1"&gt;# All ephemeral, all secure, all magnificently over-engineered&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Infrastructure Wins That Matter 🚀
&lt;/h2&gt;

&lt;p&gt;Despite being born from "questionable life choices," Clickjitsu showcases serious cloud-native patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ephemeral Workloads&lt;/strong&gt;: Each session is completely isolated and self-cleaning 🧹&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Horizontal Scalability&lt;/strong&gt;: Want 100 AI shoppers? Just scale the pods! 📈
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource Management&lt;/strong&gt;: Proper CPU/memory limits prevent AI shopping sprees from breaking your cluster 💳&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebRTC Streaming&lt;/strong&gt;: Real-time browser viewing because watching AI click buttons is surprisingly addictive 👁️&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitOps Ready&lt;/strong&gt;: Infrastructure as code that would make your DevOps team weep with joy 😭&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Warning Labels and Disclaimers ⚠️
&lt;/h2&gt;

&lt;p&gt;This is a &lt;strong&gt;one-day hack&lt;/strong&gt; that turned into something surprisingly robust – use responsibly! Side effects may include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mysterious charges on your credit card (set those spending limits!) 💳&lt;/li&gt;
&lt;li&gt;AI developing sentience and judging your browsing habits 👨‍⚖️
&lt;/li&gt;
&lt;li&gt;Kubernetes bills that make you question life choices 💸&lt;/li&gt;
&lt;li&gt;Your browser automation having better security than most enterprise systems 🏢&lt;/li&gt;
&lt;li&gt;Colleagues asking "how the hell did you build that?" 🤯&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Future of Secure Automation 🔮
&lt;/h2&gt;

&lt;p&gt;This isn't just about letting AI click buttons – it's about creating a &lt;strong&gt;paradigm where automation meets paranoid-level security&lt;/strong&gt;. Imagine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Corporate AI Assistants&lt;/strong&gt;: Safely handling sensitive business processes without data leakage 💼&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Personal Digital Butlers&lt;/strong&gt;: Managing your online life without privacy nightmares 🏠
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Research Automation&lt;/strong&gt;: Gathering competitive intelligence without leaving digital footprints 🕵️&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance Automation&lt;/strong&gt;: Meeting regulations with verifiable isolation and audit trails ✅&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero-Trust Browsing&lt;/strong&gt;: Every web interaction happens in a disposable, monitored environment 🗑️&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Yourself (If You Dare) 🎮
&lt;/h2&gt;

&lt;p&gt;Want to watch AI navigate the web while you sip coffee in your security-hardened ivory tower? The project is open source and ready for your own questionable experiments!&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting Started:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone the madness&lt;/span&gt;
git clone https://github.com/pmdroid/clickjitsu

&lt;span class="c"&gt;# Deploy to your K8s cluster&lt;/span&gt;
&lt;span class="c"&gt;# Watch AI do your bidding&lt;/span&gt;
&lt;span class="c"&gt;# Profit (securely)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Just remember: with great AI power comes great responsibility (and the need for really good monitoring) 🕷️&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways That'll Stick 🎯
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Security Through Isolation&lt;/strong&gt;: Fresh environments eliminate contamination risks better than hand sanitizer 🛡️&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observable AI&lt;/strong&gt;: Real-time streaming lets you supervise your digital minions like a benevolent overlord 👀&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalable Architecture&lt;/strong&gt;: Cloud-native design handles enterprise workloads without breaking a sweat 📈
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Persistence&lt;/strong&gt;: What happens in the container, stays in the container (and then gets obliterated) 🔒&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure as Entertainment&lt;/strong&gt;: Who knew watching AI browse the web could be this addictive? 🍿&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Bottom Line 💰
&lt;/h2&gt;

&lt;p&gt;Clickjitsu proves that sometimes the most useful innovations come from solving problems you didn't know you had. It's browser automation for the age of zero-trust architecture, where every click is monitored, every session is isolated, and every result is achieved without compromising your digital soul.&lt;/p&gt;

&lt;p&gt;Ready to delegate your browser tasks to AI agents while keeping everything locked down tighter than Fort Knox? Your secure automation journey starts here! 🚀&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with ❤️ and questionable engineering decisions that somehow resulted in enterprise-grade security. Because in 2025, even our browser automation needs better security than most banks&lt;/em&gt; 😅🏦&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; - Yes, it actually works. No, we can't be held responsible for what your AI decides to buy. Please set spending limits. I'm not kidding about this one! 💸&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>ai</category>
      <category>browser</category>
      <category>automation</category>
    </item>
    <item>
      <title>Cloudflare Logs: Not Just for Breakfast Anymore 🥞</title>
      <dc:creator>Pascal Matthiesen</dc:creator>
      <pubDate>Tue, 05 Aug 2025 07:38:47 +0000</pubDate>
      <link>https://dev.to/pmdroid/cloudflare-logs-not-just-for-breakfast-anymore-10ne</link>
      <guid>https://dev.to/pmdroid/cloudflare-logs-not-just-for-breakfast-anymore-10ne</guid>
      <description>&lt;p&gt;Alright, log lovers, let's get this observability party started 🎉. We're about to turn your Cloudflare logs from wallflowers into the life of the data analysis party 🥳.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Challenge&lt;/strong&gt; 😕: Cloudflare Logpush delivers valuable data, but it might not be in the most usable format for further analysis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt; 💡: Enter Vector and Loki, the dream team 🏆. We'll leverage Vector's built-in HTTP server to accept your Cloudflare log lines, process them, and then ship them off to Loki for storage and analysis 🚀.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Bother? 🤔
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Find and fix issues faster&lt;/strong&gt;: Your logs will be organized and searchable, making troubleshooting a breeze.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Optimize performance&lt;/strong&gt;: Identify bottlenecks and fine-tune your applications like a pro.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boost security&lt;/strong&gt;: Detect threats and protect your digital assets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Ready to Geek Out!
&lt;/h2&gt;

&lt;p&gt;We'll dive into the technical details soon, so get your command line fingers ready. You'll learn how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up Vector to transform and forward your logs.&lt;/li&gt;
&lt;li&gt;Get Loki ready to ingest and analyze your data.&lt;/li&gt;
&lt;li&gt;Configure Cloudflare Logpush to send logs via HTTP.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These commands give your Kubernetes cluster a VIP backstage pass 🎫 to the hottest logging tool in town: Vector! ✨&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;helm repo add vector https://helm.vector.dev&lt;/code&gt;: This tells Helm (your trusty Kubernetes package manager) where to find Vector's exclusive swag, like adding a secret app store to your phone 🤫.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;helm repo update&lt;/code&gt;: This command refreshes Helm's knowledge, making sure you have access to the freshest Vector releases. Think of it as checking for those "new app" notifications on your phone 📲.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;helm repo add vector https://helm.vector.dev&lt;/span&gt;
&lt;span class="s"&gt;helm repo update&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This Kubernetes Secret ("vector") is the Fort Knox 🔒 of your Vector logging tool, guarding a super-secret HTTP password ("123abc") 🤫. But hold on, Captain Obvious here 🦸 – change that password before some sneaky cyber ninja 🥷 steals your precious logs!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Secret&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;vector&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;vector&lt;/span&gt;
&lt;span class="na"&gt;stringData&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;HTTP_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;123abc"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This Vector configuration sets up a secure gateway 🚪 for your Cloudflare logs. It grabs the logs, translates them into a format Loki understands 🗣️, and then sends them off for safekeeping 📦. It's like a trusty butler for your website data 🤵.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;envFrom&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;secretRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;vector&lt;/span&gt;
&lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http&lt;/span&gt;
      &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3000&lt;/span&gt;
  &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Stateless-Aggregator&lt;/span&gt;
&lt;span class="na"&gt;customConfig&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;acknowledgements&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;sources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http"&lt;/span&gt;
      &lt;span class="na"&gt;address&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0.0.0.0:3000&lt;/span&gt;
      &lt;span class="na"&gt;strict_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
      &lt;span class="na"&gt;encoding&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;text&lt;/span&gt;
      &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/ingest&lt;/span&gt;
      &lt;span class="na"&gt;auth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cloudflare&lt;/span&gt;
        &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${HTTP_PASSWORD}"&lt;/span&gt;
  &lt;span class="na"&gt;transforms&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;parse_json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;remap&lt;/span&gt;
      &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;in"&lt;/span&gt;
      &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;. = parse_json!(.message)&lt;/span&gt;
        &lt;span class="s"&gt;.timestamp = from_unix_timestamp!(.EventTimestampMs, unit: "milliseconds")&lt;/span&gt;
  &lt;span class="na"&gt;sinks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;loki"&lt;/span&gt;
      &lt;span class="na"&gt;tenant_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0:0"&lt;/span&gt;
      &lt;span class="na"&gt;encoding&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;codec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;json"&lt;/span&gt;
      &lt;span class="na"&gt;remove_timestamp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
      &lt;span class="na"&gt;out_of_order_action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;accept&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;job&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cloudflare&lt;/span&gt;
      &lt;span class="na"&gt;endpoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http://loki-gateway.monitoring.svc.cluster.local&lt;/span&gt;
      &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;parse_json"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command summons the Helm installer 🧙‍♂️ to conjure up Vector on your Kubernetes cluster:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;helm install vector vector/vector \&lt;/span&gt;
  &lt;span class="s"&gt;--namespace vector \&lt;/span&gt;
  &lt;span class="s"&gt;--create-namespace \&lt;/span&gt;
  &lt;span class="s"&gt;--values values.yaml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's like giving Helm a magic spell book 🪄, pointing to the Vector spell page, and telling it where to build Vector's cozy little home 🏡 (in the "vector" namespace) with the customizations you specified in the "values.yaml" file. Now you're ready to wrangle those logs! 🧹🪵&lt;/p&gt;

&lt;p&gt;Now, let's teach Cloudflare to share those juicy logs with Vector! 🤝 Just replace the placeholders and run this command in your terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.cloudflare.com/client/v4/accounts/&amp;lt;YOUR_CF_ACCOUNT_ID&amp;gt;/logpush/jobs"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &amp;lt;YOUR_CF_API_TOKEN&amp;gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
      "name": "vector-logs",
      "destination_conf": "&amp;lt;YOUR_VECTOR_ENDPOINT&amp;gt;?header_Authorization=Basic%20&amp;lt;BASE64_ENCODED_AUTH&amp;gt;",
      "dataset": "workers_trace_events",
      "enabled": true
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace these placeholders:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;: Your Cloudflare account ID 🔢&lt;/li&gt;
&lt;li&gt;: Your Cloudflare API token 🗝️&lt;/li&gt;
&lt;li&gt;: The full URL to your Vector's HTTP endpoint (e.g., &lt;a href="https://vector.yourdomain.com/ingest" rel="noopener noreferrer"&gt;https://vector.yourdomain.com/ingest&lt;/a&gt;) 🌐&lt;/li&gt;
&lt;li&gt;: Your Vector username and password encoded in Base64 format 🔒 (&lt;code&gt;echo -n "$username:$password" | base64&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it! Cloudflare will start pushing logs to Vector, and Vector will whisk them off to Loki for safekeeping and analysis. 💨 Now you're a log analysis wizard! 🧙‍♂️&lt;/p&gt;

&lt;p&gt;And with that, the logs have been tamed... for now. 😈  But rest assured, they'll be back with a vengeance, just like my insatiable craving for pizza. 🍕  If you enjoyed this wild ride through log analysis, join me next time as I tackle more tech challenges, share hilarious startup fails, and maybe even reveal my secret pizza recipe (just kidding...or am I? 😉).&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>infrastructureascode</category>
    </item>
    <item>
      <title>GitOps Made Easy: Building the Ultimate Kubernetes Testing Lab 🚀</title>
      <dc:creator>Pascal Matthiesen</dc:creator>
      <pubDate>Tue, 05 Aug 2025 07:33:27 +0000</pubDate>
      <link>https://dev.to/pmdroid/gitops-made-easy-building-the-ultimate-kubernetes-testing-lab-13ii</link>
      <guid>https://dev.to/pmdroid/gitops-made-easy-building-the-ultimate-kubernetes-testing-lab-13ii</guid>
      <description>&lt;p&gt;Hey Kubernetes warriors! 👋 Ever wanted to spin up a complete, production-like environment faster than you can say "microservices"? Well, buckle up because we're about to explore &lt;code&gt;flux-e2e&lt;/code&gt; - a GitOps repository that'll make your infrastructure dreams come true! &lt;/p&gt;

&lt;h2&gt;
  
  
  The Challenge 🤔
&lt;/h2&gt;

&lt;p&gt;Picture this: You're building a Kubernetes application, and you need to test it with proper networking, security policies, observability, and all the production bells and whistles. Traditionally, this means hours of YAML wrestling, secret management nightmares, and probably at least three cups of coffee ☕.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The usual pain points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setting up proper GitOps workflows 📝&lt;/li&gt;
&lt;li&gt;Configuring secure networking without losing your sanity 🔐&lt;/li&gt;
&lt;li&gt;Getting observability right from day one 📊&lt;/li&gt;
&lt;li&gt;Making it all work together without breaking 💥&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Solution 💡
&lt;/h2&gt;

&lt;p&gt;Enter &lt;code&gt;flux-e2e&lt;/code&gt; - a beautifully orchestrated GitOps repository that gives you a complete Kubernetes testing environment with just one command. Think of it as the "easy button" for infrastructure testing! &lt;/p&gt;

&lt;h3&gt;
  
  
  What Makes This Special? ✨
&lt;/h3&gt;

&lt;p&gt;This isn't just another "hello world" Kubernetes setup. We're talking about a &lt;strong&gt;full-stack, production-ready testing environment&lt;/strong&gt; that includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitOps with Flux CD&lt;/strong&gt; - Because manual deployments are so 2019 📅&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cilium CNI + Tailscale&lt;/strong&gt; - Networking that actually makes sense 🌐&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grafana + Loki&lt;/strong&gt; - Observability that doesn't suck 📈&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network policies + sealed secrets&lt;/strong&gt; - Security that doesn't give you headaches 🛡️&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proper dependency management&lt;/strong&gt; - Everything deploys in the right order 🎯&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Architecture That'll Make You Smile 😊
&lt;/h2&gt;

&lt;p&gt;The genius lies in the numbered directory structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;├── 0-bootstrap/          # Start here - namespaces and basics
├── 1-network-policies/   # Lock it down early
├── 2-secrets/           # Encrypted secrets (no more leaked passwords!)
├── 3-config/            # Configuration management
├── 4-infrastructure/    # The heavy lifting (cert-manager, operators)
├── 5-system/           # Core services (MariaDB, Redis)
├── 6-apps/             # Your actual applications
├── 7-ingress/          # Tailscale funnel magic
└── cluster/            # Flux orchestrates it all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this is brilliant:&lt;/strong&gt; Dependencies flow naturally from 0 to 7. No more "chicken and egg" deployment problems! 🐣&lt;/p&gt;

&lt;h2&gt;
  
  
  The Magic Script 🪄
&lt;/h2&gt;

&lt;p&gt;Ready for the best part? Getting this entire stack running is literally one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;TAILSCALE_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"tskey-api-xxxxx"&lt;/span&gt;
&lt;span class="c"&gt;# ... set a few more environment variables&lt;/span&gt;
./local.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What happens next is pure magic:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Spins up a Kind cluster with Cilium 🎪&lt;/li&gt;
&lt;li&gt;Installs Flux CD and points it to your repo 🎯&lt;/li&gt;
&lt;li&gt;Deploys everything in the correct dependency order 📋&lt;/li&gt;
&lt;li&gt;Sets up Tailscale networking for secure access 🔒&lt;/li&gt;
&lt;li&gt;Gives you URLs to access your services! 🌍&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Tailscale Twist 🌟
&lt;/h2&gt;

&lt;p&gt;Here's where things get really cool. Instead of dealing with LoadBalancers or complicated ingress setups, everything is exposed through &lt;strong&gt;Tailscale funnel&lt;/strong&gt;. Your services get URLs like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;https://{random-prefix}grafana.{tailnet}.ts.net&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https://{random-prefix}echo.{tailnet}.ts.net&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why this rocks:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Secure by default (only your Tailscale network can access) 🔐&lt;/li&gt;
&lt;li&gt;No public IPs or complex firewall rules 🚫&lt;/li&gt;
&lt;li&gt;Works from anywhere with proper authentication ✅&lt;/li&gt;
&lt;li&gt;Random prefixes prevent conflicts in shared environments 🎲&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Under the Hood: Smart Design Patterns 🔧
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Variable Substitution Magic
&lt;/h3&gt;

&lt;p&gt;Everything is configured through a &lt;code&gt;cluster-vars&lt;/code&gt; ConfigMap with variable substitution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;someConfig&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${VARIABLE_NAME}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change one value, update everything! 🎭&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Sealed Secrets = Sleep Better at Night
&lt;/h3&gt;

&lt;p&gt;No more secrets in plaintext Git repos. Everything is encrypted with sealed-secrets, so you can commit your secrets safely. Your security team will love you! 💕&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Network Policies by Default
&lt;/h3&gt;

&lt;p&gt;Every namespace gets restrictive network policies. Because security shouldn't be an afterthought! 🛡️&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Use Cases 🌍
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Perfect for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local development&lt;/strong&gt; - Full-stack testing without the cloud bill 💰&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD pipelines&lt;/strong&gt; - Spin up environments for each PR 🔄&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learning GitOps&lt;/strong&gt; - See how it all fits together 🎓&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture validation&lt;/strong&gt; - Test your designs before production 🧪&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Debugging Like a Pro 🕵️
&lt;/h2&gt;

&lt;p&gt;When things go sideways (they always do), the repo includes helpful debugging commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check Flux status&lt;/span&gt;
flux get kustomizations

&lt;span class="c"&gt;# See what's broken&lt;/span&gt;
kubectl get pods &lt;span class="nt"&gt;-A&lt;/span&gt;

&lt;span class="c"&gt;# Follow the logs&lt;/span&gt;
kubectl logs &lt;span class="nt"&gt;-n&lt;/span&gt; flux-system &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;helm-controller
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Cleanup is Automatic! 🧹
&lt;/h2&gt;

&lt;p&gt;Exit the script, and everything cleans up automatically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Removes Tailscale devices ✅&lt;/li&gt;
&lt;li&gt;Optionally deletes the Kind cluster ✅&lt;/li&gt;
&lt;li&gt;No orphaned resources ✅&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No more "what was that cluster name again?" moments! 😅&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters 🎯
&lt;/h2&gt;

&lt;p&gt;In a world where Kubernetes complexity can make grown developers cry, &lt;code&gt;flux-e2e&lt;/code&gt; shows us that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;GitOps doesn't have to be hard&lt;/strong&gt; - Good structure makes all the difference&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security can be baked in&lt;/strong&gt; - Network policies and sealed secrets from day one&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability is achievable&lt;/strong&gt; - Grafana and Loki working out of the box&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local testing can be production-like&lt;/strong&gt; - No more "works on my machine" 🤷‍♂️&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Get Started Today! 🚦
&lt;/h2&gt;

&lt;p&gt;Ready to revolutionize your Kubernetes testing game? &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Clone the repo:&lt;/strong&gt; &lt;code&gt;git clone https://github.com/pmdroid/flux-e2e&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set your environment variables&lt;/strong&gt; (don't forget the Tailscale API key!)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run:&lt;/strong&gt; &lt;code&gt;./local.sh&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch the magic happen&lt;/strong&gt; ✨&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Final Thoughts 💭
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;flux-e2e&lt;/code&gt; isn't just a repository - it's a &lt;strong&gt;blueprint for how modern Kubernetes deployments should work&lt;/strong&gt;. It proves that with the right patterns and tools, we can have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simplicity&lt;/strong&gt; without sacrificing functionality 📊&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt; without operational overhead 🔒&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability&lt;/strong&gt; without complexity 👀&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitOps&lt;/strong&gt; without the learning curve 📈&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you're a GitOps newbie or a Kubernetes veteran, this repo will teach you something new about building resilient, secure, and observable systems.&lt;/p&gt;

&lt;p&gt;Now go forth and GitOps responsibly! 🎉&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you tried flux-e2e? Share your experience in the comments! And if you build something cool with it, we'd love to hear about it! 🗨️&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gitops</category>
      <category>kubernetes</category>
      <category>e2e</category>
    </item>
  </channel>
</rss>
