<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>TechFuel HQ</title><link>https://techfuelhq.com/</link><description>Recent content on TechFuel HQ</description><generator>Hugo</generator><language>en-us</language><managingEditor>LK Wood IV</managingEditor><lastBuildDate>Tue, 25 Aug 2026 00:00:00 -0500</lastBuildDate><atom:link href="https://techfuelhq.com/index.xml" rel="self" type="application/rss+xml"/><atom:link href="https://pubsubhubbub.appspot.com/" rel="hub"/><item><title>Jellyfin Remote Access: Pick the Right Path for Your Situation (2026)</title><link>https://techfuelhq.com/tutorials/jellyfin-remote-access-2026/</link><pubDate>Tue, 25 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/tutorials/jellyfin-remote-access-2026/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · 2026-08-25 · ~12 min read · St. Louis County, MO&lt;/p>
&lt;img src="https://techfuelhq.com/images/tutorials/jellyfin-remote-access-2026.svg" alt="Decision diagram for Jellyfin remote access: four paths from a home Jellyfin server - Tailscale mesh VPN to your own phones and laptops, reverse proxy with a domain to family TVs and browsers, VPS relay via WireGuard or Pangolin for CGNAT connections, and Cloudflare Tunnel marked with a terms-of-service warning for video" width="1200" height="630" loading="eager" fetchpriority="high" style="display:block;margin:1.5rem auto;max-width:100%;height:auto;border:1px solid #1e1e3a;border-radius:8px;" />
&lt;p>Jellyfin does not have a relay. That single architecture fact generates the question this page answers. When a Plex user hits play from a hotel, Plex&amp;rsquo;s own infrastructure brokers the connection; when Plex put that convenience behind a paywall in 2025, the &lt;a href="https://techfuelhq.com/articles/jellyfin-vs-plex-2026/">migration wave toward Jellyfin&lt;/a> began, and every migrant hit the same wall about a week in. Jellyfin gives you a checkbox that says &lt;em>Allow remote connections to this server&lt;/em> and leaves the actual path from the outside world to your basement entirely to you.&lt;/p>
&lt;p>The r/jellyfin community answers this question so often that a post sitting at 279-plus upvotes as of late August 2026 is literally titled &lt;a href="https://www.reddit.com/r/jellyfin/comments/1vtff2e/im_kinda_tired_of_the_constant_remote_access/" rel="noopener">&amp;ldquo;I&amp;rsquo;m kinda tired of the constant remote access questions&amp;rdquo;&lt;/a> — 250-plus comments of people relitigating the same four options. Listing the options was never the hard part. Matching one to your situation is. So this guide routes first and explains second.&lt;/p>
&lt;div class="verdict-card" style="border:1px solid #c8ff00;border-left:4px solid #c8ff00;border-radius:6px;padding:1.25rem 1.5rem;margin:1.5rem 0 2rem 0;background:rgba(200,255,0,0.04);">
&lt;p>&lt;strong>TL;DR · Route yourself before reading anything else&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>&lt;tr>&lt;th>Your situation&lt;/th>&lt;th>Use this&lt;/th>&lt;/tr>&lt;/thead>
&lt;tbody>
&lt;tr>&lt;td>Just you, on your own phone and laptop&lt;/td>&lt;td>&lt;strong>Tailscale&lt;/strong> (Path 1)&lt;/td>&lt;/tr>
&lt;tr>&lt;td>You + household, every device can install apps&lt;/td>&lt;td>&lt;strong>Tailscale&lt;/strong>, apps on each device (Path 1)&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Family elsewhere, watching on smart TVs&lt;/td>&lt;td>&lt;strong>Reverse proxy + your own domain&lt;/strong> (Path 2)&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Family elsewhere on TVs, but your ISP uses CGNAT&lt;/td>&lt;td>&lt;strong>VPS relay: Pangolin or WireGuard bounce&lt;/strong> (Path 3)&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Non-technical viewers who will not install anything&lt;/td>&lt;td>&lt;strong>Reverse proxy&lt;/strong> - a URL in a browser is the only universal client (Path 2 or 3)&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Hotel room / a TV you do not own&lt;/td>&lt;td>&lt;strong>Travel streaming stick with Tailscale&lt;/strong>, or laptop + HDMI (device table below)&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Roku in another house&lt;/td>&lt;td>&lt;strong>Reverse proxy or VPS relay&lt;/strong> - no Tailscale client exists for Roku&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Tempted by Cloudflare Tunnel because it is free&lt;/td>&lt;td>&lt;strong>Read Path 4 first&lt;/strong> - video streaming sits against Cloudflare's CDN terms&lt;/td>&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;h2 id="why-just-use-tailscale-keeps-failing-people">Why &amp;ldquo;just use Tailscale&amp;rdquo; keeps failing people&lt;/h2>
&lt;p>Tailscale is the default answer in every thread, and for the person asking, it is usually right. It is also the answer I give for a solo setup, so this is not a takedown. The failures cluster in one place: &lt;strong>the devices you do not control.&lt;/strong>&lt;/p>
&lt;p>Tailscale reaches a device by running a client on it. The client coverage is better than most people assume in 2026 - there is an &lt;a href="https://tailscale.com/docs/install/android" rel="noopener">Android TV app in the Play Store&lt;/a>, an &lt;a href="https://tailscale.com/docs/install/amazon-fire" rel="noopener">Amazon Appstore app for Fire TV&lt;/a> (most devices after 2018, though Tailscale states it does not support the Fire TV Stick 4K Select), and an &lt;a href="https://tailscale.com/kb/1280/appletv" rel="noopener">Apple TV app&lt;/a>. But Tailscale&amp;rsquo;s &lt;a href="https://tailscale.com/kb/1347/installation" rel="noopener">supported-platform list&lt;/a> ends there for TVs. No Roku. No LG webOS. No Samsung Tizen. Jellyfin ships &lt;a href="https://jellyfin.org/downloads/clients/" rel="noopener">official apps for all three&lt;/a>, so the missing piece is the network path. Your mother-in-law&amp;rsquo;s Roku can run Jellyfin; it cannot run your VPN.&lt;/p>
&lt;p>The second failure is human. A tailnet wants an account relationship with every participant: you either share devices to their Tailscale account or manage logins for them. For a household that tolerates you, fine. For the relative who calls when the TV &amp;ldquo;stopped working,&amp;rdquo; each moving part you added is a future phone call. The 100-plus-comment version of this complaint is &lt;a href="https://www.reddit.com/r/jellyfin/comments/1tu1tvy/" rel="noopener">&amp;ldquo;I&amp;rsquo;m eyeing Jellyfin (currently use Plex w/ a Lifetime pass)&amp;rdquo;&lt;/a>, a holder of the old Plex deal asking whether Jellyfin can match that remote simplicity for non-technical family - and the honest answer is: only if you build the path that needs nothing installed, which is Path 2.&lt;/p>
&lt;p>So run Tailscale when you control the endpoints, and something with a plain HTTPS URL when you do not.&lt;/p>
&lt;h2 id="path-1-tailscale-or-another-mesh-vpn">Path 1: Tailscale (or another mesh VPN)&lt;/h2>
&lt;p>This is the path for you, your own devices, and a household that installs apps. It costs $0. The free &lt;a href="https://tailscale.com/pricing" rel="noopener">Personal plan&lt;/a> covers up to 6 users with unlimited devices, which is most homes.&lt;/p>
&lt;p>The mechanics are in our &lt;a href="https://techfuelhq.com/tutorials/tailscale-remote-access-homelab-2026/">Tailscale homelab guide&lt;/a> — client on the server, client on each viewer, then the Jellyfin apps talk to &lt;code>http://&amp;lt;tailscale-ip&amp;gt;:8096&lt;/code> from anywhere. The &lt;a href="https://techfuelhq.com/tutorials/jellyfin-setup-docker-homelab-2026/">Jellyfin Docker guide&lt;/a> covers the server side in Step 6. Traffic stays WireGuard-encrypted end to end, nothing is exposed to the internet, and CGNAT does not matter because every connection is outbound.&lt;/p>
&lt;p>Two honest caveats. Battery and cellular behavior on phones is solved, but every viewer&amp;rsquo;s device must keep its VPN toggled on, and the failure mode when it silently is not - &amp;ldquo;your server is down&amp;rdquo; - lands on you. And if you would rather self-host the coordination server too, that is &lt;a href="https://techfuelhq.com/networking/headscale-self-hosted-tailscale-2026/">Headscale&lt;/a>, with the same client math.&lt;/p>
&lt;p>Do not confuse this path with Tailscale Funnel, which publishes a tailnet service to the open internet through Tailscale&amp;rsquo;s relays. Tailscale &lt;a href="https://tailscale.com/kb/1223/funnel" rel="noopener">documents Funnel traffic as subject to non-configurable bandwidth limits&lt;/a> - a constraint that rules it out for pushing video at your family every evening.&lt;/p>
&lt;h2 id="path-2-reverse-proxy--your-own-domain">Path 2: Reverse proxy + your own domain&lt;/h2>
&lt;p>This is the path for family on TVs and for viewers who install nothing, because any client with a browser or a Jellyfin app that accepts a URL can reach it. It needs a public IPv4 address and ports 80/443 forwarded on your router. The only recurring cost is an ordinary domain registration, since the proxy automates a free Let&amp;rsquo;s Encrypt TLS certificate.&lt;/p>
&lt;p>This is the path I validated end to end while writing this guide, on a bare Windows box with no Docker, because the claim &amp;ldquo;a reverse proxy in front of Jellyfin is fiddly&amp;rdquo; deserved a test. It is not fiddly anymore. The sequence, timed:&lt;/p>
&lt;ol>
&lt;li>Jellyfin 10.11.11 portable zip unpacked to a folder and started: &lt;strong>about three minutes&lt;/strong> from download to a listening server on port 8096. No installer, no admin rights.&lt;/li>
&lt;li>The setup wizard&amp;rsquo;s &lt;em>Set up Remote Access&lt;/em> screen shows one checkbox — &lt;strong>Allow remote connections to this server&lt;/strong> — already checked by default. I verified the shipped network config afterward through the API: remote access on, UPnP &lt;strong>off&lt;/strong>, HTTPS &lt;strong>off&lt;/strong>, Known Proxies empty. Jellyfin never opens your router for you and never brings its own TLS - both are deliberately your job, and both are exactly what the proxy provides.&lt;/li>
&lt;li>&lt;a href="https://caddyserver.com/" rel="noopener">Caddy&lt;/a> as the proxy, one binary, and the entire working config is this:&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>media.yourdomain.com {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> reverse_proxy 127.0.0.1:8096
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>That is the whole file. With a real domain pointed at your IP, Caddy obtains and renews the Let&amp;rsquo;s Encrypt certificate on its own. Against my local instance I watched the three things that historically break proxied Jellyfin all come back clean: the web client served, logins authenticated, and the websocket upgrade returned &lt;code>101 Switching Protocols&lt;/code> with &lt;strong>zero&lt;/strong> websocket-specific configuration. That last one matters because Jellyfin&amp;rsquo;s &lt;a href="https://jellyfin.org/docs/general/post-install/networking/reverse-proxy/" rel="noopener">reverse-proxy docs&lt;/a> warn that not every proxy passes websockets by default - nginx wants explicit upgrade headers, and the equivalent toggle is the classic missed step in &lt;a href="https://techfuelhq.com/tutorials/nginx-proxy-manager-homelab-2026/">Nginx Proxy Manager&lt;/a>. Caddy is also what Jellyfin&amp;rsquo;s own docs recommend first, &amp;ldquo;for its ease of use.&amp;rdquo; On the same evidence, I concur. (Choosing between Caddy, NPM, and Traefik is &lt;a href="https://techfuelhq.com/homelab/caddy-vs-nginx-proxy-manager-vs-traefik-2026/">its own comparison&lt;/a>.)&lt;/p>
&lt;p>One Windows-specific wrinkle from the test worth passing on: Caddy&amp;rsquo;s self-signed local mode pauses on an interactive certificate-trust prompt. Irrelevant for the real deployment - public certificates involve no local trust store - but if you dry-run with &lt;code>local_certs&lt;/code> first, expect that prompt.&lt;/p>
&lt;p>Two settings finish the job properly. Add the proxy&amp;rsquo;s IP to &lt;strong>Known Proxies&lt;/strong> in Jellyfin&amp;rsquo;s networking settings, or every viewer shows up in your logs as the proxy&amp;rsquo;s address instead of their own - the docs flag this, and the fresh-install default I captured (empty list) means it is always on you to set. And leave Jellyfin itself listening on plain 8096 bound to localhost or the LAN; the proxy is the only thing that should face the world. &lt;strong>Never forward 8096 directly&lt;/strong> - that is unencrypted HTTP with your login page on it, and it is the port-forward horror story the community warnings are actually about.&lt;/p>
&lt;p>What kills this path is not skill. It is &lt;a href="https://techfuelhq.com/networking/tailscale-vs-cloudflare-tunnel-2026/">CGNAT&lt;/a> - if your ISP does not give you a real public IPv4, no amount of port forwarding helps, and dynamic-DNS tricks change nothing. Check before you buy a domain. If your router&amp;rsquo;s WAN address falls in the 100.64.x-100.127.x range (&lt;a href="https://www.rfc-editor.org/rfc/rfc6598" rel="noopener">RFC 6598 shared address space&lt;/a>), or the &amp;ldquo;what is my IP&amp;rdquo; number differs from the router&amp;rsquo;s WAN number, you are CGNATed and you want Path 3.&lt;/p>
&lt;h2 id="path-3-vps-relay---the-cgnat-escape-hatch">Path 3: VPS relay - the CGNAT escape hatch&lt;/h2>
&lt;p>This fits everything Path 2 fits, for the case where the ISP will not give you a public IP or you refuse to open home ports. The going figure in &lt;a href="https://www.reddit.com/r/jellyfin/comments/1uqgqil/" rel="noopener">the community threads&lt;/a> is about &lt;strong>$5/month&lt;/strong> for a small VPS.&lt;/p>
&lt;p>The idea is to rent the public IP you do not have. A minimal VPS gets the public endpoint; your home server connects outward to it; visitor traffic enters the VPS and rides that outbound tunnel home. Three implementations, in ascending order of hand-holding:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>WireGuard bounce&lt;/strong> - the DIY version. WireGuard on both ends, forwarding rules on the VPS. Full control, most assembly; our &lt;a href="https://techfuelhq.com/tutorials/wireguard-self-hosted-vpn-proxmox-2026/">WireGuard on Proxmox guide&lt;/a> covers the VPN half.&lt;/li>
&lt;li>&lt;strong>FRP&lt;/strong> (fast reverse proxy) - the same shape with a purpose-built tool, popular in the budget threads.&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://github.com/fosrl/pangolin" rel="noopener">Pangolin&lt;/a>&lt;/strong> - the project that broke out in 2026, and the reason this section is not just &amp;ldquo;run WireGuard.&amp;rdquo; It is a WireGuard-based, identity-aware tunneled reverse proxy: dashboard, per-app authentication, Let&amp;rsquo;s Encrypt handling, all self-hosted. Its &lt;a href="https://docs.pangolin.net/self-host/quick-install" rel="noopener">own requirements&lt;/a> state the deal plainly: a Linux server with a public IP, a domain, and ports 80/443 (TCP) plus 51820/21820 (UDP). At 22.5k GitHub stars it has become the default answer to &amp;ldquo;self-hosted Cloudflare Tunnel alternative,&amp;rdquo; and there is a &lt;a href="https://www.pangolin.net/pricing" rel="noopener">managed free tier&lt;/a> (5 users, 5 sites) if you want to try the model before renting anything.&lt;/li>
&lt;/ul>
&lt;p>The trade nobody advertises: every stream now transits the VPS, so your remote picture quality is capped by the VPS provider&amp;rsquo;s bandwidth and your home upload, whichever is worse. Budget VPS bandwidth caps are real; check the fine print against your bitrates before moving the family movie night onto one.&lt;/p>
&lt;h2 id="path-4-cloudflare-tunnel---free-easy-and-built-on-someone-elses-tolerance">Path 4: Cloudflare Tunnel - free, easy, and built on someone else&amp;rsquo;s tolerance&lt;/h2>
&lt;p>Cloudflare Tunnel deserves its reputation for polish: outbound-only connector, free HTTPS URL, CGNAT-proof, no client software for viewers. For a wiki or a dashboard I recommend it without hesitation - the &lt;a href="https://techfuelhq.com/networking/tailscale-vs-cloudflare-tunnel-2026/">full comparison against Tailscale&lt;/a> covers where it shines.&lt;/p>
&lt;p>For Jellyfin specifically, read the terms before you build on it. Cloudflare&amp;rsquo;s &lt;a href="https://www.cloudflare.com/service-specific-terms-application-services/" rel="noopener">service-specific terms&lt;/a>, as published on 2026-08-25, state that unless you are an Enterprise customer, &amp;ldquo;Cloudflare offers specific Paid Services (e.g., the Developer Platform, Images, and Stream) that you must use in order to serve video and other large files via the CDN,&amp;rdquo; and that Cloudflare &amp;ldquo;reserves the right to disable or limit your access to or use of the CDN&amp;rdquo; if you serve &amp;ldquo;video or a disproportionate percentage of pictures, audio files, or other large files&amp;rdquo; without them.&lt;/p>
&lt;p>Streaming your library through a free tunnel is exactly that. The record supports two observations at once. Enforcement against small personal servers is rare in practice — the community is full of people doing it quietly — and &lt;strong>no threshold is published anywhere&lt;/strong>, so any &amp;ldquo;under X TB you&amp;rsquo;re fine&amp;rdquo; claim you read is folklore, not policy. Both things are true, and together they mean the availability of your family&amp;rsquo;s media server depends on a policy Cloudflare applies at its own discretion. That is a fine risk for an experiment and a bad foundation for the thing your household relies on. There is also a mechanical constraint that bites before the policy does: the &lt;a href="https://developers.cloudflare.com/support/troubleshooting/http-status-codes/4xx-client-error/error-413/" rel="noopener">100 MB request-body cap&lt;/a> on free plans breaks large uploads through the same hostname.&lt;/p>
&lt;p>If the tunnel&amp;rsquo;s shape is what you want - outbound-only, no exposed home ports, URL for everyone - Pangolin in Path 3 is that shape with the policy risk replaced by a small VPS bill.&lt;/p>
&lt;h2 id="the-device-truth-table">The device truth table&lt;/h2>
&lt;p>The rows are where remote-access plans actually die. &amp;ldquo;Works&amp;rdquo; here means the normal Jellyfin app experience over that path.&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Device&lt;/th>
&lt;th scope="col">Jellyfin app&lt;/th>
&lt;th scope="col">Tailscale (Path 1)&lt;/th>
&lt;th scope="col">Proxy/relay URL (Paths 2-3)&lt;/th>
&lt;th scope="col">Reality check&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Android / Google TV&lt;/td>
&lt;td>&lt;a href="https://jellyfin.org/downloads/clients/" rel="noopener">Official&lt;/a>&lt;/td>
&lt;td>✅ &lt;a href="https://tailscale.com/docs/install/android" rel="noopener">Play Store client&lt;/a>&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>Best-covered TV platform: both paths work&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Fire TV&lt;/td>
&lt;td>Official (Android TV app)&lt;/td>
&lt;td>✅ &lt;a href="https://tailscale.com/docs/install/amazon-fire" rel="noopener">Amazon Appstore&lt;/a>, most post-2018 devices; &lt;strong>not&lt;/strong> the 4K Select stick&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>The travel-stick platform of choice&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Apple TV&lt;/td>
&lt;td>&lt;a href="https://github.com/jellyfin/Swiftfin" rel="noopener">Swiftfin&lt;/a> / Infuse&lt;/td>
&lt;td>✅ &lt;a href="https://tailscale.com/kb/1280/appletv" rel="noopener">App Store client&lt;/a>&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>Tailscale&amp;rsquo;s only non-Android TV client&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Roku&lt;/td>
&lt;td>Official&lt;/td>
&lt;td>❌ no client exists&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>The single strongest argument for Path 2/3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>LG webOS&lt;/td>
&lt;td>Official&lt;/td>
&lt;td>❌ no client&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>Same story as Roku&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Samsung Tizen&lt;/td>
&lt;td>Official&lt;/td>
&lt;td>❌ no client&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>Same story as Roku&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Xbox&lt;/td>
&lt;td>Official&lt;/td>
&lt;td>❌ no client&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>Console app, URL-based access only&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Phones / tablets / laptops&lt;/td>
&lt;td>Official&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>Everything works; these were never the problem&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Hotel / dorm TV&lt;/td>
&lt;td>none of yours&lt;/td>
&lt;td>via a stick you bring&lt;/td>
&lt;td>✅ if the TV has a browser (rough)&lt;/td>
&lt;td>See below&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>The hotel row earns its own paragraph, because &lt;a href="https://www.reddit.com/r/jellyfin/comments/1uqgqil/" rel="noopener">a 90-plus-comment thread on it&lt;/a> converged on answers that surprise people. Casting from your phone mostly fails in hotels: hotel Wi-Fi typically runs AP isolation, so your phone and a Chromecast cannot see each other even on the same network. The frequent travelers in that thread &lt;strong>bring a streaming stick with Tailscale and Jellyfin already signed in&lt;/strong>, plug it into the room TV&amp;rsquo;s HDMI, and give the stick the hotel Wi-Fi — the tunnel is outbound, so captive portals and CGNAT do not matter. The road warriors in that thread report usable HDMI inputs in the large majority of rooms, with the occasional welded-on &amp;ldquo;hospitality mode&amp;rdquo; remote as the exception. The zero-cleverness fallback is a laptop and an HDMI cable. A GL.iNet-class travel router running the VPN for the whole room is the deluxe version of the same idea.&lt;/p>
&lt;p>If you run Path 2 or 3, the hotel problem mostly dissolves. Your domain works in any browser, including the TV&amp;rsquo;s, and in any Jellyfin app on hardware you bring.&lt;/p>
&lt;h2 id="the-security-baseline-whichever-path-you-picked">The security baseline, whichever path you picked&lt;/h2>
&lt;p>Paths 1 and 3-via-Pangolin put authentication in front of Jellyfin; Path 2 puts Jellyfin&amp;rsquo;s own login on the internet. Either way:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Password quality is the whole game on a public login page.&lt;/strong> Long, unique, per user, no shared &amp;ldquo;family&amp;rdquo; account with a weak password. Jellyfin&amp;rsquo;s account system is the only thing between a scanner and your library on Path 2.&lt;/li>
&lt;li>&lt;strong>Update the server.&lt;/strong> Jellyfin 10.11.11 is current as I write this; security fixes ride ordinary releases, and a version pinned in 2024 and forgotten is how exposed services rot. The &lt;a href="https://techfuelhq.com/tutorials/jellyfin-setup-docker-homelab-2026/">setup guide&lt;/a> covers the container-update flow.&lt;/li>
&lt;li>&lt;strong>Set Known Proxies&lt;/strong> (Path 2/3), or your access logs record the proxy talking to itself while real client addresses vanish - which also breaks any fail2ban-style banning you add at the proxy layer later.&lt;/li>
&lt;li>&lt;strong>Do not log full request URLs at the proxy.&lt;/strong> Jellyfin&amp;rsquo;s docs note it sometimes passes &lt;code>api_key&lt;/code> in the URL; a proxy logging full paths writes credentials into its own logfiles.&lt;/li>
&lt;li>&lt;strong>Quick Connect ships enabled&lt;/strong> on a fresh 10.11.11 install - the code-based login on the sign-in page, verified on the test instance below. It is convenient for TV logins on your own tailnet; on a fully public instance, it is one more auth path you should consciously decide to keep or disable.&lt;/li>
&lt;/ul>
&lt;h2 id="what-i-tested-and-what-i-did-not">What I tested, and what I did not&lt;/h2>
&lt;p>The reverse-proxy path above is first-hand: Jellyfin 10.11.11 portable on Windows, Caddy 2.11.4 in front, wizard walked, defaults pulled from the live API, Quick Connect state read off the fresh install, websocket upgrade verified through the proxy, on 2026-08-25. The public-DNS leg ran against a local certificate authority rather than a routable domain, because I was not going to open ports on the network I ran the test from - the Let&amp;rsquo;s Encrypt half of Caddy&amp;rsquo;s job is its most automated part, but it is the one piece of Path 2 this test takes from documentation rather than observation. Tailscale&amp;rsquo;s TV-client coverage comes from Tailscale&amp;rsquo;s own install docs rather than a rack of TVs, and the hotel tactics come from the travel thread&amp;rsquo;s consensus, attributed as such; I have not road-tested them. I have not run Pangolin beyond its documentation and requirements - it is on the bench list, and if that test changes the Path 3 advice, this page moves with it.&lt;/p>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://jellyfin.org/docs/general/post-install/networking/" rel="noopener">https://jellyfin.org/docs/general/post-install/networking/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://jellyfin.org/docs/general/post-install/networking/reverse-proxy/" rel="noopener">https://jellyfin.org/docs/general/post-install/networking/reverse-proxy/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://jellyfin.org/downloads/clients/" rel="noopener">https://jellyfin.org/downloads/clients/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/jellyfin/Swiftfin" rel="noopener">https://github.com/jellyfin/Swiftfin&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://tailscale.com/kb/1347/installation" rel="noopener">https://tailscale.com/kb/1347/installation&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://tailscale.com/docs/install/android" rel="noopener">https://tailscale.com/docs/install/android&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://tailscale.com/docs/install/amazon-fire" rel="noopener">https://tailscale.com/docs/install/amazon-fire&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://tailscale.com/kb/1280/appletv" rel="noopener">https://tailscale.com/kb/1280/appletv&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://tailscale.com/kb/1223/funnel" rel="noopener">https://tailscale.com/kb/1223/funnel&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://tailscale.com/pricing" rel="noopener">https://tailscale.com/pricing&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.cloudflare.com/service-specific-terms-application-services/" rel="noopener">https://www.cloudflare.com/service-specific-terms-application-services/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/fosrl/pangolin" rel="noopener">https://github.com/fosrl/pangolin&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.pangolin.net/self-host/quick-install" rel="noopener">https://docs.pangolin.net/self-host/quick-install&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.pangolin.net/pricing" rel="noopener">https://www.pangolin.net/pricing&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.rfc-editor.org/rfc/rfc6598" rel="noopener">https://www.rfc-editor.org/rfc/rfc6598&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://caddyserver.com/docs/quick-starts/reverse-proxy" rel="noopener">https://caddyserver.com/docs/quick-starts/reverse-proxy&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.plex.tv/plans/" rel="noopener">https://www.plex.tv/plans/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.reddit.com/r/jellyfin/comments/1vtff2e/im_kinda_tired_of_the_constant_remote_access/" rel="noopener">https://www.reddit.com/r/jellyfin/comments/1vtff2e/im_kinda_tired_of_the_constant_remote_access/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.reddit.com/r/jellyfin/comments/1uqgqil/" rel="noopener">https://www.reddit.com/r/jellyfin/comments/1uqgqil/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.reddit.com/r/jellyfin/comments/1tu1tvy/" rel="noopener">https://www.reddit.com/r/jellyfin/comments/1tu1tvy/&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Windows VM Won't Boot After the Proxmox 9 Upgrade? Read the Error Before You Reinstall (2026)</title><link>https://techfuelhq.com/articles/proxmox-9-windows-vm-not-booting-2026/</link><pubDate>Tue, 25 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/articles/proxmox-9-windows-vm-not-booting-2026/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · Published 2026-08-25 · ~9 min read · St. Louis County, MO&lt;/p>
&lt;p>The host reboot after a &lt;a href="https://techfuelhq.com/tutorials/proxmox-ve-8-to-9-upgrade-2026/">Proxmox VE 8-to-9 upgrade&lt;/a> has a particular quiet moment. The console comes back. The containers go green. The Debian guests come up. And the one Windows VM lands on a blue recovery screen instead of a login: &lt;em>&amp;ldquo;Your PC/Device needs to be repaired&amp;hellip; 0xc0000001. An unexpected error has occurred.&amp;rdquo;&lt;/em>&lt;/p>
&lt;p>Nothing inside Windows changed. That is the tell.&lt;/p>
&lt;p>A guest that booted fine before the upgrade and refuses after it is reporting a change in the layer underneath — firmware type, disk controller, boot entries, or the host kernel itself. Which layer depends on what the failure looks like, and the failure tells you if you read it before touching anything. Reinstalling Windows, the move half the panic threads reach for, is the one response that cannot be right: it destroys a healthy guest to address a host-side change, and in the worst case reinstalls onto the exact configuration that triggers the bug.&lt;/p>
&lt;p>I maintain the upgrade guide this page pairs with, and I want to be straight about sourcing: I have not reproduced this failure on a lab host. Every fix below instead names the community thread or vendor document that confirmed it, chiefly the &lt;a href="https://forum.proxmox.com/threads/windows-server-2025-fails-to-boot-after-pve-9-2-linux-7-0-kernel-upgrade.183958/" rel="noopener">Proxmox forum thread&lt;/a> where the 0xc0000001 signature was worked to a confirmed fix, and the r/Proxmox reports that match it. Where a step was tried in those threads and did &lt;em>not&lt;/em> work, I say that too. That list of dead ends is half the value here.&lt;/p>
&lt;img src="https://techfuelhq.com/images/articles/proxmox-9-windows-vm-not-booting-2026.svg" alt="Diagnostic fork for a Windows VM that will not boot after a Proxmox VE 9 upgrade: the 0xc0000001 recovery screen maps to the kernel 7.0 SeaBIOS/MBR regression, a UEFI boot-menu drop maps to EFI boot entries, INACCESSIBLE BOOT DEVICE maps to a disk-controller change without its driver, and an instant reboot loop maps to the ostype setting." width="1200" height="675" loading="eager" fetchpriority="high" decoding="async" style="display:block;margin:1.5rem auto;max-width:100%;height:auto;border:1px solid #1e1e3a;border-radius:8px;" />
&lt;h2 id="what-the-failure-looks-like">What the failure looks like&lt;/h2>
&lt;p>Four screens, four different problems. Match yours before running a single command.&lt;/p>
&lt;div class="visual-block">
&lt;div style="background:#0a0a23;border:1px solid rgba(255,255,255,0.07);border-radius:10px;padding:26px 22px 20px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;">
&lt;div style="margin-bottom:18px;">
&lt;div style="font-size:19px;font-weight:700;color:#e8e8f0;letter-spacing:-0.3px;">The signature fork&lt;/div>
&lt;div style="font-size:12.5px;color:#9a9ab5;margin-top:5px;line-height:1.5;">The screen the VM stops on names the broken layer. Every fix in the ladder below belongs to exactly one of these forks &amp;mdash; running fixes from the wrong fork is how a one-reboot problem becomes a weekend.&lt;/div>
&lt;/div>
&lt;div style="display:flex;gap:9px;flex-wrap:wrap;">
&lt;div style="flex:1 1 260px;min-width:0;background:rgba(80,144,224,0.07);border:1px solid rgba(80,144,224,0.35);border-top:3px solid #5090e0;border-radius:8px;padding:13px 14px;">
&lt;div style="font-size:10px;letter-spacing:1.2px;color:#7db0f0;font-weight:700;">FORK A &amp;middot; HOST KERNEL&lt;/div>
&lt;div style="font-size:13px;font-weight:700;color:#e8e8f0;margin-top:6px;line-height:1.45;">Blue recovery screen: &lt;span style="font-family:ui-monospace,Menlo,Consolas,monospace;color:#7db0f0;">0xc0000001&lt;/span> &amp;ldquo;An unexpected error has occurred&amp;rdquo;&lt;/div>
&lt;div style="font-size:11.5px;color:#b8c4d8;margin-top:7px;line-height:1.55;">Reported on &lt;strong style="color:#d8e4f8;">SeaBIOS + MBR&lt;/strong> guests the moment the host moved to kernel 7.0. Same VM boots fine on the previous 6.17 kernel.&lt;/div>
&lt;div style="font-size:11px;color:#8b97ad;margin-top:7px;">&amp;#8594; Steps 1&amp;ndash;2, permanent fix in Step 5&lt;/div>
&lt;/div>
&lt;div style="flex:1 1 260px;min-width:0;background:rgba(255,160,64,0.07);border:1px solid rgba(255,160,64,0.35);border-top:3px solid #ffa040;border-radius:8px;padding:13px 14px;">
&lt;div style="font-size:10px;letter-spacing:1.2px;color:#ffb866;font-weight:700;">FORK B &amp;middot; EFI BOOT ENTRY&lt;/div>
&lt;div style="font-size:13px;font-weight:700;color:#e8e8f0;margin-top:6px;line-height:1.45;">Drops to the UEFI boot menu or shell &amp;mdash; picking the disk manually boots fine&lt;/div>
&lt;div style="font-size:11.5px;color:#d0c8b8;margin-top:7px;line-height:1.55;">The OS is intact; the &lt;strong style="color:#e8dcc8;">auto-boot chain&lt;/strong> is not. Reported on OVMF guests after 9.2 point updates, worst with boot disks on IDE.&lt;/div>
&lt;div style="font-size:11px;color:#8b97ad;margin-top:7px;">&amp;#8594; Step 3&lt;/div>
&lt;/div>
&lt;div style="flex:1 1 260px;min-width:0;background:rgba(224,90,90,0.07);border:1px solid rgba(224,90,90,0.35);border-top:3px solid #e05a5a;border-radius:8px;padding:13px 14px;">
&lt;div style="font-size:10px;letter-spacing:1.2px;color:#e88080;font-weight:700;">FORK C &amp;middot; DISK CONTROLLER&lt;/div>
&lt;div style="font-size:13px;font-weight:700;color:#e8e8f0;margin-top:6px;line-height:1.45;">BSOD: &lt;span style="font-family:ui-monospace,Menlo,Consolas,monospace;color:#e88080;">INACCESSIBLE BOOT DEVICE&lt;/span>&lt;/div>
&lt;div style="font-size:11.5px;color:#d8bcbc;margin-top:7px;line-height:1.55;">The boot disk's &lt;strong style="color:#f0d0d0;">bus type changed&lt;/strong> and Windows has no driver bound for it &amp;mdash; usually self-inflicted mid-troubleshoot, or after a restore that changed the controller.&lt;/div>
&lt;div style="font-size:11px;color:#8b97ad;margin-top:7px;">&amp;#8594; Step 4&lt;/div>
&lt;/div>
&lt;div style="flex:1 1 260px;min-width:0;background:rgba(200,255,0,0.06);border:1px solid rgba(200,255,0,0.3);border-top:3px solid #c8ff00;border-radius:8px;padding:13px 14px;">
&lt;div style="font-size:10px;letter-spacing:1.2px;color:#c8ff00;font-weight:700;">FORK D &amp;middot; GUEST TYPE FLAGS&lt;/div>
&lt;div style="font-size:13px;font-weight:700;color:#e8e8f0;margin-top:6px;line-height:1.45;">Instant reboot loop &amp;mdash; no error screen at all&lt;/div>
&lt;div style="font-size:11.5px;color:#d0d8b8;margin-top:7px;line-height:1.55;">Reported on a UEFI Windows 11 guest on kernel 7.0.14: the VM resets before Windows draws anything. Fixed in-thread by correcting &lt;span style="font-family:ui-monospace,Menlo,Consolas,monospace;color:#d8e880;">ostype&lt;/span> from win10 to win11.&lt;/div>
&lt;div style="font-size:11px;color:#8b97ad;margin-top:7px;">&amp;#8594; 30-second checks below&lt;/div>
&lt;/div>
&lt;/div>
&lt;div style="text-align:right;margin-top:10px;font-size:10px;color:#565672;">techfuelhq.com &amp;middot; signatures per forum.proxmox.com thread 183958 + r/Proxmox reports, mid-2026&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>One honest caveat on ordering. Nobody has failure-rate telemetry for this, me included, so the ladder below is ordered by cost of the test, cheapest and most reversible first. Anyone who tells you which of these causes is &amp;ldquo;most common&amp;rdquo; is guessing.&lt;/p>
&lt;h2 id="the-30-second-configuration-checks">The 30-second configuration checks&lt;/h2>
&lt;p>Before changing anything, pull the VM&amp;rsquo;s config on the host and read five lines:&lt;/p>
&lt;pre tabindex="0">&lt;code>qm config &amp;lt;vmid&amp;gt;
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>&lt;strong>&lt;code>bios:&lt;/code>&lt;/strong> is &lt;code>ovmf&lt;/code> or &lt;code>seabios&lt;/code> (absent means SeaBIOS, the default). This decides which fork you are in. A UEFI Windows install needs &lt;code>ovmf&lt;/code>; if this line says otherwise, something rewrote your config (a restore, a migration script, a manual edit).&lt;/li>
&lt;li>&lt;strong>&lt;code>efidisk0:&lt;/code>&lt;/strong> must exist on every OVMF VM. An OVMF guest with no EFI disk has nowhere to store boot entries, and boot-entry loss is exactly the Fork B symptom.&lt;/li>
&lt;li>&lt;strong>&lt;code>machine:&lt;/code>&lt;/strong> shows whether your virtual hardware moved. Windows VMs get their QEMU machine version pinned at creation (&lt;code>pc-q35-8.1&lt;/code>, say) precisely because, in the words of the Proxmox reference documentation, &amp;ldquo;Windows is sensitive to changes in the virtual hardware.&amp;rdquo; If yours shows a pinned version, the upgrade did not move it. If it shows &lt;code>latest&lt;/code> or a bare &lt;code>q35&lt;/code>, the upgrade silently jumped your virtual hardware to QEMU 11&amp;rsquo;s newest revision.&lt;/li>
&lt;li>&lt;strong>&lt;code>scsihw:&lt;/code> and the boot disk&amp;rsquo;s bus&lt;/strong> (&lt;code>scsi0:&lt;/code> / &lt;code>sata0:&lt;/code> / &lt;code>ide0:&lt;/code>) matter for Step 4, so note what they are. If Windows last booted from a &lt;code>scsi0&lt;/code> disk and the disk now hangs off &lt;code>ide0&lt;/code>, that mismatch is your Fork C.&lt;/li>
&lt;li>&lt;strong>&lt;code>ostype:&lt;/code>&lt;/strong> should be &lt;code>win11&lt;/code> for the Windows 11 / Server 2022 / Server 2025 generation and &lt;code>win10&lt;/code> for Windows 10 / Server 2016 / 2019 — the qm.conf reference defines win11 as &amp;ldquo;Microsoft Windows 11/2022/2025&amp;rdquo; and win10 as &amp;ldquo;10/2016/2019&amp;rdquo;, and Server 2022 on the win10 setting is a common leftover. The forum thread&amp;rsquo;s reboot-loop case (Fork D) was resolved by exactly this one-line correction on a UEFI Windows 11 guest, so check it before deeper surgery.&lt;/li>
&lt;/ul>
&lt;p>Five lines, under a minute, and you have usually already picked your fork.&lt;/p>
&lt;h2 id="why-proxmox-9-breaks-windows-vms-and-leaves-linux-guests-alone">Why Proxmox 9 breaks Windows VMs and leaves Linux guests alone&lt;/h2>
&lt;p>The &lt;a href="https://techfuelhq.com/tutorials/proxmox-ve-8-to-9-upgrade-2026/">8-to-9 upgrade&lt;/a> is not one change. Landing on the current 9.2 means Debian 13.5, QEMU 11.0, and the Linux 7.0 kernel all arrive at once, and each is a layer a guest boots through.&lt;/p>
&lt;p>The kernel is the loud one right now. Within days of kernel 7.0 reaching 9.2 hosts, the Proxmox forum thread above collected Windows Server guests failing with 0xc0000001 across three hosts with different storage back-ends — all SeaBIOS, all MBR boot disks, all fine again the moment the host booted the previous 6.17.13 kernel. The thread&amp;rsquo;s participants converged on a kernel regression affecting SeaBIOS/MBR guests specifically; no OVMF guest shows up among the failures, and one commenter reported his OVMF guests running fine on the same PVE version. As of this writing there is no Proxmox staff reply in that thread, so treat the diagnosis as strong community evidence rather than an official statement. The fix pattern it produced, though, was confirmed by two separate users in the linked discussion, which is more than most boot-failure folklore ever gets.&lt;/p>
&lt;p>QEMU 11 is the quiet one. Windows VMs carry a pinned machine version for stability, so most survive the QEMU jump untouched. The r/Proxmox comments on the same failure confirm the corollary: rolling the machine version back (&lt;code>pc-q35-8.0&lt;/code>) did &lt;em>not&lt;/em> fix the 0xc0000001 failure. Machine versions matter at the margins. Guests set to &lt;code>latest&lt;/code> get a large hardware jump, and QEMU&amp;rsquo;s own policy now removes machine versions from upstream after six years, so a config pinned to something ancient will eventually stop starting at all. Worth reading once and then not obsessing over.&lt;/p>
&lt;p>And Windows itself is simply the fussy tenant. It refuses to boot from a disk bus it was not prepared for (the documented INACCESSIBLE BOOT DEVICE failure in Step 4), its Boot Configuration Data store assumes the firmware handoff never changes shape, and a BitLocker-protected guest treats TPM changes as a reason to demand its recovery key. &lt;a href="https://techfuelhq.com/homelab/lxc-vs-vm-proxmox-2026/">Linux guests and containers&lt;/a> re-enumerate most of this on every boot and move on. That asymmetry (host change, Windows-only casualty) is the entire diagnostic frame of this page.&lt;/p>
&lt;h2 id="the-fix-ladder-least-invasive-first">The fix ladder, least invasive first&lt;/h2>
&lt;p>Each step says what it does, when it is the right one, and how to undo it.&lt;/p>
&lt;h3 id="step-1-update-the-host-before-you-change-the-vm">Step 1: update the host before you change the VM&lt;/h3>
&lt;p>The bug you hit may already be fixed. One commenter in the boot-menu thread reports a similar failure (his word — similar, not identical) that cleared up with a later Proxmox kernel or qemu-server update. Check and apply point updates on the host, reboot, and re-test the VM before touching its config.&lt;/p>
&lt;pre tabindex="0">&lt;code>apt update &amp;amp;&amp;amp; apt dist-upgrade
&lt;/code>&lt;/pre>&lt;p>&lt;strong>When it is the one.&lt;/strong> Always first. It costs a host reboot and nothing else, and every later step benefits from being on current packages. &lt;strong>How to revert.&lt;/strong> Nothing to revert.&lt;/p>
&lt;h3 id="step-2-boot-the-previous-kernel--the-confirmed-0xc0000001-fix">Step 2: boot the previous kernel — the confirmed 0xc0000001 fix&lt;/h3>
&lt;p>This is Fork A&amp;rsquo;s move, and it doubles as its diagnostic. Proxmox keeps the previous kernel installed; &lt;code>proxmox-boot-tool&lt;/code> can select it, and the selection works on both systemd-boot and GRUB hosts:&lt;/p>
&lt;pre tabindex="0">&lt;code>proxmox-boot-tool kernel list
proxmox-boot-tool kernel pin 6.17.13-13-pve --next-boot
reboot
&lt;/code>&lt;/pre>&lt;p>&lt;code>--next-boot&lt;/code> applies for one boot only. If the Windows VM comes up normally on 6.17 (as it did for the reporters in the forum thread, whose guests failed on kernel 7.0.6-2 and booted on 6.17.13-13), you have confirmed the kernel fork in one reboot with zero permanent changes. Then make it stick until you are ready for Step 5:&lt;/p>
&lt;pre tabindex="0">&lt;code>proxmox-boot-tool kernel pin 6.17.13-13-pve
&lt;/code>&lt;/pre>&lt;p>The cost is real, and I want it on the page: a pinned host is not running the kernel line that receives current fixes. You are trading an unbootable guest for a slightly stale host, which is the right trade this week and the wrong one forever. Record the pin somewhere you will see it, re-test on each new point release, and &lt;code>proxmox-boot-tool kernel unpin&lt;/code> the day the current kernel boots your guests again. If you run &lt;a href="https://techfuelhq.com/tutorials/gpu-passthrough-proxmox-vm-2026/">GPU passthrough&lt;/a>, you may already know this dance. Kernel pinning is the same escape hatch the passthrough community reaches for when a new kernel breaks VFIO.&lt;/p>
&lt;h3 id="step-3-repair-the-uefi-boot-path--when-manual-boot-works">Step 3: repair the UEFI boot path — when manual boot works&lt;/h3>
&lt;p>Fork B has the friendliest tell in the whole taxonomy: press Esc at the VM&amp;rsquo;s firmware splash, pick the Windows disk by hand, and it boots perfectly. The OS is fine. Only the automatic handoff is broken. Three sub-fixes, in cost order:&lt;/p>
&lt;p>&lt;strong>Boot order first.&lt;/strong> VM → Options → Boot Order. After upgrades and restores this list can end up pointing at the wrong device or de-selecting the boot disk entirely. Fix, cold-boot (full stop/start, not a guest reboot), done.&lt;/p>
&lt;p>&lt;strong>Get the boot disk off IDE.&lt;/strong> In the r/Proxmox thread where two of four Server 2022 guests dropped to the boot menu after a 9.2.9 update, the affected disks hung off IDE, and a commenter identified the mechanism as the BCD not supporting IDE EFI boot chaining, which is exactly why manual selection worked while auto-boot failed. Moving the boot disk to SCSI resolved it, with one caveat the reporter hit honestly — Windows needed a Safe Mode boot to bind the storage driver on first start after the move. Do it in Step 4&amp;rsquo;s driver-safe order rather than a blind detach/re-attach.&lt;/p>
&lt;p>&lt;strong>Rebuild the EFI vars and TPM state.&lt;/strong> This is the heavier variant, reported working across a fleet. Detach and delete the VM&amp;rsquo;s EFI disk and TPM state, re-add both fresh, and — the detail that made it stick — reset the TPM to factory keys before the first boot. The thread&amp;rsquo;s reporter found a plain rebuild did not stick (Windows booted once, then the failure returned on the next reboot); the commenter who recovered roughly two dozen VMs adds the factory-key reset before first boot as the step that makes it hold. Nobody in-thread tested the two variants side by side. &lt;strong>Before you touch either disk, have your BitLocker recovery key in hand.&lt;/strong> Clearing the TPM is on Microsoft&amp;rsquo;s own list of events that put a BitLocker device into recovery, so expect the recovery prompt at next boot — and without the key that screen is a lockout.&lt;/p>
&lt;p>&lt;strong>When it is the one.&lt;/strong> The manual-selection tell, or an OVMF guest whose &lt;code>efidisk0&lt;/code> is missing or damaged. &lt;strong>How to revert.&lt;/strong> Boot order and controller moves reverse in the GUI; a deleted EFI/TPM disk does not come back, which is why the recovery key comes first.&lt;/p>
&lt;h3 id="step-4-swap-the-disk-controller-without-losing-boot">Step 4: swap the disk controller without losing boot&lt;/h3>
&lt;p>Fork C is the one you can give yourself mid-troubleshoot, and the shape of it is worth thirty seconds. When the boot disk arrives on a bus Windows has not booted from before, Windows can fail before it is up — the standard explanation is that boot-critical storage drivers are only armed once Windows has actually used them. Whatever the exact mechanism, Proxmox&amp;rsquo;s driver documentation states the outcome flatly: installing the VirtIO drivers and switching the boot disk in one step &amp;ldquo;will result in a blue screen, claiming an &amp;lsquo;INACCESSIBLE BOOT DEVICE&amp;rsquo;.&amp;rdquo;&lt;/p>
&lt;p>So the swap is a two-boot procedure, per that same document:&lt;/p>
&lt;ol>
&lt;li>Load the &lt;a href="https://pve.proxmox.com/wiki/Windows_VirtIO_Drivers" rel="noopener">virtio-win ISO&lt;/a> in the VM&amp;rsquo;s CD drive and attach a small &lt;strong>temporary&lt;/strong> disk (1 GB) on the VirtIO SCSI bus.&lt;/li>
&lt;li>Boot Windows, install the drivers, and wait until the temp disk shows up in Disk Management. That appearance is the proof the driver is genuinely bound.&lt;/li>
&lt;li>Shut down. Remove the temporary disk, then detach the boot disk and re-attach it on the target bus (SCSI on the VirtIO SCSI single controller is what Proxmox&amp;rsquo;s Windows best-practices guide has you pick).&lt;/li>
&lt;li>Fix Options → Boot Order to point back at the boot disk, boot, and take the ISO out once you are up.&lt;/li>
&lt;/ol>
&lt;p>If you are already stuck on the blue screen because the bus changed underneath you, put the disk back on the old bus first. That is the one-minute undo (detach, re-attach on the previous bus type, restore boot order), and Windows boots because the old driver is still the one it trusts. Then do the procedure above properly. And a warning from the founding thread worth repeating: controller shuffling was tried against Fork A&amp;rsquo;s 0xc0000001 and did nothing — VirtIO SCSI single versus VirtIO SCSI, iothread on or off, none of it moved that failure. Controller surgery fixes controller problems. It does not fix kernel problems.&lt;/p>
&lt;h3 id="step-5-convert-seabiosmbr-to-uefi--the-permanent-fork-a-fix">Step 5: convert SeaBIOS/MBR to UEFI — the permanent Fork A fix&lt;/h3>
&lt;p>The kernel pin in Step 2 avoids the wedge; this removes it. The wedge condition is SeaBIOS firmware booting an MBR disk, so the reporter converted his Windows guests to UEFI/GPT and ran them on kernel 7.0 without issue — &amp;ldquo;everything runs now fine,&amp;rdquo; in his words in the r/Proxmox comments after migrating his whole fleet — and a second user in the same discussion, after converting his Server 2025 guest the same way, closed with &amp;ldquo;everything is ok.&amp;rdquo;&lt;/p>
&lt;p>Inside Windows, validate before you commit. &lt;code>mbr2gpt&lt;/code> refuses ineligible layouts (more than three primary partitions, extended/logical partitions present), and per Microsoft&amp;rsquo;s documentation BitLocker protection must be suspended first:&lt;/p>
&lt;pre tabindex="0">&lt;code>mbr2gpt /validate /allowFullOS
mbr2gpt /convert /allowFullOS
&lt;/code>&lt;/pre>&lt;p>The conversion rewrites the partition table in place, creates the EFI system partition, and migrates the BCD. Data stays, but there is no un-convert command, so this is a tested-backup-first operation. Then shut down and flip the Proxmox side to match, because a GPT disk under SeaBIOS boots nothing:&lt;/p>
&lt;ol>
&lt;li>Hardware → Add → &lt;strong>EFI Disk&lt;/strong>.&lt;/li>
&lt;li>Options (or Hardware → BIOS) → change &lt;strong>SeaBIOS&lt;/strong> to &lt;strong>OVMF (UEFI)&lt;/strong>.&lt;/li>
&lt;li>Re-check Boot Order, cold-start, and expect one trip through the firmware menu if the fresh EFI vars need the Windows Boot Manager entry selected once.&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>When it is the one.&lt;/strong> Fork A guests you want back on the current kernel line, done one VM at a time in a maintenance window. I would not run it on a domain controller before its backup restore had been tested. The tool is fine; &amp;ldquo;no undo command&amp;rdquo; plus &amp;ldquo;untested backup&amp;rdquo; is the combination you only get burned by once. &lt;strong>How to revert.&lt;/strong> You do not; you restore.&lt;/p>
&lt;h3 id="step-6-restore-the-pre-upgrade-backup">Step 6: restore the pre-upgrade backup&lt;/h3>
&lt;p>If you took the &lt;a href="https://techfuelhq.com/tutorials/proxmox-backup-server-3-2-1-2026/">tested backup the upgrade guide insists on&lt;/a>, the calm exit was available the whole time. Restore the guest as it was, pin the kernel if the restored VM still hits Fork A, and schedule the UEFI conversion for a quieter week. A restore also cleanly unwinds a troubleshooting session that changed five things: restored config, restored disk, known state.&lt;/p>
&lt;p>If you did not take one, let this be the page that converts you. Every fork above is survivable with a backup and console access; several are miserable without. The &lt;a href="https://techfuelhq.com/tutorials/proxmox-backup-server-3-2-1-2026/">3-2-1 setup&lt;/a> takes an evening.&lt;/p>
&lt;h2 id="what-not-to-do">What not to do&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Do not reinstall Windows.&lt;/strong> Wrong layer. The guest is healthy; the platform moved. In the kernel-regression case a fresh install onto SeaBIOS/MBR can hit the same wall on first boot.&lt;/li>
&lt;li>&lt;strong>Do not detach and re-attach disks &amp;ldquo;to see if it helps.&amp;rdquo;&lt;/strong> Every detach can drop the disk from the boot order, stacking a Fork B problem on top of whatever you had. Config changes here should be single, deliberate, and written down.&lt;/li>
&lt;li>&lt;strong>Do not upgrade the rest of the cluster while node one&amp;rsquo;s Windows guests are down.&lt;/strong> The failure travels with the kernel, and so does your blast radius. Diagnose on one node; pin or fix before the next node moves.&lt;/li>
&lt;li>&lt;strong>Do not run fixes from the wrong fork.&lt;/strong> The reporter&amp;rsquo;s threads already burned the hours for you: against 0xc0000001, controller swaps did nothing, iothread toggles did nothing, machine-version rollback to pc-q35-8.0 did nothing, and a QEMU 10-vs-11 switch did nothing. The kernel pin worked. The UEFI conversion worked. Match the signature, run its fix.&lt;/li>
&lt;/ul>
&lt;h2 id="prevent-it-on-the-next-node">Prevent it on the next node&lt;/h2>
&lt;p>Everything above compresses into three pre-upgrade lines for whatever you upgrade next:&lt;/p>
&lt;ol>
&lt;li>&lt;code>qm config&lt;/code> every Windows guest and record &lt;code>bios&lt;/code> / &lt;code>machine&lt;/code> / boot bus / &lt;code>ostype&lt;/code>. Thirty seconds per VM, and it turns any post-upgrade surprise into a diff instead of a mystery.&lt;/li>
&lt;li>Convert SeaBIOS/MBR Windows guests to UEFI &lt;strong>before&lt;/strong> the host jumps to kernel 7.0, on your schedule instead of during an outage.&lt;/li>
&lt;li>Take the tested backup. Then run the &lt;a href="https://techfuelhq.com/tutorials/proxmox-ve-8-to-9-upgrade-2026/">full pre-flight checklist&lt;/a> (pve8to9, NIC pinning, console access) and upgrade knowing the escape hatches on this page exist but expecting not to need them.&lt;/li>
&lt;/ol>
&lt;p>The upgrade itself is routine. The preparation is the whole job — and for Windows guests specifically, the preparation now includes knowing which firmware they boot with.&lt;/p>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;ul>
&lt;li>Proxmox forum — &amp;ldquo;Windows Server 2025 fails to boot after PVE 9.2 / Linux 7.0 Kernel upgrade&amp;rdquo; (the 0xc0000001 thread; kernel versions, controller/iothread and QEMU 10-vs-11 non-fixes, the ostype win10→win11 boot-loop fix): &lt;a href="https://forum.proxmox.com/threads/windows-server-2025-fails-to-boot-after-pve-9-2-linux-7-0-kernel-upgrade.183958/" rel="noopener">https://forum.proxmox.com/threads/windows-server-2025-fails-to-boot-after-pve-9-2-linux-7-0-kernel-upgrade.183958/&lt;/a>&lt;/li>
&lt;li>r/Proxmox — the same failure&amp;rsquo;s discussion thread (three hosts, SeaBIOS/MBR/VirtIO SCSI, broken 7.0.6-2-pve vs working 6.17.13-13-pve; machine-version-rollback non-fix; both UEFI-conversion confirmations): &lt;a href="https://www.reddit.com/r/Proxmox/comments/1trztwg/" rel="noopener">https://www.reddit.com/r/Proxmox/comments/1trztwg/&lt;/a>&lt;/li>
&lt;li>r/Proxmox — Server 2022 guests dropping to the boot menu after 9.2.9, manual disk selection working; IDE/EFI boot chaining diagnosis, EFI+TPM rebuild fix, the similar-failure-fixed-by-update report: &lt;a href="https://www.reddit.com/r/Proxmox/comments/1vgbstt/" rel="noopener">https://www.reddit.com/r/Proxmox/comments/1vgbstt/&lt;/a>&lt;/li>
&lt;li>Proxmox wiki — Paravirtualized Block Drivers for Windows (the temporary-disk procedure and the INACCESSIBLE BOOT DEVICE warning, quoted verbatim): &lt;a href="https://pve.proxmox.com/wiki/Paravirtualized_Block_Drivers_for_Windows" rel="noopener">https://pve.proxmox.com/wiki/Paravirtualized_Block_Drivers_for_Windows&lt;/a>&lt;/li>
&lt;li>Proxmox wiki — Windows 10 guest best practices (SCSI bus on the VirtIO SCSI single controller for Windows guests): &lt;a href="https://pve.proxmox.com/wiki/Windows_10_guest_best_practices" rel="noopener">https://pve.proxmox.com/wiki/Windows_10_guest_best_practices&lt;/a>&lt;/li>
&lt;li>Proxmox wiki — Host Bootloader (proxmox-boot-tool kernel list / pin / &amp;ndash;next-boot / unpin): &lt;a href="https://pve.proxmox.com/wiki/Host_Bootloader" rel="noopener">https://pve.proxmox.com/wiki/Host_Bootloader&lt;/a>&lt;/li>
&lt;li>Proxmox VE reference documentation — QEMU/KVM Virtual Machines (Windows machine-version pinning, machine-version removal policy): &lt;a href="https://pve.proxmox.com/pve-docs/chapter-qm.html" rel="noopener">https://pve.proxmox.com/pve-docs/chapter-qm.html&lt;/a>; ostype value definitions (win10 = 10/2016/2019, win11 = 11/2022/2025): &lt;a href="https://pve.proxmox.com/pve-docs/qm.conf.5.html" rel="noopener">https://pve.proxmox.com/pve-docs/qm.conf.5.html&lt;/a>&lt;/li>
&lt;li>Microsoft Learn — MBR2GPT (validate/convert syntax, /allowFullOS, disk prerequisites, BitLocker suspension, UEFI firmware requirement): &lt;a href="https://learn.microsoft.com/en-us/windows/deployment/mbr-to-gpt" rel="noopener">https://learn.microsoft.com/en-us/windows/deployment/mbr-to-gpt&lt;/a>&lt;/li>
&lt;li>Microsoft Learn — BitLocker recovery overview (&amp;ldquo;Turning off, disabling, deactivating, or clearing the TPM&amp;rdquo; as a recovery trigger): &lt;a href="https://learn.microsoft.com/en-us/windows/security/operating-system-security/data-protection/bitlocker/recovery-overview" rel="noopener">https://learn.microsoft.com/en-us/windows/security/operating-system-security/data-protection/bitlocker/recovery-overview&lt;/a>&lt;/li>
&lt;li>Proxmox VE roadmap — 9.2 release contents (Debian 13.5, kernel 7.0, QEMU 11.0), verified 2026-08-25: &lt;a href="https://pve.proxmox.com/wiki/Roadmap" rel="noopener">https://pve.proxmox.com/wiki/Roadmap&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Ollama vs llama.cpp Throughput: Same-GPU Compare Dataset</title><link>https://techfuelhq.com/data/llm-server-compare/</link><pubDate>Thu, 20 Aug 2026 01:10:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/data/llm-server-compare/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · Published 2026-08-20 · ~3 min read · St. Louis County, MO&lt;/p>
&lt;h2 id="the-short-version">The short version&lt;/h2>
&lt;p>I ran both servers on one GPU across three models. Same box. Same settings. llama.cpp
b10507 wins decode by 2-6% on dense
models and by 13-22% on the gpt-oss MoE; Ollama 0.32.1 wins real-prompt prefill by
4-7%. VRAM matches within 7 MiB wherever the two load the same file. The raw engine
(llama-bench) runs 367 t/s on the 3B where the full Ollama stack runs 319, so the
entire serving stack costs about 13%.&lt;/p>
&lt;p>Download: &lt;a href="https://techfuelhq.com/data/llm-server-compare-2026-08.csv">llm-server-compare-2026-08.csv&lt;/a>.
CC BY 4.0, per-run decode arrays included.&lt;/p>
&lt;h2 id="the-measured-configurations">The measured configurations&lt;/h2>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Model&lt;/th>
&lt;th scope="col">Server&lt;/th>
&lt;th scope="col" style="text-align: right">Decode&lt;/th>
&lt;th scope="col" style="text-align: right">Prefill (long)&lt;/th>
&lt;th scope="col" style="text-align: right">GPU mem (MiB)&lt;/th>
&lt;th scope="col" style="text-align: right">Load&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Llama 3.2 3B&lt;/td>
&lt;td>Ollama 0.32.1&lt;/td>
&lt;td style="text-align: right">319 t/s&lt;/td>
&lt;td style="text-align: right">17,444 t/s&lt;/td>
&lt;td style="text-align: right">4,343&lt;/td>
&lt;td style="text-align: right">3.2s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Llama 3.2 3B&lt;/td>
&lt;td>llama.cpp b10507&lt;/td>
&lt;td style="text-align: right">338 t/s&lt;/td>
&lt;td style="text-align: right">16,809 t/s&lt;/td>
&lt;td style="text-align: right">4,339&lt;/td>
&lt;td style="text-align: right">2.5s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qwen 2.5 14B&lt;/td>
&lt;td>Ollama 0.32.1&lt;/td>
&lt;td style="text-align: right">99.4 t/s&lt;/td>
&lt;td style="text-align: right">5,004 t/s&lt;/td>
&lt;td style="text-align: right">10,941&lt;/td>
&lt;td style="text-align: right">5.6s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qwen 2.5 14B&lt;/td>
&lt;td>llama.cpp b10507&lt;/td>
&lt;td style="text-align: right">101.4 t/s&lt;/td>
&lt;td style="text-align: right">4,697 t/s&lt;/td>
&lt;td style="text-align: right">10,942&lt;/td>
&lt;td style="text-align: right">8.1s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>gpt-oss 20B&lt;/td>
&lt;td>Ollama 0.32.1&lt;/td>
&lt;td style="text-align: right">195.8 t/s&lt;/td>
&lt;td style="text-align: right">—&lt;/td>
&lt;td style="text-align: right">14,152&lt;/td>
&lt;td style="text-align: right">8.6s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>gpt-oss 20B&lt;/td>
&lt;td>llama.cpp (upstream GGUF)&lt;/td>
&lt;td style="text-align: right">222-238 t/s²&lt;/td>
&lt;td style="text-align: right">—&lt;/td>
&lt;td style="text-align: right">13,037&lt;/td>
&lt;td style="text-align: right">19.8s&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>² Prompt-dependent on this MoE: a fixed prompt held 232-242 t/s (median 238.5); varied
prompts were bimodal with a ~176 slow path (median 235.3), and the published 222 median
includes a cold first run. Ollama&amp;rsquo;s fork ran a flat 195.7-196.3 under the same nonce
scheme. Load times are cold-start to first ready response: llama-server was faster on
the 3B, Ollama faster on both larger models.&lt;/p>
&lt;p>The desktop baseline was 1,642 MiB of GPU memory before any model loaded (nvidia-smi
reports MiB; the CSV column is vram_total_mib_median). These figures run 2-7% above our
&lt;a href="https://techfuelhq.com/data/rtx-5080-llm-throughput/">RTX 5080 throughput dataset&lt;/a> for the same models
because that capture used 500-1,650-token prompts; both pages state their regime.&lt;/p>
&lt;h2 id="method">Method&lt;/h2>
&lt;p>I kept one server resident at a time, with a fresh process per model and &lt;code>ollama stop&lt;/code>
plus process-tree kills between configurations. Every request carried a unique nonce prefix, llama-server
additionally ran with prompt caching disabled, and generation was pinned to temperature
0, seed 42, 256 tokens (64 on the long-prefill pass), context 4096, full offload. Rates
are each server&amp;rsquo;s own counters; a wall-clock recomputation agreed within 2% on every
run (one cold-start exception at 3.6%, disclosed above), and llama-bench served as a
third instrument on the 3B (pp512 19,589 ± 2,071 t/s, tg256 367.1 ± 0.7 t/s, raw
engine loop). The capture scripts are available on request via &lt;a href="mailto:hello@techfuelhq.com">hello@techfuelhq.com&lt;/a>.&lt;/p>
&lt;p>The limits, named. One GPU, one box, three models, default server flags, and a
short-prompt prefill column retained only to document its own overhead artifact. Token
counts for identical text differ slightly between servers because Ollama applies its
chat template to /api/generate while llama-server&amp;rsquo;s /completion takes prompts raw. The
decision-layer writeup is
&lt;a href="https://techfuelhq.com/self-hosted/ollama-vs-llamacpp-rtx-5080-2026/">the companion article&lt;/a>; this page is
the citable record.&lt;/p></description></item><item><title>Ollama vs llama.cpp on an RTX 5080: Measured (2026)</title><link>https://techfuelhq.com/self-hosted/ollama-vs-llamacpp-rtx-5080-2026/</link><pubDate>Thu, 20 Aug 2026 01:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/self-hosted/ollama-vs-llamacpp-rtx-5080-2026/</guid><description>&lt;p>The argument shows up in every local-AI thread: Ollama is &amp;ldquo;just a wrapper&amp;rdquo; and real
performance lives in bare llama.cpp. Nobody arguing it ever posts numbers from the same
machine. So I ran both servers on the same RTX 5080, loading the same GGUF bytes,
with generation pinned to temperature 0, seed 42, and fresh prompts every run.&lt;/p>
&lt;p>The answer surprised me, because I went in expecting to confirm the forum consensus
and instead measured something smaller, stranger, and more useful. &lt;strong>The wrapper costs
almost nothing, and each side wins one event.&lt;/strong>&lt;/p>
&lt;p>Decode goes to llama.cpp. Prefill goes to Ollama. Nobody wins big.&lt;/p>
&lt;h2 id="the-measured-table">The measured table&lt;/h2>
&lt;p>Ollama 0.32.1 versus llama.cpp b10507 (llama-server), full GPU offload, 4096 context,
256-token generations, decode medians of five runs. Prefill measured at real prompt
length (~420 tokens), median of three fresh runs with a discarded warmup. The short
version of why the prompt length matters is below.&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Model&lt;/th>
&lt;th scope="col">Server&lt;/th>
&lt;th scope="col" style="text-align: right">Decode&lt;/th>
&lt;th scope="col" style="text-align: right">Prefill&lt;/th>
&lt;th scope="col" style="text-align: right">GPU mem (MiB)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Llama 3.2 3B&lt;/td>
&lt;td>Ollama&lt;/td>
&lt;td style="text-align: right">319 t/s&lt;/td>
&lt;td style="text-align: right">17,444 t/s&lt;/td>
&lt;td style="text-align: right">4,343&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Llama 3.2 3B&lt;/td>
&lt;td>llama.cpp&lt;/td>
&lt;td style="text-align: right">&lt;strong>338 t/s&lt;/strong>&lt;/td>
&lt;td style="text-align: right">16,809 t/s&lt;/td>
&lt;td style="text-align: right">4,339&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qwen 2.5 14B&lt;/td>
&lt;td>Ollama&lt;/td>
&lt;td style="text-align: right">99.4 t/s&lt;/td>
&lt;td style="text-align: right">5,004 t/s&lt;/td>
&lt;td style="text-align: right">10,941&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qwen 2.5 14B&lt;/td>
&lt;td>llama.cpp&lt;/td>
&lt;td style="text-align: right">&lt;strong>101.4 t/s&lt;/strong>&lt;/td>
&lt;td style="text-align: right">4,697 t/s&lt;/td>
&lt;td style="text-align: right">10,942&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>gpt-oss 20B&lt;/td>
&lt;td>Ollama&lt;/td>
&lt;td style="text-align: right">195.8 t/s&lt;/td>
&lt;td style="text-align: right">—&lt;/td>
&lt;td style="text-align: right">14,152&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>gpt-oss 20B&lt;/td>
&lt;td>llama.cpp²&lt;/td>
&lt;td style="text-align: right">&lt;strong>222-238 t/s&lt;/strong>&lt;/td>
&lt;td style="text-align: right">—&lt;/td>
&lt;td style="text-align: right">13,037&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>² Upstream GGUF (the Ollama blob refuses to load; see the portability catch below).
gpt-oss is a mixture-of-experts model and its decode rate on upstream llama.cpp is
prompt-dependent: a fixed prompt held a tight 232-242 t/s (median 238.5), while varied
prompts were bimodal, mostly ~230-243 with a ~176 slow path — honest range 175-243,
varied-prompt median 235.3. The published 222 median also carries a cold first run at
186. Ollama&amp;rsquo;s fork ran a flat 195.7-196.3 under the same nonce scheme. The gpt-oss
prefill cells are dashed because the long-prompt pass was not run on this model.&lt;/p>
&lt;p>Desktop baseline was 1,642 MiB of GPU memory; subtract it for the models&amp;rsquo; own
footprints. Wall-clock recomputation agreed with each server&amp;rsquo;s self-reported rates
within 2% on every run but one — the first gpt-oss run on llama-server landed 3.6% off,
a cold-start artifact. Wherever both servers loaded the same file, VRAM matched within
7 MiB. Same weights, same memory. The gpt-oss row is the exception, and it is carrying
two different conversions of the model, not a wrapper difference. These figures also
run 2-7% above our earlier &lt;a href="https://techfuelhq.com/data/rtx-5080-llm-throughput/">RTX 5080 throughput dataset&lt;/a>
for the same models, because that capture used 500-1,650-token prompts where this one
uses short ones; both pages state their regime.&lt;/p>
&lt;p>llama.cpp decodes 2-6% faster on the dense models, more on the MoE below.
Ollama prefills 4-7% faster at real prompt sizes.
Neither gap changes what a model feels like to use, and neither survives a driver
update, an engine release, or a quantization change as the deciding factor in a
purchase or a migration.&lt;/p>
&lt;h2 id="the-overhead-ladder">The overhead ladder&lt;/h2>
&lt;p>One more instrument makes the picture honest. llama.cpp ships llama-bench, which times
the raw engine loop with no server in front of it. On Llama 3.2 3B:&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Instrument&lt;/th>
&lt;th scope="col">What it measures&lt;/th>
&lt;th scope="col" style="text-align: right">Decode&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>llama-bench&lt;/td>
&lt;td>bare engine loop&lt;/td>
&lt;td style="text-align: right">367 t/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>llama-server&lt;/td>
&lt;td>+ HTTP serving, sampling pipeline&lt;/td>
&lt;td style="text-align: right">338 t/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Ollama&lt;/td>
&lt;td>+ model management, its serving stack&lt;/td>
&lt;td style="text-align: right">319 t/s&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>Each layer costs single-digit percent, and that is the entire &amp;ldquo;wrapper tax&amp;rdquo;: 13% from
the bare engine loop to the most convenient tool in the stack, most of it spent on
serving machinery that any usable setup needs anyway, whichever side of the argument
you started on. Forum threads promise dramatic slowdowns. None reproduced here.&lt;/p>
&lt;p>That is the whole controversy, measured.&lt;/p>
&lt;h2 id="how-my-first-measurement-lied-to-me">How my first measurement lied to me&lt;/h2>
&lt;p>The first pass of this bench used a short, ~40-token prompt, and it showed Ollama&amp;rsquo;s
prefill rates landing 32-55% above llama-server&amp;rsquo;s — a gap that turned out to be an
artifact, because at tiny
prompt sizes &amp;ldquo;prefill tokens per second&amp;rdquo; is dominated by fixed per-request overhead
rather than compute, which means it measures which server shuffles a request faster
rather than which one ingests your context faster, and re-measured at ~420 prompt
tokens, llama-server&amp;rsquo;s prefill jumped from ~5,300 to ~16,800 t/s on the 3B while the
gap collapsed to single digits. The flags people credit for prefill speed did nothing
here either: flash attention on or off, micro-batch 512 or 2048, all within noise at
real prompt length on this card. Flags were not the story. Prompt length was.&lt;/p>
&lt;p>So treat one-line-prompt prefill numbers as request plumbing, not throughput.&lt;/p>
&lt;h2 id="the-portability-catch">The portability catch&lt;/h2>
&lt;p>Ollama stores weights as standard GGUF blobs, and &lt;code>ollama show &amp;lt;model&amp;gt; --modelfile&lt;/code>
prints the path. Point llama-server at it and both tools share one copy of the weights.
That worked perfectly for Llama 3.2 3B and Qwen 2.5 14B.&lt;/p>
&lt;p>It failed for gpt-oss:20b, and the failure is worth knowing about. llama.cpp refused
the blob with &lt;code>unknown model architecture: 'gptoss'&lt;/code>, and the server died on the spot. Ollama&amp;rsquo;s conversion tags the
architecture with its own name, while upstream llama.cpp expects &lt;code>gpt-oss&lt;/code> — so the
one model Ollama co-launched is the one whose Ollama download you cannot carry to the
upstream engine, so its download does not travel. The fix is downloading the
&lt;a href="https://huggingface.co/ggml-org/gpt-oss-20b-GGUF" rel="noopener">upstream GGUF&lt;/a> separately, at the
cost of a second ~12GB copy on disk. The upstream copy then decoded 13-22% faster than
Ollama&amp;rsquo;s fork on most prompts and allocated 1.1GB less GPU memory at the same context,
so the annoyance bought something real, about 1.09 GiB of it.&lt;/p>
&lt;h2 id="which-one-should-you-run">Which one should you run?&lt;/h2>
&lt;p>Run Ollama when you want model management to be someone else&amp;rsquo;s problem: pulls, updates,
memory eviction, an OpenAI-style API on 11434, and every tutorial on the internet
assuming you have it. Our &lt;a href="https://techfuelhq.com/data/rtx-5080-llm-throughput/">RTX 5080 throughput dataset&lt;/a>
and the &lt;a href="https://techfuelhq.com/tutorials/self-host-local-llm-rtx-5060-2026/">RTX 5060 local LLM guide&lt;/a> both
ride on it for exactly that reason.&lt;/p>
&lt;p>Run llama-server when you want the newest engine the day it ships, exact control over
batching, context, and sampling, or the last few percent of decode speed. For these
models the engines share llama.cpp lineage; Ollama&amp;rsquo;s &lt;a href="https://github.com/ollama/ollama" rel="noopener">README&lt;/a>
lists llama.cpp among its supported backends, and the gpt-oss arch tag shows it also
ships its own engine paths. You are choosing how much of the engine&amp;rsquo;s surface to touch. Throughput is the wrong reason to switch in either direction — 2-6% is
less than the gain from one quantization step or one driver update.&lt;/p>
&lt;h2 id="method-and-limits">Method and limits&lt;/h2>
&lt;p>Both servers ran the same sha256-identical GGUF blobs from Ollama&amp;rsquo;s own store (except
the gpt-oss case above), one server resident at a time, fresh process per model, with
&lt;code>ollama stop&lt;/code> and process-tree kills between runs. Every request used a unique prompt
nonce; llama-server additionally got &lt;code>cache_prompt: false&lt;/code>. Generation pinned to
temperature 0, seed 42, 256 tokens (64 for the long-prefill pass), context 4096 on
both. Rates come from each server&amp;rsquo;s own timing counters, cross-checked by wall-clock
recomputation (within 2% throughout) and by llama-bench as a third instrument.&lt;/p>
&lt;p>The limits, named. One GPU, one box, three models, servers on default flags. Token counts for identical prompt text differed slightly between servers (433
vs 407 on the long prompt) because Ollama applies its chat template to /api/generate
while llama-server&amp;rsquo;s /completion takes the prompt raw — rates are per-token, so the
comparison holds, but byte-identical inputs produce slightly different token streams.
Ollama&amp;rsquo;s engine is a vendored llama.cpp build, so some of the decode gap is simply
engine version lag, and it will move with every release on both sides. Date everything;
this page says 2026-08-20.&lt;/p></description></item><item><title>MCP Server Resource Benchmark: RAM, Startup, Tools Dataset</title><link>https://techfuelhq.com/data/mcp-server-bench/</link><pubDate>Thu, 20 Aug 2026 00:48:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/data/mcp-server-bench/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · Published 2026-08-20 · ~3 min read · St. Louis County, MO&lt;/p>
&lt;h2 id="the-short-version">The short version&lt;/h2>
&lt;p>I benchmarked eleven of the most-recommended MCP servers for what they cost to keep
resident. The answer: &lt;strong>178-422MB of RAM each&lt;/strong> (median 188MB), ready in 0.5-1.9 seconds
warm, with tool counts from 1 to 26. A realistic concurrent five-server stack totals
&lt;strong>961.6MB&lt;/strong>, and two independent measurement paths confirmed that figure to the decimal.
Tool count barely predicts weight. The runtime and framework dominate.&lt;/p>
&lt;p>Download: &lt;a href="https://techfuelhq.com/data/mcp-server-bench-2026-08.csv">mcp-server-bench-2026-08.csv&lt;/a>. CC BY 4.0,
per-iteration arrays included.&lt;/p>
&lt;h2 id="the-measured-table">The measured table&lt;/h2>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Server&lt;/th>
&lt;th scope="col">Version&lt;/th>
&lt;th scope="col" style="text-align: right">Ready&lt;/th>
&lt;th scope="col" style="text-align: right">RSS&lt;/th>
&lt;th scope="col" style="text-align: right">Tools&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>GitHub (legacy npm)&lt;/td>
&lt;td>0.6.2&lt;/td>
&lt;td style="text-align: right">547ms&lt;/td>
&lt;td style="text-align: right">178MB&lt;/td>
&lt;td style="text-align: right">26&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Playwright&lt;/td>
&lt;td>1.63.0-alpha-2026-08-05&lt;/td>
&lt;td style="text-align: right">618ms&lt;/td>
&lt;td style="text-align: right">227MB&lt;/td>
&lt;td style="text-align: right">24&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Time (Python)&lt;/td>
&lt;td>1.29.0¹&lt;/td>
&lt;td style="text-align: right">619ms&lt;/td>
&lt;td style="text-align: right">181MB&lt;/td>
&lt;td style="text-align: right">2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Sequential-thinking&lt;/td>
&lt;td>0.2.0&lt;/td>
&lt;td style="text-align: right">666ms&lt;/td>
&lt;td style="text-align: right">186MB&lt;/td>
&lt;td style="text-align: right">1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Memory&lt;/td>
&lt;td>0.6.3&lt;/td>
&lt;td style="text-align: right">667ms&lt;/td>
&lt;td style="text-align: right">187MB&lt;/td>
&lt;td style="text-align: right">9&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Filesystem&lt;/td>
&lt;td>0.2.0&lt;/td>
&lt;td style="text-align: right">692ms&lt;/td>
&lt;td style="text-align: right">188MB&lt;/td>
&lt;td style="text-align: right">14&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Git (Python)&lt;/td>
&lt;td>1.29.0¹&lt;/td>
&lt;td style="text-align: right">699ms&lt;/td>
&lt;td style="text-align: right">185MB&lt;/td>
&lt;td style="text-align: right">12&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Fetch (Python)&lt;/td>
&lt;td>1.29.0¹&lt;/td>
&lt;td style="text-align: right">717ms&lt;/td>
&lt;td style="text-align: right">220MB&lt;/td>
&lt;td style="text-align: right">1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Context7&lt;/td>
&lt;td>4.0.2&lt;/td>
&lt;td style="text-align: right">815ms&lt;/td>
&lt;td style="text-align: right">214MB&lt;/td>
&lt;td style="text-align: right">2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Desktop Commander&lt;/td>
&lt;td>0.2.47&lt;/td>
&lt;td style="text-align: right">1,705ms&lt;/td>
&lt;td style="text-align: right">275MB&lt;/td>
&lt;td style="text-align: right">26&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qdrant (Python, 3.12 pin)&lt;/td>
&lt;td>1.29.0¹&lt;/td>
&lt;td style="text-align: right">1,881ms&lt;/td>
&lt;td style="text-align: right">422MB&lt;/td>
&lt;td style="text-align: right">2&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>¹ The four Python servers self-report 1.29.0 via serverInfo. That is a framework
version string rather than each package&amp;rsquo;s own release number.&lt;/p>
&lt;p>Controls on the same box: bare Node resident loop 52.1MB, bare Python loop 15.2MB.
Five-server concurrent stack components: memory 189.8, filesystem 187.1, fetch 221.7,
git 184.5, GitHub 178.5. Total: 961.6MB.&lt;/p>
&lt;h2 id="method">Method&lt;/h2>
&lt;p>Each iteration spawns the server fresh (npx or uvx, warm package cache after one
discarded warmup), completes the MCP initialize handshake over stdio, requests
tools/list, then samples RSS across the full descendant process tree. I report medians
of five iterations, three for the two servers benched later the same evening, marked in
the CSV. The bench script lives in our repo at ops/bench/mcp/mcp_bench.py. For the
decision layer, meaning which servers earn their memory and which to skip, read
&lt;a href="https://techfuelhq.com/self-hosted/best-mcp-servers-homelab-2026/">the companion article&lt;/a>.&lt;/p>
&lt;p>Known limitations, named: one Windows 11 machine, warm caches, stdio transport only,
readiness and listing timed rather than per-tool-call latency under load. The GitHub
entry is the legacy npm package; GitHub&amp;rsquo;s current first-party server ships as a Go
binary and hosted remote. Version 1.0.0 of this dataset; changes will be logged in the
update history above.&lt;/p></description></item><item><title>Unraid vs TrueNAS vs OMV vs Proxmox: NAS OS Pick (2026)</title><link>https://techfuelhq.com/storage/unraid-vs-truenas-vs-omv-vs-proxmox-2026/</link><pubDate>Thu, 20 Aug 2026 00:30:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/storage/unraid-vs-truenas-vs-omv-vs-proxmox-2026/</guid><description>&lt;p>Every NAS thread ends in the same four names, and one of them does not belong. I spent
an evening verifying the current state of all four against their own release notes,
pricing pages, and documentation, because so much of the standing advice on this
comparison describes products that no longer exist, and the details that changed are
exactly the ones that decide the purchase: TrueNAS SCALE is gone as a name, TrueNAS CORE is discontinued
as a product, Unraid&amp;rsquo;s &amp;ldquo;subscription&amp;rdquo; is not one, and Proxmox, the name that starts half
the arguments, does not serve a single network share out of the box and never claimed
it could.&lt;/p>
&lt;p>Here is the decision, then the evidence.&lt;/p>
&lt;h2 id="the-short-version">The short version&lt;/h2>
&lt;p>Two are free. One is worth paying for. One is a hypervisor wearing a costume.&lt;/p>
&lt;p>Mixed drives you already own, apps with minimum friction, money available: Unraid.
Uniform drives, integrity as the priority, 8GB of RAM to spare: TrueNAS Community
Edition. A weak or small box, Debian comfort, zero budget: openmediavault. And if
virtual machines are the actual point of the server, run Proxmox — with a NAS on top of
it, not instead of one.&lt;/p>
&lt;h2 id="the-august-2026-state-of-play">The August 2026 state of play&lt;/h2>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">&lt;/th>
&lt;th scope="col">Unraid&lt;/th>
&lt;th scope="col">TrueNAS CE&lt;/th>
&lt;th scope="col">openmediavault&lt;/th>
&lt;th scope="col">Proxmox VE&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Version&lt;/td>
&lt;td>7.3.2 (Jul 2026)&lt;/td>
&lt;td>25.10.6 (Aug 2026)&lt;/td>
&lt;td>8.5.6-1 (Aug 2026)&lt;/td>
&lt;td>9.2 (May 2026)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Cost&lt;/td>
&lt;td>$49 / $109 / $249 once&lt;/td>
&lt;td>Free&lt;/td>
&lt;td>Free&lt;/td>
&lt;td>Free²&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Storage&lt;/td>
&lt;td>mixed-size parity array&lt;/td>
&lt;td>ZFS only&lt;/td>
&lt;td>mdadm + 16 mountable filesystems&lt;/td>
&lt;td>for VM disks, not shares&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RAM floor¹&lt;/td>
&lt;td>none published&lt;/td>
&lt;td>8GB&lt;/td>
&lt;td>1GiB&lt;/td>
&lt;td>1GB (2GB + guests)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Apps&lt;/td>
&lt;td>Community Apps (Docker)&lt;/td>
&lt;td>TrueNAS Apps (Docker)&lt;/td>
&lt;td>omv-extras plugins&lt;/td>
&lt;td>VMs + LXC only&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>¹ Official documentation figures; Unraid&amp;rsquo;s getting-started docs publish no RAM number
(only a 4GB USB stick requirement) and its forum moderators suggest 4GB as the practical
minimum. ² Subscriptions run €120 (repo access only, no tickets) to €1,100 (unlimited
tickets) per socket per year; the free package repo is officially labeled not
recommended for production.&lt;/p>
&lt;h2 id="what-the-old-comparisons-get-wrong">What the old comparisons get wrong&lt;/h2>
&lt;p>The rename nobody indexed. TrueNAS SCALE became TrueNAS Community Edition with 25.04
&amp;ldquo;Fangtooth&amp;rdquo; in April 2025, and the FreeBSD-based CORE line is formally finished. The
software status page says it is no longer under active development, with 13.0-U6.8 and
13.3-U1.2 as the final builds. Any comparison still weighing &amp;ldquo;CORE vs SCALE&amp;rdquo; is a
museum piece.&lt;/p>
&lt;p>Unraid&amp;rsquo;s pricing produces the loudest arguments and the most misinformation. The
licenses are perpetual. The $36 a year on the Starter and Unleashed tiers is optional
and only gates new feature releases; your installed version keeps working and keeps
receiving security patches within its minor version. Lime Technology shipped 7.2.8 with a
WebGUI CVE fix three weeks after 7.3.2 was already current. Call it a subscription and
its forum will correct you, with citations.&lt;/p>
&lt;p>RAIDZ expansion stopped being a differentiator. TrueNAS shipped it in 24.10 in October
2024, sponsored by iXsystems, and Unraid&amp;rsquo;s ZFS pools gained the same one-drive-at-a-time
growth in 7.2.0 a year later. The classic &amp;ldquo;ZFS can&amp;rsquo;t grow one disk at a time&amp;rdquo; objection
is two years stale against TrueNAS and ten months stale against Unraid.&lt;/p>
&lt;p>openmediavault deserves both its reputation and its asterisk. It is the lightest real
NAS OS here, it is genuinely free, and the third-party omv-extras mergerfs and SnapRAID
plugins recreate Unraid&amp;rsquo;s mixed-drive economics without the license fee. The asterisk is structural: the
GitHub contributor graph shows 8,303 commits by the lead developer against 24 by the
next contributor. One maintainer carries the core. OMV 7 also quietly went end-of-life
in June 2026, so a fresh install today should start at OMV 8.&lt;/p>
&lt;h2 id="the-category-error">The category error&lt;/h2>
&lt;p>Proxmox VE describes itself as a server management platform for enterprise
virtualization. Its storage documentation lists NFS and SMB only as backends it mounts
from somewhere else, to hold VM disks and backups. There is no interface anywhere in it
for creating a share, and its community answers the recurring question without
hedging: &amp;ldquo;not a NAS software like TrueNAS,&amp;rdquo; in its own words. That settles it.&lt;/p>
&lt;p>So why is it in every NAS thread? Because homelabbers correctly run it as the base
layer and put the NAS on top — a TrueNAS or OMV virtual machine with disks passed
through, a fileserver LXC, or bare Samba on the underlying Debian. All of those work.
None of them makes Proxmox a NAS OS; they make it a hypervisor hosting one, which is a
different decision with different failure modes. If that is your situation, the real
question is which storage backend to run under Proxmox, and &lt;a href="https://techfuelhq.com/homelab/proxmox-truenas-unraid-storage-backend-2026/">we compare exactly
that&lt;/a> separately.&lt;/p>
&lt;h2 id="picking-by-your-actual-constraint">Picking by your actual constraint&lt;/h2>
&lt;p>&lt;strong>Your drives are a mixed bag.&lt;/strong> Unraid&amp;rsquo;s parity array takes different sizes in one
protected pool, and openmediavault reaches the same shape via the third-party omv-extras
mergerfs and SnapRAID plugins. TrueNAS will let you mix sizes but charges you for it:
ZFS caps every disk in a vdev at the smallest member&amp;rsquo;s capacity.&lt;/p>
&lt;p>&lt;strong>Your RAM is tight.&lt;/strong> TrueNAS officially wants 8GB plus 1GB per drive past eight. OMV
officially runs in 1GiB. On a repurposed thin client or an N100 with soldered memory,
that spread decides the argument by itself.&lt;/p>
&lt;p>&lt;strong>You want apps without ceremony.&lt;/strong> Unraid&amp;rsquo;s Community Apps store is, in my judgment,
the smoothest catalog in home NAS. TrueNAS moved its apps backend from Kubernetes to plain Docker in
24.10, which simplified life, though its forums carry real migration scars from that
transition, and the forum threads from the 25.04 virtualization overhaul read the
same way. OMV needs the omv-extras compose plugin before Docker exists
at all.&lt;/p>
&lt;p>&lt;strong>Your data is the point and nothing else is.&lt;/strong> TrueNAS. It is not close, because the
whole platform is organized around one job: ZFS end-to-end with checksumming, snapshots,
and replication, maintained by a company whose paying enterprise customers keep the
storage layer honest whether or not the home users complain loudly enough.&lt;/p>
&lt;p>&lt;strong>Budget rules everything.&lt;/strong> OMV and TrueNAS are free. Unraid&amp;rsquo;s $49 Starter covers six
attached devices, which fits most first builds; count your drives before assuming the
$109 tier. Run your drive plan through the &lt;a href="https://techfuelhq.com/tools/nas-storage-calculator/">RAID capacity
calculator&lt;/a> first — parity overhead changes the real
cost per usable terabyte more than the license does.&lt;/p>
&lt;p>Whatever wins, put it on hardware that idles politely. A NAS runs 24/7, so the
&lt;a href="https://techfuelhq.com/homelab/24-7-homelab-idle-power-costs-2026/">idle-power economics&lt;/a> compound annually,
and the &lt;a href="https://techfuelhq.com/homelab/best-budget-nas-builds-2025/">budget NAS builds&lt;/a> and
&lt;a href="https://techfuelhq.com/homelab/nas-from-old-pc-2026/">old-PC conversion guide&lt;/a> both start from that premise.&lt;/p>
&lt;h2 id="method-and-limits">Method and limits&lt;/h2>
&lt;p>Everything above was verified on 2026-08-20 against official release notes, pricing
pages, and documentation, with community claims labeled as community claims; the source
list below carries the URLs. Two honesty notes from the verification run: the
openmediavault docs site blocks automated fetchers, so its facts were checked against
the project&amp;rsquo;s own docs source repository (identical content), and a small number of
forum items were verified through search-index snippets rather than full page loads. What this page is not: a hands-on
bench of the four installers side by side. I have not run these four concurrently on
matched hardware, so you will find no throughput or power numbers here — when we
measure that, it will publish as a dataset with the raw files, like our other
measured work. Versions move fast in this space; if the table above and a vendor page
ever disagree, the vendor page has moved and this page&amp;rsquo;s lastmod tells you by how much.&lt;/p></description></item><item><title>Best MCP Servers for a Homelab: 11 Measured (2026)</title><link>https://techfuelhq.com/self-hosted/best-mcp-servers-homelab-2026/</link><pubDate>Wed, 19 Aug 2026 23:58:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/self-hosted/best-mcp-servers-homelab-2026/</guid><description>&lt;p>All four &amp;ldquo;favorite MCP servers&amp;rdquo; roundups I could find share one gap. None publishes a
single number. No memory footprint, no startup time, no latency. Enumerate and vibe is
the format. So I wrote a small benchmark, pointed it at eleven of the most-recommended
MCP servers, and measured what they actually cost to keep resident on a homelab box.&lt;/p>
&lt;p>The headline: &lt;strong>each server holds 178-422MB of RAM&lt;/strong>, and the popular advice to &amp;ldquo;just
connect everything&amp;rdquo; costs about &lt;strong>1GB for five servers&lt;/strong>, because I measured 961.6MB for
a real concurrent stack, two independent measurement paths agreed on it to the decimal,
and that is a gigabyte gone before a single model or container starts, spent on tooling
I touch a few times a day. Nobody mentions this. RAM is the quiet bill.&lt;/p>
&lt;h2 id="the-measured-table">The measured table&lt;/h2>
&lt;p>Fresh spawn per iteration, warm package cache, five iterations per server (three for
GitHub and Qdrant, benched later the same evening — the iterations column in the CSV
says which), medians reported. RSS covers the full process tree, because npx and uvx
both spawn children, and measuring only the parent undercounts 18x. Raw data ships as
&lt;a href="https://techfuelhq.com/data/mcp-server-bench-2026-08.csv">CSV&lt;/a> with a
&lt;a href="https://techfuelhq.com/data/mcp-server-bench/">versioned dataset page&lt;/a>, CC BY 4.0.&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Server&lt;/th>
&lt;th scope="col">Version&lt;/th>
&lt;th scope="col" style="text-align: right">Ready&lt;/th>
&lt;th scope="col" style="text-align: right">RSS&lt;/th>
&lt;th scope="col" style="text-align: right">Tools&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>GitHub (legacy npm)&lt;/td>
&lt;td>0.6.2&lt;/td>
&lt;td style="text-align: right">547ms&lt;/td>
&lt;td style="text-align: right">178MB&lt;/td>
&lt;td style="text-align: right">26&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Playwright&lt;/td>
&lt;td>1.63.0-alpha-2026-08-05&lt;/td>
&lt;td style="text-align: right">618ms&lt;/td>
&lt;td style="text-align: right">227MB&lt;/td>
&lt;td style="text-align: right">24&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Time (Python)&lt;/td>
&lt;td>1.29.0¹&lt;/td>
&lt;td style="text-align: right">619ms&lt;/td>
&lt;td style="text-align: right">181MB&lt;/td>
&lt;td style="text-align: right">2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Sequential-thinking&lt;/td>
&lt;td>0.2.0&lt;/td>
&lt;td style="text-align: right">666ms&lt;/td>
&lt;td style="text-align: right">186MB&lt;/td>
&lt;td style="text-align: right">1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Memory&lt;/td>
&lt;td>0.6.3&lt;/td>
&lt;td style="text-align: right">667ms&lt;/td>
&lt;td style="text-align: right">187MB&lt;/td>
&lt;td style="text-align: right">9&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Filesystem&lt;/td>
&lt;td>0.2.0&lt;/td>
&lt;td style="text-align: right">692ms&lt;/td>
&lt;td style="text-align: right">188MB&lt;/td>
&lt;td style="text-align: right">14&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Git (Python)&lt;/td>
&lt;td>1.29.0¹&lt;/td>
&lt;td style="text-align: right">699ms&lt;/td>
&lt;td style="text-align: right">185MB&lt;/td>
&lt;td style="text-align: right">12&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Fetch (Python)&lt;/td>
&lt;td>1.29.0¹&lt;/td>
&lt;td style="text-align: right">717ms&lt;/td>
&lt;td style="text-align: right">220MB&lt;/td>
&lt;td style="text-align: right">1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Context7&lt;/td>
&lt;td>4.0.2&lt;/td>
&lt;td style="text-align: right">815ms&lt;/td>
&lt;td style="text-align: right">214MB&lt;/td>
&lt;td style="text-align: right">2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Desktop Commander&lt;/td>
&lt;td>0.2.47&lt;/td>
&lt;td style="text-align: right">1,705ms&lt;/td>
&lt;td style="text-align: right">275MB&lt;/td>
&lt;td style="text-align: right">26&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qdrant (Python, 3.12 pin)&lt;/td>
&lt;td>1.29.0¹&lt;/td>
&lt;td style="text-align: right">1,881ms&lt;/td>
&lt;td style="text-align: right">422MB&lt;/td>
&lt;td style="text-align: right">2&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>¹ The four Python servers self-report the version string 1.29.0 via serverInfo, a
framework string rather than each package&amp;rsquo;s own release number.&lt;/p>
&lt;p>Controls matter here. A bare Node process idles at 52MB and bare Python at 15MB on the
same box, so the gap between those floors and the table is frameworks plus dependencies.
Your tool code is nearly free. Tool count barely predicts weight. The 26-tool GitHub
server is the lightest thing I measured, while the 1-tool sequential-thinking server
still costs 186MB. The framework is the payload.&lt;/p>
&lt;p>Two findings surprised me. Python servers land as heavy as Node ones, since uvx resolves
an environment and spawns its own interpreter chain; fetch holds 220MB for a single tool.
And the whole startup-cost worry is mostly noise for homelab use. Everything except
Desktop Commander and Qdrant is ready in under a second warm, and a persistent client
like Claude Code spawns servers once per session anyway.&lt;/p>
&lt;h2 id="the-tiers-with-the-criteria-stated">The tiers, with the criteria stated&lt;/h2>
&lt;p>I ranked on four things I can defend: measured cost, utility per megabyte, install
friction, and whether the server works standalone or needs a service running behind it.&lt;/p>
&lt;h3 id="tier-1-connect-these-first">Tier 1, connect these first&lt;/h3>
&lt;p>&lt;strong>Filesystem&lt;/strong> (188MB, 14 tools), &lt;strong>Fetch&lt;/strong> (220MB, 1 tool), and &lt;strong>Git&lt;/strong> (185MB,
12 tools). These are the hands and eyes of any local AI setup. They read and edit real
files, pull real web pages, and work actual repository history. Every workflow I run
daily leans on at least two of the three, so their megabytes never idle.&lt;/p>
&lt;h3 id="tier-2-worth-it-when-the-use-exists">Tier 2, worth it when the use exists&lt;/h3>
&lt;p>&lt;strong>GitHub&lt;/strong> (178MB, 26 tools) earns a slot if your work lives in issues and PRs. The npm
package I measured is the legacy implementation; GitHub&amp;rsquo;s current
&lt;a href="https://github.com/github/github-mcp-server" rel="noopener">first-party server&lt;/a> ships as a Go binary
and a hosted remote endpoint, so treat 178MB as the worst case.
&lt;strong>Playwright&lt;/strong> (227MB, 24 tools) puts an agent behind a real browser, and the 227MB is
just the idle server, so budget for the browser on top. &lt;strong>Memory&lt;/strong> (187MB, 9 tools)
gives an agent a persistent knowledge graph across sessions, which pays off once you
have sessions worth remembering. &lt;strong>Desktop Commander&lt;/strong> (275MB, 26 tools) is the heaviest
Node server, and at 1.7s only Qdrant starts slower. It earns that by being a full
terminal-and-editor surface. Run it where you would trust an agent with a shell, and
nowhere else.&lt;/p>
&lt;h3 id="tier-3-think-twice">Tier 3, think twice&lt;/h3>
&lt;p>Sequential-thinking is the worst utility-per-megabyte in the table. It holds 186MB for
one tool that restates a reasoning pattern current models handle natively. Context7
(214MB, 2 tools) pulls current library docs into context, which helps coding agents and
duplicates a client that already fetches the web. Qdrant is the heaviest measured at
422MB, and bare uvx failed to install it outright on this machine — the resolver picked
a pydantic-core it had to source-build, which dies without a Rust toolchain. Pin it with
&lt;code>uvx --python 3.12 mcp-server-qdrant&lt;/code> and it starts fine, then holds its FastEmbed
embedding model (all-MiniLM-L6-v2 by default) inside that 422MB. Run it if you already run Qdrant for something else.&lt;/p>
&lt;h2 id="the-service-bound-layer-i-did-not-measure">The service-bound layer I did not measure&lt;/h2>
&lt;p>The service-bound servers the homelab press centers on need their platform running to
mean anything. Proxmox MCP is the consensus pick, covered by three of the four
roundups I checked, with one author counting 200+ exposed tools. Kubernetes MCP and
Docker Desktop&amp;rsquo;s MCP Toolkit round out that set. This bench box runs
neither Docker nor Proxmox, so those numbers would have been theater, and I left them
out. The pattern from the measured set almost certainly transfers. Expect the runtime
floor plus dependencies, call it 200-400MB per server, and measure on your own box
before trusting anyone&amp;rsquo;s table, including mine.&lt;/p>
&lt;h2 id="configs-beyond-cursor">Configs beyond Cursor&lt;/h2>
&lt;p>Three of the four roundups I read assume Cursor, and the fourth stays client-agnostic.
Two clients they skip matter in a homelab. Claude Code
wires a server in one line.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>claude mcp add filesystem -- npx -y @modelcontextprotocol/server-filesystem C:/lab
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>LM Studio and Claude Desktop take the same JSON shape in &lt;code>mcp.json&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;mcpServers&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;filesystem&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;command&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;npx&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;args&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;-y&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;@modelcontextprotocol/server-filesystem&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;C:/lab&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Swap &lt;code>npx -y &amp;lt;package&amp;gt;&lt;/code> for &lt;code>uvx &amp;lt;package&amp;gt;&lt;/code> on the Python servers, and remember the
Qdrant interpreter pin from the table above.&lt;/p>
&lt;h2 id="what-to-run-this-on">What to run this on&lt;/h2>
&lt;p>The RAM math is friendly. A five-server stack costs about 1GB resident, so any
&lt;a href="https://techfuelhq.com/homelab/best-mini-pcs-homelab-2026/">N100-class mini PC&lt;/a> with 16GB handles the tooling
layer without noticing. The real constraint is whatever model or services run beside it.
If the same box also hosts a local LLM, size memory for the model first. Our
&lt;a href="https://techfuelhq.com/data/rtx-5080-llm-throughput/">RTX 5080 throughput dataset&lt;/a> and the
&lt;a href="https://techfuelhq.com/tutorials/self-host-local-llm-rtx-5060-2026/">local LLM on an RTX 5060 guide&lt;/a> carry the
VRAM numbers. Mine are measured on this bench. The 5060 guide&amp;rsquo;s come from published
benchmarks for those cards. With &lt;a href="https://techfuelhq.com/articles/ddr5-ram-buying-guide-2025/">DDR5 prices where they are&lt;/a>,
over-provisioning system RAM is the cheapest insurance in the build.&lt;/p>
&lt;h2 id="method-including-the-traps">Method, including the traps&lt;/h2>
&lt;p>The bench script (&lt;code>ops/bench/mcp/mcp_bench.py&lt;/code> in our repo) spawns each server fresh,
speaks MCP JSON-RPC over stdio with an initialize handshake followed by a tools/list
call, and samples RSS across the full descendant process tree 0.4s after the listing
returns. Five iterations per server, three for the two late additions. One discarded
warmup spawn keeps npm and uv package caches warm, because the documented condition is a configured homelab, and never a first
install. Run-to-run ready-time spread stayed under 7% for eight of eleven servers; the Python
time and fetch servers carried first-iteration outliers up to 17%, visible in the
published arrays. RSS spread stayed within 8MB worst case.&lt;/p>
&lt;p>The instrument hit traps, so yours does not have to. Measuring only the spawned npx parent
reports 10.3MB while the full process tree holds 189.3MB — an 18x undercount, recorded
in the evidence set. Sum the tree.
My first Git-server runs timed out because I pointed the repository flag at a plain
directory, and the server waits silently. The Qdrant failure looked like a hang until
stderr showed the build dying: &amp;ldquo;Failed to build pydantic-core==2.33.2 &amp;hellip; Rust not
found, installing into a temporary directory&amp;rdquo;. Bare uvx had resolved a pinned
pydantic-core and fallen back to a source build; the 3.12 interpreter pin sidesteps it. For the five-stack figure the components were memory 189.8, filesystem 187.1, fetch
221.7, git 184.5, and GitHub 178.5, totaling 961.6MB by psutil; an independent
PowerShell WorkingSet64 walk over the same process trees returned 961.6MB, exact
agreement.&lt;/p>
&lt;p>Limitations, named. One Windows 11 machine. Warm caches. Stdio transport only. I
measured readiness and listing, and never per-tool-call latency under load. The GitHub
entry is the legacy npm package rather than the current Go binary. Linux numbers will
differ, likely lower on the Node floor, and that comparison is a natural v2 alongside
the service-bound servers once this lab runs Docker.&lt;/p></description></item><item><title>RTX 5080 LLM Power Efficiency: Measured Watts and Joules per Token</title><link>https://techfuelhq.com/data/rtx-5080-llm-power-efficiency/</link><pubDate>Wed, 19 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/data/rtx-5080-llm-power-efficiency/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · Published 2026-08-19 · ~5 min read · St. Louis County, MO&lt;/p>
&lt;img src="https://techfuelhq.com/images/data/rtx-5080-llm-power-efficiency.svg" alt="Measured RTX 5080 LLM power efficiency bar chart, tokens per joule from 1Hz board telemetry at the stock 448W limit: Llama 3.2 3B leads at 1.2 (318 tok/s at 265W), sparse gpt-oss 20B second at 0.665 (194 tok/s at 292W), Qwen 2.5 7B at 0.53 (182 tok/s at 344W), and Qwen 2.5 14B at 0.317 (99 tok/s at 312W)" width="1200" height="630" loading="eager" fetchpriority="high" style="display:block;margin:1.5rem auto;max-width:100%;height:auto;border:1px solid #1e1e3a;border-radius:8px;" />
&lt;h2 id="the-short-version">The short version&lt;/h2>
&lt;p>The &lt;a href="https://techfuelhq.com/data/rtx-5080-llm-throughput/">RTX 5080 throughput dataset&lt;/a> answers &amp;ldquo;how fast&amp;rdquo; — this companion answers &lt;strong>&amp;ldquo;at what electrical cost.&amp;rdquo;&lt;/strong> Same retail card, same ollama stack: I logged board power at 1Hz with nvidia-smi while driving fixed-length generations through four models from 3B to 20.9B parameters, then divided each run&amp;rsquo;s decode rate by the watts that produced it. The result is the number almost nobody publishes for consumer cards: &lt;strong>joules per token&lt;/strong>, and from it, real dollars per million tokens at the current &lt;a href="https://www.eia.gov/electricity/monthly/epm_table_grapher.php?t=epmt_5_6_a" rel="noopener">EIA US residential electricity average&lt;/a> of $0.184/kWh.&lt;/p>
&lt;p>Two findings up front. First, &lt;strong>the sparse-MoE gpt-oss 20B beats the dense 7B on tokens per joule (0.665 vs 0.53) and doubles the dense 14B (0.317)&lt;/strong> — active-parameter count and quantization set the electric bill, not total size. Second, the quiet budget-killer: &lt;strong>this card measures 52–71W at idle&lt;/strong> in my system — not the 8–15W reference figure reviews quote — which at 24/7 duty is $85–115/year before a single token is generated.&lt;/p>
&lt;h2 id="the-numbers-capture-2026-08-19-stock-448w-power-limit">The numbers (capture 2026-08-19, stock 448W power limit)&lt;/h2>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Model&lt;/th>
&lt;th scope="col">Quant&lt;/th>
&lt;th scope="col" style="text-align: right">Decode tok/s (med)&lt;/th>
&lt;th scope="col" style="text-align: right">Board W (med, loaded)&lt;/th>
&lt;th scope="col" style="text-align: right">Tokens/joule&lt;/th>
&lt;th scope="col" style="text-align: right">Wh per 1M tokens&lt;/th>
&lt;th scope="col" style="text-align: right">$ per 1M tokens&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Llama 3.2 3B&lt;/td>
&lt;td>Q4_K_M&lt;/td>
&lt;td style="text-align: right">318.3&lt;/td>
&lt;td style="text-align: right">265.2&lt;/td>
&lt;td style="text-align: right">1.20&lt;/td>
&lt;td style="text-align: right">231&lt;/td>
&lt;td style="text-align: right">$0.043&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qwen 2.5 7B&lt;/td>
&lt;td>Q4_K_M&lt;/td>
&lt;td style="text-align: right">182.2&lt;/td>
&lt;td style="text-align: right">343.6&lt;/td>
&lt;td style="text-align: right">0.53&lt;/td>
&lt;td style="text-align: right">524&lt;/td>
&lt;td style="text-align: right">$0.096&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qwen 2.5 14B&lt;/td>
&lt;td>Q4_K_M&lt;/td>
&lt;td style="text-align: right">98.8&lt;/td>
&lt;td style="text-align: right">311.6&lt;/td>
&lt;td style="text-align: right">0.32&lt;/td>
&lt;td style="text-align: right">876&lt;/td>
&lt;td style="text-align: right">$0.161&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>gpt-oss 20B&lt;/td>
&lt;td>MXFP4 (MoE)&lt;/td>
&lt;td style="text-align: right">194.4&lt;/td>
&lt;td style="text-align: right">292.4&lt;/td>
&lt;td style="text-align: right">0.67&lt;/td>
&lt;td style="text-align: right">418&lt;/td>
&lt;td style="text-align: right">$0.077&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>&lt;em>Loaded-basis medians: telemetry samples counted only at GPU utilization ≥ 50%. Decode rates are ollama&amp;rsquo;s own eval counters (fresh prompt every iteration — cached-prompt runs report prefill artifacts, not decode). Full column set including clocks, temperature, VRAM, and per-run min/max is in &lt;a href="https://techfuelhq.com/data/rtx-5080-llm-power-efficiency.csv">the CSV&lt;/a>.&lt;/em>&lt;/p>
&lt;h2 id="what-the-data-says">What the data says&lt;/h2>
&lt;p>&lt;strong>Sparsity beats size.&lt;/strong> gpt-oss 20B is the second-most efficient model on the card despite carrying the most total parameters — 0.67 tokens/joule against the dense 7B&amp;rsquo;s 0.53 and the dense 14B&amp;rsquo;s 0.32. It is a mixture-of-experts design that activates only a fraction of its weights per token, shipped in MXFP4, so it decodes at 194 tok/s while drawing &lt;em>less&lt;/em> power than the 7B. If your workload fits its quality profile, the 20B is both the smartest and the second-cheapest model per token in this ladder — the dense-model intuition that &amp;ldquo;bigger costs more electricity per token&amp;rdquo; fails here.&lt;/p>
&lt;p>&lt;strong>Board power barely moves; efficiency moves 4x.&lt;/strong> Across a 7x spread in total parameters, loaded board power stays inside a narrow 265–344W band — the card runs at 59–77% of its 448W limit no matter what I feed it, and never once touched the cap. The 7B is the thirstiest of the four (343.6W): it generates fast enough to keep the memory bus saturated while still lighting up plenty of compute. What actually separates the models is the numerator — tokens delivered per second — which is why tokens-per-joule spans 0.32 to 1.20 while watts span barely 30%.&lt;/p>
&lt;p>&lt;strong>The marginal token is nearly free; the idle hours are not.&lt;/strong> Even the least efficient row costs $0.161 of electricity per million tokens — a full novel&amp;rsquo;s worth of output for under two cents at the &lt;a href="https://www.eia.gov/electricity/monthly/epm_table_grapher.php?t=epmt_5_6_a" rel="noopener">May-2026 EIA residential average&lt;/a>. Set against the idle finding below (52–71W around the clock ≈ $85–115/year), the budget conclusion for a home inference node inverts the usual framing: model choice barely matters to the bill; what the box does during the other 23 hours dominates it. Temperatures never passed 52°C at a 30% fan median, and the 448W cap was never reached — which also means a power-limit sweep should cost little throughput, and that is exactly the queued v1.1.&lt;/p>
&lt;h2 id="the-idle-power-finding">The idle-power finding&lt;/h2>
&lt;p>Every 24/7 cost model I have seen for this card starts from single-digit idle watts. Mine doesn&amp;rsquo;t idle there: across repeated captures this week the card sat between &lt;strong>52W and 71W at the Windows desktop&lt;/strong>, pinned in P0 with graphics clocks near 2.9GHz — multi-monitor output holds the high P-state, an animated wallpaper added ~6W and 2% utilization on its own, and the cleanest state I could produce (wallpaper closed, no model resident) still read 53.7W. This is a known behavior class, not a defect, but it is the number an always-on node actually pays: at $0.184/kWh, 52–71W around the clock is &lt;strong>456–622 kWh ≈ $85–115/year of pure idle&lt;/strong>. If your 5080 box mostly waits for occasional inference, the idle line, not the inference line, dominates the bill — check your own card with &lt;code>nvidia-smi --query-gpu=power.draw --format=csv&lt;/code> before trusting any spec-sheet idle figure, mine included.&lt;/p>
&lt;h2 id="method-exactly">Method, exactly&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Card:&lt;/strong> ASUS ROG Astral RTX 5080 OC (the same physical card as the &lt;a href="https://techfuelhq.com/data/rtx-5080-llm-throughput/">throughput dataset&lt;/a> and the &lt;a href="https://techfuelhq.com/data/gpu/rog-astral-rtx-5080-oc-2026-06-09/">Astral bench dataset&lt;/a>), stock 448W power limit, driver-default clocks.&lt;/li>
&lt;li>&lt;strong>Host:&lt;/strong> Ryzen 7 7800X3D, 64GB DDR5-6000, Windows 11, ollama 0.32.1.&lt;/li>
&lt;li>&lt;strong>Workload:&lt;/strong> &lt;code>ollama run &amp;lt;model&amp;gt; --verbose&lt;/code> generating from a fixed ~60-word prompt with a unique per-iteration prefix (defeats ollama&amp;rsquo;s prompt cache, which otherwise reports cache-hit rates that measure nothing). Three iterations per model.&lt;/li>
&lt;li>&lt;strong>Telemetry:&lt;/strong> &lt;code>nvidia-smi --query-gpu=power.draw,clocks.gr,temperature.gpu,utilization.gpu,memory.used,...&lt;/code> polled at 1Hz for the whole profile window; the published watts are medians over samples with utilization ≥ 50% so idle seconds between iterations never dilute the load figure.&lt;/li>
&lt;li>&lt;strong>Pairing:&lt;/strong> each efficiency figure divides a profile&amp;rsquo;s median decode rate by that same profile&amp;rsquo;s median loaded watts — never a rate from one run by watts from another.&lt;/li>
&lt;li>&lt;strong>Decode, not prefill:&lt;/strong> the parser anchors on ollama&amp;rsquo;s &lt;code>eval rate:&lt;/code> line start; a substring match also catches &lt;code>prompt eval rate:&lt;/code> and silently records prefill — a bug these capture scripts had and fixed, documented in the scripts themselves.&lt;/li>
&lt;/ul>
&lt;h2 id="limitations-honestly">Limitations, honestly&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>One prompt shape.&lt;/strong> Single-stream interactive decode from a short prompt; batch serving, long-context prefill, and draft-model setups will land elsewhere. The &lt;a href="https://techfuelhq.com/data/rtx-5080-llm-throughput/">throughput dataset&lt;/a> covers context scaling; its decode rates are the canonical speed numbers for this card.&lt;/li>
&lt;li>&lt;strong>Board power only.&lt;/strong> nvidia-smi reports GPU board draw — CPU, RAM, fans, and PSU efficiency losses are excluded. Wall draw for the whole box runs higher; my measured whole-rig figures live in the &lt;a href="https://techfuelhq.com/articles/rtx-5080-perf-per-watt-ai-24-7-2026/">perf-per-watt article&lt;/a>.&lt;/li>
&lt;li>&lt;strong>Stock power limit only (for now).&lt;/strong> The obvious next axis — the same ladder at 400/350/300W caps — needs an elevated shell for &lt;code>nvidia-smi -pl&lt;/code>; that sweep is queued as v1.1.&lt;/li>
&lt;li>&lt;strong>Windows + this driver.&lt;/strong> P-state and idle behavior differ across OS/driver/monitor configurations; the 70W idle is my system&amp;rsquo;s truth, not a universal constant.&lt;/li>
&lt;/ul>
&lt;h2 id="use-the-data-cc-by-40">Use the data (CC BY 4.0)&lt;/h2>
&lt;p>Cite as &amp;ldquo;TechFuelHQ RTX 5080 LLM power-efficiency dataset, v1.0.0&amp;rdquo;. The table CSV is at &lt;a href="https://techfuelhq.com/data/rtx-5080-llm-power-efficiency.csv">/data/rtx-5080-llm-power-efficiency.csv&lt;/a>; the raw 1Hz telemetry CSVs (one per run) and the capture manifest are in &lt;a href="https://techfuelhq.com/data/rtx-5080-llm-power-efficiency-raw/MANIFEST.txt">/data/rtx-5080-llm-power-efficiency-raw/&lt;/a>. Attribution: TechFuelHQ / Lowell K. Wood IV, link to this page.&lt;/p>
&lt;h2 id="change-log">Change log&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>1.0.0 (2026-08-19)&lt;/strong> — initial publication: 4-model stock-power ladder (3B/7B/14B/20.9B), loaded-basis power medians, joules-per-token and $/Mtok at $0.184/kWh, raw telemetry CSVs, idle-power finding.&lt;/li>
&lt;/ul></description></item><item><title>Best Motherboards for Ryzen 7 9800X3D (2026)</title><link>https://techfuelhq.com/articles/best-motherboard-ryzen-7-9800x3d-2026/</link><pubDate>Tue, 18 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/articles/best-motherboard-ryzen-7-9800x3d-2026/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · Published 2026-08-18 · 14 min read · St. Louis County, MO&lt;/p>
&lt;h2 id="the-three-boards-at-a-glance">The three boards at a glance&lt;/h2>
&lt;p>The 9800X3D reaches full gaming speed on a well-built mainstream board. These picks buy three different layouts; CPU performance stays in the same class, so every dollar above the B850 default must purchase a port, lane, form factor, debug control, or expansion path the build will use.&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Pick&lt;/th>
&lt;th scope="col">Best for&lt;/th>
&lt;th scope="col">The features that justify it&lt;/th>
&lt;th scope="col" style="text-align: right">Aug. 17 reference&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>MSI MAG B850 Tomahawk Max WiFi&lt;/strong>&lt;/td>
&lt;td>Best ATX value for most builds&lt;/td>
&lt;td>PCIe 5.0 x16, Gen5 M.2, Wi-Fi 7, 5GbE, strong 80A-stage listing&lt;/td>
&lt;td style="text-align: right">&lt;strong>$209.99 standalone&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>ASUS ROG Strix B850-G Gaming WiFi&lt;/strong>&lt;/td>
&lt;td>White micro-ATX build&lt;/td>
&lt;td>Four M.2, Wi-Fi 7, 2.5GbE, 20Gbps USB-C, PCIe 5.0 x16&lt;/td>
&lt;td style="text-align: right">ASUS listed &lt;strong>$259.99&lt;/strong> standalone; bundle was $1,059.99&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>ASUS ROG Crosshair X870E Hero&lt;/strong>&lt;/td>
&lt;td>Storage, USB4, and expansion-heavy build&lt;/td>
&lt;td>Five M.2, SlimSAS, dual USB4, 5GbE + 2.5GbE, Wi-Fi 7&lt;/td>
&lt;td style="text-align: right">ASUS listed &lt;strong>$569.99&lt;/strong> standalone; bundle was $1,599.99&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>The standalone MSI price is a dated Newegg feed snapshot. The ASUS figures came from the official product-page offers captured on August 18. The bundle figures are current retailer snapshots described later. Check the live number before ordering.&lt;/p>
&lt;img src="https://techfuelhq.com/images/articles/best-motherboard-ryzen-7-9800x3d-2026.svg" alt="Ryzen 7 9800X3D motherboard decision map. A B850 board covers the gaming essentials and is marked the default. A white micro-ATX B850 branch serves compact aesthetic builds. An X870E branch adds five M.2 slots, USB4, dual wired networking, and extra lane flexibility for expansion-heavy systems." width="1200" height="630" loading="eager" fetchpriority="high" decoding="async" style="display:block;margin:1.5rem auto;max-width:100%;height:auto;border:1px solid #1e1e3a;border-radius:8px;" />
&lt;h2 id="the-rule-that-prevents-motherboard-overspending">The rule that prevents motherboard overspending&lt;/h2>
&lt;p>Buy the cheapest well-built board that has the ports you will use. Then verify its slot and lane map. Write those requirements down before opening retailer tabs; otherwise every extra feature looks useful in isolation.&lt;/p>
&lt;p>The Ryzen 7 9800X3D is an eight-core, 120W AM5 processor. A decent B850 board already supplies ample CPU power. Moving to X870 or X870E changes the connectivity floor and lane layout; it does not add gaming frames by itself.&lt;/p>
&lt;p>I would reject a board for:&lt;/p>
&lt;ul>
&lt;li>no BIOS Flashback on an expensive build&lt;/li>
&lt;li>weak rear I/O for the devices you own&lt;/li>
&lt;li>only gigabit Ethernet when faster networking matters&lt;/li>
&lt;li>a lane-sharing rule that disables a card or drive you plan to install&lt;/li>
&lt;li>too few M.2 slots for the build&amp;rsquo;s life&lt;/li>
&lt;li>a price that approaches premium X870E territory without premium I/O&lt;/li>
&lt;/ul>
&lt;p>A lower chipset rung does not disqualify a board. A missing port or broken lane plan does.&lt;/p>
&lt;h2 id="1-msi-b850-tomahawk-max-wifi-is-the-default">1. MSI B850 Tomahawk Max WiFi is the default&lt;/h2>
&lt;p>The B850 Tomahawk Max WiFi is the board I would put under a 9800X3D gaming system unless the build brief names a reason to move. That reason should be concrete: a smaller white case, five NVMe drives, USB4 peripherals, or an add-in-card layout this board cannot serve.&lt;/p>
&lt;p>The exact Newegg row lists:&lt;/p>
&lt;ul>
&lt;li>ATX form factor&lt;/li>
&lt;li>B850 chipset and AM5 socket&lt;/li>
&lt;li>PCIe 5.0 x16&lt;/li>
&lt;li>a Gen5 M.2 slot&lt;/li>
&lt;li>Wi-Fi 7&lt;/li>
&lt;li>5GbE&lt;/li>
&lt;li>four DDR5 slots&lt;/li>
&lt;li>four SATA ports&lt;/li>
&lt;li>an 80A smart-power-stage design&lt;/li>
&lt;/ul>
&lt;p>That is the useful part of a modern high-end platform without a flagship tax. The August 17 feed captured $209.99 against a $229.99 regular field. Even if the live price moves, the board belongs in the low-$200 class. A $500 board serves a different build.&lt;/p>
&lt;p>There is one layout caveat in the retailer specification: the lower PCIe 4.0 x4-length slot drops to x2 when M.2_3 is populated. If you plan to run a fast capture card, storage adapter, or 10GbE NIC there, read the manual before filling every M.2 slot. Gaming builds with one GPU will rarely care. Hybrid workstation and homelab builds can care immediately.&lt;/p>
&lt;p>For a gaming tower with one GPU, two or three NVMe drives, and onboard networking, this is the complete answer.&lt;/p>
&lt;h2 id="2-rog-strix-b850-g-is-the-white-micro-atx-pick">2. ROG Strix B850-G is the white micro-ATX pick&lt;/h2>
&lt;p>The B850-G exists for a different build. It compresses a premium-looking white AM5 platform into micro-ATX without stripping the storage and rear I/O that usually disappear first.&lt;/p>
&lt;p>ASUS specifies:&lt;/p>
&lt;ul>
&lt;li>micro-ATX&lt;/li>
&lt;li>14+2+1 power stages&lt;/li>
&lt;li>PCIe 5.0 x16&lt;/li>
&lt;li>four M.2 slots, including one Gen5 slot&lt;/li>
&lt;li>Wi-Fi 7&lt;/li>
&lt;li>Intel 2.5GbE&lt;/li>
&lt;li>ten rear USB ports, led by 20Gbps Type-C&lt;/li>
&lt;li>BIOS Flashback and Clear CMOS buttons&lt;/li>
&lt;/ul>
&lt;p>The fourth M.2 slot sits on the underside, which matters for access and cooling. Two SATA ports are also lean for anyone reusing several 2.5-inch drives. Those layout costs should be in the case plan. Install the underside SSD before the board goes into the chassis; discovering it later turns a two-minute upgrade into a teardown.&lt;/p>
&lt;p>ASUS&amp;rsquo;s page listed $259.99 at capture. That premium over the MSI buys a smaller white board and its particular I/O arrangement. It does not buy a faster 9800X3D.&lt;/p>
&lt;span class="buy-cell buy-cell--inline">&lt;a class="buy-cell__action buy-cell__action--primary"
href="https://click.linksynergy.com/deeplink?id=CW4UrCo/56I&amp;amp;mid=44583&amp;amp;murl=https%3A%2F%2Fwww.newegg.com%2Fp%2Fpl%3Fd%3DASUS%2BROG%2BStrix%2BB850-G%2BGaming%2BWiFi"
rel="nofollow sponsored noopener"
target="_blank"
data-affiliate-retailer="Newegg"
data-affiliate-slot="table-row"
data-link-kind="search">Search Newegg&lt;span class="buy-cell__checked">Link checked 2026-08-18&lt;/span>&lt;/a>&lt;/span>
&lt;h2 id="3-crosshair-x870e-hero-is-for-expansion">3. Crosshair X870E Hero is for expansion&lt;/h2>
&lt;p>The Crosshair X870E Hero is not the &amp;ldquo;best gaming&amp;rdquo; choice. It is the choice for a system that needs to behave like a workstation while keeping an X3D gaming CPU.&lt;/p>
&lt;p>Its reason to exist is the I/O map:&lt;/p>
&lt;ul>
&lt;li>five M.2 slots, three of them Gen5 with a Ryzen 9000 or 7000 processor&lt;/li>
&lt;li>SlimSAS plus four SATA ports&lt;/li>
&lt;li>two USB4 40Gbps rear ports&lt;/li>
&lt;li>eight additional 10Gbps rear USB ports&lt;/li>
&lt;li>5GbE and 2.5GbE&lt;/li>
&lt;li>Wi-Fi 7&lt;/li>
&lt;li>two full-length CPU-connected slots with configurable lane sharing&lt;/li>
&lt;li>onboard Q-Code, start controls, BIOS Flashback, and Clear CMOS&lt;/li>
&lt;/ul>
&lt;p>The lane-sharing rules deserve attention. Populate the second and third CPU-connected M.2 slots and the primary graphics slot can fall to x8 while the second full-length slot changes or disables. That is normal on a feature-dense desktop platform, but it means the installation order needs a plan. Sketch the final drive and card map first. Buying five slots is useless if populating the wrong two breaks the slot you bought the board to gain.&lt;/p>
&lt;p>ASUS listed $569.99 at capture. Spend that only when the five-drive layout, USB4, dual wired networking, or slot flexibility replaces hardware you would otherwise add. A single-GPU gaming PC with two drives does not need it.&lt;/p>
&lt;span class="buy-cell buy-cell--inline">&lt;a class="buy-cell__action buy-cell__action--primary"
href="https://click.linksynergy.com/deeplink?id=CW4UrCo/56I&amp;amp;mid=44583&amp;amp;murl=https%3A%2F%2Fwww.newegg.com%2Fp%2Fpl%3Fd%3DASUS%2BROG%2BCrosshair%2BX870E%2BHero"
rel="nofollow sponsored noopener"
target="_blank"
data-affiliate-retailer="Newegg"
data-affiliate-slot="table-row"
data-link-kind="search">Search Newegg&lt;span class="buy-cell__checked">Link checked 2026-08-18&lt;/span>&lt;/a>&lt;/span>
&lt;h2 id="b850-vs-x870-vs-x870e-for-the-9800x3d">B850 vs X870 vs X870E for the 9800X3D&lt;/h2>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Chipset class&lt;/th>
&lt;th scope="col">Buy it when&lt;/th>
&lt;th scope="col">Do not buy it for&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>B850&lt;/strong>&lt;/td>
&lt;td>One GPU, normal NVMe count, gaming-first value&lt;/td>
&lt;td>More FPS from the CPU&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>X870&lt;/strong>&lt;/td>
&lt;td>You want USB4 and a stronger modern-I/O baseline&lt;/td>
&lt;td>A belief that &amp;ldquo;X&amp;rdquo; means faster games&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>X870E&lt;/strong>&lt;/td>
&lt;td>You need more high-speed expansion and can map the lanes&lt;/td>
&lt;td>One GPU, two drives, and no add-in cards&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>AMD&amp;rsquo;s AM5 chipset table is the right starting point, but a model&amp;rsquo;s manual is the final authority. Two boards with the same chipset can expose different slots and controllers. Their sharing rules can differ too.&lt;/p>
&lt;p>That is why the shortlist crosses chipset tiers. It follows build requirements.&lt;/p>
&lt;h2 id="are-the-cpu-bundles-worth-it">Are the CPU bundles worth it?&lt;/h2>
&lt;p>The August feed contained several Ryzen 7 9800X3D motherboard bundles. Three illustrate why &amp;ldquo;bundle&amp;rdquo; is not a synonym for &amp;ldquo;deal.&amp;rdquo;&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Bundle&lt;/th>
&lt;th scope="col" style="text-align: right">Aug. 17 snapshot&lt;/th>
&lt;th scope="col">Rendered seller check, Aug. 18&lt;/th>
&lt;th scope="col">What to verify&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Sapphire NITRO+ B850M + 9800X3D&lt;/td>
&lt;td style="text-align: right">&lt;strong>$969.99&lt;/strong>&lt;/td>
&lt;td>TECH EDGE; new; ships from China; not fulfilled by Newegg&lt;/td>
&lt;td>Manufacturer warranty flag was false; returns were non-replaceable&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ASUS ROG Strix B850-G + 9800X3D&lt;/td>
&lt;td style="text-align: right">&lt;strong>$1,059.99&lt;/strong>&lt;/td>
&lt;td>TECH EDGE; new; ships from China; not fulfilled by Newegg&lt;/td>
&lt;td>Manufacturer warranty flag was true; still compare return freight and delivery&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ASUS Crosshair X870E Hero + 9800X3D&lt;/td>
&lt;td style="text-align: right">&lt;strong>$1,599.99&lt;/strong>&lt;/td>
&lt;td>TECH EDGE; new; ships from China; not fulfilled by Newegg&lt;/td>
&lt;td>Manufacturer warranty flag was true; the premium only works if you need the board&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>The seller was rated 4.6/5 over 39 reviews in the prior 12 months and marked Top Rated in the embedded listing data at capture. That is useful context. It is not the same purchase path as a direct Newegg item. A heavy motherboard-and-CPU return to China can consume the paper discount in freight and delay. It also adds transit risk.&lt;/p>
&lt;p>Price the CPU and board separately first. Newegg&amp;rsquo;s exact 9800X3D row was $479 in the same feed. Add the $209.99 MSI board and the parts total is $688.99 before tax. A $969.99 micro-ATX bundle therefore needs to justify roughly $281 through a different board, availability, or terms. The Crosshair bundle is a specialist purchase rather than a value shortcut.&lt;/p>
&lt;p>If you still want a bundle, use the current searches below and inspect the exact seller block before payment.&lt;/p>
&lt;span class="buy-cell buy-cell--inline">&lt;a class="buy-cell__action buy-cell__action--primary"
href="https://click.linksynergy.com/deeplink?id=CW4UrCo/56I&amp;amp;mid=44583&amp;amp;murl=https%3A%2F%2Fwww.newegg.com%2Fp%2Fpl%3Fd%3DRyzen%2B7%2B9800X3D%2Bmotherboard%2Bbundle"
rel="nofollow sponsored noopener"
target="_blank"
data-affiliate-retailer="Newegg"
data-affiliate-slot="table-row"
data-link-kind="search">Search Newegg&lt;span class="buy-cell__checked">Link checked 2026-08-18&lt;/span>&lt;/a>&lt;/span>
&lt;h2 id="what-about-b650-and-x670">What about B650 and X670?&lt;/h2>
&lt;p>You do not need to replace a good AM5 board merely because B850 and X870 exist.&lt;/p>
&lt;p>If you already own B650, B650E, X670, or X670E, check the manufacturer&amp;rsquo;s 9800X3D BIOS support and the ports you need. A supported existing board is usually the value winner. The &lt;a href="https://techfuelhq.com/reviews/rog-strix-b650a-review-2026/">ROG Strix B650-A review&lt;/a> covers one real example of a B650 board running an X3D system with ample power delivery.&lt;/p>
&lt;p>Before a BIOS update, back up important data and do not interrupt power during the flash. Use BIOS Flashback when the board supports it and the installed CPU cannot boot the current firmware.&lt;/p>
&lt;p>This page covers a new board purchase. A working compatible platform should stay in service.&lt;/p>
&lt;h2 id="ram-cooling-and-the-rest-of-the-build">RAM, cooling, and the rest of the build&lt;/h2>
&lt;p>Use two DDR5 modules. DDR5-6000 with an AMD EXPO profile is the low-drama target; the &lt;a href="https://techfuelhq.com/articles/ddr5-ram-buying-guide-2025/">DDR5 buying guide&lt;/a> explains why a larger advertised number is not automatically a better AM5 result. For the purchase itself, use the &lt;a href="https://techfuelhq.com/data/ram-price-index/">open RAM price index&lt;/a>: its August 18 capture reviewed 583 listings, still found only three of 12 tracked kits that cleared the direct-retailer rules, and put the cheapest qualifying 32GB observation at $459.99. The gate remains closed, so treat the table as dated offers rather than a broad market average.&lt;/p>
&lt;p>The 9800X3D does not include a cooler. Board selection should therefore leave room in the case and budget for the cooling hardware you want. The board does not need a giant VRM heatsink to survive this CPU, but the case still needs airflow across the socket, memory, SSD heatsinks, and graphics card. Header placement matters here: count pump and fan headers against the actual radiator and case layout, rather than assuming a premium board has one in the convenient corner.&lt;/p>
&lt;p>One build can overturn the entire default. Imagine a 9800X3D workstation with an RTX 5080, three Gen5 scratch drives, two more archive SSDs, a capture card, 10GbE today, and a USB4 RAID enclosure already on the desk. The Crosshair&amp;rsquo;s price is suddenly easier to defend because one board replaces an add-in network card, a storage adapter, and a Thunderbolt-style expansion plan. Remove those devices and the logic collapses back to B850. That is the standard: every premium interface should displace another cost or solve a named constraint. The workstation case can defend the X870E premium because its five-drive map, USB4 enclosure, faster wired links, debug controls, and second expansion slot replace a pile of adapters while keeping the build coherent; a one-GPU gaming tower with two SSDs receives none of that value, even though both machines use the same processor and can post the same frame rate. Run the same test in reverse before paying: remove USB4, the fifth drive, the second network link, and the extra card from the parts plan; if the system still works exactly as intended, the premium board has lost every job that made it rational and the B850 choice is stronger.&lt;/p>
&lt;p>Finally, map the whole build before checkout:&lt;/p>
&lt;ul>
&lt;li>exact case form factor&lt;/li>
&lt;li>GPU thickness and slot obstruction&lt;/li>
&lt;li>number of M.2 and SATA drives&lt;/li>
&lt;li>front USB-C header requirement&lt;/li>
&lt;li>wired network speed&lt;/li>
&lt;li>add-in cards now and later&lt;/li>
&lt;li>fan and pump-header count&lt;/li>
&lt;/ul>
&lt;p>The &lt;a href="https://techfuelhq.com/tools/pc-builder/">PC Builder&lt;/a> catches the basic socket and form-factor problems. Its &lt;a href="https://techfuelhq.com/data/pc-part-prices-2026/">open 126-part compatibility dataset&lt;/a> exposes the source and last-verified date behind each supported row. The board manual catches the lane-sharing rules that a category-level dataset cannot.&lt;/p>
&lt;h2 id="the-shortest-honest-recommendation">The shortest honest recommendation&lt;/h2>
&lt;p>Buy the &lt;strong>MSI B850 Tomahawk Max WiFi&lt;/strong> for a normal ATX 9800X3D gaming build.&lt;/p>
&lt;p>Buy the &lt;strong>ROG Strix B850-G&lt;/strong> when the machine must be white and micro-ATX.&lt;/p>
&lt;p>Buy the &lt;strong>Crosshair X870E Hero&lt;/strong> only when five M.2 slots, USB4, dual wired networking, or its expansion controls are already part of the plan.&lt;/p>
&lt;p>Anything beyond that is paying for a feature list you have not assigned a job.&lt;/p></description></item><item><title>Best RTX 5080 Prebuilt Gaming PCs (2026)</title><link>https://techfuelhq.com/articles/best-rtx-5080-prebuilt-gaming-pc-2026/</link><pubDate>Tue, 18 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/articles/best-rtx-5080-prebuilt-gaming-pc-2026/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · Published 2026-08-18 · 13 min read · St. Louis County, MO&lt;/p>
&lt;h2 id="the-three-picks-at-a-glance">The three picks at a glance&lt;/h2>
&lt;p>All three finalists use the same performance core: Ryzen 7 9800X3D, GeForce RTX 5080 16GB, 32GB DDR5, and a 2TB NVMe SSD. The table therefore ranks what usually stays hidden in a prebuilt listing.&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Pick&lt;/th>
&lt;th scope="col">Why it made the list&lt;/th>
&lt;th scope="col" style="text-align: right">Disclosed power supply&lt;/th>
&lt;th scope="col" style="text-align: right">Newegg feed snapshot, Aug. 17&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>ABS Kaze II Ruby&lt;/strong>&lt;/td>
&lt;td>Best disclosed parts list and power hardware&lt;/td>
&lt;td style="text-align: right">Gamdias HELIOS P2-1000G, 1000W Gold&lt;/td>
&lt;td style="text-align: right">&lt;strong>$2,939.99&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Andromeda Insights V3 Ultra 50&lt;/strong>&lt;/td>
&lt;td>Best value; explicitly lists DDR5-6000 and an 850W Gold supply&lt;/td>
&lt;td style="text-align: right">850W Gold, brand not stated&lt;/td>
&lt;td style="text-align: right">&lt;strong>$2,799.99&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Acer Nitro UD.P02AA.070&lt;/strong>&lt;/td>
&lt;td>Brand-name alternative with liquid cooling&lt;/td>
&lt;td style="text-align: right">850W, efficiency and model not stated&lt;/td>
&lt;td style="text-align: right">&lt;strong>$3,299.99&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>Those prices are dated retailer-feed snapshots. The exact Newegg pages still resolved to the matching item on August 18, and all three pages showed Newegg as both seller and shipper at capture. Inventory can move before this page does.&lt;/p>
&lt;img src="https://techfuelhq.com/images/articles/best-rtx-5080-prebuilt-gaming-pc-2026.svg" alt="RTX 5080 prebuilt buying diagram showing that the GPU and CPU are only the visible layer; the decision is made by four hidden checks: a named 850W-or-better power supply, two memory modules, a 2TB SSD, and a clear seller, warranty, and return path" width="1200" height="630" loading="eager" fetchpriority="high" decoding="async" style="display:block;margin:1.5rem auto;max-width:100%;height:auto;border:1px solid #1e1e3a;border-radius:8px;" />
&lt;h2 id="how-i-ranked-the-systems">How I ranked the systems&lt;/h2>
&lt;p>I started with a hard floor, then let disclosed component quality break the tie. A product page that names the PSU model, memory arrangement, storage generation, board, and seller path can justify a modest premium because each disclosed field removes a return-window investigation; a page that repeats only the CPU and GPU cannot.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>RTX 5080 16GB and Ryzen 7 9800X3D.&lt;/strong> A cheaper processor can still run a 5080, but it is less hardware at this price. Every finalist uses AMD&amp;rsquo;s eight-core X3D chip.&lt;/li>
&lt;li>&lt;strong>32GB DDR5 and 2TB NVMe.&lt;/strong> A $3,000 gaming PC should not arrive with 16GB or a cramped 1TB system drive.&lt;/li>
&lt;li>&lt;strong>At least 850W.&lt;/strong> NVIDIA lists 850W minimum system power for the 360W RTX 5080. The &lt;a href="https://techfuelhq.com/articles/what-psu-for-rtx-5080-2026/">full RTX 50-series PSU guide&lt;/a> explains when 1000W becomes the better buy.&lt;/li>
&lt;li>&lt;strong>A listing that names the weak links.&lt;/strong> PSU model, memory speed, motherboard, cooler, seller, and warranty matter. Silence is a risk, not a premium feature.&lt;/li>
&lt;li>&lt;strong>The title, item number, and destination had to agree.&lt;/strong> I discarded feed rows whose product name and Newegg URL described different hardware.&lt;/li>
&lt;/ol>
&lt;p>RGB earned zero points. A giant discount badge against a price the system may never have sold for earned zero too.&lt;/p>
&lt;h2 id="1-abs-kaze-ii-ruby-has-the-strongest-disclosed-parts-list">1. ABS Kaze II Ruby has the strongest disclosed parts list&lt;/h2>
&lt;p>The Kaze II Ruby wins because its parts list answers the most expensive hidden question. Newegg names the power supply as a &lt;strong>Gamdias HELIOS P2-1000G 1000W 80 Plus Gold&lt;/strong> unit. That changes the decision: the other two finalists list capacity, but they never identify the complete model.&lt;/p>
&lt;p>The rest is the right shape for a high-end gaming system:&lt;/p>
&lt;ul>
&lt;li>Ryzen 7 9800X3D&lt;/li>
&lt;li>RTX 5080 16GB&lt;/li>
&lt;li>32GB DDR5&lt;/li>
&lt;li>2TB PCIe NVMe SSD&lt;/li>
&lt;li>Wi-Fi 6&lt;/li>
&lt;li>Windows 11 Home&lt;/li>
&lt;/ul>
&lt;p>The August 17 feed showed $2,939.99, down from a listed $3,499.99 regular figure. I care more about the $2,939.99 checkout number than the size of that markdown. The flashy percentage badge can disappear tomorrow; the named power supply is still the hardware inside the case.&lt;/p>
&lt;p>There are still three checks to make. Confirm the 32GB arrives as two modules, identify the motherboard, and read the current warranty and return language. A named PSU does not make every undisclosed part disappear. It does make this the easiest system to approve. If the checkout configuration swaps any of those fields, stop and re-price the machine.&lt;/p>
&lt;h2 id="2-andromeda-v3-ultra-50-is-the-value-pick">2. Andromeda V3 Ultra 50 is the value pick&lt;/h2>
&lt;p>The Andromeda was the least expensive qualified system in the feed at $2,799.99. It also discloses more memory detail than the other listings: &lt;strong>32GB of DDR5-6000&lt;/strong>. The 2TB drive is described as Gen4, and the power supply is rated 850W Gold.&lt;/p>
&lt;p>That is a strong specification sheet for $140 less than the ABS. The trade is confidence around the power supply. &amp;ldquo;850W Gold&amp;rdquo; tells you the capacity and efficiency tier; it does not identify the platform, protections, cable, or warranty. NVIDIA&amp;rsquo;s 850W floor means the capacity is sufficient. The missing model is why this system finishes second. Ask for the exact unit before the return window closes; a photo of the side label settles it in seconds.&lt;/p>
&lt;p>The exact page showed the matching Andromeda title. Newegg handled both the sale and shipment from the United States when checked. That removes the marketplace ambiguity that sinks many cheaper-looking results.&lt;/p>
&lt;p>Buy this one when the price gap matters and the listing or support team can provide the exact PSU and memory configuration before the return window closes.&lt;/p>
&lt;span class="buy-cell buy-cell--inline">&lt;a class="buy-cell__action buy-cell__action--primary"
href="https://click.linksynergy.com/link?id=CW4UrCo/56I&amp;amp;offerid=1749755.445834222291073233416867&amp;amp;type=15&amp;amp;murl=https%3A%2F%2Fwww.newegg.com%2Fandromeda-insights-ultra-gaming-desktop-pcs-geforce-rtx-5080-amd-ryzen-7-9800x3d-32gb-ddr5-2tb-nvme-ssd-50-vector-black%2Fp%2F3D5-006J-00058%3Fitem%3D3D5-006J-00058"
rel="nofollow sponsored noopener"
target="_blank"
data-affiliate-retailer="Newegg"
data-affiliate-slot="table-row"
data-link-kind="product">Check Newegg&lt;span class="buy-cell__checked">Link checked 2026-08-18&lt;/span>&lt;/a>&lt;/span>
&lt;h2 id="3-acer-nitro-is-the-brand-name-alternative">3. Acer Nitro is the brand-name alternative&lt;/h2>
&lt;p>Acer&amp;rsquo;s Nitro UD.P02AA.070 keeps the same core specification and adds liquid CPU cooling. The listing names a Ryzen 7 9800X3D, RTX 5080 16GB, 32GB DDR5, 2TB PCIe NVMe SSD, and an 850W power supply.&lt;/p>
&lt;p>It also asks the most. The feed captured $3,299.99, which is $360 above the ABS and $500 above the Andromeda. The listing does not name the PSU model or efficiency certification, and it specifies gigabit Ethernet rather than a faster wired interface.&lt;/p>
&lt;p>That does not make the Acer a bad machine. It makes the premium hard to defend from the published parts list alone. Choose it if the exact Acer service package, local availability, or chassis design has value to you. On hardware disclosure per dollar, it ranks third. At this price, brand familiarity needs to arrive with a better support path, not merely a familiar badge.&lt;/p>
&lt;span class="buy-cell buy-cell--inline">&lt;a class="buy-cell__action buy-cell__action--primary"
href="https://click.linksynergy.com/link?id=CW4UrCo/56I&amp;amp;offerid=1749755.445836957457544655962378&amp;amp;type=15&amp;amp;murl=https%3A%2F%2Fwww.newegg.com%2Facer-america-nitro-acer-r7-9800x3d-rtx-5080-16g-32gb-ram-2tb-ssd-liquid-cooling-gaming-pc-win11-geforce-rtx-5080-amd-ryzen-7-9800x3d-32gb-ddr5-2tb-pcie-nvme-ssd-ud-p02aa-070%2Fp%2FN82E16883101948%3Fitem%3DN82E16883101948"
rel="nofollow sponsored noopener"
target="_blank"
data-affiliate-retailer="Newegg"
data-affiliate-slot="table-row"
data-link-kind="product">Check Newegg&lt;span class="buy-cell__checked">Link checked 2026-08-18&lt;/span>&lt;/a>&lt;/span>
&lt;h2 id="what-i-rejected">What I rejected&lt;/h2>
&lt;p>The live search results contain dozens of RTX 5080 systems. Most fail for one of five reasons.&lt;/p>
&lt;h3 id="a-lower-tier-cpu-at-the-same-system-price">A lower-tier CPU at the same system price&lt;/h3>
&lt;p>A Core i7-14700F or Ryzen 7 9700X can be a good processor. It does not belong in a system priced beside these 9800X3D builds unless the rest of the machine is materially better.&lt;/p>
&lt;h3 id="sixteen-gigabytes-of-system-memory">Sixteen gigabytes of system memory&lt;/h3>
&lt;p>That is an immediate upgrade on a new flagship PC. It also raises the chance of a single-module configuration. Thirty-two gigabytes is the floor here.&lt;/p>
&lt;h3 id="one-terabyte-of-storage">One terabyte of storage&lt;/h3>
&lt;p>Modern game libraries fill it quickly. A 2TB system drive is a modest requirement at this budget, and all three picks meet it.&lt;/p>
&lt;h3 id="a-vague-or-undersized-power-supply">A vague or undersized power supply&lt;/h3>
&lt;p>The RTX 5080&amp;rsquo;s official requirement is 850W system power. A listing below that floor is out. A listing that says only &amp;ldquo;1000W&amp;rdquo; without a model still needs investigation; wattage cannot tell you build quality.&lt;/p>
&lt;h3 id="marketplace-ambiguity">Marketplace ambiguity&lt;/h3>
&lt;p>The product page must identify seller and fulfillment. It must also state the condition and warranty. The return path needs to be clear. A low price from an unknown seller can erase its savings with one freight return, and on a 40-pound glass-sided tower the expensive failure is rarely the missing five percent of benchmark performance; it is discovering after delivery that the power supply, memory layout, or warranty differs from the product tile while the only remedy is packing the entire machine again.&lt;/p>
&lt;h2 id="the-price-ceiling-for-a-32gb-and-2tb-build">The price ceiling for a 32GB and 2TB build&lt;/h2>
&lt;p>My cutoff for this specification is roughly &lt;strong>$3,500 before tax&lt;/strong>. Cross it, and I want a visible reason:&lt;/p>
&lt;ul>
&lt;li>64GB instead of 32GB&lt;/li>
&lt;li>4TB instead of 2TB&lt;/li>
&lt;li>a premium factory-overclocked RTX 5080&lt;/li>
&lt;li>a clearly better motherboard, PSU, and cooling stack&lt;/li>
&lt;li>a service package worth buying&lt;/li>
&lt;/ul>
&lt;p>A basic 32GB/2TB system at $3,700 is too close to premium-custom pricing. It also gets uncomfortably close to the next GPU tier. If you are willing to assemble the machine, compare the full bill against the &lt;a href="https://techfuelhq.com/pc-builds/2500-dollar-7800x3d-rtx-5080-4k-build-2026/">$2,500-class RTX 5080 build&lt;/a> and load the same parts into the &lt;a href="https://techfuelhq.com/tools/pc-builder/">PC Builder&lt;/a>.&lt;/p>
&lt;h2 id="what-performance-should-you-expect">What performance should you expect?&lt;/h2>
&lt;p>NVIDIA specifies the RTX 5080 with 10,752 CUDA cores, 16GB of GDDR7, a 360W total graphics power rating, and an 850W minimum system requirement. The Ryzen 7 9800X3D supplies eight Zen 5 cores and 96MB of L3 cache on AM5.&lt;/p>
&lt;p>Those specifications put every finalist in the same broad performance class. Cooler design and the installed GPU model decide some of the small gaps, while power limits, BIOS behavior, and memory configuration decide the rest.&lt;/p>
&lt;p>For a measured reference, the &lt;a href="https://techfuelhq.com/gpu-reviews/rog-astral-rtx-5080-oc-review-2026/">ROG Astral RTX 5080 OC review&lt;/a> includes first-party 4K results and a 308-sample power log. The &lt;a href="https://techfuelhq.com/data/gpu/rog-astral-rtx-5080-oc-2026-06-09/">open bench dataset&lt;/a> carries the underlying game and clock rows, plus thermal and power measurements, under CC BY 4.0. Use it as a picture of what one well-cooled premium 5080 did; an OEM card may hold different clocks.&lt;/p>
&lt;p>The practical target is 4K gaming. At 1440p, a cheaper GPU can often deliver the experience without forcing the rest of the build into this price band. The &lt;a href="https://techfuelhq.com/articles/best-gpu-4k-gaming-2026/">2026 4K GPU guide&lt;/a> maps that break point. If your monitor is still 1440p/144Hz, spend against the display before paying for unused GPU headroom.&lt;/p>
&lt;p>Here is the edge case that changes my answer. A buyer who keeps a PC for six years, moves from 1440p to a 4K OLED next spring, runs local models on the 16GB card, and refuses to replace parts mid-cycle can justify buying the 5080 tower before the current monitor demands it. That is a planned multi-use purchase, not a vague future-proofing claim.&lt;/p>
&lt;p>There is measured evidence for the local-model half. On TechFuelHQ&amp;rsquo;s retail RTX 5080, the &lt;a href="https://techfuelhq.com/data/rtx-5080-llm-throughput/">open Ollama throughput dataset&lt;/a> recorded gpt-oss:20b fully GPU-resident at roughly 13.7–14.0 GiB and 187–190 decode tokens per second; the raw CSV is mirrored on Kaggle and Hugging Face. That does not benchmark image generation or prove every 16GB workload fits. It does show that a named local-AI role can be real rather than speculative.&lt;/p>
&lt;p>The six-year plan has named workloads and a named display upgrade, with enough time for the premium to spread across several roles. Remove the 4K display and local workload, and the logic collapses: a gaming-only 1440p buyer is left with expensive capability no current screen or workflow can turn into visible value.&lt;/p>
&lt;h2 id="the-60-second-checkout-audit">The 60-second checkout audit&lt;/h2>
&lt;p>Do this after clicking through and before payment.&lt;/p>
&lt;ol>
&lt;li>Match the item number to the exact row in this guide.&lt;/li>
&lt;li>Confirm Ryzen 7 9800X3D and RTX 5080 16GB in the selected configuration.&lt;/li>
&lt;li>Look for two memory modules. If the page stays silent, ask or check immediately after delivery.&lt;/li>
&lt;li>Confirm the PSU model and a native 12V-2x6 cable where possible.&lt;/li>
&lt;li>Count open M.2 slots and accessible DIMM slots for future upgrades.&lt;/li>
&lt;li>Read who sells it and who ships it.&lt;/li>
&lt;li>Open the warranty and return terms.&lt;/li>
&lt;li>Screenshot the final configuration and delivery promise.&lt;/li>
&lt;/ol>
&lt;p>If one of those fields changes, re-rank the system. The model name on the case matters less than the parts and terms attached to the exact SKU, because two towers wearing the same product-family badge can differ in the power supply and memory layout. They can also arrive with a different motherboard, SSD, cooler, seller, warranty, or delivery promise. Those details decide whether a prebuilt stays an easy purchase or becomes an expensive return. The exact-SKU check is the purchase: without it, a familiar family name can hide a lower-tier power supply, one memory module instead of two, a different motherboard, or a return path that turns a small discount into a freight bill after the tower is already in your house.&lt;/p></description></item><item><title>Best RTX 5090 Prebuilt Gaming PCs (2026)</title><link>https://techfuelhq.com/articles/best-rtx-5090-prebuilt-gaming-pc-2026/</link><pubDate>Tue, 18 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/articles/best-rtx-5090-prebuilt-gaming-pc-2026/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · Published 2026-08-18 · 14 min read · St. Louis County, MO&lt;/p>
&lt;h2 id="the-three-picks-at-a-glance">The three picks at a glance&lt;/h2>
&lt;p>These systems share the expensive core: Ryzen 7 9800X3D, GeForce RTX 5090 32GB, 32GB DDR5, and 2TB of solid-state storage. The ranking turns on the platform around those parts and the price attached to the exact SKU.&lt;/p>
&lt;p>Same GPU and CPU. Very different risk.&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Pick&lt;/th>
&lt;th scope="col">Why it made the list&lt;/th>
&lt;th scope="col">Disclosed power and cooling&lt;/th>
&lt;th scope="col" style="text-align: right">Live Newegg price, Aug. 18&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Stormcraft Valkyrie&lt;/strong>&lt;/td>
&lt;td>Best pick; most complete useful disclosure&lt;/td>
&lt;td>1300W 80 Plus Gold, 360mm AIO&lt;/td>
&lt;td style="text-align: right">&lt;strong>$5,599.99&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Acer Nitro N80-181-UR19&lt;/strong>&lt;/td>
&lt;td>Best value; same gaming core for $300 less&lt;/td>
&lt;td>1200W, liquid cooling; PSU model not stated&lt;/td>
&lt;td style="text-align: right">&lt;strong>$5,299.99&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Thermaltake View 9890S&lt;/strong>&lt;/td>
&lt;td>Premium white X870 alternative; not the value choice&lt;/td>
&lt;td>1200W Gold ATX 3.0, Thermaltake 360mm AIO&lt;/td>
&lt;td style="text-align: right">&lt;strong>$6,699.99&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>All three pages showed &lt;strong>sold and shipped by Newegg&lt;/strong> when captured. These are live-page snapshots. Prices can move. Thermaltake is the important warning: its August 17 affiliate feed showed $6,090.99, but the rendered product page was $6,699.99 on August 18. The checkout page wins that disagreement.&lt;/p>
&lt;img src="https://techfuelhq.com/images/articles/best-rtx-5090-prebuilt-gaming-pc-2026.svg" alt="RTX 5090 prebuilt decision diagram showing that every finalist shares the RTX 5090 and Ryzen 7 9800X3D, while the purchase is decided by a native high-current power path, two memory modules, adequate cooling and airflow, and exact seller, warranty, and configuration terms" width="1200" height="630" loading="eager" fetchpriority="high" decoding="async" style="display:block;margin:1.5rem auto;max-width:100%;height:auto;border:1px solid #1e1e3a;border-radius:8px;" />
&lt;h2 id="how-i-ranked-the-systems">How I ranked the systems&lt;/h2>
&lt;p>The full August 17 feed held four direct-catalog RTX 5090 desktops. Two Stormcraft rows used the same chassis and price with different processor platforms, so I narrowed the final comparison to the three Ryzen 7 9800X3D systems; holding the gaming CPU, GPU, memory capacity, and storage capacity steady exposes the platform differences instead of burying them under a changing processor.&lt;/p>
&lt;p>I then scored the parts that can turn a $5,000-plus computer into a poor purchase:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Power path.&lt;/strong> NVIDIA rates the RTX 5090 at 575W and specifies 1000W required system power. A 1200W or 1300W supply is the right capacity class here, but capacity is only the start. The model, protections, and native GPU cable still need confirmation.&lt;/li>
&lt;li>&lt;strong>Memory configuration.&lt;/strong> Thirty-two gigabytes must be two modules. Acer and Stormcraft explicitly showed 16GB x 2 in the captured specifications.&lt;/li>
&lt;li>&lt;strong>Cooling and airflow.&lt;/strong> A 360mm AIO earns confidence only as a disclosed component, not as proof of low temperatures or noise. I have not tested these systems.&lt;/li>
&lt;li>&lt;strong>Storage and motherboard.&lt;/strong> A 2TB system drive is the floor. Gen4 detail and a named chipset make future expansion easier to judge.&lt;/li>
&lt;li>&lt;strong>Seller and price integrity.&lt;/strong> The item number, title, live price, seller, and shipper had to agree on the rendered page.&lt;/li>
&lt;/ol>
&lt;p>RGB, &amp;ldquo;AI powered,&amp;rdquo; and giant markdown badges earned nothing. Exact parts and a clean return path did.&lt;/p>
&lt;h2 id="1-stormcraft-valkyrie-is-the-best-pick">1. Stormcraft Valkyrie is the best pick&lt;/h2>
&lt;p>The Valkyrie asks $300 more than Acer and gives a visible reason for most of that difference. Its product page names:&lt;/p>
&lt;ul>
&lt;li>Ryzen 7 9800X3D&lt;/li>
&lt;li>RTX 5090 32GB&lt;/li>
&lt;li>32GB as &lt;strong>two 16GB DDR5-6000 modules&lt;/strong>&lt;/li>
&lt;li>2TB Gen4 NVMe SSD&lt;/li>
&lt;li>AMD B850 motherboard&lt;/li>
&lt;li>360mm AIO liquid cooler&lt;/li>
&lt;li>seven ARGB fans&lt;/li>
&lt;li>1300W 80 Plus Gold power supply&lt;/li>
&lt;/ul>
&lt;p>That is the strongest platform disclosure in the direct-retailer set. The 1300W capacity sits above the practical 1200W target in the &lt;a href="https://techfuelhq.com/articles/what-psu-for-rtx-5080-2026/">RTX 50-series PSU guide&lt;/a>, and the listing gives the memory speed, module count, storage generation, motherboard chipset, radiator size, and fan count. The page also showed Newegg as both seller and shipper.&lt;/p>
&lt;p>Several identities remain hidden: &amp;ldquo;1300W 80 Plus Gold&amp;rdquo; does not name the PSU manufacturer or model, and the listing says component brands may vary, which means the exact graphics card, memory kit, SSD, board model, and supply can change within the stated specification. I cannot call those parts premium. The page still tells the buyer more than the others.&lt;/p>
&lt;p>At $5,599.99, the Valkyrie is the best choice when you want the 5090 tier and would pay $300 to remove several expensive unknowns. Confirm those fields one final time before ordering.&lt;/p>
&lt;h2 id="2-acer-nitro-is-the-value-pick">2. Acer Nitro is the value pick&lt;/h2>
&lt;p>Acer&amp;rsquo;s N80-181-UR19 is the lowest-priced direct 9800X3D and RTX 5090 system in the captured feed and live pages. At $5,299.99, it is $300 below the Stormcraft and $1,400 below the Thermaltake.&lt;/p>
&lt;p>The useful disclosures are better than the short feed title suggests:&lt;/p>
&lt;ul>
&lt;li>Ryzen 7 9800X3D&lt;/li>
&lt;li>RTX 5090 32GB&lt;/li>
&lt;li>32GB DDR5 as &lt;strong>16GB x 2&lt;/strong>&lt;/li>
&lt;li>2TB PCIe SSD&lt;/li>
&lt;li>1200W power supply&lt;/li>
&lt;li>liquid CPU cooling&lt;/li>
&lt;li>Wi-Fi 6 and gigabit Ethernet&lt;/li>
&lt;/ul>
&lt;p>The 1200W capacity is appropriate. The weak point is identity. The page does not name the PSU model or efficiency certification, and its detailed table says only &amp;ldquo;Liquid Cooling&amp;rdquo; even though the title advertises a 240mm AIO. It also leaves the motherboard model and SSD generation unstated.&lt;/p>
&lt;p>That makes Acer the value pick, with a plain trade: save $300 and accept less component identity, or pay Stormcraft for DDR5-6000, a named B850 chipset, Gen4 storage detail, a larger listed radiator, and another 100W of supply capacity. Choose Acer when the support channel, chassis, and saving matter more. Photograph the PSU label and memory modules after delivery, before the return window gets short.&lt;/p>
&lt;span class="buy-cell buy-cell--inline">&lt;a class="buy-cell__action buy-cell__action--primary"
href="https://click.linksynergy.com/link?id=CW4UrCo/56I&amp;amp;offerid=1749755.4458315250198206734392933&amp;amp;type=15&amp;amp;murl=https%3A%2F%2Fwww.newegg.com%2Facer-america-nitro-acer-r7-9800x3d-rtx-5090-32g-32gb-ram-2tb-ssd-liquid-cooling-gaming-pc-win11-geforce-rtx-5090-amd-ryzen-7-9800x3d-32gb-ddr5-2tb-pcie-ssd-n80-181-ur19%2Fp%2FN82E16883101949%3Fitem%3DN82E16883101949"
rel="nofollow sponsored noopener"
target="_blank"
data-affiliate-retailer="Newegg"
data-affiliate-slot="table-row"
data-link-kind="product">Check Newegg&lt;span class="buy-cell__checked">Link checked 2026-08-18&lt;/span>&lt;/a>&lt;/span>
&lt;h2 id="3-thermaltake-view-9890s-is-the-premium-alternative">3. Thermaltake View 9890S is the premium alternative&lt;/h2>
&lt;p>The View 9890S has the clearest named cooling and platform combination:&lt;/p>
&lt;ul>
&lt;li>Ryzen 7 9800X3D&lt;/li>
&lt;li>RTX 5090 32GB&lt;/li>
&lt;li>32GB DDR5-6000&lt;/li>
&lt;li>2TB NVMe SSD&lt;/li>
&lt;li>AMD X870 chipset&lt;/li>
&lt;li>Thermaltake 360mm ARGB AIO&lt;/li>
&lt;li>1200W 80 Plus Gold ATX 3.0 power supply&lt;/li>
&lt;li>Wi-Fi 7&lt;/li>
&lt;li>white panoramic chassis&lt;/li>
&lt;/ul>
&lt;p>Those are real differences. X870, a named Thermaltake radiator, Wi-Fi 7, a white build, and a more explicit ATX 3.0 supply description can matter to a buyer who wants this exact design.&lt;/p>
&lt;p>The price breaks the general recommendation: the live page showed $6,699.99, or $1,100 above Stormcraft and $1,400 above Acer, while the prior feed showed $6,090.99. At the live number, the premium buys appearance and platform detail rather than more GPU, CPU, memory, or storage capacity.&lt;/p>
&lt;p>I would skip that premium for gaming performance. This system stays on the list as the distinct white X870 alternative. It does not compete for value at the captured price. If it falls near the Valkyrie, re-run the comparison.&lt;/p>
&lt;span class="buy-cell buy-cell--inline">&lt;a class="buy-cell__action buy-cell__action--primary"
href="https://click.linksynergy.com/link?id=CW4UrCo/56I&amp;amp;offerid=1749755.4458313632340155146618509&amp;amp;type=15&amp;amp;murl=https%3A%2F%2Fwww.newegg.com%2Fthermaltake-gaming-desktop-pc-geforce-rtx-5090-amd-ryzen-7-9800x3d-32gb-ddr5-2tb-ssd-lcgs-view-9890s-380xl-white%2Fp%2FN82E16883100115%3Fitem%3DN82E16883100115"
rel="nofollow sponsored noopener"
target="_blank"
data-affiliate-retailer="Newegg"
data-affiliate-slot="table-row"
data-link-kind="product">Check Newegg&lt;span class="buy-cell__checked">Link checked 2026-08-18&lt;/span>&lt;/a>&lt;/span>
&lt;h2 id="why-these-are-9800x3d-systems">Why these are 9800X3D systems&lt;/h2>
&lt;p>At this price, the processor should fit the job. The Ryzen 7 9800X3D is an eight-core, 16-thread, 120W AM5 processor with 96MB of L3 cache. It is the gaming-first choice in the captured direct-retailer set.&lt;/p>
&lt;p>The feed also held a $5,599.99 Stormcraft Valkyrie with an Intel Core Ultra 7 270K Plus, a system that can make sense for a different workload mix but would blur this gaming comparison by changing the processor platform while every other finalist stays on the 9800X3D.&lt;/p>
&lt;p>I kept the CPU constant on purpose. Once every row uses a 9800X3D and RTX 5090, the reader can compare the system rather than decoding two product categories at once.&lt;/p>
&lt;h2 id="what-a-5000-plus-prebuilt-must-disclose">What a $5,000-plus prebuilt must disclose&lt;/h2>
&lt;p>The expensive GPU cannot be permission for everything around it to become vague. A machine at this price should make its electrical and upgrade constraints easy to inspect before you pay, then easy to verify again when the box arrives. Two facts from this comparison show why the second check matters. Thermaltake&amp;rsquo;s live price had moved $609 above the prior feed snapshot. Stormcraft warns that component brands may vary inside the stated configuration. Save the checkout screenshot. When the box arrives, compare the delivered graphics card and power supply against the order. Check the memory module count and motherboard next. Finish with the SSD and cooler. Inspect the cabling before the return window gets short.&lt;/p>
&lt;h3 id="a-native-high-current-power-path">A native high-current power path&lt;/h3>
&lt;p>NVIDIA lists 575W total graphics power and 1000W required system power for the RTX 5090. A capacity label of 1200W or 1300W clears the first test. The exact PSU model and a native cable clear the second.&lt;/p>
&lt;p>Avoid treating four adapter leads as a harmless visual issue. This is a high-current connection behind a large card. Confirm the cable type, seat it fully, and avoid a tight bend at the connector.&lt;/p>
&lt;h3 id="two-memory-modules">Two memory modules&lt;/h3>
&lt;p>The captured Acer and Stormcraft pages showed 16GB x 2. Thermaltake disclosed 32GB DDR5-6000 but did not expose the module count in the same table. Confirm two modules before accepting the configuration.&lt;/p>
&lt;p>Thirty-two gigabytes is enough for gaming. The &lt;a href="https://techfuelhq.com/articles/ddr5-ram-buying-guide-2025/">DDR5 buying guide&lt;/a> covers capacity and timing tradeoffs if this tower will also be a 64GB creator or local-AI machine.&lt;/p>
&lt;h3 id="storage-that-fits-the-price">Storage that fits the price&lt;/h3>
&lt;p>Two terabytes is the floor at this tier. Stormcraft identifies its drive as Gen4. Acer says 2TB PCIe, while Thermaltake says 2TB NVMe. None of those capacity lines tells you controller, endurance, or sustained write behavior.&lt;/p>
&lt;p>Identify the installed SSD after delivery and count the open M.2 slots. A $5,500 tower should not require replacing its only system drive just to add working space.&lt;/p>
&lt;h3 id="a-motherboard-and-case-you-can-expand">A motherboard and case you can expand&lt;/h3>
&lt;p>Stormcraft discloses B850. Thermaltake discloses X870. Acer leaves the board unnamed in the saved specification. The chipset will not create gaming frames. It does help define storage lanes and USB. It also tells you more about networking and future cards.&lt;/p>
&lt;p>Case dimensions and slot clearance matter too. An RTX 5090 is not a small component. Confirm that the installed model has room to breathe and that adding another card or bottom-mounted fans will not choke it.&lt;/p>
&lt;h2 id="rtx-5090-or-rtx-5080-prebuilt">RTX 5090 or RTX 5080 prebuilt?&lt;/h2>
&lt;p>The RTX 5090 tier needs a named reason. Mine would be one of these:&lt;/p>
&lt;ul>
&lt;li>maximum native or lightly upscaled 4K performance&lt;/li>
&lt;li>a 4K high-refresh display that can expose the difference&lt;/li>
&lt;li>32GB of VRAM for local AI, rendering, or creation&lt;/li>
&lt;li>one machine serving both gaming and a GPU-heavy paid workload&lt;/li>
&lt;/ul>
&lt;p>If the computer is for ordinary 1440p gaming or 4K with DLSS, the &lt;a href="https://techfuelhq.com/articles/best-rtx-5080-prebuilt-gaming-pc-2026/">best RTX 5080 prebuilt guide&lt;/a> starts at $2,799.99 in the same dated retailer feed. The jump from that value pick to the least expensive 5090 system here was $2,500. That money can buy a serious display and a later GPU upgrade. It can also fund the memory and storage the system will use every day.&lt;/p>
&lt;p>The RTX 5090 is faster. It is not automatically the better purchase. NVIDIA&amp;rsquo;s official specifications put the difference in plain terms: 32GB versus 16GB of GDDR7 and a 575W versus 360W power rating. The &lt;a href="https://techfuelhq.com/articles/best-gpu-4k-gaming-2026/">2026 4K GPU guide&lt;/a> places both cards in the wider buying ladder.&lt;/p>
&lt;h2 id="the-price-ceiling">The price ceiling&lt;/h2>
&lt;p>My practical ceiling for this configuration is about &lt;strong>$6,000 before tax&lt;/strong>. That means a 9800X3D, 32GB, 2TB, and an RTX 5090. Cross the line only when the premium buys something you can name.&lt;/p>
&lt;p>Above that line, I want several of these:&lt;/p>
&lt;ul>
&lt;li>64GB of memory&lt;/li>
&lt;li>4TB or more of quality storage&lt;/li>
&lt;li>an explicitly named premium RTX 5090 model&lt;/li>
&lt;li>a named high-end power supply&lt;/li>
&lt;li>a motherboard and networking stack worth the difference&lt;/li>
&lt;li>a service package with measurable value&lt;/li>
&lt;li>a chassis and cooling configuration you were already willing to buy separately&lt;/li>
&lt;/ul>
&lt;p>Thermaltake&amp;rsquo;s live $6,699.99 can be defended only by the buyer who already values its white panoramic design, X870 platform, Wi-Fi 7, named 360mm cooler, and ATX 3.0 power description. Those features do not make it $1,100 faster than Stormcraft.&lt;/p>
&lt;h2 id="the-60-second-checkout-audit">The 60-second checkout audit&lt;/h2>
&lt;p>Do this after clicking through and before payment.&lt;/p>
&lt;ol>
&lt;li>Match the item number to the exact system in this guide.&lt;/li>
&lt;li>Confirm Ryzen 7 9800X3D, RTX 5090 32GB, 32GB DDR5, and 2TB storage.&lt;/li>
&lt;li>Look for two memory modules and record their speed.&lt;/li>
&lt;li>Identify the exact PSU model and native GPU cable.&lt;/li>
&lt;li>Identify the graphics-card, motherboard, SSD, and cooler models.&lt;/li>
&lt;li>Confirm who sells it and who ships it.&lt;/li>
&lt;li>Open the warranty and return terms, including freight.&lt;/li>
&lt;li>Check case clearance, open M.2 slots, and usable expansion slots.&lt;/li>
&lt;li>Screenshot the final configuration, price, delivery date, and seller block.&lt;/li>
&lt;/ol>
&lt;p>If the configuration changes, the ranking changes with it. At this price, a family name is not a substitute for the exact hardware and terms you are buying.&lt;/p></description></item><item><title>Best Wi-Fi 7 Routers (2026): 3 Picks That Make Sense</title><link>https://techfuelhq.com/networking/best-wifi-7-router-2026/</link><pubDate>Tue, 18 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/networking/best-wifi-7-router-2026/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · Published 2026-08-18 · 13 min read · St. Louis County, MO&lt;/p>
&lt;h2 id="three-picks-at-a-glance">Three picks at a glance&lt;/h2>
&lt;p>Choose the band layout first. Then count the ports. A giant aggregate speed number comes last because no single client receives the whole number printed on the box.&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Pick&lt;/th>
&lt;th scope="col">Best for&lt;/th>
&lt;th scope="col">Radio layout&lt;/th>
&lt;th scope="col">Useful wired I/O&lt;/th>
&lt;th scope="col" style="text-align: right">Live price, Aug. 18&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>TP-Link Archer BE550 Pro&lt;/strong>&lt;/td>
&lt;td>Best for most homes&lt;/td>
&lt;td>Tri-band: 2.4 + 5 + 6GHz&lt;/td>
&lt;td>1× 10G WAN, 4× 2.5G LAN&lt;/td>
&lt;td style="text-align: right">&lt;strong>$229.99&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>ASUS RT-BE88U&lt;/strong>&lt;/td>
&lt;td>Wired-first router and switch replacement&lt;/td>
&lt;td>Dual-band: 2.4 + 5GHz; &lt;strong>no 6GHz&lt;/strong>&lt;/td>
&lt;td>10G SFP+, 10G WAN/LAN, 4× 2.5G, 4× 1G&lt;/td>
&lt;td style="text-align: right">&lt;strong>$338.99&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>ASUS GT-BE98 Pro&lt;/strong>&lt;/td>
&lt;td>Premium wireless capacity and dual-6GHz AiMesh&lt;/td>
&lt;td>Quad-band: 2.4 + 5 + 6 + 6GHz&lt;/td>
&lt;td>10G WAN/LAN, 10G LAN, 3× 2.5G LAN&lt;/td>
&lt;td style="text-align: right">&lt;strong>$629.99&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>These are dated direct-listing prices. The exact pages resolved and showed the matching product in stock at capture, but the seller and price can move before this article does.&lt;/p>
&lt;img src="https://techfuelhq.com/images/networking/best-wifi-7-router-2026.svg" alt="Wi-Fi 7 router decision map: choose the TP-Link Archer BE550 Pro for tri-band 6GHz value, the ASUS RT-BE88U for dense 10G and 2.5G wired ports despite no 6GHz, or the ASUS GT-BE98 Pro for dual 6GHz radios and flagship wireless capacity" width="1200" height="630" loading="eager" fetchpriority="high" decoding="async" style="display:block;margin:1.5rem auto;max-width:100%;height:auto;border:1px solid #1e1e3a;border-radius:8px;" />
&lt;h2 id="the-decision-before-the-product">The decision before the product&lt;/h2>
&lt;p>This page assumes you have already decided Wi-Fi 7 is worth buying. If that question is still open, start with &lt;a href="https://techfuelhq.com/networking/wifi-7-homelab-home-network-2026/">Wi-Fi 7 for the home network and homelab&lt;/a>. It covers real throughput, MLO, client support, and the cases where Wi-Fi 6E should stay in service.&lt;/p>
&lt;p>For the purchase itself, write down four facts:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Does the router need 6GHz?&lt;/strong> If 320MHz channels are part of the plan, yes.&lt;/li>
&lt;li>&lt;strong>What feeds the router?&lt;/strong> Gigabit, 2.5Gbps, 5Gbps, or 10Gbps internet changes the WAN requirement.&lt;/li>
&lt;li>&lt;strong>What sits behind it?&lt;/strong> A NAS, multi-gig switch, or wired gaming PCs decide the LAN ports.&lt;/li>
&lt;li>&lt;strong>Is one access point enough?&lt;/strong> A large or difficult house may need mesh instead of a more expensive standalone box.&lt;/li>
&lt;/ol>
&lt;p>The best router is the least expensive one that serves those four constraints. The rest is unused radio inventory. A flagship only earns its place when the second 6GHz radio, extra 10G path, or denser wired switch replaces another box or fixes a measured bottleneck; without that job, the premium buys capacity that sits idle while the same phone and laptop behave much as they would on the midrange router.&lt;/p>
&lt;h2 id="1-tp-link-archer-be550-pro-is-the-best-pick">1. TP-Link Archer BE550 Pro is the best pick&lt;/h2>
&lt;p>The Archer BE550 Pro is the rare midrange router whose wireless and wired sides match. TP-Link specifies three bands, including 6GHz, with 320MHz channels and MLO. The wired side has one 10Gbps WAN port and four 2.5Gbps LAN ports.&lt;/p>
&lt;p>That combination matters more than the BE9700/BE9300 naming inconsistency between TP-Link and the retailer feed. A fast Wi-Fi client can reach a multi-gig NAS without being pinched through a gigabit LAN port. A 5Gbps fiber service can enter through the 10G WAN port. Four 2.5G LAN ports also remove the immediate need for a small multi-gig switch in many homes.&lt;/p>
&lt;p>At $229.99, it sits where the existing technology guide said useful tri-band Wi-Fi 7 should sit: the low-to-mid $200s. It is $109 below the RT-BE88U and $400 below the GT-BE98 Pro.&lt;/p>
&lt;p>I would still verify three details at checkout. Match &lt;strong>BE550 Pro&lt;/strong>, not the nearby BE550 family name. Confirm the regional version. Then check that the phone, laptop, or desktop you expect to speed up supports 6GHz Wi-Fi 7; a router cannot add a radio to the client.&lt;/p>
&lt;h2 id="2-asus-rt-be88u-is-the-wired-first-exception">2. ASUS RT-BE88U is the wired-first exception&lt;/h2>
&lt;p>The RT-BE88U is an unusual recommendation because its strongest feature is also the reason many Wi-Fi 7 buyers should skip it.&lt;/p>
&lt;p>ASUS calls it dual-band. The official specification and Newegg table show only 2.4GHz and 5GHz wireless. There is no 6GHz radio, so there are no 320MHz 6GHz channels. Put that fact above every marketing number.&lt;/p>
&lt;p>The wired layout is excellent:&lt;/p>
&lt;ul>
&lt;li>one 10G SFP+ port&lt;/li>
&lt;li>one standard 10G WAN/LAN port&lt;/li>
&lt;li>four 2.5G ports&lt;/li>
&lt;li>four gigabit ports&lt;/li>
&lt;li>WAN/LAN aggregation options&lt;/li>
&lt;/ul>
&lt;p>For a homelab or fiber gateway, that can replace both a consumer router and a separate multi-gig switch. The SFP+ port is especially useful when the existing core already speaks DAC or fiber. At $338.99, the additional $109 over TP-Link can be cheaper than buying an extra managed switch.&lt;/p>
&lt;p>For a wireless-first buyer, the logic reverses. Spending more while losing 6GHz makes no sense when the reason for the upgrade is wide-channel Wi-Fi. This is the port-density pick. Nothing else.&lt;/p>
&lt;span class="buy-cell buy-cell--inline">&lt;a class="buy-cell__action buy-cell__action--primary"
href="https://click.linksynergy.com/link?id=CW4UrCo/56I&amp;amp;offerid=1749755.445838548739904449648413&amp;amp;type=15&amp;amp;murl=https%3A%2F%2Fwww.newegg.com%2Fasus-rt-be88u-ieee-802-11a-ieee-802-11b-ieee-802-11g-wifi-4-wifi-5-wifi-6-wifi-6e-wifi-7-ipv4-ipv6%2Fp%2FN82E16833320598%3Fitem%3DN82E16833320598"
rel="nofollow sponsored noopener"
target="_blank"
data-affiliate-retailer="Newegg"
data-affiliate-slot="table-row"
data-link-kind="product">Check Newegg&lt;span class="buy-cell__checked">Link checked 2026-08-18&lt;/span>&lt;/a>&lt;/span>
&lt;h2 id="3-asus-gt-be98-pro-is-the-flagship">3. ASUS GT-BE98 Pro is the flagship&lt;/h2>
&lt;p>The GT-BE98 Pro carries four radios: 2.4GHz and 5GHz plus two separate 6GHz bands. ASUS pairs that with 320MHz support, one 10G WAN/LAN port, another 10G LAN port, three 2.5G LAN ports, plus AiMesh.&lt;/p>
&lt;p>The second 6GHz radio is the feature that can justify the price. In an AiMesh deployment, one 6GHz band can carry wireless backhaul while the other serves clients. In a dense single-router deployment, the extra radio can divide high-end clients instead of placing them all on one 6GHz channel set.&lt;/p>
&lt;p>Most homes will never turn that capability into a visible result. A single laptop cannot consume four bands. A gigabit internet plan cannot saturate the wired uplink. If the second 6GHz radio has no backhaul or client-density job, the $629.99 price is a $400 premium for idle capacity.&lt;/p>
&lt;p>Buy it for a named topology: dual-6GHz AiMesh, multiple current Wi-Fi 7 clients, 10G core networking, or a flagship gaming network where cost is secondary. The GT-BE98 Pro is the strongest wireless platform here. It is not the default.&lt;/p>
&lt;span class="buy-cell buy-cell--inline">&lt;a class="buy-cell__action buy-cell__action--primary"
href="https://click.linksynergy.com/link?id=CW4UrCo/56I&amp;amp;offerid=1749755.445832470857938676049424&amp;amp;type=15&amp;amp;murl=https%3A%2F%2Fwww.newegg.com%2Fasus-gt-be98-pro%2Fp%2FN82E16833320588%3Fitem%3DN82E16833320588"
rel="nofollow sponsored noopener"
target="_blank"
data-affiliate-retailer="Newegg"
data-affiliate-slot="table-row"
data-link-kind="product">Check Newegg&lt;span class="buy-cell__checked">Link checked 2026-08-18&lt;/span>&lt;/a>&lt;/span>
&lt;h2 id="why-6ghz-changes-the-ranking">Why 6GHz changes the ranking&lt;/h2>
&lt;p>Wi-Fi 7 features are not one indivisible package. MLO and 4K-QAM can operate without 6GHz. The headline 320MHz channels cannot; in the United States they live in the 6GHz band.&lt;/p>
&lt;p>That creates three product classes:&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Class&lt;/th>
&lt;th scope="col">What it gives you&lt;/th>
&lt;th scope="col">What it misses&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Dual-band Wi-Fi 7&lt;/strong>&lt;/td>
&lt;td>MLO/4K-QAM on 2.4 and 5GHz, often strong wired I/O&lt;/td>
&lt;td>6GHz and 320MHz channels&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Tri-band Wi-Fi 7&lt;/strong>&lt;/td>
&lt;td>The full mainstream feature set: 2.4, 5, 6GHz&lt;/td>
&lt;td>A dedicated second 6GHz backhaul/client radio&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Quad-band dual-6GHz&lt;/strong>&lt;/td>
&lt;td>Extra capacity or dedicated 6GHz mesh backhaul&lt;/td>
&lt;td>Value, unless the topology uses it&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>This is why TP-Link wins and ASUS RT-BE88U stays a specialist. The Archer delivers the feature most buyers mean when they say &amp;ldquo;upgrade to Wi-Fi 7.&amp;rdquo; The RT-BE88U delivers a different thing: a serious wired edge with a current-generation 5GHz radio.&lt;/p>
&lt;h2 id="port-topology-beats-a-30gbps-box-number">Port topology beats a 30Gbps box number&lt;/h2>
&lt;p>Router marketing adds every radio&amp;rsquo;s theoretical maximum and prints the sum. That number is access-point capacity under ideal conditions. It is not a laptop speed test.&lt;/p>
&lt;p>Read the physical ports instead:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Archer BE550 Pro:&lt;/strong> cleanest 10G-WAN-to-2.5G-LAN layout.&lt;/li>
&lt;li>&lt;strong>RT-BE88U:&lt;/strong> best wired density and the only SFP+ option here.&lt;/li>
&lt;li>&lt;strong>GT-BE98 Pro:&lt;/strong> two 10G-class paths plus three 2.5G LAN ports.&lt;/li>
&lt;/ul>
&lt;p>For a NAS and workstation, map the whole chain. A 10G router feeding a gigabit switch is still a gigabit network. A Wi-Fi 7 access point wired back through 1GbE is still limited to one gigabit of backhaul. The &lt;a href="https://techfuelhq.com/networking/25gbe-vs-10gbe-homelab-2026/">2.5GbE versus 10GbE guide&lt;/a> explains when the next wired tier pays off.&lt;/p>
&lt;h2 id="standalone-router-or-mesh">Standalone router or mesh?&lt;/h2>
&lt;p>These picks are standalone routers. That is deliberate. A mesh comparison needs node count and backhaul radio first; after that come wired backhaul speed, placement, and total-kit price. Mixing a three-pack Orbi or Deco kit into this table would create the appearance of choice while comparing different products.&lt;/p>
&lt;p>Choose standalone when:&lt;/p>
&lt;ul>
&lt;li>the router can sit near the center of the usable space&lt;/li>
&lt;li>one access point already covers the home&lt;/li>
&lt;li>Ethernet can feed a separate access point later&lt;/li>
&lt;/ul>
&lt;p>Choose mesh when:&lt;/p>
&lt;ul>
&lt;li>floors, dense walls, or distance create repeatable dead zones&lt;/li>
&lt;li>one central location cannot cover the house&lt;/li>
&lt;li>you can wire at least the main satellite with 2.5GbE or faster&lt;/li>
&lt;/ul>
&lt;p>A larger antenna count does not repair a bad access-point location. Spend on topology before flagship hardware. Picture a two-story house with 5Gbps fiber, one wired office, a 10GbE NAS in the basement, and two Wi-Fi 7 laptops upstairs: the Archer serves the wireless upgrade and four 2.5G rooms cleanly; the RT-BE88U earns its premium only if its SFP+ and extra wired ports replace a switch; the GT-BE98 Pro earns its premium only if a second 6GHz radio carries mesh backhaul or a dense client group. The exercise also exposes the mesh question before checkout: if the upstairs devices remain weak because the access point is badly placed, buy a second wired access point or a mesh node rather than paying for a larger standalone router and hoping one box defeats the floor plan.&lt;/p>
&lt;h2 id="do-not-upgrade-to-solve-a-fault">Do not upgrade to solve a fault&lt;/h2>
&lt;p>A router that disconnects clients, reboots, or loses WAN under load may need replacement. It may also have a channel, firmware, heat, power, or ISP problem. Work through &lt;a href="https://techfuelhq.com/articles/wifi-keeps-disconnecting-2026/">Wi-Fi that keeps disconnecting&lt;/a> before using a new wireless generation as a repair strategy.&lt;/p>
&lt;p>The same rule applies to speed. Test a wired client first. If Ethernet is slow, the radio is innocent.&lt;/p>
&lt;h2 id="the-60-second-checkout-audit">The 60-second checkout audit&lt;/h2>
&lt;ol>
&lt;li>Match the exact model and item number.&lt;/li>
&lt;li>Count the bands. Look for 6GHz explicitly.&lt;/li>
&lt;li>Confirm the WAN port speed and whether it can become LAN.&lt;/li>
&lt;li>Count 10G, 2.5G, and 1G LAN ports separately.&lt;/li>
&lt;li>Check whether your clients support Wi-Fi 7 and 6GHz.&lt;/li>
&lt;li>Decide standalone versus mesh before ordering.&lt;/li>
&lt;li>Confirm seller, warranty, return window, and regional version.&lt;/li>
&lt;li>Screenshot the final price and configuration.&lt;/li>
&lt;/ol>
&lt;p>For most buyers, the answer remains the Archer BE550 Pro. It buys the radio that makes Wi-Fi 7 different and the ports that keep it from being trapped behind gigabit.&lt;/p></description></item><item><title>RTX 5090 vs RTX 5080 (2026): Which One Should You Buy?</title><link>https://techfuelhq.com/gpu-reviews/rtx-5090-vs-5080-2026/</link><pubDate>Tue, 18 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/gpu-reviews/rtx-5090-vs-5080-2026/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · Published 2026-08-18 · 15 min read · St. Louis County, MO&lt;/p>
&lt;h2 id="the-decision-in-one-table">The decision in one table&lt;/h2>
&lt;p>The RTX 5090 wins every absolute-performance question. The RTX 5080 wins the purchase question for most gamers. The exception is a buyer whose current game, render, model, or paid workflow already reaches the 16GB boundary or whose display can turn the 5090&amp;rsquo;s extra native-4K frame rate into something visible; in that case, the larger card solves a named limit rather than serving as expensive insurance.&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Decision&lt;/th>
&lt;th scope="col">RTX 5080&lt;/th>
&lt;th scope="col">RTX 5090&lt;/th>
&lt;th scope="col">Winner&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>4K gaming with DLSS&lt;/td>
&lt;td>Strong, measured and playable&lt;/td>
&lt;td>Faster&lt;/td>
&lt;td>&lt;strong>RTX 5080 value&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Maximum native 4K&lt;/td>
&lt;td>Compromises remain in the hardest titles&lt;/td>
&lt;td>Fastest tier&lt;/td>
&lt;td>&lt;strong>RTX 5090&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>VRAM&lt;/td>
&lt;td>16GB GDDR7&lt;/td>
&lt;td>32GB GDDR7&lt;/td>
&lt;td>&lt;strong>RTX 5090&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Card power&lt;/td>
&lt;td>360W reference TGP&lt;/td>
&lt;td>575W reference TGP&lt;/td>
&lt;td>&lt;strong>RTX 5080&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Required system power&lt;/td>
&lt;td>850W&lt;/td>
&lt;td>1000W&lt;/td>
&lt;td>&lt;strong>RTX 5080&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Local AI that fits inside 16GB&lt;/td>
&lt;td>Already capable&lt;/td>
&lt;td>Faster/roomier, but unmeasured here&lt;/td>
&lt;td>&lt;strong>RTX 5080 value&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Workloads that exceed 16GB&lt;/td>
&lt;td>Spill or fail&lt;/td>
&lt;td>32GB headroom&lt;/td>
&lt;td>&lt;strong>RTX 5090&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Most gaming builds&lt;/td>
&lt;td>Rational ceiling&lt;/td>
&lt;td>Halo purchase&lt;/td>
&lt;td>&lt;strong>RTX 5080&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;img src="https://techfuelhq.com/images/gpu-reviews/rtx-5090-vs-5080-2026.svg" alt="RTX 5090 versus RTX 5080 decision map: choose the RTX 5080 for most 4K gaming and lower power, or the RTX 5090 when 32GB VRAM, maximum native 4K performance, rendering, or paid GPU work has a defined job" width="1200" height="630" loading="eager" fetchpriority="high" decoding="async" style="display:block;margin:1.5rem auto;max-width:100%;height:auto;border:1px solid #1e1e3a;border-radius:8px;" />
&lt;h2 id="current-direct-retailer-example">Current direct-retailer example&lt;/h2>
&lt;p>Launch MSRP is useful history. It is not the number buyers face today.&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Exact card&lt;/th>
&lt;th scope="col">What the listing disclosed&lt;/th>
&lt;th scope="col" style="text-align: right">Live price, Aug. 18&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>GIGABYTE WINDFORCE RTX 5080 16GB&lt;/strong>&lt;/td>
&lt;td>304mm long, 2.5 slots, 850W recommended PSU&lt;/td>
&lt;td style="text-align: right">&lt;strong>$1,399.99&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>ASUS ROG Astral RTX 5090 32GB&lt;/strong>&lt;/td>
&lt;td>14.1 inches, 3.8 slots, 1000W recommended PSU&lt;/td>
&lt;td style="text-align: right">&lt;strong>$4,829.99&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>Both pages showed sold and shipped by Newegg at capture. The 5090 example cost &lt;strong>3.45 times&lt;/strong> as much. This is not an apples-to-apples cooler comparison: ROG Astral is a premium flagship board, while WINDFORCE is a simpler RTX 5080. It is still a real checkout comparison, and it shows why MSRP-only advice fails.&lt;/p>
&lt;h2 id="specifications-that-matter">Specifications that matter&lt;/h2>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Specification&lt;/th>
&lt;th scope="col" style="text-align: right">RTX 5080&lt;/th>
&lt;th scope="col" style="text-align: right">RTX 5090&lt;/th>
&lt;th scope="col" style="text-align: right">Difference&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>CUDA cores&lt;/td>
&lt;td style="text-align: right">10,752&lt;/td>
&lt;td style="text-align: right">21,760&lt;/td>
&lt;td style="text-align: right">+11,008&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>VRAM&lt;/td>
&lt;td style="text-align: right">16GB GDDR7&lt;/td>
&lt;td style="text-align: right">32GB GDDR7&lt;/td>
&lt;td style="text-align: right">2× capacity&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Memory interface&lt;/td>
&lt;td style="text-align: right">256-bit&lt;/td>
&lt;td style="text-align: right">512-bit&lt;/td>
&lt;td style="text-align: right">2× width&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Total graphics power&lt;/td>
&lt;td style="text-align: right">360W&lt;/td>
&lt;td style="text-align: right">575W&lt;/td>
&lt;td style="text-align: right">+215W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Required system power&lt;/td>
&lt;td style="text-align: right">850W&lt;/td>
&lt;td style="text-align: right">1000W&lt;/td>
&lt;td style="text-align: right">+150W&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>The core count is not a frame-rate equation. Games do not scale one-for-one with CUDA cores, and CPU limits, memory behavior, ray tracing, and engine design change the gap. The capacity and power differences are literal. They shape what fits in VRAM, which supply belongs in the system, and how much heat the case must move.&lt;/p>
&lt;h2 id="how-much-faster-is-the-rtx-5090">How much faster is the RTX 5090?&lt;/h2>
&lt;p>Two credible suites answer this in different shapes.&lt;/p>
&lt;p>GamersNexus measured the RTX 5090 &lt;strong>30% to 68.9% ahead&lt;/strong> of the RTX 5080 at 4K, depending on the game, with results commonly in the &lt;strong>45% to 55%&lt;/strong> range. That wide spread is the honest result. A single title can land near 30%. Another can approach 70%.&lt;/p>
&lt;p>TechPowerUp&amp;rsquo;s combined 3840×2160 raster chart put the RTX 5090 at &lt;strong>152%&lt;/strong> of the RTX 5080&amp;rsquo;s performance, a 52% suite-level lead. That aligns with the middle of the GamersNexus range while using a different game list and aggregation method.&lt;/p>
&lt;p>The safe buying number is therefore not &amp;ldquo;the 5090 is always 50% faster.&amp;rdquo; It is:&lt;/p>
&lt;ul>
&lt;li>expect a large 4K lead&lt;/li>
&lt;li>expect the exact lead to move by title&lt;/li>
&lt;li>do not pay for the maximum result unless your own games resemble the workloads that produce it&lt;/li>
&lt;/ul>
&lt;p>At 1440p, CPU limits shrink the value of the larger GPU. If the display is 1440p, the RTX 5090 is usually an expensive way to wait on the processor.&lt;/p>
&lt;h2 id="what-the-rtx-5080-already-does-at-4k">What the RTX 5080 already does at 4K&lt;/h2>
&lt;p>TechFuelHQ owns and measures an ASUS ROG Astral RTX 5080 OC. The &lt;a href="https://techfuelhq.com/data/gpu/rog-astral-rtx-5080-oc-2026-06-09/">open bench dataset&lt;/a> publishes raw values with the method and correction history under CC BY 4.0.&lt;/p>
&lt;p>Measured 4K results include:&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Workload&lt;/th>
&lt;th scope="col" style="text-align: right">Average FPS&lt;/th>
&lt;th scope="col" style="text-align: right">1% low&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Cyberpunk 2077 Ultra raster&lt;/td>
&lt;td style="text-align: right">58&lt;/td>
&lt;td style="text-align: right">49&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Cyberpunk RT Ultra, DLSS Quality&lt;/td>
&lt;td style="text-align: right">50&lt;/td>
&lt;td style="text-align: right">41&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Cyberpunk Path Tracing, native&lt;/td>
&lt;td style="text-align: right">19&lt;/td>
&lt;td style="text-align: right">15&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Alan Wake 2 RT, DLSS Quality&lt;/td>
&lt;td style="text-align: right">49&lt;/td>
&lt;td style="text-align: right">38&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Black Myth Wukong Cinematic&lt;/td>
&lt;td style="text-align: right">34&lt;/td>
&lt;td style="text-align: right">27&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>The card needs help in the hardest path-traced workload. That is where DLSS 4 changes the buying decision. On the same system, Cyberpunk 4K path tracing measured:&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Mode&lt;/th>
&lt;th scope="col" style="text-align: right">Output FPS&lt;/th>
&lt;th scope="col" style="text-align: right">PC latency&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Native path tracing&lt;/td>
&lt;td style="text-align: right">19&lt;/td>
&lt;td style="text-align: right">95ms&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DLSS Quality, no frame generation&lt;/td>
&lt;td style="text-align: right">40&lt;/td>
&lt;td style="text-align: right">45ms&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DLSS Quality + MFG 2×&lt;/td>
&lt;td style="text-align: right">90&lt;/td>
&lt;td style="text-align: right">55ms&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DLSS Quality + MFG 4×&lt;/td>
&lt;td style="text-align: right">135&lt;/td>
&lt;td style="text-align: right">62ms&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>If those techniques are acceptable, the RTX 5080 is already a serious 4K card. The RTX 5090 buys more native headroom and a higher starting frame rate. It does not make the RTX 5080 incapable.&lt;/p>
&lt;h2 id="the-16gb-versus-32gb-decision">The 16GB versus 32GB decision&lt;/h2>
&lt;p>For gaming, 16GB is the practical high-end capacity today. The first-party 4K runs above fit and complete on the RTX 5080. Buying 32GB solely because a future game might need it is weak evidence.&lt;/p>
&lt;p>For work, capacity can become binary. A render scene, local model, image batch, or timeline either fits in VRAM or it does not. Once the workload crosses 16GB, the RTX 5090&amp;rsquo;s performance advantage is no longer just frames per second. It can keep work on the GPU that the 5080 must spill, reduce, or refuse.&lt;/p>
&lt;p>Name the workload before paying:&lt;/p>
&lt;ul>
&lt;li>What is the current peak VRAM allocation?&lt;/li>
&lt;li>Does lowering batch size destroy throughput?&lt;/li>
&lt;li>Does CPU/RAM offload create an unacceptable delay?&lt;/li>
&lt;li>Does the extra GPU memory replace a second card, cloud bill, or work interruption?&lt;/li>
&lt;/ul>
&lt;p>If there is no measured 16GB problem, the 32GB answer is insurance at flagship pricing.&lt;/p>
&lt;h2 id="local-ai-use-measured-data-not-parameter-count-folklore">Local AI: use measured data, not parameter-count folklore&lt;/h2>
&lt;p>The &lt;a href="https://techfuelhq.com/data/rtx-5080-llm-throughput/">RTX 5080 local LLM throughput dataset&lt;/a> is measured on the same retail card and mirrored on Kaggle and Hugging Face. It shows what 16GB can already do:&lt;/p>
&lt;ul>
&lt;li>gpt-oss:20b MXFP4: &lt;strong>187–190 decode tokens/second&lt;/strong>&lt;/li>
&lt;li>resident VRAM: roughly &lt;strong>13.7–14.0 GiB&lt;/strong>&lt;/li>
&lt;li>Qwen 2.5 14B Q4_K_M: &lt;strong>94–97 tok/s&lt;/strong>&lt;/li>
&lt;li>Qwen 2.5 7B Q4_K_M: &lt;strong>177–180 tok/s&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>This site has no first-party RTX 5090 AI result, so I will not invent a speed multiplier. The grounded claim is capacity: 32GB gives room for larger fully resident models, longer contexts, image work, plus larger batches. The grounded counterclaim is equally important: 16GB is already enough for fast interactive use on several useful models.&lt;/p>
&lt;p>Buy the 5090 for AI when a workload you run now exceeds the 5080&amp;rsquo;s capacity. Buy the 5080 when your actual models fit.&lt;/p>
&lt;h2 id="power-case-and-the-rest-of-the-system">Power, case, and the rest of the system&lt;/h2>
&lt;p>The RTX 5090 adds 215W of reference board power. That changes more than the electric bill.&lt;/p>
&lt;p>NVIDIA specifies 850W required system power for the RTX 5080 and 1000W for the RTX 5090. TechFuelHQ&amp;rsquo;s &lt;a href="https://techfuelhq.com/articles/what-psu-for-rtx-5080-2026/">full RTX 50-series PSU guide&lt;/a> treats 1200W as the practical high-end 5090 target once a powerful processor and factory-overclocked board enter the build.&lt;/p>
&lt;p>Physical size follows the same pattern in the live examples:&lt;/p>
&lt;ul>
&lt;li>GIGABYTE WINDFORCE RTX 5080: 304mm, 2.5 slots&lt;/li>
&lt;li>ASUS ROG Astral RTX 5090: 14.1 inches, 3.8 slots&lt;/li>
&lt;/ul>
&lt;p>That can determine case choice, front-radiator clearance, lower-slot access, GPU support, and cable bend radius. The GPU price is only the first system cost.&lt;/p>
&lt;h2 id="price-to-performance-without-fake-precision">Price-to-performance without fake precision&lt;/h2>
&lt;p>Using TechPowerUp&amp;rsquo;s 52% combined 4K raster lead and the two live listings above:&lt;/p>
&lt;ul>
&lt;li>performance multiplier: about &lt;strong>1.52×&lt;/strong>&lt;/li>
&lt;li>price multiplier: about &lt;strong>3.45×&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>That does not produce a universal &amp;ldquo;value score.&amp;rdquo; The cards are different AIB tiers, and the RTX 5090 also buys double the VRAM. It does show the shape of the purchase: live retail asks for far more money than the gaming-performance increase alone returns.&lt;/p>
&lt;p>The RTX 5090 can still be the cheaper business tool when its 32GB capacity replaces cloud GPU time, cuts a render queue, or prevents an out-of-memory failure. Put a number on that benefit before paying: if the larger card saves four billable hours each week, avoids a recurring cloud instance, and keeps a current scene fully resident, the purchase has three measurable payback paths; if it only raises a benchmark score, gaming receives none of that accounting benefit.&lt;/p>
&lt;h2 id="buy-the-rtx-5080-if">Buy the RTX 5080 if&lt;/h2>
&lt;ul>
&lt;li>the system is primarily for gaming&lt;/li>
&lt;li>DLSS Quality and frame generation are acceptable at 4K&lt;/li>
&lt;li>current workloads fit inside 16GB&lt;/li>
&lt;li>you want an 850W-class build with easier case fit&lt;/li>
&lt;li>the 5090 price premium would delay the monitor, storage, or next upgrade&lt;/li>
&lt;/ul>
&lt;h2 id="buy-the-rtx-5090-if">Buy the RTX 5090 if&lt;/h2>
&lt;ul>
&lt;li>maximum native or lightly upscaled 4K performance is the requirement&lt;/li>
&lt;li>32GB solves a measured memory-capacity problem&lt;/li>
&lt;li>rendering, AI, or creation time has direct financial value&lt;/li>
&lt;li>the larger PSU, case, cooling, and card price are already budgeted&lt;/li>
&lt;li>money-no-object performance is itself the goal&lt;/li>
&lt;/ul>
&lt;p>The first list describes most buyers. The second describes a smaller group with better reasons, and the difference should survive a simple counterfactual: if the paid workload, 32GB allocation, or native-4K display disappeared tomorrow, would the rest of the purchase still justify a card that costs several thousand dollars more and forces a larger power and cooling envelope?&lt;/p>
&lt;h2 id="complete-system-or-card">Complete system or card?&lt;/h2>
&lt;p>If you want the GPU inside a ready-to-run tower, compare the &lt;a href="https://techfuelhq.com/articles/best-rtx-5080-prebuilt-gaming-pc-2026/">best RTX 5080 prebuilts&lt;/a> and &lt;a href="https://techfuelhq.com/articles/best-rtx-5090-prebuilt-gaming-pc-2026/">best RTX 5090 prebuilts&lt;/a>. Those guides rank power delivery and memory layout, then check storage, seller, and warranty details that disappear when a listing talks only about the GPU.&lt;/p>
&lt;p>For the card alone, confirm the exact item and dimensions, then verify the recommended supply, seller, warranty, and return terms. A GPU family name is not the product in your cart.&lt;/p></description></item><item><title>Monitor Flickering? Use Task Manager to Find the Cause</title><link>https://techfuelhq.com/articles/monitor-flickering-fix-2026/</link><pubDate>Mon, 17 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/articles/monitor-flickering-fix-2026/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · Published August 17, 2026 · St. Louis, Missouri&lt;/p>
&lt;img src="https://techfuelhq.com/images/articles/monitor-flickering-fix-2026.svg" alt="Monitor flickering diagnostic flow: Task Manager separates display-driver flicker from an incompatible app, then the monitor menu separates the PC signal path from the monitor and its power source" width="1200" height="630" loading="eager" fetchpriority="high" style="display:block;margin:1.5rem auto;max-width:100%;height:auto;border:1px solid rgba(200,255,0,0.18);border-radius:8px;" />
&lt;p>A flickering monitor is not one fault. It can be Windows repainting the desktop through a bad driver, one incompatible app flashing while the rest of the display is stable, a video cable losing the signal, an unstable power source, or variable refresh rate making dark scenes pulse.&lt;/p>
&lt;p>That is why the usual list of ten random fixes wastes time. The order matters. I start with &lt;strong>Task Manager&lt;/strong>, because Microsoft&amp;rsquo;s own procedure gives the cleanest Windows-side split: if Task Manager flickers with everything else, the display driver is the likely cause; if Task Manager stays stable while the rest flickers, an app is the likely cause.&lt;/p>
&lt;p>First, name the symptom. A brief loss of the entire picture is a &lt;strong>blackout&lt;/strong>, so use the &lt;a href="https://techfuelhq.com/articles/monitor-keeps-going-black-2026/">monitor-keeps-going-black guide&lt;/a>. A fixed vertical or horizontal band belongs in the &lt;a href="https://techfuelhq.com/articles/lines-on-monitor-screen-2026/">lines-on-monitor guide&lt;/a>. A trail behind motion is &lt;a href="https://techfuelhq.com/articles/how-to-fix-monitor-ghosting-2026/">monitor ghosting&lt;/a>. This page is for the image or brightness visibly pulsing while the picture remains on-screen.&lt;/p>
&lt;p>Do not mix them.&lt;/p>
&lt;h2 id="the-30-second-split">The 30-second split&lt;/h2>
&lt;p>Wait until the flicker is visible, then press &lt;strong>Ctrl + Shift + Esc&lt;/strong> to open Task Manager.&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">What flickers?&lt;/th>
&lt;th scope="col">Start here&lt;/th>
&lt;th scope="col">What it rules toward&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Task Manager and the rest of Windows&lt;/td>
&lt;td>Display driver&lt;/td>
&lt;td>Update, roll back, or reinstall the driver&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Everything except Task Manager&lt;/td>
&lt;td>One incompatible app&lt;/td>
&lt;td>Update or uninstall the app that triggers it&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>The monitor&amp;rsquo;s own menu or no-signal box&lt;/td>
&lt;td>Monitor or power source&lt;/td>
&lt;td>Cable-independent panel, board, or outlet problem&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Only a dark game or loading screen with VRR on&lt;/td>
&lt;td>G-Sync / FreeSync / Adaptive Sync&lt;/td>
&lt;td>Frame-time and VRR-range tuning&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Only at a high refresh rate or resolution&lt;/td>
&lt;td>Cable, port, adapter, or bandwidth&lt;/td>
&lt;td>Test a lower rate and a known-good connection&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>Microsoft&amp;rsquo;s &lt;a href="https://support.microsoft.com/en-us/windows/hardware/display-graphics/troubleshoot-screen-flickering-in-windows" rel="noopener">screen-flickering procedure&lt;/a> is explicit. Task Manager flickering with the screen points to the display driver. A stable Task Manager points to an incompatible app. That isolates the Windows side. The monitor still needs its own test.&lt;/p>
&lt;p>One test creates two branches.&lt;/p>
&lt;p>Open the monitor&amp;rsquo;s &lt;strong>on-screen menu&lt;/strong> with its physical button or joystick while the flicker is happening. That menu is drawn by the monitor, not by Windows.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The menu is stable:&lt;/strong> Samsung&amp;rsquo;s diagnostic boundary points away from monitor service. Keep working the PC, cable, port, and refresh-rate steps below.&lt;/li>
&lt;li>&lt;strong>The menu flickers too:&lt;/strong> disconnect the video cable so the monitor shows its own no-signal message. If that also flickers, the PC is no longer involved. Test the monitor&amp;rsquo;s power source, then the monitor itself.&lt;/li>
&lt;/ul>
&lt;p>Samsung uses the same boundary in its &lt;a href="https://www.samsung.com/us/support/troubleshoot/TSG10007367/" rel="noopener">monitor flicker troubleshooting&lt;/a>. A clean menu or error message means the monitor does not need service; the connected device or cable is causing the issue. Flicker across those internal elements keeps the monitor side under suspicion.&lt;/p>
&lt;h2 id="step-1-reset-the-graphics-driver">Step 1: Reset the graphics driver&lt;/h2>
&lt;p>Press &lt;strong>Windows key + Ctrl + Shift + B&lt;/strong>.&lt;/p>
&lt;p>Windows briefly blanks or redraws the screen while it resets the graphics driver. Microsoft says the shortcut may fix the issue. A stable picture afterward is useful evidence for the Windows display path, but it is not proof that the monitor panel is healthy.&lt;/p>
&lt;p>Do not treat the shortcut as a permanent repair. It restarts the driver; it does not fix why the driver became unstable.&lt;/p>
&lt;p>If the flicker returns:&lt;/p>
&lt;ol>
&lt;li>Open &lt;strong>Device Manager&lt;/strong>.&lt;/li>
&lt;li>Expand &lt;strong>Display adapters&lt;/strong>.&lt;/li>
&lt;li>If the problem started immediately after a driver update, open the adapter&amp;rsquo;s &lt;strong>Properties → Driver&lt;/strong> tab and use &lt;strong>Roll Back Driver&lt;/strong> when available.&lt;/li>
&lt;li>If the driver is old, update it from NVIDIA, AMD, Intel, or the laptop manufacturer.&lt;/li>
&lt;li>If updates and rollback both fail, uninstall the display adapter and let Windows reinstall it, or use the clean-install sequence in the &lt;a href="https://techfuelhq.com/articles/gpu-driver-crash-fix-2026/">GPU driver crash guide&lt;/a>.&lt;/li>
&lt;/ol>
&lt;p>The timing decides whether update or rollback comes first. A driver that started flickering right after an update is not fixed by installing the same update again.&lt;/p>
&lt;h2 id="step-2-if-task-manager-is-stable-find-the-app">Step 2: If Task Manager is stable, find the app&lt;/h2>
&lt;p>When Task Manager stays solid while another window or the rest of the desktop flickers, Microsoft points at an incompatible app.&lt;/p>
&lt;p>Do not reinstall the whole graphics stack yet. Find the smallest repeatable trigger:&lt;/p>
&lt;ul>
&lt;li>Does it begin only when a browser opens?&lt;/li>
&lt;li>Only when Discord, Steam, an overlay, capture software, or a remote-desktop app is visible?&lt;/li>
&lt;li>Only while resizing a specific window?&lt;/li>
&lt;li>Does closing that app stop the flicker immediately?&lt;/li>
&lt;/ul>
&lt;p>Update the app first. If it is already current, uninstall it, restart, and test before reinstalling. That gives you an actual control: same display driver, same monitor, app absent.&lt;/p>
&lt;p>Older or incompatible Windows programs can show flickering windows even when the desktop is otherwise healthy. If one program is the trigger, changing the monitor cable will not repair it.&lt;/p>
&lt;h2 id="step-3-work-the-connection-and-power-path">Step 3: Work the connection and power path&lt;/h2>
&lt;p>Samsung&amp;rsquo;s current monitor guidance puts the practical hardware-side suspects together: a loose or damaged cable, faulty power, high-current appliances on the same circuit, outdated drivers, and the computer&amp;rsquo;s refresh-rate setting.&lt;/p>
&lt;p>Work these in order:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Reseat both ends of the video cable.&lt;/strong> Check for a crushed section, sharp bend, loose latch, or damaged connector.&lt;/li>
&lt;li>&lt;strong>Bypass the extras.&lt;/strong> Remove the dock, KVM, splitter, capture device, and adapter. Connect the PC directly to the monitor.&lt;/li>
&lt;li>&lt;strong>Try another port.&lt;/strong> Move to another output on the graphics card and another input on the monitor.&lt;/li>
&lt;li>&lt;strong>Try a known-good cable.&lt;/strong> Match its certification to the mode you run. The &lt;a href="https://techfuelhq.com/tools/displayport-hdmi-bandwidth-calculator/">DisplayPort and HDMI bandwidth calculator&lt;/a> shows whether the resolution, refresh rate, color depth, and chroma fit the connection.&lt;/li>
&lt;li>&lt;strong>Test another outlet.&lt;/strong> Plug the monitor directly into a different circuit as a control. Keep space heaters and other high-current loads off the same circuit during the test.&lt;/li>
&lt;/ol>
&lt;p>A new cable is evidence only if changing the cable changes the symptom. Buying three cables before running the Task Manager and monitor-menu tests is parts-cannon troubleshooting in a different form.&lt;/p>
&lt;p>Change one thing only.&lt;/p>
&lt;p>The trap is treating every flicker as a cable fault because the cable is visible and easy to replace, when a stable monitor menu, a Task Manager window that flickers with the desktop, and a symptom that began immediately after a driver update together make a far stronger case for the Windows display path than for the wire on your desk.&lt;/p>
&lt;h2 id="step-4-test-the-refresh-rate">Step 4: Test the refresh rate&lt;/h2>
&lt;p>Open &lt;strong>Settings → System → Display → Advanced display&lt;/strong> and confirm Windows is using a refresh rate the monitor supports.&lt;/p>
&lt;p>As a diagnostic, temporarily drop from 144, 165, or 240 Hz to 60 Hz:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Flicker stops at 60 Hz:&lt;/strong> the original display mode is exposing a signal-path or monitor-timing problem. Test the cable, ports, adapters, and native mode separately before naming the failed part.&lt;/li>
&lt;li>&lt;strong>Flicker is unchanged:&lt;/strong> the refresh-rate ceiling was not the cause; return to the driver/app or monitor/power branch.&lt;/li>
&lt;/ul>
&lt;p>Do not leave a high-refresh monitor at 60 Hz. This is a short diagnostic control. Find the weak link, then restore the native rate with the correct cable and port.&lt;/p>
&lt;h2 id="step-5-only-flickers-in-games-test-vrr">Step 5: Only flickers in games? Test VRR&lt;/h2>
&lt;p>If the desktop is stable and the screen pulses in dark game scenes, loading screens, or menus, test &lt;strong>G-Sync, FreeSync, or Adaptive Sync&lt;/strong> before replacing anything.&lt;/p>
&lt;p>Variable refresh rate makes the monitor follow the GPU&amp;rsquo;s frame output. When frame times jump, the refresh rate jumps with them. KTC&amp;rsquo;s &lt;a href="https://us.ktcplay.com/blogs/support-tips/what-causes-monitor-flicker-with-vrr-adaptive-sync" rel="noopener">VRR flicker explanation&lt;/a> describes the repeatable pattern: unstable frame rates force rapid refresh-rate changes, with the effect most visible in dark scenes or near the monitor&amp;rsquo;s VRR floor.&lt;/p>
&lt;p>Run one controlled comparison:&lt;/p>
&lt;ol>
&lt;li>Reproduce the flicker in the same scene.&lt;/li>
&lt;li>Turn G-Sync, FreeSync, or Adaptive Sync off.&lt;/li>
&lt;li>Replay the scene without changing anything else.&lt;/li>
&lt;/ol>
&lt;p>Use the exact same scene.&lt;/p>
&lt;p>If the flicker disappears, the panel is not necessarily dying. Turn VRR back on and cap the frame rate to a level your PC can hold steadily. Also update the GPU driver and monitor firmware. The goal is steadier frame pacing, not a higher peak number.&lt;/p>
&lt;p>Samsung also recommends disabling G-Sync or FreeSync as a flicker test on supported displays.&lt;/p>
&lt;h2 id="step-6-when-the-monitor-itself-becomes-the-likely-fault">Step 6: When the monitor itself becomes the likely fault&lt;/h2>
&lt;p>Only then does the monitor side move to the top.&lt;/p>
&lt;p>Suspect the display or its power board when:&lt;/p>
&lt;ul>
&lt;li>its own on-screen menu flickers;&lt;/li>
&lt;li>its no-signal message flickers with the video cable disconnected;&lt;/li>
&lt;li>the same behavior survives a different cable, input, and source device;&lt;/li>
&lt;li>a different wall outlet and power cord change nothing;&lt;/li>
&lt;li>the flicker appears before Windows loads;&lt;/li>
&lt;li>the panel brightness pulses even while displaying a static internal menu.&lt;/li>
&lt;/ul>
&lt;p>At that point, stop reinstalling drivers. If the monitor is under warranty, record a short video showing the flicker across the on-screen menu and request service. That evidence proves the symptom exists independently of the PC.&lt;/p>
&lt;h2 id="the-fix-order">The fix order&lt;/h2>
&lt;ol>
&lt;li>&lt;strong>Separate flicker from a full blackout, fixed line, or motion trail.&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Open Task Manager:&lt;/strong> driver branch if it flickers, app branch if it does not.&lt;/li>
&lt;li>&lt;strong>Open the monitor menu:&lt;/strong> stable means upstream; flickering means monitor or power.&lt;/li>
&lt;li>&lt;strong>Reset the driver&lt;/strong> with Windows key + Ctrl + Shift + B.&lt;/li>
&lt;li>&lt;strong>Reseat and simplify the signal path:&lt;/strong> no dock, KVM, splitter, or adapter.&lt;/li>
&lt;li>&lt;strong>Test another cable, port, and outlet.&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Drop the refresh rate temporarily&lt;/strong> to isolate bandwidth or timing.&lt;/li>
&lt;li>&lt;strong>For game-only flicker, toggle VRR&lt;/strong> and compare the same scene.&lt;/li>
&lt;li>&lt;strong>Request monitor service only after its own menu or no-signal image flickers.&lt;/strong>&lt;/li>
&lt;/ol>
&lt;p>That order stays reversible. More importantly, it gives each change a control. Prove which layer is unstable before replacing the layer below it.&lt;/p>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://support.microsoft.com/en-us/windows/hardware/display-graphics/troubleshoot-screen-flickering-in-windows" rel="noopener">Microsoft Support — Troubleshoot screen flickering in Windows&lt;/a> — Task Manager split, graphics-driver reset, driver rollback/update/uninstall, and incompatible-app branch.&lt;/li>
&lt;li>&lt;a href="https://www.samsung.com/us/support/troubleshoot/TSG10007367/" rel="noopener">Samsung Support — Image is distorted, ghosted, or flickering on my Samsung monitor&lt;/a> — cable, power-source, refresh-rate, driver, G-Sync/FreeSync, and monitor-menu controls.&lt;/li>
&lt;li>&lt;a href="https://us.ktcplay.com/blogs/support-tips/what-causes-monitor-flicker-with-vrr-adaptive-sync" rel="noopener">KTC — What causes monitor flicker with VRR or Adaptive Sync&lt;/a> — frame-time swings, rapid refresh-rate changes, dark-scene visibility, and the VRR-floor pattern.&lt;/li>
&lt;/ul></description></item><item><title>Adding a User to the Docker Group Is Not a Convenience Setting (2026)</title><link>https://techfuelhq.com/tutorials/add-user-to-docker-group-2026/</link><pubDate>Sat, 15 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/tutorials/add-user-to-docker-group-2026/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · 2026-08-15 · ~8 min read · St. Louis County, MO&lt;/p>
&lt;p>Here is the command you came for:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo groupadd docker &lt;span style="color:#75715e"># only if the group does not exist yet&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo usermod -aG docker $USER
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># then log out and log back in&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>And here is the sentence that belongs next to it, which Docker puts in a Warning box on its own post-installation page and almost nobody repeats:&lt;/p>
&lt;blockquote>
&lt;p>The docker group grants root-level privileges to the user.&lt;/p>&lt;/blockquote>
&lt;p>Not &amp;ldquo;elevated access to Docker&amp;rdquo;. Root on the host.&lt;/p>
&lt;h2 id="why-it-is-root-concretely">Why it is root, concretely&lt;/h2>
&lt;p>The reason &lt;code>sudo&lt;/code> is needed in the first place is architectural. Docker&amp;rsquo;s docs put it plainly: the daemon binds a Unix socket rather than a TCP port, that socket is owned by root, and the daemon itself always runs as root. Joining the &lt;code>docker&lt;/code> group does not reduce what the daemon can do. It gives you write access to the socket that commands it.&lt;/p>
&lt;p>The socket is the entire access-control model. Moby&amp;rsquo;s own systemd unit ships it as &lt;code>SocketUser=root&lt;/code>, &lt;code>SocketGroup=docker&lt;/code>, &lt;code>SocketMode=0660&lt;/code>. There is no per-user authorization layer behind it. Anything that can write to that socket can ask the root daemon for anything.&lt;/p>
&lt;p>So the escalation is not clever:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>docker run --mount type&lt;span style="color:#f92672">=&lt;/span>bind,src&lt;span style="color:#f92672">=&lt;/span>/,dst&lt;span style="color:#f92672">=&lt;/span>/host -it alpine sh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You are now root inside a container with the host&amp;rsquo;s entire filesystem at &lt;code>/host&lt;/code>. Docker&amp;rsquo;s security page states it directly — the container can alter your host filesystem without any restriction. Edit &lt;code>/host/etc/shadow&lt;/code>, drop a key in &lt;code>/host/root/.ssh/authorized_keys&lt;/code>, whatever you like.&lt;/p>
&lt;p>Notice what is absent. No &lt;code>--privileged&lt;/code>. No sudo prompt. No password. No entry in the sudo log.&lt;/p>
&lt;p>That last one is the part I find most under-discussed. &lt;code>sudo&lt;/code> leaves a trail. Group membership does not.&lt;/p>
&lt;h2 id="so-why-does-every-tutorial-recommend-it">So why does every tutorial recommend it&lt;/h2>
&lt;p>Because Docker&amp;rsquo;s own docs frame it as convenience first. The section opens with the reasoning that if you don&amp;rsquo;t want to preface the docker command with sudo, you create a Unix group called docker and add users to it. The Warning box sits &lt;em>underneath&lt;/em> that.&lt;/p>
&lt;p>Read in order, the page teaches convenience and then qualifies it. Skimmed — which is how anyone with a broken build reads a post-install page — you get the command and miss the box. Docker clearly knows this happens, because they had to add a second and more explicit warning on the Windows side, where &lt;code>docker-users&lt;/code> membership is described as equivalent to granting administrative privileges on the host. OWASP made not exposing the daemon socket rule number one of its Docker cheat sheet.&lt;/p>
&lt;p>The warning exists. It is just positioned to lose.&lt;/p>
&lt;h2 id="why-the-change-does-not-take-effect-immediately">Why the change does not take effect immediately&lt;/h2>
&lt;p>You run &lt;code>usermod&lt;/code>, you run &lt;code>docker ps&lt;/code>, and you still get permission denied. Nothing is broken.&lt;/p>
&lt;p>Supplementary group IDs are a credential attached to a process when it is created. Your shell was created before you joined the group, so it does not carry the membership, and re-reading &lt;code>/etc/group&lt;/code> is not something a running process does. The shell will never pick it up. Neither will your desktop session, or the terminal you opened an hour ago.&lt;/p>
&lt;p>Docker&amp;rsquo;s instruction is to log out and log back in so that group membership is re-evaluated, and they note a Linux VM may need a full restart.&lt;/p>
&lt;p>To test without logging out:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>newgrp docker
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker run hello-world
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>newgrp&lt;/code> starts a subshell that carries the group. It is a session-level patch. Close that shell and you are back where you started, so do not mistake it for the change having applied globally.&lt;/p>
&lt;h2 id="the-configjson-warning-nobody-explains">The config.json warning nobody explains&lt;/h2>
&lt;p>If you used &lt;code>sudo docker&lt;/code> before joining the group, you will eventually see this:&lt;/p>
&lt;pre tabindex="0">&lt;code>WARNING: Error loading config file: /home/user/.docker/config.json - stat
/home/user/.docker/config.json: permission denied
&lt;/code>&lt;/pre>&lt;p>Root created that directory in your home. Docker documents the fix:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo chown &lt;span style="color:#e6db74">&amp;#34;&lt;/span>$USER&lt;span style="color:#e6db74">&amp;#34;&lt;/span>:&lt;span style="color:#e6db74">&amp;#34;&lt;/span>$USER&lt;span style="color:#e6db74">&amp;#34;&lt;/span> /home/&lt;span style="color:#e6db74">&amp;#34;&lt;/span>$USER&lt;span style="color:#e6db74">&amp;#34;&lt;/span>/.docker -R
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo chmod g+rwx &lt;span style="color:#e6db74">&amp;#34;&lt;/span>$HOME&lt;span style="color:#e6db74">/.docker&amp;#34;&lt;/span> -R
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Cosmetic, not dangerous. It will nag until you clear it.&lt;/p>
&lt;h2 id="what-to-do-instead-honestly">What to do instead, honestly&lt;/h2>
&lt;p>I am not going to tell you never to join the docker group. Plenty of people should. The point is to do it knowing what it is.&lt;/p>
&lt;p>&lt;strong>Rootless mode&lt;/strong> is the real fix, because it removes the root daemon rather than gating access to one. It has genuine limitations and I have not run it long enough under a homelab workload to tell you which of those bite in practice, so I will not pretend otherwise.&lt;/p>
&lt;p>&lt;strong>&lt;code>sudo docker&lt;/code>&lt;/strong> keeps every invocation authenticated and logged. It is mildly annoying and it is the correct default on a machine that is not yours alone.&lt;/p>
&lt;p>&lt;strong>Join the group deliberately&lt;/strong> on a box where root-equivalent access is already a thing you accept. On a dedicated homelab Docker host that you administer alone and could rebuild in an afternoon, the trade is reasonable and I would make it.&lt;/p>
&lt;p>What I would not do is join the group on a shared machine, a work laptop, or anything with credentials on it you would not want a container to read, and then tell myself it was a permissions tweak.&lt;/p>
&lt;p>The same reasoning governs anything you point at that socket. A &lt;a href="https://techfuelhq.com/tutorials/dockge-docker-compose-manager-2026/">Dockge&lt;/a> or Portainer container with the socket mounted is not a dashboard; it is that same root-equivalent access with a web login in front of it.&lt;/p>
&lt;h2 id="the-docker-desktop-exception">The Docker Desktop exception&lt;/h2>
&lt;p>This is the one place the warning genuinely does not carry over. On Docker Desktop the daemon and your containers run inside a Linux VM, and Docker documents that VM as the security boundary. Container root is not host root in the way it is on a native Linux install.&lt;/p>
&lt;p>Do not port the Linux Engine threat model onto Desktop unexamined. Do not port Desktop&amp;rsquo;s comfort back onto a Linux server either — on Windows, &lt;code>docker-users&lt;/code> carries its own warning, in Docker&amp;rsquo;s words equivalent to granting administrative privileges on the host.&lt;/p>
&lt;h2 id="what-i-have-not-tested">What I have not tested&lt;/h2>
&lt;p>I have not run rootless mode as a daily driver, so I cannot tell you where its limitations actually hurt versus where they are theoretical.&lt;/p>
&lt;p>I have not audited whether any mainstream distro ships auditd rules that would record socket writes by group members. My claim above is that &lt;code>sudo&lt;/code> logs and group membership does not, which follows from how each works, but I have not sat down and confirmed what a default install captures.&lt;/p>
&lt;h2 id="what-getting-this-wrong-costs">What getting this wrong costs&lt;/h2>
&lt;p>On your own homelab box, usually nothing. That is exactly why the habit spreads.&lt;/p>
&lt;p>The bill arrives somewhere else. It arrives when the same muscle memory runs &lt;code>usermod -aG docker&lt;/code> on a shared build server, and the service account that now has passwordless unlogged root is the one whose CI token leaks six months later. Nobody has to attack Docker. The group was the grant.&lt;/p>
&lt;p>Run the command if it suits your machine. Just do not believe it only saves you four keystrokes.&lt;/p></description></item><item><title>Docker Cleanup: Which Prune Command Eats Your Data (2026)</title><link>https://techfuelhq.com/tutorials/docker-cleanup-disk-space-2026/</link><pubDate>Sat, 15 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/tutorials/docker-cleanup-disk-space-2026/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · 2026-08-15 · ~8 min read · St. Louis County, MO&lt;/p>
&lt;p>The received wisdom is simple. &lt;code>docker system prune -a --volumes&lt;/code> eats databases, so never run it.&lt;/p>
&lt;p>That fear is aimed at the wrong command. Docker&amp;rsquo;s own options table describes &lt;code>--volumes&lt;/code> as &lt;strong>&amp;ldquo;Prune anonymous volumes&amp;rdquo;&lt;/strong>, and the confirmation prompt spells out what it will remove: all anonymous volumes not used by at least one container. A named volume is not anonymous. If your Postgres data lives in a volume you named in a compose file, &lt;code>docker system prune -a --volumes&lt;/code> is not the thing that will take it.&lt;/p>
&lt;p>The command that removes named volumes is this one.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>docker volume prune --all
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Docker documents that by default &lt;code>docker volume prune&lt;/code> only removes anonymous volumes, and that &lt;code>--all&lt;/code> removes all unused volumes, not just anonymous ones, behind an API 1.42 gate. Read those two sentences next to each other and the asymmetry is obvious: the destructive option is a four-character flag on a command whose name sounds like it only touches leftovers.&lt;/p>
&lt;p>So the scary-sounding command is narrower than its reputation. The mild-sounding one is the loaded gun. That inversion — feared command safe, safe-sounding command dangerous — is the whole reason this page exists.&lt;/p>
&lt;p>One honest caveat before you act on any of it. Everything above is read from Docker&amp;rsquo;s current documentation, not from a test I ran on this machine. I have no Docker daemon here, and I would rather say so than imply a bench I did not use. There is a two-minute scratch test at the end. Run it first. Trust it over me.&lt;/p>
&lt;h2 id="look-before-you-sweep">Look before you sweep&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>docker system df
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>That breaks usage into images, containers, local volumes and build cache, with a reclaimable column. Run it first. Every time.&lt;/p>
&lt;p>I push this because &amp;ldquo;reclaim disk space&amp;rdquo; is usually the wrong framing, and running a prune before you have looked at &lt;code>docker system df&lt;/code> is how people end up re-pulling forty gigabytes of images to solve a problem that was one container writing an unbounded log file the whole time. The question is what filled the disk, and the answer changes the fix entirely. Build cache on a machine that builds often is a different problem from forty pulled images you never run, which is different again from one container writing an unbounded log. Only one of those is solved by pruning.&lt;/p>
&lt;h2 id="what-each-command-removes">What each command removes&lt;/h2>
&lt;p>&lt;strong>&lt;code>docker system prune&lt;/code>&lt;/strong>, per its confirmation prompt, removes exactly four things:&lt;/p>
&lt;ul>
&lt;li>all stopped containers&lt;/li>
&lt;li>all networks not used by at least one container&lt;/li>
&lt;li>all dangling images&lt;/li>
&lt;li>unused build cache&lt;/li>
&lt;/ul>
&lt;p>No volumes at all. A dangling image — one that no tag points at any more — is typically what is left after rebuilding under the same tag.&lt;/p>
&lt;p>&lt;strong>&lt;code>docker system prune -a&lt;/code>&lt;/strong> adds, per the options table: &lt;em>Remove all unused images not just dangling ones&lt;/em>.&lt;/p>
&lt;p>This is a much wider sweep than it reads. &amp;ldquo;Unused&amp;rdquo; means no container is associated with the image, tagged or not. On a homelab where you keep images around for things you run occasionally, &lt;code>-a&lt;/code> removes them and you will pull them again over your home connection at the least convenient moment. It is safe for your data. It is expensive for your time.&lt;/p>
&lt;p>&lt;strong>&lt;code>docker system prune --volumes&lt;/code>&lt;/strong> adds anonymous volumes, as covered above.&lt;/p>
&lt;p>&lt;strong>&lt;code>docker volume prune&lt;/code>&lt;/strong> takes anonymous volumes only, by default.&lt;/p>
&lt;p>&lt;strong>&lt;code>docker volume prune --all&lt;/code>&lt;/strong> is the one to watch. Unused named volumes go too.&lt;/p>
&lt;p>&lt;strong>&lt;code>docker builder prune&lt;/code>&lt;/strong> takes build cache only. It is the safest command here, because build cache is reproducible by definition. On a machine that builds regularly it is also often the entire problem.&lt;/p>
&lt;h2 id="the-trap-that-is-genuinely-real">The trap that is genuinely real&lt;/h2>
&lt;p>Here is the case where you can genuinely lose data to anonymous-volume pruning. It is not the one people worry about.&lt;/p>
&lt;p>Some official images declare a &lt;code>VOLUME&lt;/code> in their Dockerfile. Postgres declares one at its data directory. When you start such an image without giving it a named volume or a bind mount, Docker satisfies that declaration by creating an anonymous volume. It has a long hex name you never chose. It holds your actual database.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># creates an anonymous volume holding real data&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker run -d postgres:17
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># creates a named volume you control&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker run -d -v pgdata:/var/lib/postgresql/data postgres:17
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Stop that first container and the anonymous volume is now unused, and squarely in scope for &lt;code>--volumes&lt;/code>.&lt;/p>
&lt;p>So the failure mode is not &amp;ldquo;prune ate my named volume&amp;rdquo;. It is &amp;ldquo;I never named the volume, so Docker quietly named it for me, that autogenerated name made it anonymous by definition, and anonymous is precisely the category the flag I ran was documented to remove&amp;rdquo;. The fix is upstream of any prune command: name your volumes. A compose file with a top-level &lt;code>volumes:&lt;/code> block gets this right by default, which is one more reason to run things through compose rather than long &lt;code>docker run&lt;/code> lines.&lt;/p>
&lt;h2 id="what-i-run-weekly">What I run weekly&lt;/h2>
&lt;p>Weekly, on a homelab Docker host, with the reasoning attached:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>docker system df &lt;span style="color:#75715e"># look first&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker builder prune &lt;span style="color:#75715e"># cache is reproducible&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker system prune &lt;span style="color:#75715e"># stopped containers, unused networks, dangling images&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>That reclaims most of what accumulates. It touches nothing you cannot rebuild.&lt;/p>
&lt;p>I add &lt;code>-a&lt;/code> only when I have decided I am willing to re-pull, which on a metered or slow connection is a real cost rather than a theoretical one.&lt;/p>
&lt;p>I never run &lt;code>docker volume prune --all&lt;/code> on a schedule. A volume is the one thing here that might be the only copy. When I want a specific volume gone, I look at it first and then remove it by name, which is slower in exactly the way that a command capable of destroying the only copy of something ought to be:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>docker volume ls
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker volume inspect &amp;lt;name&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker volume rm &amp;lt;name&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Slower. It also makes me say what I mean.&lt;/p>
&lt;h2 id="the-scratch-test-so-you-do-not-have-to-take-my-word-for-it">The scratch test, so you do not have to take my word for it&lt;/h2>
&lt;p>Two minutes, on a machine where losing the test volumes costs nothing.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>docker volume create keepme
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker run -d --name anon-test postgres:17 &lt;span style="color:#75715e"># anonymous volume&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker run -d --name named-test -v keepme:/data alpine sleep &lt;span style="color:#ae81ff">60&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker rm -f anon-test named-test
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker volume ls &lt;span style="color:#75715e"># note what exists&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker system prune -a --volumes &lt;span style="color:#75715e"># the feared command&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker volume ls &lt;span style="color:#75715e"># keepme should still be here&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If &lt;code>keepme&lt;/code> survives and the hex-named one does not, the documented behaviour holds on your version. If it does not survive, I want to know — that would mean the docs and your daemon disagree, which is a much more interesting problem than a tidy disk.&lt;/p>
&lt;h2 id="what-i-have-not-tested">What I have not tested&lt;/h2>
&lt;p>I have not run any of this on a live daemon during this write-up, for the reason given at the top. Every behavioural claim here traces to Docker&amp;rsquo;s current CLI documentation.&lt;/p>
&lt;p>I have not checked how an older daemon behaves, and this is the gap I would most want closed before anyone runs these commands on a long-lived box that has not been updated in a couple of years. &lt;code>--all&lt;/code> on &lt;code>docker volume prune&lt;/code> carries an API 1.42 gate, which implies the pre-1.42 behaviour differed, and I have not established what a new CLI does against an old daemon. If you are on something long-lived and unpatched, test rather than assume.&lt;/p>
&lt;p>I have not measured how much any of this reclaims in practice. That number is a property of your machine, and quoting mine would tell you nothing.&lt;/p>
&lt;h2 id="what-getting-it-wrong-costs">What getting it wrong costs&lt;/h2>
&lt;p>Pruning images costs you a download. Pruning build cache costs one slow build. Both are annoyances with a known price.&lt;/p>
&lt;p>Pruning a volume costs you whatever was in it, and the price is only discovered later, usually when something tries to read data that is no longer there and fails in a way that does not obviously say &amp;ldquo;your volume is gone&amp;rdquo;. If that data mattered, the real lesson is not about prune flags at all. It is that a volume you would miss should be &lt;a href="https://techfuelhq.com/homelab/restic-vs-borg-vs-kopia-2026/">backed up&lt;/a>, because a wrong flag is only one of many ways to lose it.&lt;/p></description></item><item><title>Docker Compose Environment Variables: .env Is Not env_file (2026)</title><link>https://techfuelhq.com/tutorials/docker-compose-environment-variables-2026/</link><pubDate>Sat, 15 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/tutorials/docker-compose-environment-variables-2026/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · 2026-08-15 · ~9 min read · St. Louis County, MO&lt;/p>
&lt;p>Put a &lt;code>.env&lt;/code> file next to your &lt;code>compose.yaml&lt;/code>, fill it with variables, start the stack, and exec into the container to check.&lt;/p>
&lt;p>They are not there.&lt;/p>
&lt;p>This is the single most common Compose confusion. It is also not carelessness.&lt;/p>
&lt;p>The two mechanisms have similar names, similar syntax, and point in opposite directions.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>.env&lt;/code>&lt;/strong> fills &lt;code>${VAR}&lt;/code> placeholders &lt;strong>in the compose file itself&lt;/strong>. By itself it puts nothing in a container.&lt;/li>
&lt;li>&lt;strong>&lt;code>env_file:&lt;/code>&lt;/strong> passes variables &lt;strong>into the container&lt;/strong>, and is not consulted when Compose interpolates the compose file.&lt;/li>
&lt;/ul>
&lt;p>Docker says the first half plainly. Their precedence page notes that the Host OS environment and &lt;code>.env&lt;/code> file columns are listed only for illustration purposes, and that in reality they do not result in a variable in the container by itself.&lt;/p>
&lt;p>Read that twice. It is the whole article.&lt;/p>
&lt;h2 id="the-two-directions-side-by-side">The two directions, side by side&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># .env (interpolation source)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">POSTGRES_VERSION=17&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># compose.yaml&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">services&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">db&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">image&lt;/span>: &lt;span style="color:#ae81ff">postgres:${POSTGRES_VERSION} &lt;/span> &lt;span style="color:#75715e"># .env fills THIS&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">env_file&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">db.env &lt;/span> &lt;span style="color:#75715e"># this goes INTO the container&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">environment&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">TZ=America/Chicago &lt;/span> &lt;span style="color:#75715e"># so does this&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>POSTGRES_VERSION&lt;/code> never reaches the container.&lt;/p>
&lt;p>&lt;code>TZ&lt;/code> and everything in &lt;code>db.env&lt;/code> do reach it, and neither of them can interpolate anything, which means the file you edited and the file you needed to edit are frequently different files.&lt;/p>
&lt;p>The mirror-image mistake is just as common and harder to spot:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">services&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">web&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">image&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;webapp:${TAG}&amp;#34;&lt;/span> &lt;span style="color:#75715e"># TAG will NOT come from env_file&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">env_file&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">.env&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Listing &lt;code>.env&lt;/code> under &lt;code>env_file:&lt;/code> does not make its contents available for interpolation. It makes them available inside the container, which is a different thing that you did not ask for.&lt;/p>
&lt;h2 id="precedence-in-the-order-docker-documents">Precedence, in the order Docker documents&lt;/h2>
&lt;p>Highest to lowest, for what ends up in the container:&lt;/p>
&lt;ol>
&lt;li>&lt;code>docker compose run -e&lt;/code> on the CLI&lt;/li>
&lt;li>&lt;code>environment&lt;/code> or &lt;code>env_file&lt;/code> &lt;strong>with no value&lt;/strong> — passes through from your shell&lt;/li>
&lt;li>the &lt;code>environment&lt;/code> attribute&lt;/li>
&lt;li>the &lt;code>env_file&lt;/code> attribute&lt;/li>
&lt;li>a Dockerfile &lt;code>ARG&lt;/code> or &lt;code>ENV&lt;/code>&lt;/li>
&lt;/ol>
&lt;p>Two entries in that list catch people.&lt;/p>
&lt;p>&lt;strong>&lt;code>environment&lt;/code> beats &lt;code>env_file&lt;/code>, even when it is empty.&lt;/strong> Docker&amp;rsquo;s wording is explicit that this holds true even if those values are empty or undefined. So a leftover &lt;code>FOO=&lt;/code> under &lt;code>environment:&lt;/code> silently overrides a correct &lt;code>FOO&lt;/code> in your env file. Nothing warns you. The variable is simply empty, and you spend the next twenty minutes reading the env file, which is correct, because the problem is in the other file entirely.&lt;/p>
&lt;p>&lt;strong>A Dockerfile default is a fallback.&lt;/strong> The docs state that having any &lt;code>ARG&lt;/code> or &lt;code>ENV&lt;/code> setting in a Dockerfile evaluates only if there is no Compose entry for &lt;code>environment&lt;/code>, &lt;code>env_file&lt;/code> or &lt;code>run --env&lt;/code>. You do not layer on top of it. You replace it entirely.&lt;/p>
&lt;p>There is also a second, &lt;em>different&lt;/em> precedence list in the docs covering interpolation: shell, then &lt;code>--env-file&lt;/code>, then the project &lt;code>.env&lt;/code>. Two lists. Two jobs. Reading one and applying it to the other is how people end up certain the docs contradict themselves.&lt;/p>
&lt;h2 id="the-silent-failures">The silent failures&lt;/h2>
&lt;p>This is what makes the topic worth a page rather than a paragraph.&lt;/p>
&lt;p>Almost every way to get it wrong fails quietly.&lt;/p>
&lt;p>&lt;strong>Unset interpolated variables become empty strings, not errors.&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">image&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;postgres:${POSTGRES_VERSION}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>With &lt;code>POSTGRES_VERSION&lt;/code> unset, that resolves to &lt;code>postgres:&lt;/code>, which the docs note is not a valid image reference.&lt;/p>
&lt;p>Compose builds the string anyway and hands you the failure one layer down, where the error message talks about an image rather than about the variable that produced it, so the search you run next is the wrong search.&lt;/p>
&lt;p>&lt;strong>Bare passthrough does not warn; the explicit form does.&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">environment&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">DEBUG &lt;/span> &lt;span style="color:#75715e"># unset? no warning, nothing passed&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">DEBUG=${DEBUG} &lt;/span> &lt;span style="color:#75715e"># unset? Compose warns&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Both are legal. Only the second tells you when the shell had nothing to give. I use it for that reason alone.&lt;/p>
&lt;p>&lt;strong>A missing &lt;code>--env-file&lt;/code> is a hard error. A missing &lt;code>.env&lt;/code> is silent.&lt;/strong>&lt;/p>
&lt;p>That asymmetry is deliberate. A path you named explicitly is a promise; the default is optional. It also means a stack that runs on your laptop can start on the server with a chunk of its configuration quietly absent, because &lt;code>.env&lt;/code> was never committed and nobody noticed it was gone.&lt;/p>
&lt;p>I check for that first now, whenever something runs locally and not on the host. It is nearly always this.&lt;/p>
&lt;h2 id="secrets-do-not-belong-here">Secrets do not belong here&lt;/h2>
&lt;p>Anything you put in the container environment is readable with &lt;code>docker inspect&lt;/code>. That means it is readable by anyone who can reach the Docker socket — and on a Linux host, &lt;a href="https://techfuelhq.com/tutorials/add-user-to-docker-group-2026/">that is anyone in the docker group&lt;/a>, which is root-equivalent access anyway.&lt;/p>
&lt;p>Compose supports file-based secrets that arrive at &lt;code>/run/secrets/&amp;lt;name&amp;gt;&lt;/code> instead:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">services&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">db&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">image&lt;/span>: &lt;span style="color:#ae81ff">postgres:17&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">environment&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">POSTGRES_PASSWORD_FILE&lt;/span>: &lt;span style="color:#ae81ff">/run/secrets/db_password&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">secrets&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">db_password&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">secrets&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">db_password&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">file&lt;/span>: &lt;span style="color:#ae81ff">./db_password.txt&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Note the pattern in that block. The environment variable holds a path. The secret itself never enters the environment. Many official images support a &lt;code>_FILE&lt;/code> suffix on their password variables for exactly this, and where an image supports it, it is strictly better than pasting the value.&lt;/p>
&lt;p>&lt;code>ARG&lt;/code> deserves a specific warning too: build arguments are visible in the image history. An &lt;code>ARG&lt;/code> carrying a token is published rather than private, and it stays published in every layer built from it.&lt;/p>
&lt;h2 id="what-i-do">What I do&lt;/h2>
&lt;p>A &lt;code>.env&lt;/code> for things that shape the compose file: versions, ports, host paths.&lt;/p>
&lt;p>An &lt;code>env_file&lt;/code> per service for what the application reads.&lt;/p>
&lt;p>&lt;code>environment&lt;/code> for one or two values I want visible in the compose file itself, so that reading the file tells the truth about what the service gets rather than sending the reader off to a second file to find out.&lt;/p>
&lt;p>The rule I hold to, after being bitten by the empty-override: &lt;strong>never set the same variable in two places.&lt;/strong> Precedence rules exist so that Compose can resolve a conflict, not so that I can create one and rely on remembering the order at 1am.&lt;/p>
&lt;h2 id="what-i-have-not-tested">What I have not tested&lt;/h2>
&lt;p>I have not verified the behaviour on old Compose v1. Everything here is from current Compose documentation, and v1 differed in enough places that I would not extend it there.&lt;/p>
&lt;p>I have not tested how the newer top-level &lt;code>include:&lt;/code> interacts with &lt;code>.env&lt;/code> resolution across multiple compose files, which is the case I would most expect to hold a surprise.&lt;/p>
&lt;h2 id="what-getting-it-wrong-costs">What getting it wrong costs&lt;/h2>
&lt;p>Usually an hour. The hour has a distinctive shape: the configuration looks correct, the container disagrees, and nothing produces an error that points at either one.&lt;/p>
&lt;p>Occasionally it costs more. &lt;code>environment&lt;/code> silently overriding an env-file value with an empty string is a fine way to start a database with an empty password variable, and the failure mode there depends entirely on how forgiving the image is about it. Some are not forgiving at all, which is the good outcome.&lt;/p></description></item><item><title>Dockge Setup: The Compose Manager That Does Less On Purpose (2026)</title><link>https://techfuelhq.com/tutorials/dockge-docker-compose-manager-2026/</link><pubDate>Sat, 15 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/tutorials/dockge-docker-compose-manager-2026/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · 2026-08-15 · ~7 min read · St. Louis County, MO&lt;/p>
&lt;p>Dockge is a web UI over a folder of &lt;code>docker-compose.yaml&lt;/code> files. That sentence is the entire product. I mean it as praise.&lt;/p>
&lt;p>The install is one container. Five minutes, most of it waiting on a pull. The thing worth reading this page for is the volume line in the middle of that file, because getting it wrong is the one failure the project cared enough about to put a warning emoji beside in its own README, and because it fails quietly rather than loudly.&lt;/p>
&lt;h2 id="the-compose-file">The compose file&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">services&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">dockge&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">image&lt;/span>: &lt;span style="color:#ae81ff">louislam/dockge:1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">restart&lt;/span>: &lt;span style="color:#ae81ff">unless-stopped&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">ports&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">5001&lt;/span>:&lt;span style="color:#ae81ff">5001&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">volumes&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">/var/run/docker.sock:/var/run/docker.sock&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">./data:/app/data&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># Both sides of this MUST be the same path. See below.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">/opt/stacks:/opt/stacks&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">environment&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">DOCKGE_STACKS_DIR=/opt/stacks&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">PUID=1000&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">PGID=1000&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>mkdir -p /opt/dockge /opt/stacks &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> cd /opt/dockge
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># save the file above as compose.yaml&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker compose up -d
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Then open port 5001 and create the admin account. Done.&lt;/p>
&lt;h2 id="before-you-run-that-the-stable-image-is-old">Before you run that: the stable image is old&lt;/h2>
&lt;p>I nearly published this page without checking. That would have been a disservice, so here it is up front, ahead of the install advice rather than buried in a caveats section at the bottom where nobody reads it.&lt;/p>
&lt;p>Dockge 1.5.0 was released on &lt;strong>30 March 2025&lt;/strong>. On Docker Hub the tags &lt;code>1&lt;/code>, &lt;code>latest&lt;/code> and &lt;code>1.5.0&lt;/code> all resolve to one digest, and all three were last pushed that same day. The &lt;code>1&lt;/code> tag in the compose file above is therefore an image that has not been rebuilt in roughly sixteen months.&lt;/p>
&lt;p>The project is not abandoned. Master took commits into April 2026, and there is a &lt;code>nightly&lt;/code> tag rebuilt daily from it, which I confirmed had been pushed the day I wrote this. What has stalled is the &lt;em>release&lt;/em>. The gap between the code and the artefact you actually pull is the part that matters, and it is the part a version number on a README will never show you.&lt;/p>
&lt;p>Now weigh that against the socket mount in the next section. This is a container holding root-equivalent access to your host, running an image whose base layers have not been refreshed in over a year. Those two facts are worse together than either is alone.&lt;/p>
&lt;p>I still think it is worth running. On a LAN-only host, behind a proxy, on a homelab you could rebuild in an afternoon. I would not put it on anything internet-facing, and I would not put it on a machine whose loss would ruin a week. You can pin &lt;code>nightly&lt;/code> for the newer code. Then you are on unreviewed daily builds, which is a different risk, not a smaller one.&lt;/p>
&lt;p>Check the dates yourself before installing. They may well have moved since I wrote this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>curl -s &lt;span style="color:#e6db74">&amp;#34;https://hub.docker.com/v2/repositories/louislam/dockge/tags?page_size=10&amp;amp;ordering=last_updated&amp;#34;&lt;/span> | python -c &lt;span style="color:#e6db74">&amp;#34;import json,sys; [print(t[&amp;#39;name&amp;#39;], t[&amp;#39;last_updated&amp;#39;][:10]) for t in json.load(sys.stdin)[&amp;#39;results&amp;#39;]]&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="the-volume-line">The volume line&lt;/h2>
&lt;p>Look at the stacks mount again:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>- &lt;span style="color:#ae81ff">/opt/stacks:/opt/stacks&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Host path on the left, container path on the right. They are identical, and that is not stylistic. The README&amp;rsquo;s own examples are blunt about it — it marks &lt;code>/my-stacks:/my-stacks&lt;/code> correct because both paths match, and &lt;code>/docker:/my-stacks&lt;/code> wrong because they do not, with the warning that your data could end up written into a wrong path.&lt;/p>
&lt;p>Here is why. &amp;ldquo;Just do it&amp;rdquo; is unsatisfying, and you will meet this shape again.&lt;/p>
&lt;p>Dockge talks to the Docker daemon through the socket you mounted. When it asks the daemon to bring up a stack, the daemon resolves every path in that compose file &lt;strong>on the host&lt;/strong>, not inside the Dockge container. So Dockge writes a compose file to what it believes is &lt;code>/opt/stacks/immich/compose.yaml&lt;/code>, and the daemon goes looking for that same path on the host. If your bind was &lt;code>/docker:/opt/stacks&lt;/code>, then Dockge&amp;rsquo;s &lt;code>/opt/stacks/immich&lt;/code> is really &lt;code>/docker/immich&lt;/code> on the host, and the two halves of the system now disagree about where your stacks live.&lt;/p>
&lt;p>Make both sides identical and the disagreement cannot happen. It is the same class of problem as any socket-mounted tool that hands paths to the daemon, and the fix is always the same: agree with the host.&lt;/p>
&lt;p>&lt;code>/opt/stacks&lt;/code> is only a convention, and &lt;code>/srv/stacks:/srv/stacks&lt;/code> would do just as well, because what the daemon cares about is that the two sides agree rather than what they agree on. Matching is the rule. The path is yours.&lt;/p>
&lt;h2 id="what-it-deliberately-will-not-do">What it deliberately will not do&lt;/h2>
&lt;p>Dockge is compose-only. It will not manage standalone containers, networks, images, or the rest of the Docker surface Portainer covers.&lt;/p>
&lt;p>I think that is the most interesting thing about it. It is also the part people get annoyed by, because they arrive expecting a Portainer swap and find something with a deliberately smaller footprint instead. If every workload you run is a compose stack — which, in a homelab, it usually is — then a tool that only does stacks has a much smaller surface to be confusing in. If you regularly poke at networks or one-off containers, Dockge will not cover that and you will keep a terminal open. Neither of those is a defect. They are just different jobs.&lt;/p>
&lt;p>I compare it properly against the two obvious alternatives in &lt;a href="https://techfuelhq.com/homelab/komodo-vs-portainer-vs-dockge-2026/">Komodo vs Portainer vs Dockge&lt;/a>, including the licensing change that pushed a lot of people to look in the first place.&lt;/p>
&lt;h2 id="security-briefly-because-the-socket-mount-deserves-it">Security, briefly, because the socket mount deserves it&lt;/h2>
&lt;p>That first volume line mounts the Docker socket into the container. Anything that can reach the Docker socket can start a container that mounts your host filesystem as root. That is not a partial privilege. It is root.&lt;/p>
&lt;p>So the Dockge UI is not a dashboard. It is a root-equivalent control surface with a login form in front of it. Treat it that way:&lt;/p>
&lt;ul>
&lt;li>Do not publish 5001 to the internet. Put it behind &lt;a href="https://techfuelhq.com/tutorials/nginx-proxy-manager-homelab-2026/">Nginx Proxy Manager&lt;/a> with a real certificate, or reach it over a tunnel and leave it on the LAN entirely.&lt;/li>
&lt;li>Give it a password you did not reuse.&lt;/li>
&lt;/ul>
&lt;p>If you already run &lt;a href="https://techfuelhq.com/tutorials/uptime-kuma-docker-setup-2026/">Uptime Kuma&lt;/a>, the same reasoning applies there and the same fix works for both.&lt;/p>
&lt;h2 id="puid-and-pgid">PUID and PGID&lt;/h2>
&lt;p>The official file sets both to 1000, and its comment is worth repeating: both must be set for it to do anything. Setting one alone does nothing at all.&lt;/p>
&lt;p>They decide who owns the stack files Dockge writes. Get them wrong and the symptom is undramatic — you SSH in later, try to edit a compose file by hand, and cannot, because it belongs to someone else. &lt;code>id -u&lt;/code> and &lt;code>id -g&lt;/code> give you the right numbers for your own user.&lt;/p>
&lt;h2 id="adopting-stacks-you-already-have">Adopting stacks you already have&lt;/h2>
&lt;p>Dockge reads a directory. There is no import step, and no separate database holding the real state, so a compose file you drop into the stacks directory is simply a stack it can see.&lt;/p>
&lt;p>That property is the reason I find it easy to recommend trying. The compose files are the state. Nothing else is. If you decide against it in a month, you stop the container and your stacks are exactly where you left them, in plain files, unchanged. Tools that own their state are a commitment; this one is a visit.&lt;/p>
&lt;h2 id="what-i-have-not-tested">What I have not tested&lt;/h2>
&lt;p>I have not run the agent/multi-host setup, so I cannot tell you how it behaves when a remote host goes away mid-deploy, which is the case I would want to know about before depending on it.&lt;/p>
&lt;p>I have not measured its resource use, and I would rather say that than quote a figure I did not take.&lt;/p>
&lt;p>I have also not run it against a stack large enough to make the UI struggle, so I do not know where that boundary sits.&lt;/p>
&lt;h2 id="what-getting-the-volume-wrong-costs">What getting the volume wrong costs&lt;/h2>
&lt;p>Not much, if you catch it on day one. You notice the stacks are not where you expected, you fix the bind, you move on.&lt;/p>
&lt;p>The expensive version is catching it in month four, after you have pointed a backup job at &lt;code>/opt/stacks&lt;/code> on the host and it has been faithfully archiving an empty directory the whole time. The compose files were always at &lt;code>/docker&lt;/code>. Nothing errored, because nothing was wrong from any single component&amp;rsquo;s point of view.&lt;/p>
&lt;p>Check the two paths match. Before anything else.&lt;/p></description></item></channel></rss>