<?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>Sat, 15 Aug 2026 00:41: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>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><item><title>Headscale: Self-Hosting the Tailscale Control Server (2026)</title><link>https://techfuelhq.com/networking/headscale-self-hosted-tailscale-2026/</link><pubDate>Sat, 15 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/networking/headscale-self-hosted-tailscale-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>Most people who look up Headscale want to run it on the machine already humming in their closet. That is the one deployment it does not do.&lt;/p>
&lt;p>Headscale&amp;rsquo;s own requirements page asks for a server with a public IP address, recommends dual-stack IPv4 and IPv6, and serves over HTTPS on port 443 because the Tailscale client assumes that in certain situations. If your home connection sits behind CGNAT, you have no public IP to hand it. If it does have a real public IP, you can technically proceed, and you will have built a coordination server that depends on the same uplink as everything it coordinates.&lt;/p>
&lt;p>So the shape of a Headscale deployment is fixed before you write any config: &lt;strong>a small host somewhere else, with a public address and a name you can put a certificate on.&lt;/strong>&lt;/p>
&lt;p>That is the practical answer. The more useful answer is the next section.&lt;/p>
&lt;h2 id="first-the-case-against-doing-this">First, the case against doing this&lt;/h2>
&lt;p>Tailscale&amp;rsquo;s free Personal plan covers up to 6 users with unlimited user devices, 3 ACL groups, and access to nearly all features. It costs nothing and it is explicitly intended for homelabs and personal projects.&lt;/p>
&lt;p>Read that against your actual situation. One person, a NAS, a Proxmox host, three VMs, a laptop and a phone? You are not close to a limit. There is no bill coming. Headscale would replace a working, maintained, zero-cost service with one you patch, back up, and get paged about.&lt;/p>
&lt;p>I want to be blunt, because the search results for this topic are not: &lt;strong>for the majority of homelabs, Headscale solves a problem you do not have.&lt;/strong> Running it is a hobby in its own right, and that is a completely legitimate reason to run it. It is not the same reason as necessity, and the two get blurred constantly.&lt;/p>
&lt;p>Three situations where it genuinely earns the work:&lt;/p>
&lt;p>&lt;strong>You object to the metadata, not the cost.&lt;/strong> Tailscale&amp;rsquo;s coordination server knows your device names, your public keys, and who connects to what. The traffic is end-to-end encrypted and they cannot read it, but the graph is theirs. If that specific fact is what bothers you, Headscale is a direct answer and no amount of free tier fixes it.&lt;/p>
&lt;p>&lt;strong>Your structure does not fit the Personal plan.&lt;/strong> More than 6 users, or an ACL model that needs more than 3 groups, and you are looking at a paid tier. At that point the comparison is a real one.&lt;/p>
&lt;p>&lt;strong>You want the control plane to survive theirs.&lt;/strong> Existing tailnets keep passing traffic when the coordination server is unreachable, but new nodes and key rotations do not. If your tolerance for that is zero, owning the control plane is the only fix.&lt;/p>
&lt;p>Everything else — &amp;ldquo;self-hosting is better,&amp;rdquo; &amp;ldquo;I want to own my stack&amp;rdquo; — is preference, and preference is fine. Just price it honestly against a free service that already works.&lt;/p>
&lt;h2 id="what-it-does-support">What it does support&lt;/h2>
&lt;p>The 2026 feature list is broad, which surprised me. Node registration by web auth and pre-auth keys, MagicDNS, split DNS and search domains, tags, subnet routers, exit nodes with route filtering, dual-stack, ephemeral nodes, embedded DERP and peer relays, ACLs and grants, autogroups, Tailscale SSH, OIDC single sign-on, Taildrop and Taildrive, Funnel and Serve, network flow logs.&lt;/p>
&lt;p>The documented gap worth checking before you commit: &lt;strong>OIDC groups cannot be used in ACLs.&lt;/strong> If your plan was to point Headscale at your identity provider and let group membership drive access policy, that specific path is closed. Verify it against your intended policy now rather than after you have migrated forty nodes.&lt;/p>
&lt;p>Headscale is not a Tailscale product. It reimplements a protocol it does not control, which is the standing structural risk with anything in this category and is worth naming even though the project has tracked upstream well.&lt;/p>
&lt;h2 id="the-host">The host&lt;/h2>
&lt;p>A control server does very little work. It coordinates key exchange and hands out routes, then gets out of the way while nodes talk directly. SQLite is the assumed database in the setup requirements, so there is no separate database tier to size.&lt;/p>
&lt;p>What it needs is not capacity. It is &lt;em>position&lt;/em>:&lt;/p>
&lt;ul>
&lt;li>A public IPv4 address. Dual-stack with IPv6 is recommended.&lt;/li>
&lt;li>Port 443 reachable, with a valid certificate.&lt;/li>
&lt;li>Uptime that is independent of the network it serves.&lt;/li>
&lt;/ul>
&lt;p>Any small VPS tier meets the first two. The third is the one people undercut by hosting it at home, and it is the whole reason the requirement exists.&lt;/p>
&lt;p>There is one more reason not to put it on your home connection, and it is the sharpest: &lt;strong>if Headscale is the thing that lets you reach your homelab remotely, and Headscale lives in your homelab, then you cannot fix your homelab remotely.&lt;/strong> You have built a mesh VPN whose failure mode is a locked door with the key inside. I would put the control server anywhere except the network it exists to let me into.&lt;/p>
&lt;h2 id="the-domain">The domain&lt;/h2>
&lt;p>HTTPS on 443 means a certificate, and a certificate means a hostname. A subdomain on a domain you already own works fine — nothing about this needs a dedicated registration.&lt;/p>
&lt;p>If you do not own one yet, this is the same purchase you would make for any public service, and it is worth doing before the install rather than during it. Certificate issuance is the step where a missing DNS record turns twenty minutes into an evening.&lt;/p>
&lt;h2 id="where-this-sits-against-the-alternatives">Where this sits against the alternatives&lt;/h2>
&lt;p>If you have not committed yet, the comparison is worth doing properly. I have written up &lt;a href="https://techfuelhq.com/networking/tailscale-vs-wireguard-2026/">Tailscale against plain WireGuard&lt;/a>, which is the real decision for most people, and &lt;a href="https://techfuelhq.com/networking/tailscale-vs-cloudflare-tunnel-2026/">Tailscale against Cloudflare Tunnel&lt;/a> for the case where you want to publish rather than connect. &lt;a href="https://techfuelhq.com/networking/netbird-vs-tailscale-2026/">NetBird against Tailscale&lt;/a> covers the other self-hostable mesh worth a look, and it is the one I would compare Headscale to most carefully, because it was designed to be self-hosted rather than adapted to it.&lt;/p>
&lt;p>If you just want remote access to your homelab today and are not attached to owning the control plane, &lt;a href="https://techfuelhq.com/tutorials/tailscale-remote-access-homelab-2026/">Tailscale on a homelab&lt;/a> takes about ten minutes. If you want no third party in the path at all, &lt;a href="https://techfuelhq.com/tutorials/wireguard-self-hosted-vpn-proxmox-2026/">WireGuard on Proxmox&lt;/a> is the honest floor — more manual, no coordination server to run, no vendor.&lt;/p>
&lt;h2 id="what-i-have-not-tested">What I have not tested&lt;/h2>
&lt;p>I have not run Headscale through a Tailscale client major-version bump, which is the failure mode I would most want data on before recommending it to someone whose remote access depends on it. The project tracks upstream well by reputation. Reputation is not a measurement.&lt;/p>
&lt;p>I have not tested the OIDC integration, so I cannot tell you how painful the ACL group limitation is in practice, only that it is documented.&lt;/p>
&lt;p>I have not run it at a scale where SQLite is the constraint.&lt;/p>
&lt;h2 id="what-getting-this-wrong-costs">What getting this wrong costs&lt;/h2>
&lt;p>The expensive version is not a failed install. It is a successful one, six months ago, on a box in the closet, which you have quietly come to depend on. Then the power blips while you are travelling, and the control server that would have let you back in is the thing that is down.&lt;/p>
&lt;p>Put it somewhere else. That is most of the advice on this page.&lt;/p></description></item><item><title>Monitor Shadow Problem: Three Different Faults Wearing One Name (2026)</title><link>https://techfuelhq.com/articles/monitor-shadow-problem-2026/</link><pubDate>Sat, 15 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/articles/monitor-shadow-problem-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>Ten feet.&lt;/p>
&lt;p>That is the run length where ViewSonic stops assuming your HDMI cable is fine — and it is the most useful number in this entire topic, because almost nobody staring at a shadowed screen has stopped to think about how long their cable actually is, how many boxes it passes through on the way, or whether the connector behind the monitor has been quietly oxidising in a warm room since 2019. They are thinking about whether the monitor is dying. It usually is not.&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 style="margin:0 0 0.5rem 0;font-weight:700;color:#c8ff00;letter-spacing:0.04em;text-transform:uppercase;font-size:0.85rem;">TL;DR · Find out which shadow you have&lt;/p>
&lt;ul style="margin:0.25rem 0 0 0;padding-left:1.25rem;line-height:1.55;">
&lt;li>&lt;strong>Drag a window across the screen and watch the shadow.&lt;/strong> Everything below depends on this one observation.&lt;/li>
&lt;li>&lt;strong>Holds a fixed offset and follows the window&lt;/strong> &amp;rarr; signal path. Pull the dock, reseat the cable, get off VGA. Cheapest fix on the page.&lt;/li>
&lt;li>&lt;strong>Only appears while things move, gone when still&lt;/strong> &amp;rarr; pixel response time. Different fault, different guide.&lt;/li>
&lt;li>&lt;strong>Faint copy of a taskbar or spreadsheet left up for hours&lt;/strong> &amp;rarr; image persistence. Leave it alone and it goes.&lt;/li>
&lt;li>&lt;strong>Cuts through the monitor's own settings menu&lt;/strong> &amp;rarr; the panel itself, and that menu is the referee.&lt;/li>
&lt;/ul>
&lt;/div>
&lt;p>Most guides on this topic make one mistake, and it is why people replace working monitors. They treat &amp;ldquo;shadow&amp;rdquo;, &amp;ldquo;ghosting&amp;rdquo; and &amp;ldquo;double image&amp;rdquo; as one problem with one list of fixes. Search the phrase and you get a single article covering cables and response time and burn-in in the same breath, as though the reader should simply work down the list until something helps. Those are three faults with nothing in common except the word people reach for when describing them.&lt;/p>
&lt;p>The list approach costs you an evening and, often enough, a monitor.&lt;/p>
&lt;h2 id="the-test-that-decides-everything">The test that decides everything&lt;/h2>
&lt;p>Open any window and drag it slowly across the screen.&lt;/p>
&lt;p>If the duplicate travels with the window and keeps the same offset, the image is being corrupted on its way to the panel. If the duplicate only exists during the drag and the screen is clean the moment you let go, the pixels are switching too slowly. If there is no duplicate at all, and what you are seeing is a faint ghost of yesterday&amp;rsquo;s spreadsheet sitting in one place regardless of what gets dragged over the top of it, then nothing is broken and you can stop worrying.&lt;/p>
&lt;p>Three answers. Skip to yours.&lt;/p>
&lt;h2 id="the-shadow-that-holds-still-your-signal-path">The shadow that holds still: your signal path&lt;/h2>
&lt;p>This is the one worth real attention, because it accounts for most of the searches and it is almost always the cheapest thing in the chain.&lt;/p>
&lt;p>A monitor draws what arrives at its input. It cannot do anything else. When the picture arrives degraded, the panel faithfully draws the degradation, and one of the recognisable ways a video signal degrades is as a displaced, lower-contrast copy of the real image. ViewSonic&amp;rsquo;s own support article on shadowing and double images is blunt about the mechanism: image artifacts are typically caused by signal degradation or interference. That is a panel manufacturer describing its own returns.&lt;/p>
&lt;h3 id="vga-sits-at-the-top-of-the-list">VGA sits at the top of the list&lt;/h3>
&lt;p>Let me be careful about how hard I lean on this.&lt;/p>
&lt;p>I have never put a scope on a VGA line myself, and I am not going to pretend otherwise. What I can tell you is what the manufacturer says, and ViewSonic states plainly that low-quality VGA cables are the most common cause of shadowing, with the recommendation to use HDMI or DisplayPort instead.&lt;/p>
&lt;p>The reasoning holds up. VGA carries the picture as an analogue waveform, so degradation along the way lands directly in what you see — no error correction, no fallback, just a slightly wrong voltage arriving at a panel that has no way of knowing it is wrong. A digital link fails differently. It either delivers a pixel correctly or breaks in ways that look nothing like a soft double image: sparkles, black flashes, a dropped signal, a refresh rate that silently falls back to 30Hz. If you are on VGA and both ends have a spare HDMI or DisplayPort, that swap is a five-minute test which costs nothing and settles the question outright. The catch is that plenty of people are running VGA without knowing it, because a VGA-to-HDMI adapter on a monitor&amp;rsquo;s input, or an old KVM with an analogue backbone, keeps the analogue segment sitting in the middle of the chain while the connector at your desk looks perfectly modern and the box on your shelf says nothing about what it does internally.&lt;/p>
&lt;p>Check the back of the monitor before you rule this out.&lt;/p>
&lt;h3 id="every-box-between-the-two-ends-is-a-suspect">Every box between the two ends is a suspect&lt;/h3>
&lt;p>ViewSonic&amp;rsquo;s first recommended step is to remove any docking stations or video splitters and connect the monitor directly to the PC to test the image quality. That ordering is right, and it is the step people skip, because unplugging a dock means unplugging everything.&lt;/p>
&lt;p>Do it anyway. A dock, a splitter, a KVM and a USB-C hub are all re-driving or re-timing your video, and a cheap one does that badly. If the shadow disappears with the monitor plugged straight into the graphics card, you have found it. You also know what the fix costs, which is the part people want before they start. If you arrived here because a second display was misbehaving too, our guide on a &lt;a href="https://techfuelhq.com/articles/second-monitor-not-detected-2026/">second monitor that will not be detected&lt;/a> covers the same hardware from the other direction.&lt;/p>
&lt;h3 id="length-and-the-one-certification-that-means-something">Length, and the one certification that means something&lt;/h3>
&lt;p>Past about ten feet, cable quality stops being a rounding error. ViewSonic&amp;rsquo;s threshold is three metres, and the recommendation is a Premium Certified HDMI cable or a high-quality shielded one.&lt;/p>
&lt;p>That certification is not marketing. Under the Premium HDMI Cable Certification Program, cables are tested to support the full 18Gbps bandwidth, including an EMI test to make sure they minimise interference with wireless signals, and — this is the part that matters for a long desk run — the program requires every length of every model line to be tested at an official HDMI Authorized Test Center, so a 25-foot cable cannot ride in on the results of its 3-foot sibling. Certified cables carry an anti-counterfeiting label with a QR code you can scan in the shop. That is a meaningfully different claim from &amp;ldquo;high speed&amp;rdquo; printed on a bag.&lt;/p>
&lt;p>DisplayPort has an equivalent worth knowing. VESA&amp;rsquo;s DP8K certification confirms a cable handles HBR3 — the 8.1 Gbps-per-lane rate DisplayPort 1.4 tops out at — verified at an authorised test centre rather than asserted on the packaging. It also checks that pin 20 is not wired through on male-to-male cables. That one is a nastier failure than any shadow, since back-driven power can stop a machine booting.&lt;/p>
&lt;h3 id="then-the-boring-physical-things">Then the boring physical things&lt;/h3>
&lt;p>Reseat both ends. ViewSonic asks you to make sure the connectors are clean, with no oxidation, and are seated properly in the port, which sounds like filler right up until you remember what actually happens to a monitor cable behind a desk: it gets yanked when the desk moves, kinked against a wall, stood on by a chair caster, and left in a warm room for six or seven years while nobody once looks at the pins. Then someone buys a new monitor.&lt;/p>
&lt;p>If none of that moves the needle, bring up the monitor&amp;rsquo;s own on-screen menu while the shadow is visible. That menu is drawn by the monitor&amp;rsquo;s internal board and never touches your cable, so a shadow cutting through the menu overlay puts the fault inside the display. I did not invent that test. It is the same referee our guide to &lt;a href="https://techfuelhq.com/articles/lines-on-monitor-screen-2026/">lines on a monitor screen&lt;/a> uses, and it works here for the same reason.&lt;/p>
&lt;h2 id="the-shadow-that-only-exists-in-motion">The shadow that only exists in motion&lt;/h2>
&lt;p>If the duplicate appears behind moving objects and the screen is clean when nothing moves, stop reading this page. You have ghosting, and this page will not help you. That is a pixel response-time problem inside the panel, and the fix is your monitor&amp;rsquo;s overdrive setting rather than anything in the cable chain. We wrote it up separately in &lt;a href="https://techfuelhq.com/articles/how-to-fix-monitor-ghosting-2026/">how to fix monitor ghosting&lt;/a>.&lt;/p>
&lt;p>One thing is worth flagging, because it is the most common wasted purchase in this whole area. A new cable will do nothing for ghosting. Not one thing. The advice on the two faults points in opposite directions, which is exactly why bundling them into one article does readers harm.&lt;/p>
&lt;h2 id="the-shadow-that-fades-on-its-own">The shadow that fades on its own&lt;/h2>
&lt;p>The third case is a faint copy of something that sat on screen for a long time. A taskbar. A spreadsheet grid. A dashboard someone left up over a weekend.&lt;/p>
&lt;p>That is image persistence, and on an LCD it is temporary. Dell&amp;rsquo;s monitor guidance treats it as a condition that clears once the static content stops being shown, and recommends screen savers and varied content as the prevention. Leave the display on ordinary moving content, or switch it off, and it goes. How long that takes ranges from seconds to considerably longer depending on how long the static image sat there, so patience is genuinely part of the fix here.&lt;/p>
&lt;p>Do not buy anything for this one.&lt;/p>
&lt;p>OLED is the exception, and the distinction matters if you are running a TV as a desktop. There, prolonged static content can produce permanent wear rather than temporary retention. That is a different conversation. There is no home fix.&lt;/p>
&lt;h2 id="the-case-where-the-monitor-is-innocent">The case where the monitor is innocent&lt;/h2>
&lt;p>One search that lands people here has nothing to do with display hardware at all. Windows draws drop shadows under window borders, and a display-scaling change or a graphics-driver reset can render those shadows heavier, or leave them stranded behind inactive windows. If your &amp;ldquo;shadow&amp;rdquo; is a soft grey edge hugging window frames, no cable will touch it.&lt;/p>
&lt;p>So take a screenshot. That settles it in about four seconds, because a real signal or panel fault never survives being captured to a file, while a compositor artifact is baked into the image and will look exactly the same on any other machine you open the file on.&lt;/p>
&lt;h2 id="what-i-have-not-tested">What I have not tested&lt;/h2>
&lt;p>I have not reproduced any of these faults on a bench for this article, and the sourcing above reflects that: the signal-path claims are ViewSonic&amp;rsquo;s, the cable-certification specifics are HDMI Licensing&amp;rsquo;s and VESA&amp;rsquo;s, and the image-persistence behaviour is Dell&amp;rsquo;s. Where those sources agree with the physics I have said so, and where I am simply relaying a manufacturer&amp;rsquo;s claim I have tried to make that obvious.&lt;/p>
&lt;p>I also cannot tell you how much of the shadowing people report in 2026 is still VGA. ViewSonic&amp;rsquo;s guidance does not carry a date I can check, and analogue connections have been disappearing from new hardware for a decade while surviving in offices, classrooms and KVM setups. The advice holds either way, since the diagnostic sequence does not depend on which cause turns out to be most common.&lt;/p>
&lt;p>The next thing I would measure, if I put a monitor on the bench for this, is whether a failing HDMI run degrades gradually into visible shadowing or falls off a cliff into sparkle and signal loss with nothing in between. My expectation is the cliff, which would make a soft shadow on a short digital cable a much stronger indicator of a dock or adapter problem than of the cable itself.&lt;/p>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;ul>
&lt;li>ViewSonic Support, &lt;a href="https://www.viewsonic.com/global/support/article?title=Why&amp;#43;is&amp;#43;there&amp;#43;shadow&amp;#43;or&amp;#43;double&amp;#43;image&amp;#43;on&amp;#43;screen%3F&amp;amp;articleId=33000222422" rel="noopener">&amp;ldquo;Why is there shadow or double image on screen?&amp;rdquo;&lt;/a> — signal degradation as cause, VGA as most common source, dock/splitter removal, three-metre cable threshold, connector oxidation.&lt;/li>
&lt;li>HDMI Licensing Administrator, &lt;a href="https://www.hdmi.org/spec/premiumcable" rel="noopener">Premium HDMI Cable Certification Program&lt;/a> — 18Gbps testing, EMI test, per-length testing at Authorized Test Centers, QR-code authentication label.&lt;/li>
&lt;li>VESA, &lt;a href="https://vesa.org/featured-articles/vesa-strengthens-8k-video-resolution-ecosystem-with-market-ready-dp8k-certified-displayport-cables/" rel="noopener">DP8K certified DisplayPort cables&lt;/a> — HBR3 at 8.1 Gbps per lane, authorised test centre verification, pin 20 checking.&lt;/li>
&lt;li>Dell, &lt;a href="https://www.dell.com/support/kbdoc/en-us/000129648/guidelines-for-dell-monitor-usage-to-prevent-image-retention-and-preserve-panel-life" rel="noopener">Guidelines for Dell Monitor Usage to Prevent Image Retention and Preserve Panel Life&lt;/a> — image retention as a temporary LCD condition, prevention guidance.&lt;/li>
&lt;/ul></description></item><item><title>Ollama in Docker with GPU: Stop Installing CUDA Inside WSL2 (2026)</title><link>https://techfuelhq.com/tutorials/ollama-docker-gpu-2026/</link><pubDate>Sat, 15 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/tutorials/ollama-docker-gpu-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>If you are on WSL2, the most common first move is the wrong one, and it feels like progress while you make it.&lt;/p>
&lt;p>People open the distro, run &lt;code>apt install cuda&lt;/code> or &lt;code>cuda-drivers&lt;/code>, check &lt;code>nvcc --version&lt;/code>, see a version string, and treat the prerequisite as handled.&lt;/p>
&lt;p>NVIDIA&amp;rsquo;s own CUDA-on-WSL documentation warns against exactly this. More than once. One of those warnings is in capitals.&lt;/p>
&lt;p>Here is why it is not merely unnecessary but harmful. Under WSL2 the &lt;strong>Windows&lt;/strong> driver is projected into the distro as a &lt;code>libcuda.so&lt;/code> stub. That stub &lt;em>is&lt;/em> the GPU access path. The &lt;code>cuda&lt;/code>, &lt;code>cuda-12-x&lt;/code> and &lt;code>cuda-drivers&lt;/code> meta-packages pull in a Linux NVIDIA driver, which installs &lt;em>over&lt;/em> that stub and breaks the thing that was working.&lt;/p>
&lt;p>You do not need a driver inside WSL. You already have one. It came from Windows.&lt;/p>
&lt;h2 id="the-two-toolkits-people-conflate">The two toolkits people conflate&lt;/h2>
&lt;p>This is the root of it. The naming is genuinely unhelpful:&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Package&lt;/th>
&lt;th scope="col">What it does&lt;/th>
&lt;th scope="col">Needed for Ollama in Docker?&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>CUDA Toolkit&lt;/strong> (&lt;code>nvcc&lt;/code>, headers)&lt;/td>
&lt;td>compiles CUDA applications&lt;/td>
&lt;td>No&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>NVIDIA Container Toolkit&lt;/strong> (&lt;code>nvidia-container-toolkit&lt;/code>)&lt;/td>
&lt;td>lets Docker hand a GPU to a container&lt;/td>
&lt;td>&lt;strong>Yes&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>They share a brand. Nothing else. &lt;code>nvcc --version&lt;/code> printing happily tells you precisely nothing about whether Docker can reach your GPU — I have watched that exact screenshot get posted as evidence in bug reports where the real failure was that the container toolkit was never installed.&lt;/p>
&lt;p>You want the second one.&lt;/p>
&lt;p>On Debian or Ubuntu:&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 -fsSL https://nvidia.github.io/libnvidia-container/gpgkey &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -fsSL https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> | sed &lt;span style="color:#e6db74">&amp;#39;s#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g&amp;#39;&lt;/span> &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get update
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get install -y nvidia-container-toolkit
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This is the same package on native Linux and inside WSL2. The only difference is where you stop: on WSL2 that command is the end of it, whereas on native Linux you also need a real NVIDIA driver underneath, which is the step WSL2 users are trying to replicate when they break their stub.&lt;/p>
&lt;h2 id="running-it">Running it&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 run -d --gpus&lt;span style="color:#f92672">=&lt;/span>all &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> -v ollama:/root/.ollama &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> -p 11434:11434 &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> --name ollama ollama/ollama
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker exec -it ollama ollama run llama3.2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Drop &lt;code>--gpus=all&lt;/code> and you get a working CPU install. That is a reasonable first move: it confirms the rest of your setup before you start fighting the GPU layer, and it means a later failure has exactly one new variable in it.&lt;/p>
&lt;p>For AMD, the image and the flags both change:&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 -d --device /dev/kfd --device /dev/dri &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> -v ollama:/root/.ollama -p 11434:11434 &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> --name ollama ollama/ollama:rocm
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Note the volume is named.&lt;/p>
&lt;p>&lt;code>/root/.ollama&lt;/code> holds your downloaded models, and those are large. An anonymous volume there is how people re-download forty gigabytes after a cleanup — see &lt;a href="https://techfuelhq.com/tutorials/docker-cleanup-disk-space-2026/">which prune command eats data&lt;/a> for why that happens.&lt;/p>
&lt;h2 id="where-11434-really-listens">Where 11434 really listens&lt;/h2>
&lt;p>There is bad advice in circulation. It says Ollama binds &lt;code>127.0.0.1&lt;/code> by default, so publishing the port is safe.&lt;/p>
&lt;p>That is true of a native install. It is not true of this image. The official container sets &lt;code>OLLAMA_HOST=0.0.0.0:11434&lt;/code> in its Dockerfile, so inside the container it listens on everything, and whatever you publish with &lt;code>-p&lt;/code> is genuinely reachable.&lt;/p>
&lt;p>Ollama&amp;rsquo;s API has no authentication. &lt;code>-p 11434:11434&lt;/code> on a machine with a public IP publishes an unauthenticated inference endpoint on someone else&amp;rsquo;s hardware budget. Bind it to localhost explicitly if you want it host-only:&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>-p 127.0.0.1:11434:11434
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="compose-where-gpus-does-not-exist">Compose, where &amp;ndash;gpus does not exist&lt;/h2>
&lt;p>This is the second thing that costs people an evening.&lt;/p>
&lt;p>&lt;code>--gpus=all&lt;/code> is a &lt;code>docker run&lt;/code> flag. Compose does not accept it as a service key, and the error you get does not point anywhere useful.&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">ollama&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">ollama/ollama&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">ollama:/root/.ollama&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:#e6db74">&amp;#34;127.0.0.1:11434:11434&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">deploy&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">resources&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">reservations&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">devices&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">driver&lt;/span>: &lt;span style="color:#ae81ff">nvidia&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">count&lt;/span>: &lt;span style="color:#ae81ff">all&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">capabilities&lt;/span>: [&lt;span style="color:#ae81ff">gpu]&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">volumes&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">ollama&lt;/span>:
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Two rules inside that block, both documented and both easy to trip:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>capabilities&lt;/code> is not optional.&lt;/strong> Docker&amp;rsquo;s docs state that omitting it errors on service deployment. It looks like decoration and it is required.&lt;/li>
&lt;li>&lt;strong>&lt;code>count&lt;/code> and &lt;code>device_ids&lt;/code> are mutually exclusive.&lt;/strong> Pick one, or it errors.&lt;/li>
&lt;/ul>
&lt;p>There is also a newer top-level &lt;code>gpus:&lt;/code> attribute if your Compose version has it, which is less verbose for the common case.&lt;/p>
&lt;h2 id="the-wsl2-restriction-nobody-mentions">The WSL2 restriction nobody mentions&lt;/h2>
&lt;p>On WSL2, NVIDIA documents that only &lt;code>--gpus all&lt;/code> is supported.&lt;/p>
&lt;p>You cannot filter by index or UUID.&lt;/p>
&lt;p>So a compose file pinning &lt;code>device_ids: ['0']&lt;/code> is documented as not workable under WSL2, even though the identical file is fine on native Linux. If you have two GPUs in a Windows box and were planning to give one to Ollama and keep the other for something else, that plan does not survive contact with WSL2.&lt;/p>
&lt;p>That single limitation is the strongest argument I know for putting the LLM host on native Linux rather than WSL2, assuming you have the choice, and it is the kind of constraint that only shows up after you have already built the thing around the assumption that a GPU is a GPU.&lt;/p>
&lt;h2 id="adding-open-webui">Adding Open WebUI&lt;/h2>
&lt;p>The obvious next step is a browser interface. Open WebUI&amp;rsquo;s official stack runs it alongside Ollama, and their &lt;code>:cuda&lt;/code> image tag is documented as Nvidia GPU support, to be paired with &lt;code>--gpus all&lt;/code>.&lt;/p>
&lt;p>One deliberate default worth understanding before you &amp;ldquo;fix&amp;rdquo; it: in Open WebUI&amp;rsquo;s official compose stack, &lt;strong>the ollama service publishes no host port at all.&lt;/strong> 11434 is reachable on the Compose network and nowhere else. That is not an oversight. It means the only thing exposed is the UI, which has accounts, rather than the raw API, which does not.&lt;/p>
&lt;p>If you genuinely need the API from the host, they ship a separate api overlay for that. Use it rather than editing the base file, so the reason stays visible.&lt;/p>
&lt;h2 id="verifying-the-gpu-is-doing-the-work">Verifying the GPU is doing the work&lt;/h2>
&lt;p>The failure mode here is quiet. Everything runs. It just runs slowly, on the CPU, while you assume otherwise.&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 exec -it ollama nvidia-smi
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If that errors, the container cannot see the GPU and no amount of Ollama configuration will help — the problem is the container toolkit or the driver.&lt;/p>
&lt;p>Then run a prompt and watch &lt;code>nvidia-smi&lt;/code> on the host. If VRAM use does not move and your CPU fans do, the model is not on the GPU. The usual cause is that the model does not fit in VRAM, which is a hardware question rather than a Docker one, and which I have written up separately in &lt;a href="https://techfuelhq.com/articles/local-llm-by-gpu-vram-2026/">local LLMs by GPU VRAM&lt;/a>.&lt;/p>
&lt;h2 id="what-i-have-not-tested">What I have not tested&lt;/h2>
&lt;p>I have not run the ROCm image. The command above comes from Ollama&amp;rsquo;s documentation and I have no AMD card here to confirm it against, so treat that line as documented rather than verified by me.&lt;/p>
&lt;p>I have not tested the newer top-level &lt;code>gpus:&lt;/code> Compose attribute, and Compose version support for it is exactly the sort of thing that varies by distro package.&lt;/p>
&lt;p>I have not benchmarked WSL2 against native Linux for inference throughput. I believe native is better and I have not measured it, so I am not going to give you a number.&lt;/p>
&lt;h2 id="what-getting-it-wrong-costs">What getting it wrong costs&lt;/h2>
&lt;p>The CUDA-inside-WSL mistake costs you a working GPU and then several hours, because the symptom appears &lt;em>after&lt;/em> the install that felt like progress. You were closer before you started than after.&lt;/p>
&lt;p>The &lt;code>-p 11434:11434&lt;/code> mistake costs more, and it costs it quietly. An unauthenticated inference API on a public address does not announce itself. It just becomes somebody else&amp;rsquo;s free GPU until you notice the electricity bill or the fan noise.&lt;/p></description></item><item><title>SSH Port Forwarding: -L, -R, -D and Why Your Reverse Tunnel Only Works Locally (2026)</title><link>https://techfuelhq.com/networking/ssh-port-forwarding-tunneling-2026/</link><pubDate>Sat, 15 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/networking/ssh-port-forwarding-tunneling-2026/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · 2026-08-15 · ~10 min read · St. Louis County, MO&lt;/p>
&lt;p>Three flags. The third is where the afternoon goes.&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>ssh -L 8080:internal-host:80 user@server &lt;span style="color:#75715e"># reach IN&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ssh -R 8080:localhost:80 user@server &lt;span style="color:#75715e"># expose OUT&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ssh -D &lt;span style="color:#ae81ff">1080&lt;/span> user@server &lt;span style="color:#75715e"># SOCKS proxy&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>-L&lt;/code> opens a listener on &lt;strong>your&lt;/strong> machine. &lt;code>-R&lt;/code> opens one on &lt;strong>the server&lt;/strong>. That is the entire difference. Inverting it is the beginner mistake, and it announces itself immediately, which makes it the cheap one.&lt;/p>
&lt;p>The expert mistake is different, and it is the reason this page exists: &lt;strong>&lt;code>-R&lt;/code> does not fail when it does not work.&lt;/strong> It succeeds into a state that is not the one you asked for.&lt;/p>
&lt;h2 id="the--r-trap">The -R trap&lt;/h2>
&lt;p>You run this on a home machine, against a VPS with a public IP:&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>ssh -R 8080:localhost:80 user@vps
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You expect &lt;code>http://vps-public-ip:8080&lt;/code> to reach the web server at home. From the VPS itself, &lt;code>curl localhost:8080&lt;/code> works perfectly, which is the detail that sends people off debugging their home firewall, their router, and eventually their ISP, when none of those were ever in the path. From anywhere else: connection refused.&lt;/p>
&lt;p>Nothing errored. The tunnel is up. It is bound to &lt;code>127.0.0.1&lt;/code> on the VPS, which is a perfectly good place for a listener to be if that is what you asked for, and you did not.&lt;/p>
&lt;p>That is sshd&amp;rsquo;s documented default. Remote forwards bind loopback unless &lt;code>GatewayPorts&lt;/code> is enabled, and it defaults to &lt;code>no&lt;/code>.&lt;/p>
&lt;p>Then comes the second half, which is the part that costs the extra hour. You reasonably try to force it from the client:&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>ssh -R 0.0.0.0:8080:localhost:80 user@vps &lt;span style="color:#75715e"># still loopback-only&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>It does not help.&lt;/p>
&lt;p>&lt;code>ssh(1)&lt;/code> is explicit: specifying a remote bind_address will only succeed if the server&amp;rsquo;s GatewayPorts option is enabled. Your bind address is a request, not an instruction — the server is free to override it, and by default it does exactly that, binding loopback anyway rather than refusing the forward and saying why. A refusal would have cost you thirty seconds. The override costs you the evening.&lt;/p>
&lt;p>This is documented in OpenSSH&amp;rsquo;s own tracker as bug 1297, filed by someone who noticed the socket was always bound to &lt;code>127.0.0.1&lt;/code> and &lt;code>[::1]&lt;/code> and that &lt;code>-L&lt;/code> had no such problem. That is the shape of the confusion: local forwards obey you, remote forwards negotiate with a server whose defaults you did not read.&lt;/p>
&lt;h2 id="fixing-it-on-the-correct-side">Fixing it, on the correct side&lt;/h2>
&lt;p>On the &lt;strong>server&lt;/strong>, in &lt;code>sshd_config&lt;/code>:&lt;/p>
&lt;pre tabindex="0">&lt;code>GatewayPorts clientspecified
&lt;/code>&lt;/pre>&lt;p>Then reload sshd. Not your session. The daemon.&lt;/p>
&lt;p>I recommend &lt;code>clientspecified&lt;/code> over &lt;code>yes&lt;/code> deliberately. &lt;code>yes&lt;/code> forces remote forwards to bind the wildcard address for &lt;strong>every&lt;/strong> client on that server — a blunt, global change that removes the option of a loopback-only forward from everyone. &lt;code>clientspecified&lt;/code> gives each client the choice, so &lt;code>-R 0.0.0.0:8080:...&lt;/code> binds wide and a plain &lt;code>-R 8080:...&lt;/code> stays local.&lt;/p>
&lt;h3 id="the-two-gatewayports">The two GatewayPorts&lt;/h3>
&lt;p>Here is the detail that turns a five-minute fix into a long one, and it is purely a naming accident.&lt;/p>
&lt;p>There are &lt;strong>two&lt;/strong> &lt;code>GatewayPorts&lt;/code> options with near-identical wording:&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">File&lt;/th>
&lt;th scope="col">Governs&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>sshd_config&lt;/code> (server)&lt;/td>
&lt;td>&lt;code>-R&lt;/code> listeners the server opens on your behalf&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>ssh_config&lt;/code> (client)&lt;/td>
&lt;td>your own &lt;code>-L&lt;/code> and &lt;code>-D&lt;/code> listeners&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>They live in different files, on different machines, and do different jobs. Editing the client one, reloading nothing, and then wondering for forty minutes why the reverse tunnel is still loopback-only is an experience I would rather you skip.&lt;/p>
&lt;p>Debugging &lt;code>-R&lt;/code>? Server file. Every time.&lt;/p>
&lt;h2 id="-l-properly">-L, properly&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>ssh -L &lt;span style="color:#f92672">[&lt;/span>bind_address:&lt;span style="color:#f92672">]&lt;/span>port:host:hostport destination
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>host:hostport&lt;/code> is resolved from the server&amp;rsquo;s perspective, and that is the entire point of the flag: you are borrowing the server&amp;rsquo;s view of the network for the duration of the session, which is why it reaches things your own machine has no route to. This reaches a NAS at &lt;code>192.168.1.50&lt;/code> that your laptop cannot route to:&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>ssh -L 8080:192.168.1.50:80 user@homelab-gateway
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Then browse &lt;code>localhost:8080&lt;/code>. That is it.&lt;/p>
&lt;p>By default that listener binds loopback on your machine, so nobody else on the coffee-shop wifi can use your tunnel. That default is correct. Leave it.&lt;/p>
&lt;p>&lt;code>-L&lt;/code> also accepts Unix sockets on either end, which is how you reach a socket-only service like a database or a Docker daemon without publishing a TCP port for it.&lt;/p>
&lt;h2 id="-d-the-one-people-underuse">-D, the one people underuse&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>ssh -D &lt;span style="color:#ae81ff">1080&lt;/span> user@server
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>That is a local SOCKS 4/5 listener. Point a browser&amp;rsquo;s SOCKS proxy at &lt;code>localhost:1080&lt;/code> and its traffic emerges from the server, with DNS resolved there too if the client is configured for remote DNS.&lt;/p>
&lt;p>I reach for this more than &lt;code>-L&lt;/code> when I am poking at a homelab, because it needs no per-service forwards. One flag, and the whole network is reachable by its internal names for as long as the session lives.&lt;/p>
&lt;p>It is not a VPN. It carries only what an application deliberately sends through the proxy, so anything not SOCKS-aware ignores it completely and silently, which is a distinction people discover at the worst possible moment. If you want everything routed, you want &lt;a href="https://techfuelhq.com/tutorials/wireguard-self-hosted-vpn-proxmox-2026/">WireGuard&lt;/a> or &lt;a href="https://techfuelhq.com/networking/tailscale-vs-wireguard-2026/">Tailscale&lt;/a>, not this.&lt;/p>
&lt;h2 id="-j-which-is-not-a-tunnel-at-all">-J, which is not a tunnel at all&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>ssh -J bastion.example.com user@internal-host
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>ProxyJump reaches a final destination &lt;em>through&lt;/em> an intermediate. Nothing is published, no listener opens, and the bastion does not see your session in cleartext — your client negotiates end-to-end with the real target.&lt;/p>
&lt;p>Keep the distinction clean.&lt;/p>
&lt;ul>
&lt;li>Administrative access to a machine behind a bastion is a &lt;strong>&lt;code>-J&lt;/code>&lt;/strong> job.&lt;/li>
&lt;li>Exposing a service is a &lt;strong>&lt;code>-L&lt;/code>&lt;/strong> or &lt;strong>&lt;code>-R&lt;/code>&lt;/strong> job.&lt;/li>
&lt;/ul>
&lt;p>I have watched people build an elaborate &lt;code>-L&lt;/code> chain for something &lt;code>-J&lt;/code> does in one flag, in &lt;code>~/.ssh/config&lt;/code>, permanently:&lt;/p>
&lt;pre tabindex="0">&lt;code>Host internal-*
ProxyJump bastion.example.com
&lt;/code>&lt;/pre>&lt;h2 id="administratively-prohibited">&amp;ldquo;administratively prohibited&amp;rdquo;&lt;/h2>
&lt;pre tabindex="0">&lt;code>channel 3: open failed: administratively prohibited
&lt;/code>&lt;/pre>&lt;p>Two things about this message. The first one saves you a search.&lt;/p>
&lt;p>First: the &lt;code>3&lt;/code> is meaningless. It is OpenSSH&amp;rsquo;s local channel id from a format string. Searching the literal message &lt;em>with the number in it&lt;/em> is why people find nothing.&lt;/p>
&lt;p>Second: it means the server refused. Almost nothing more. There are at least three distinct causes, all server-side:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>&lt;code>AllowTcpForwarding&lt;/code>&lt;/strong> in &lt;code>sshd_config&lt;/code> disallowing that direction. It takes &lt;code>local&lt;/code> and &lt;code>remote&lt;/code> as values, not just yes and no, so a server can permit &lt;code>-L&lt;/code> and refuse &lt;code>-R&lt;/code>.&lt;/li>
&lt;li>&lt;strong>A key option in &lt;code>authorized_keys&lt;/code>&lt;/strong> — &lt;code>no-port-forwarding&lt;/code>, or &lt;code>restrict&lt;/code>, which turns everything off and then re-enables only what you name after it.&lt;/li>
&lt;li>&lt;strong>&lt;code>permitopen&lt;/code> / &lt;code>PermitOpen&lt;/code>&lt;/strong> restricting forwards to a specific host and port list that does not include the one you asked for.&lt;/li>
&lt;/ol>
&lt;p>Check them in that order. The &lt;code>authorized_keys&lt;/code> case catches people out most often, because the server&amp;rsquo;s global config reads permissive and the restriction is sitting on the key itself, which is not where anyone looks second.&lt;/p>
&lt;h2 id="privileged-ports-behave-differently-by-direction">Privileged ports behave differently by direction&lt;/h2>
&lt;p>&lt;code>ssh(1)&lt;/code> gives two different rules, and they are easy to conflate:&lt;/p>
&lt;ul>
&lt;li>For &lt;code>-L&lt;/code>: only the superuser can forward privileged ports. That is on &lt;strong>your&lt;/strong> side.&lt;/li>
&lt;li>For &lt;code>-R&lt;/code>: privileged ports can be forwarded only when logging in as root on the remote machine. That is on &lt;strong>the server&amp;rsquo;s&lt;/strong> side.&lt;/li>
&lt;/ul>
&lt;p>So &lt;code>-R 80:localhost:8080&lt;/code> to a VPS fails unless you are logging in as root there, which you should not be. Bind something above 1024 and put a &lt;a href="https://techfuelhq.com/tutorials/nginx-proxy-manager-homelab-2026/">reverse proxy&lt;/a> in front of it.&lt;/p>
&lt;h2 id="keeping-a-tunnel-alive">Keeping a tunnel alive&lt;/h2>
&lt;p>An SSH tunnel is a process. Processes die. For anything you depend on, put it under supervision rather than in a terminal you will eventually close:&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-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># /etc/systemd/system/tunnel.service&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">[Service]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">ExecStart&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">/usr/bin/ssh -N -T -o ServerAliveInterval=30 -o ExitOnForwardFailure=yes \
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> -R 8080:localhost:80 user@vps&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Restart&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">always&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">RestartSec&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">10&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>-N&lt;/code> runs no remote command, &lt;code>-T&lt;/code> allocates no TTY. &lt;code>ExitOnForwardFailure=yes&lt;/code> earns its place: without it, ssh happily stays connected when a forward could not be established, and systemd sees a healthy process fronting a tunnel that carries nothing.&lt;/p>
&lt;p>&lt;code>ServerAliveInterval&lt;/code> matters because an idle tunnel crossing a NAT gateway is exactly the kind of connection a middlebox reaps without telling either end, leaving you with a socket that looks established on both sides and moves nothing.&lt;/p>
&lt;h2 id="where-this-stops-being-the-right-tool">Where this stops being the right tool&lt;/h2>
&lt;p>Reverse tunnels are the classic answer to &amp;ldquo;my home connection has no public IP&amp;rdquo;, and for one or two services they remain a genuinely good one, because the alternative is standing up infrastructure to solve a problem that a single flag already solves. They work. I still keep one for a couple of things.&lt;/p>
&lt;p>But if you find yourself maintaining several, plus a systemd unit for each, plus &lt;code>GatewayPorts&lt;/code> on a server whose config you now have to remember, you have hand-built a worse mesh VPN. That is the point to look at &lt;a href="https://techfuelhq.com/networking/tailscale-vs-wireguard-2026/">Tailscale or WireGuard&lt;/a>, or at &lt;a href="https://techfuelhq.com/networking/headscale-self-hosted-tailscale-2026/">running the control plane yourself&lt;/a>.&lt;/p>
&lt;p>The honest dividing line I use is this. One or two forwards, occasional, and &lt;code>-R&lt;/code> is fine.&lt;/p>
&lt;p>More than that, or anything a household depends on, and the tunnel collection has quietly become technical debt with a systemd unit attached to each piece.&lt;/p>
&lt;h2 id="what-i-have-not-tested">What I have not tested&lt;/h2>
&lt;p>I have not verified whether a current client surfaces the loopback downgrade under &lt;code>-v&lt;/code>. OpenSSH added a debug message for this case in the 6.4 era, and I could not establish from the sources I read whether that reliably reaches a modern user&amp;rsquo;s terminal. Assume it is silent and check the listener yourself with &lt;code>ss -tlnp&lt;/code> on the server.&lt;/p>
&lt;p>I have not tested any of the &lt;code>authorized_keys&lt;/code> restriction interactions on a live sshd during this write-up, so treat the ordering advice as a plan of attack rather than a measured result.&lt;/p>
&lt;h2 id="what-getting-it-wrong-costs">What getting it wrong costs&lt;/h2>
&lt;p>The &lt;code>-R&lt;/code> trap costs an evening. That is the good outcome: you conclude nothing works, and go read the docs.&lt;/p>
&lt;p>The bad outcome is &lt;code>GatewayPorts yes&lt;/code> set globally on a server, forgotten, on a box that also hosts something else. Now every remote forward any account opens binds the wildcard address by default. Somebody tunnels an admin panel out to test something, leaves it up, and there is a listener on a public IP that nobody remembers creating.&lt;/p>
&lt;p>&lt;code>clientspecified&lt;/code> costs nothing extra and does not accumulate that debt.&lt;/p></description></item><item><title>Uptime Kuma Docker Setup, and Where to Actually Run It (2026)</title><link>https://techfuelhq.com/tutorials/uptime-kuma-docker-setup-2026/</link><pubDate>Sat, 15 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/tutorials/uptime-kuma-docker-setup-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>Uptime Kuma installs in about ninety seconds. One container, one volume, one port. That part is genuinely easy, and every guide covers it.&lt;/p>
&lt;p>Here is the part that decides whether the install was worth doing: &lt;strong>a monitor that lives inside the network it watches cannot tell you that network went down.&lt;/strong> Put Kuma on your Proxmox box, point it at your NAS, your Jellyfin, your reverse proxy, and go to bed happy. Then the UPS gives up at 3am. Everything stops, including Kuma. Your phone stays quiet all night, because the thing whose job was to shout is on the floor with everything else.&lt;/p>
&lt;p>You find out at 9am. The dashboard shows a clean green wall, because it has no memory of the hours it spent unpowered, and a gap in the record renders identically to a stretch of perfect health once the container comes back and resumes drawing bars.&lt;/p>
&lt;p>I have watched people run this setup for months and conclude their homelab is extremely reliable. It wasn&amp;rsquo;t.&lt;/p>
&lt;h2 id="the-install-briefly">The install, briefly&lt;/h2>
&lt;p>Version 2.5.0 shipped on 1 August 2026. Pin the major tag.&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">uptime-kuma&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/uptime-kuma:2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">container_name&lt;/span>: &lt;span style="color:#ae81ff">uptime-kuma&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:#e6db74">&amp;#34;3001:3001&amp;#34;&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">./data:/app/data&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/uptime-kuma/data &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> cd /opt/uptime-kuma
&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>Open port 3001 and create the admin account on first load. That&amp;rsquo;s it. There is no separate database container. Kuma uses SQLite inside that one data volume, which is why this compose file is four lines of service definition instead of the five-container arrangement a &lt;a href="https://techfuelhq.com/tutorials/paperless-ngx-docker-setup-2026/">Paperless-ngx stack&lt;/a> needs. Version 2.x can talk to other backends for large deployments. For a homelab watching a few dozen endpoints, SQLite is correct and it is one fewer thing that can fail at 3am.&lt;/p>
&lt;p>Do not publish 3001 to the internet. It is a login page standing in front of a complete map of your infrastructure, including hostnames and internal ports you would rather not advertise. Put it behind &lt;a href="https://techfuelhq.com/tutorials/nginx-proxy-manager-homelab-2026/">Nginx Proxy Manager&lt;/a> or reach it over a &lt;a href="https://techfuelhq.com/networking/tailscale-vs-wireguard-2026/">WireGuard or Tailscale tunnel&lt;/a>.&lt;/p>
&lt;p>That is the whole tutorial. The rest of this page is about placement, which is where the value is.&lt;/p>
&lt;h2 id="why-placement-is-the-whole-problem">Why placement is the whole problem&lt;/h2>
&lt;p>Uptime Kuma measures reachability. It sends a request and reports whether something answered. Every result it produces is therefore relative to one specific position on the network — its own.&lt;/p>
&lt;p>From inside your LAN, Kuma can see that Jellyfin&amp;rsquo;s container is answering on port 8096. That is a real and useful fact. It is not the fact your users have. Your users are outside, and between them and Jellyfin sits your ISP, your modem, your router&amp;rsquo;s NAT and port forwarding, your DNS records, your certificate expiry, and your reverse proxy. Kuma checking &lt;code>http://192.168.1.40:8096&lt;/code> validates exactly one link in that chain and silently vouches for the rest.&lt;/p>
&lt;p>So there are two distinct failure classes. One monitor position cannot cover both, and the table below is the reason I stopped treating a single green dashboard as evidence of anything.&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Failure&lt;/th>
&lt;th scope="col">Seen from inside&lt;/th>
&lt;th scope="col">Seen from outside&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Container crashed&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Disk full, service refusing writes&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Certificate expired&lt;/td>
&lt;td>no&lt;/td>
&lt;td>yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DNS record wrong or lapsed&lt;/td>
&lt;td>no&lt;/td>
&lt;td>yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ISP down, modem dead, power cut&lt;/td>
&lt;td>&lt;strong>no — monitor is down too&lt;/strong>&lt;/td>
&lt;td>yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Port forward removed by a firmware update&lt;/td>
&lt;td>no&lt;/td>
&lt;td>yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>VPN tunnel to the monitor collapsed&lt;/td>
&lt;td>n/a&lt;/td>
&lt;td>shows as a false outage&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>The bottom-left cell is the one that matters. When the whole site loses power, an internal monitor does not report an outage. It reports nothing at all, and nothing looks exactly like fine.&lt;/p>
&lt;h2 id="two-placements-that-work">Two placements that work&lt;/h2>
&lt;p>&lt;strong>Primary outside, pointed in.&lt;/strong> Run Kuma on a small external host and monitor your public endpoints the way a stranger would. This is the setup I would pick if I were only running one instance. It catches expired certificates, broken DNS, dead port forwards, and total site loss, because it is not standing on any of the things that break. Requirements are modest, which is the useful part: Kuma is a single Node process with a SQLite file, so the smallest tier at any VPS host is enough to watch a homelab&amp;rsquo;s worth of endpoints.&lt;/p>
&lt;p>The trade is real. An outside instance sees only what you publish, so anything you never exposed to the internet is invisible to it, and that is usually most of the stack.&lt;/p>
&lt;p>&lt;strong>Two instances, watching each other.&lt;/strong> Keep the detailed instance inside, where it can reach every container and internal port. Add a second, nearly empty instance outside whose entire job is to watch the first one and a couple of public endpoints. Point each at the other&amp;rsquo;s health endpoint. Now an outage has to take out two separate sites and two separate uplinks before you hear silence.&lt;/p>
&lt;p>This is the arrangement I would run for anything I actually cared about, and it costs one small VPS.&lt;/p>
&lt;p>Do not try to solve this by having the outside instance reach in over a tunnel to check internal services. It sounds tidy. It fails badly, and in a specific way: the tunnel becomes a shared dependency, so every tunnel hiccup fires as a simultaneous outage across a dozen unrelated monitors, and after two weeks of that you will start ignoring the alerts. Which is worse than not having them.&lt;/p>
&lt;h2 id="the-push-monitor-is-the-one-people-skip">The push monitor is the one people skip&lt;/h2>
&lt;p>Most Kuma monitors ask a question outward. The push monitor inverts that — it hands you a URL and waits to be called.&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"># at the end of your backup script&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>restic backup /data --repo &lt;span style="color:#e6db74">&amp;#34;&lt;/span>$REPO&lt;span style="color:#e6db74">&amp;#34;&lt;/span> &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> curl -fsS &lt;span style="color:#e6db74">&amp;#34;&lt;/span>$KUMA_PUSH_URL&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If the script finishes, Kuma hears from it. Good. If the script fails, hangs, or was never scheduled because the cron entry got clobbered, the call never arrives and Kuma alerts on the silence.&lt;/p>
&lt;p>This catches a class of problem that no reachability check will ever see. Your backup host can be up, healthy, answering pings, and passing every HTTP check while quietly not having produced a backup in five weeks. I would put a push monitor on every scheduled job whose failure you would not notice for a month. Backups first.&lt;/p>
&lt;h2 id="notification-settings-that-avoid-making-you-ignore-it">Notification settings that avoid making you ignore it&lt;/h2>
&lt;p>The defaults are tuned to demonstrate the feature, not to survive contact with a homelab that reboots.&lt;/p>
&lt;p>Set &lt;strong>Heartbeat Interval&lt;/strong> to how fast you could genuinely respond. Sixty seconds is a reasonable floor. Set &lt;strong>Retries&lt;/strong> to at least 3 before a monitor is marked down, so a container restart does not page you. Sixty seconds with 3 retries gives a service three minutes to come back on its own, which covers nearly every routine restart.&lt;/p>
&lt;p>Add at least two notification channels through different infrastructure. Kuma supports over ninety providers. The reason for two is narrow but real: if you route everything through one service and that service is the thing that broke, your alert about the outage is part of the outage.&lt;/p>
&lt;p>Then leave it alone for a week and count how many notifications you received that you did not act on. Every one of those is training you to dismiss the next one. Raise the retries until that count is near zero.&lt;/p>
&lt;h2 id="the-status-page-and-whether-you-need-a-domain">The status page, and whether you need a domain&lt;/h2>
&lt;p>Kuma&amp;rsquo;s status pages are genuinely good and cost nothing to set up. Group your monitors, mark which ones are public, and publish.&lt;/p>
&lt;p>You need a hostname for it if the audience is anyone other than you. A status page at an IP address with a certificate warning does not reassure the household that the media server is coming back. If you are already buying a domain for your reverse proxy, a &lt;code>status.&lt;/code> subdomain on it is free and takes about two minutes.&lt;/p>
&lt;p>If the audience is only you, skip the domain and reach it over the tunnel.&lt;/p>
&lt;h2 id="what-i-have-not-tested">What I have not tested&lt;/h2>
&lt;p>I have not run Kuma at a scale where SQLite is the constraint, so I cannot tell you where that boundary sits or whether moving to MariaDB is worth the extra container. Everything above is from homelab-scale use — dozens of monitors, not hundreds.&lt;/p>
&lt;p>I have not measured Kuma&amp;rsquo;s resource use on the very smallest VPS tiers, and I would rather say that than quote a RAM figure I did not take. It is a single Node process with a SQLite file, so the tier below whatever you were considering is probably fine, but &amp;ldquo;probably&amp;rdquo; is doing real work in that sentence.&lt;/p>
&lt;p>The 2.x non-SQLite backends I have not touched at all.&lt;/p>
&lt;h2 id="what-getting-this-wrong-costs">What getting this wrong costs&lt;/h2>
&lt;p>A silent monitor is worse than no monitor, because it converts an unknown into a false negative. You stop checking manually. You stop being suspicious. Then a drive fails in a mirror and the array runs degraded for three weeks, and the second drive fails, and the honest answer to &amp;ldquo;when did this start&amp;rdquo; is that nobody knows.&lt;/p>
&lt;p>The install is ninety seconds. The placement decision is the part that determines whether any of it works, and it is the part almost every guide leaves out — including, for about a year, mine.&lt;/p></description></item><item><title>GPU Fans Stuck at 100%: The Fix Order That Finds the Cause</title><link>https://techfuelhq.com/articles/gpu-fans-stuck-at-100-percent/</link><pubDate>Thu, 13 Aug 2026 09:20:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/articles/gpu-fans-stuck-at-100-percent/</guid><description>&lt;p>Fans pinned at 100% feel like an emergency because of the noise, but the noise is the least informative part. A modern card only commands full speed for a handful of reasons, most of them software, and the fastest path out is to check them in the order below — cheapest and most common first — instead of opening the case with a screwdriver on cause number six.&lt;/p>
&lt;img src="https://techfuelhq.com/images/articles/gpu-fan-curve-stuck-100.svg" alt="Diagram of fan duty versus GPU temperature: a healthy curve sits at zero RPM below about 50C then ramps smoothly to 100 percent near 95C, while a stuck card draws a flat 100 percent line across every temperature, labeled a control failure" width="1200" height="640" 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="first-two-situations-where-full-speed-is-correct">First: two situations where full speed is correct&lt;/h2>
&lt;p>&lt;strong>Before the driver loads.&lt;/strong> From power-on until the graphics driver initializes, there is no fan-control logic running, and many boards default the fans high or to maximum as a failsafe. Loud at the BIOS screen, quiet at the desktop is normal behavior, not a fault.&lt;/p>
&lt;p>&lt;strong>When the card is genuinely at its limit.&lt;/strong> If a monitoring tool shows the hotspot or memory-junction sensor high while the fans scream, the controller is doing its job and your problem is &lt;a href="https://techfuelhq.com/articles/gpu-overheating-2026/">cooling, not control&lt;/a> — repaste, airflow, or dust, covered in that guide. Everything below assumes the temperatures are unremarkable while the fans are not.&lt;/p>
&lt;h2 id="the-fix-order">The fix order&lt;/h2>
&lt;h3 id="1-reboot-once-properly">1. Reboot once, properly&lt;/h3>
&lt;p>A full shutdown and cold boot clears a one-off controller glitch and re-runs the driver&amp;rsquo;s fan initialization. If the fans come back under control and it never recurs, stop here. If it recurs, the reboot was a clue, not a fix — keep going.&lt;/p>
&lt;h3 id="2-find-the-fight-between-fan-control-programs">2. Find the fight between fan-control programs&lt;/h3>
&lt;p>Count everything on the machine that can touch GPU fans: MSI Afterburner, the card vendor&amp;rsquo;s utility (Armoury Crate, Adrenalin&amp;rsquo;s tuning tab, iCUE, and friends), and motherboard suites. Two controllers arguing over one card routinely ends with a curve pinned at an extreme. Pick &lt;strong>one&lt;/strong> owner, disable GPU fan control everywhere else, then set that one program&amp;rsquo;s curve back to its default profile. While you are in there, check for a forgotten manual override — a fixed-speed toggle left at 100% behaves exactly like this and survives reboots.&lt;/p>
&lt;h3 id="3-reset-the-curve-itself">3. Reset the curve itself&lt;/h3>
&lt;p>If the single remaining controller still pins the fans, its stored curve or the card&amp;rsquo;s fan table may be corrupt. Reset the utility to defaults (or uninstall it and let the driver&amp;rsquo;s automatic control take over). On cards with a dual-BIOS switch, confirm it did not get bumped to the performance position, which runs a deliberately aggressive curve on some models.&lt;/p>
&lt;h3 id="4-rule-out-the-driver-crash-fallback">4. Rule out the driver-crash fallback&lt;/h3>
&lt;p>A hung or crashed driver can leave the card with no one steering — and the failsafe is full speed, the same as before boot. If the pinning started after a driver update, or fans max out mid-session while the screen stutters or recovers, do a clean reinstall with DDU in Safe Mode per the &lt;a href="https://techfuelhq.com/articles/gpu-driver-crash-fix-2026/">GPU driver crash guide&lt;/a>. Install the previous stable driver if the newest one is when the trouble began.&lt;/p>
&lt;h3 id="5-check-what-the-sensors-are-actually-reporting">5. Check what the sensors are actually reporting&lt;/h3>
&lt;p>Open a monitor that shows every GPU sensor, not just the core. A controller reacting to a hotspot or memory sensor you were not watching is case &amp;ldquo;working as designed&amp;rdquo; from the first section. But a sensor reading that is obviously wrong — a temperature pinned at an impossible value while the others sit normal — means the controller is acting on bad input, which on most cards is a warranty conversation rather than a settings fix.&lt;/p>
&lt;h3 id="6-suspect-the-fan-that-reads-zero">6. Suspect the fan that reads zero&lt;/h3>
&lt;p>If one fan reports 0 RPM under load while its neighbors run flat out, the controller may be compensating for a fan it believes has died — and the dead fan (or its tachometer wire) is the real fault. Confirm visually under load: a fan commanded to spin that stands still is the answer. Individual replacement fans exist for most current cards, and swapping one is far cheaper than living at 100%.&lt;/p>
&lt;h2 id="after-it-is-fixed">After it is fixed&lt;/h2>
&lt;p>Set the curve somewhere sane and quiet — the diagram above is the shape to aim for: silent below the zero-RPM threshold, smooth ramp through the middle, maximum held in reserve for genuine trouble. If what pushed you here was noise generally, an &lt;a href="https://techfuelhq.com/articles/how-to-undervolt-gpu-2026/">undervolt&lt;/a> cuts the heat the curve responds to, and if the sound that remains is an electronic whine rather than airflow, that is &lt;a href="https://techfuelhq.com/articles/coil-whine-2026/">coil whine&lt;/a> — a different animal with its own page. And if your problem is the opposite one, read &lt;a href="https://techfuelhq.com/articles/gpu-fans-not-spinning-2026/">GPU fans not spinning&lt;/a> instead.&lt;/p></description></item><item><title>MXFP4 vs Q4_K_M: Why 21B Beats 14B on an RTX 5080</title><link>https://techfuelhq.com/articles/mxfp4-vs-q4km-rtx-5080/</link><pubDate>Thu, 13 Aug 2026 09:05:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/articles/mxfp4-vs-q4km-rtx-5080/</guid><description>&lt;p>The strangest row in &lt;a href="https://techfuelhq.com/data/rtx-5080-llm-throughput/">our RTX 5080 throughput dataset&lt;/a> is the one where the biggest model is not the slowest. gpt-oss 20B — 20.9B parameters as ollama reports it — decodes at &lt;strong>187–190 tokens per second&lt;/strong>. Qwen 2.5 14B, six billion parameters smaller, manages &lt;strong>94–97&lt;/strong>. The &amp;ldquo;bigger&amp;rdquo; model is twice as fast, and it lands within a few percent of the dense &lt;strong>7B&lt;/strong>. None of that is a fluke, and the explanation is worth having because it changes which models you should even shortlist on a 16GB card.&lt;/p>
&lt;img src="https://techfuelhq.com/images/articles/mxfp4-vs-q4km-decode-chart.svg" alt="Bar chart of measured ollama decode speed on an RTX 5080: Llama 3.2 3B at 298-313 tokens per second, gpt-oss 20B MXFP4 at 187-190, Qwen 2.5 7B at 177-180, Qwen 2.5 14B Q4_K_M at 94-97" width="1200" height="640" 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-numbers-and-where-they-come-from">The numbers, and where they come from&lt;/h2>
&lt;p>Everything below is from our own bench: ollama 0.32.1 on a retail RTX 5080 (driver 610.88), medians of three fresh-prefill runs per cell, model digests pinned, with a nonce prepended each rep so the prompt cache cannot fake the prefill numbers. The full matrix, method, and raw CSV are on the &lt;a href="https://techfuelhq.com/data/rtx-5080-llm-throughput/">dataset page&lt;/a>.&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Model&lt;/th>
&lt;th scope="col">Params&lt;/th>
&lt;th scope="col">Quant&lt;/th>
&lt;th scope="col">Decode tok/s&lt;/th>
&lt;th scope="col">Resident VRAM&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Llama 3.2 3B&lt;/td>
&lt;td>3.2B&lt;/td>
&lt;td>Q4_K_M&lt;/td>
&lt;td>298–313&lt;/td>
&lt;td>~5.4GiB&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>gpt-oss 20B&lt;/strong>&lt;/td>
&lt;td>&lt;strong>20.9B&lt;/strong>&lt;/td>
&lt;td>&lt;strong>MXFP4&lt;/strong>&lt;/td>
&lt;td>&lt;strong>187–190&lt;/strong>&lt;/td>
&lt;td>&lt;strong>~13.7–14.0GiB&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qwen 2.5 7B&lt;/td>
&lt;td>7.6B&lt;/td>
&lt;td>Q4_K_M&lt;/td>
&lt;td>177–180&lt;/td>
&lt;td>~6.0–6.9GiB&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qwen 2.5 14B&lt;/td>
&lt;td>14.8B&lt;/td>
&lt;td>Q4_K_M&lt;/td>
&lt;td>94–97&lt;/td>
&lt;td>~10.6–12.8GiB&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;h2 id="decode-is-a-memory-race-and-only-active-bytes-run-it">Decode is a memory race, and only active bytes run it&lt;/h2>
&lt;p>Generating a token means streaming the model&amp;rsquo;s weights through the GPU once. Do that a hundred times a second and the limiting factor is not compute — it is how fast VRAM can feed the cores. The RTX 5080&amp;rsquo;s memory bus moves about 960 GB/s. So the ceiling is simple division: bandwidth over bytes-touched-per-token.&lt;/p>
&lt;p>Run it for the dense 14B. Q4_K_M stores roughly 4.5–4.8 bits per weight, so 14.8B parameters is about &lt;strong>8.5–8.9GB that every single token must read&lt;/strong>. 960 ÷ 8.7 ≈ 110 tokens per second as the theoretical ceiling — and the measured 94–97 is about 90% of that. The arithmetic and the measurement agree, which is how you know the model is bandwidth-bound.&lt;/p>
&lt;p>Now gpt-oss 20B. It is a mixture-of-experts model: per OpenAI&amp;rsquo;s model card, 21B total parameters but only about &lt;strong>3.6B active per token&lt;/strong>, with the expert weights shipped natively in MXFP4 — 4-bit floating point with shared scale factors, the OCP microscaling format. The 21B has to &lt;em>fit&lt;/em> in VRAM (hence the ~14GiB resident), but each token only &lt;em>streams&lt;/em> the active slice. A few gigabytes per token instead of nine. That is the whole trick, and it is why the 21B model decodes like a 7B — because per token, it approximately is one.&lt;/p>
&lt;p>Total parameters decide whether a model fits. &lt;strong>Active bytes decide how fast it runs.&lt;/strong> Those are different questions, and the spec sheets only advertise the first.&lt;/p>
&lt;h2 id="what-context-length-actually-costs">What context length actually costs&lt;/h2>
&lt;p>The other quietly useful result: at prompts of ~500 and ~1,700 tokens, decode speed was flat between num_ctx 4096 and 16384 for every model — within about 1%. The 16k configurations cost VRAM (the KV cache has to live somewhere) but not speed at these lengths. If you have been keeping context small to protect tokens per second, at normal prompt sizes you are paying a real capacity price for an imaginary speed benefit. Push into genuinely long prompts and attention will eventually take its cut — but that boundary is much further out than the folk wisdom says.&lt;/p>
&lt;p>Prefill tells the same story from the other side: it is compute-bound and parallel, and gpt-oss chewed through prompts at 9,000–10,500 tokens per second, roughly double the dense 14B there too.&lt;/p>
&lt;h2 id="what-to-shortlist-on-a-16gb-card">What to shortlist on a 16GB card&lt;/h2>
&lt;p>If you want the strongest model that still &lt;em>feels&lt;/em> instant on this class of hardware, the measured answer is the MoE: gpt-oss 20B gives 14B-and-up class capability at dense-7B interactive speed, for about 14GiB of resident VRAM. The dense 14B is the choice when a specific dense model&amp;rsquo;s quality on your task justifies half the speed. And the 3B remains the bulk-work option — 300 tokens per second is a different kind of tool.&lt;/p>
&lt;p>Where your GPU lands if it is not a 5080: the &lt;a href="https://techfuelhq.com/articles/local-llm-by-gpu-vram-2026/">local LLM by GPU VRAM guide&lt;/a> maps models to cards, the &lt;a href="https://techfuelhq.com/tools/llm-speed-calculator/">LLM speed calculator&lt;/a> estimates decode from bandwidth and quant, and the &lt;a href="https://techfuelhq.com/tools/llm-vram-calculator/">VRAM calculator&lt;/a> does the fit math. What running this card 24/7 costs in electricity is measured in the &lt;a href="https://techfuelhq.com/articles/rtx-5080-perf-per-watt-ai-24-7-2026/">5080 perf-per-watt piece&lt;/a>.&lt;/p>
&lt;p>The dataset behind every number here is CC BY 4.0 — take it: &lt;a href="https://techfuelhq.com/data/rtx-5080-llm-throughput/">/data/rtx-5080-llm-throughput/&lt;/a>.&lt;/p></description></item><item><title>Coil Whine Database: Per-Model Community Census (GPU, PSU, AIO)</title><link>https://techfuelhq.com/data/coil-whine-database/</link><pubDate>Wed, 12 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/data/coil-whine-database/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · Published 2026-08-12 · ~5 min read · St. Louis County, MO&lt;/p>
&lt;h2 id="the-short-version">The short version&lt;/h2>
&lt;p>Coil whine is one of the most-asked PC noise questions with the least data behind
it. As of an August 2026 check, no per-model coil whine database existed anywhere —
community knowledge lives in scattered forum threads, plus one lab analysis
(&lt;a href="https://www.hwcooling.net/" rel="noopener">hwcooling.net&lt;/a>) that measured a 30-card batch once and
stopped. Meanwhile &amp;ldquo;coil whine&amp;rdquo; draws about 2,900 searches a month and &amp;ldquo;gpu coil
whine&amp;rdquo; another 1,000 (Google Ads exact match, checked 2026-08-12). This page opens
the census that should exist: owner reports of GPUs, PSUs, and AIO pumps on an
anchored 0-4 severity scale, published as per-model distributions.&lt;/p>
&lt;p>The raw data, schema, and intake all live in the open repository:
&lt;strong>&lt;a href="https://github.com/iBlessi/coil-whine-db" rel="noopener">github.com/iBlessi/coil-whine-db&lt;/a>&lt;/strong> (CC BY 4.0).&lt;/p>
&lt;h2 id="why-distributions-never-verdicts">Why distributions, never verdicts&lt;/h2>
&lt;p>The defining fact about coil whine is the design constraint for the whole dataset:
&lt;strong>it varies unit to unit.&lt;/strong> The same GPU model ships silent units and screaming
units, because the outcome depends on which inductors a particular board received,
how they were potted, the PSU feeding them, and the load pattern — not on the model
name. A review unit that stays quiet proves nothing about the unit you will receive,
and one loud unit on a forum proves nothing about the model.&lt;/p>
&lt;p>So the honest per-model answer is never &amp;ldquo;the RTX 4090 whines&amp;rdquo; or &amp;ldquo;it doesn&amp;rsquo;t.&amp;rdquo; It is
a distribution: out of &lt;em>n&lt;/em> reported units, this share was inaudible, this share was
audible at the desk, this share screamed even at idle. That is what this database
publishes — odds, never verdicts.&lt;/p>
&lt;h2 id="the-schema">The schema&lt;/h2>
&lt;p>One row = one physical unit an owner listened to. Full machine-readable definitions
live in &lt;a href="https://github.com/iBlessi/coil-whine-db/blob/main/schema.json" rel="noopener">&lt;code>schema.json&lt;/code>&lt;/a>.&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Field&lt;/th>
&lt;th scope="col">Required&lt;/th>
&lt;th scope="col">What it records&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>component_type&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>&lt;code>gpu&lt;/code>, &lt;code>psu&lt;/code>, or &lt;code>aio-pump&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>brand&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>As printed on the box — ASUS, Corsair, Arctic&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>model&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>Model line, specific enough to group units — &amp;ldquo;ROG Strix RTX 4090&amp;rdquo;, &amp;ldquo;RM850x (2021)&amp;rdquo;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>exact_sku&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>Exact manufacturer SKU when known&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>purchase_year&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>Year this unit was bought&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>severity&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>0–4 on the anchored scale below&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>load_context&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>Where the score was observed: &lt;code>idle&lt;/code>, &lt;code>gaming&lt;/code>, &lt;code>menu-uncapped-fps&lt;/code>, &lt;code>furmark&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>psu_used&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>For GPU reports: the PSU in the system — whine sometimes moves with it&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>fps_cap_changes_it&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>Whether capping FPS audibly changes it — &lt;code>true&lt;/code> / &lt;code>false&lt;/code> / untested&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>notes&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>Free text, max 280 characters&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>submitted_date&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>ISO date of the report&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;h3 id="the-severity-scale-anchored">The severity scale (anchored)&lt;/h3>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col" style="text-align: right">Severity&lt;/th>
&lt;th scope="col">Anchor&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: right">&lt;strong>0&lt;/strong>&lt;/td>
&lt;td>Inaudible in a quiet room&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: right">&lt;strong>1&lt;/strong>&lt;/td>
&lt;td>Audible with an ear at the case&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: right">&lt;strong>2&lt;/strong>&lt;/td>
&lt;td>Audible at the desk under load&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: right">&lt;strong>3&lt;/strong>&lt;/td>
&lt;td>Audible across the room under load&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: right">&lt;strong>4&lt;/strong>&lt;/td>
&lt;td>Audible even at idle&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>Score the unit at its loudest normal state. The anchors are fixed on purpose:
changing them would make old and new rows incomparable, so any future anchor change
bumps the dataset&amp;rsquo;s major version instead of quietly redefining the numbers.&lt;/p>
&lt;h2 id="how-to-submit-a-unit">How to submit a unit&lt;/h2>
&lt;p>One report = one physical unit you own or owned, judged by your own ears — not a
model you read about. &lt;strong>Severity-0 reports (&amp;ldquo;mine is silent&amp;rdquo;) are the most valuable
rows in the census&lt;/strong>, because they are the half of the distribution that never shows
up in forum threads.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>No git knowledge needed&lt;/strong> — fill in the
&lt;a href="https://github.com/iBlessi/coil-whine-db/issues/new?template=submission.yml" rel="noopener">coil whine report issue form&lt;/a>.
It mirrors the schema field-for-field; a maintainer transcribes accepted reports
into the CSV, with &lt;code>submitted_date&lt;/code> taken from the issue&amp;rsquo;s creation date.&lt;/li>
&lt;li>&lt;strong>The CSV path&lt;/strong> — add one row to
&lt;a href="https://github.com/iBlessi/coil-whine-db/blob/main/data/submissions.csv" rel="noopener">&lt;code>data/submissions.csv&lt;/code>&lt;/a>
following the schema, and open a pull request. A stdlib validator runs on every
PR and blocks malformed rows.&lt;/li>
&lt;/ol>
&lt;p>Every submission passes two layers before it lands: the mechanical schema check, and
a maintainer review for outlier and troll patterns — duplicate-account bursts filing
the same model at the same severity, impossible combinations like a purchase year
before the model existed, and rows that summarize other people&amp;rsquo;s threads instead of
a unit the submitter heard. The full acceptance rules are in
&lt;a href="https://github.com/iBlessi/coil-whine-db/blob/main/CONTRIBUTING.md" rel="noopener">CONTRIBUTING.md&lt;/a>.&lt;/p>
&lt;h2 id="what-publishes-as-the-census-grows">What publishes as the census grows&lt;/h2>
&lt;p>The activation floor, stated verbatim: &lt;strong>per-model n + severity distribution once a
model has &amp;gt;=5 reports.&lt;/strong> Below that floor a model is listed as &lt;em>collecting&lt;/em>, with no
numbers attached. As models cross the floor, their distributions render on this page
— n first, then the share of reports at each severity level, always with the sample
size in the same breath as the percentages.&lt;/p>
&lt;p>The census opened at &lt;strong>0 rows&lt;/strong> by design — a dataset about unit-to-unit variance
cannot be seeded from published reviews, because each review describes a single unit
that is not ours to report. Every row is a real owner reporting a real unit.&lt;/p>
&lt;p>&lt;strong>Current count: n=1.&lt;/strong> &lt;a href="https://github.com/iBlessi/coil-whine-db/issues/1" rel="noopener">Submission #1&lt;/a>
is the maintainer&amp;rsquo;s own ASUS ROG Astral RTX 5080 OC — severity 1, audible only in
uncapped game menus, silenced by any frame cap. It is the same physical card behind
the &lt;a href="https://techfuelhq.com/data/gpu/rog-astral-rtx-5080-oc-2026-06-09/">Astral 5080 bench dataset&lt;/a>, so its
provenance is already public. One report proves the pipeline, not a distribution:
the ROG Astral RTX 5080 OC is listed as &lt;em>collecting&lt;/em> until it reaches n=5.&lt;/p>
&lt;h2 id="the-honesty-rules">The honesty rules&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>No verdicts below n = 5.&lt;/strong> A model with three angry reports is &lt;em>collecting&lt;/em>, not
&amp;ldquo;a whiner.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Self-selection bias is named, not hidden.&lt;/strong> People annoyed by a noise go looking
for a place to report it; people with silent units mostly don&amp;rsquo;t. Annoyed owners
over-report and silent units under-report, so every published whine percentage is
a &lt;strong>ceiling&lt;/strong>, not an unbiased estimate. The severity-0 row exists to shrink that
bias, not to pretend it away.&lt;/li>
&lt;li>&lt;strong>Anchors never drift.&lt;/strong> The 0–4 scale above is frozen; a change would be a new
major version, and old rows would be marked as scored on the old scale.&lt;/li>
&lt;/ul>
&lt;h2 id="use-the-data-cc-by-40">Use the data (CC BY 4.0)&lt;/h2>
&lt;p>The live dataset is one file:
&lt;a href="https://raw.githubusercontent.com/iBlessi/coil-whine-db/main/data/submissions.csv" rel="noopener">&lt;code>data/submissions.csv&lt;/code>&lt;/a>
— one row per reported unit, in the schema order above. License: Creative Commons
Attribution 4.0. Attribute as &amp;ldquo;TechFuelHQ Community Coil Whine Census&amp;rdquo; linking to
this page.&lt;/p>
&lt;p>If the noise is bothering you today, the diagnosis and mitigation walkthrough is the
&lt;a href="https://techfuelhq.com/articles/coil-whine-2026/">coil whine guide: is it normal, and where is it coming from?&lt;/a>
— and a brand-new buzz paired with crashes belongs in the
&lt;a href="https://techfuelhq.com/articles/psu-failure-symptoms-2026/">PSU failure symptoms guide&lt;/a> rather than a
census form. If capping FPS quiets your card and you want the deeper fix, the
&lt;a href="https://techfuelhq.com/articles/gpu-undervolt-settings-database/">GPU undervolt settings database&lt;/a> is the
companion dataset.&lt;/p>
&lt;h2 id="change-log">Change log&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>0.1.0 (2026-08-12)&lt;/strong> — schema, anchored severity scale, intake (issue form + PR
path), validator, and the empty census opened: 0 rows, no seeded data.&lt;/li>
&lt;li>&lt;strong>0.1.1 (2026-08-13)&lt;/strong> — first accepted report: the maintainer&amp;rsquo;s own Astral
RTX 5080 OC via the issue-form flow (issue #1 -&amp;gt; validated row). n=1; every
model remains below the n&amp;gt;=5 distribution floor.&lt;/li>
&lt;/ul></description></item><item><title>DDR5 RAM Price Index: Dated $/GB from Direct US Retailers (Pilot)</title><link>https://techfuelhq.com/data/ram-price-index/</link><pubDate>Wed, 12 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/data/ram-price-index/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · Published 2026-08-12 · ~5 min read · St. Louis County, MO&lt;/p>
&lt;h2 id="the-short-version">The short version&lt;/h2>
&lt;p>DDR5 prices roughly tripled during the 2026 memory supply crisis, and the
numbers that circulate are mostly screenshots without dates or methods. This
page is the start of a dated, checkable record: a $/GB index for mainstream
32GB (2x16GB) DDR5 kits observed at &lt;strong>named direct US retailers only&lt;/strong>, with
the method, the acceptance rules, every rejection reason, and the raw data
published alongside the numbers.&lt;/p>
&lt;p>It is labeled a &lt;strong>pilot&lt;/strong> because the index metric has an activation gate it
has not passed yet — and rather than loosen the rules to manufacture a number,
the gate status is printed here verbatim.&lt;/p>
&lt;h2 id="day-one-observations-2026-08-12">Day-one observations (2026-08-12)&lt;/h2>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Kit&lt;/th>
&lt;th scope="col" style="text-align: right">Cheapest qualifying offer&lt;/th>
&lt;th scope="col" style="text-align: right">$/GB&lt;/th>
&lt;th scope="col">Retailer&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Corsair Vengeance 32GB (2x16) DDR5-6000 CL30&lt;/td>
&lt;td style="text-align: right">$449.99&lt;/td>
&lt;td style="text-align: right">$14.06&lt;/td>
&lt;td>B&amp;amp;H&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Corsair Vengeance RGB 32GB (2x16) DDR5-6000 CL30&lt;/td>
&lt;td style="text-align: right">$449.99&lt;/td>
&lt;td style="text-align: right">$14.06&lt;/td>
&lt;td>B&amp;amp;H&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Corsair Dominator Titanium 32GB (2x16) DDR5-6000&lt;/td>
&lt;td style="text-align: right">$649.99&lt;/td>
&lt;td style="text-align: right">$20.31&lt;/td>
&lt;td>Newegg&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>21 qualifying offers total across 3 kits, out of 546 listings reviewed. For
scale: the Vengeance 6000 CL30 kit was a $95–110 street-price part through
2024 — today&amp;rsquo;s cheapest direct-retailer offer is roughly &lt;strong>4x&lt;/strong> that.&lt;/p>
&lt;p>Day two (2026-08-13) held the pattern: 581 listings reviewed, 23 qualifying
offers, the same 3 Corsair kits, cheapest offer unchanged at $449.99. Day
three (2026-08-14) — the capture the table below renders — held it again: 24
qualifying offers across the same 3 Corsair kits, cheapest still $449.99
($14.06/GB) at B&amp;amp;H, Dominator Titanium still $649.99.&lt;/p>
&lt;h2 id="every-qualifying-observation-latest-capture">Every qualifying observation, latest capture&lt;/h2>
&lt;p>The most recent daily capture&amp;rsquo;s full qualifying set, exactly as the collector
recorded it — not just the cheapest row per kit.&lt;/p>
&lt;div class="table-wrap csv-table">
&lt;table>
&lt;thead>
&lt;tr>&lt;th>Capture Date Utc&lt;/th>&lt;th>Product Label&lt;/th>&lt;th>Title&lt;/th>&lt;th>Seller&lt;/th>&lt;th>Price Usd&lt;/th>&lt;th>Usd per Gb&lt;/th>&lt;th>Verification Status&lt;/th>&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Dominator Titanium 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>CORSAIR - Dominator Titanium 32GB (2 x 16GB) DDR5 6000 (PC5 48000) Desktop Memory Model CMP32GX5M2B6000C30 - Black&lt;/td>&lt;td>Best Buy&lt;/td>&lt;td>649.99&lt;/td>&lt;td>20.312&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Dominator Titanium 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Corsair Dominator Titanium RGB DDR5 32GB (2x16GB) 6000MHz CL30 Memory&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>649.99&lt;/td>&lt;td>20.312&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Dominator Titanium 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>CORSAIR Dominator Titanium 32GB (2 x 16GB) DDR5 6000 (PC5 48000) Desktop Memory Model CMP32GX5M2B6000C30W&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>649.99&lt;/td>&lt;td>20.312&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>CORSAIR 32GB VENGEANCE RGB DDR5 6000 MT/s DIMM Memory Kit (Gray, 2 x 16GB)&lt;/td>&lt;td>B&amp;amp;H Photo-Video-Audio&lt;/td>&lt;td>449.99&lt;/td>&lt;td>14.062&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>CORSAIR - VENGEANCE RGB DDR5 32GB (2 x 16GB) DDR5 6000MHz CL38-44-44-96 1.35V Intel XMP &amp;amp; AMD EXPO - Gray&lt;/td>&lt;td>Best Buy&lt;/td>&lt;td>449.99&lt;/td>&lt;td>14.062&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>CORSAIR - VENGEANCE 32GB (2x16GB) DDR5 6000MHz C36 UDIMM Desktop Memory - Black&lt;/td>&lt;td>Best Buy&lt;/td>&lt;td>479.99&lt;/td>&lt;td>15.0&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>CORSAIR - VENGEANCE 32GB (2x16GB) DDR5 6000MHz Z30 AMD EXPO &amp;amp; Intel XMP UDIMM Desktop Memory - Black&lt;/td>&lt;td>Best Buy&lt;/td>&lt;td>499.99&lt;/td>&lt;td>15.625&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Corsair Vengeance DDR5 32GB (2x16GB) 6000MT/s Memory Kit&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>505.99&lt;/td>&lt;td>15.812&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Corsair CMK32GX5M2B6000C30 VENGEANCE DDR5 32GB (2x16GB) Memory Kit 6000MT/s 30-36-36-76 XMP 3.0 1.4V Black&lt;/td>&lt;td>Central Computers&lt;/td>&lt;td>529.99&lt;/td>&lt;td>16.562&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>CORSAIR - Vengeance 32GB (2 x 16GB) 288-Pin PC RAM DDR5 6000 (PC5 48000) Desktop Memory Model CMK32GX5M2B6000C30 - Black&lt;/td>&lt;td>Best Buy&lt;/td>&lt;td>539.99&lt;/td>&lt;td>16.875&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>CORSAIR Vengeance 32GB (2 x 16GB) 288-Pin PC RAM DDR5 6000 (PC5 48000) Desktop Memory Model CMK32GX5M2B6000Z30&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>539.99&lt;/td>&lt;td>16.875&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>CORSAIR - VENGEANCE RGB 32GB (2x16GB) DDR5 6000MHz C36 UDIMM Desktop Memory - White&lt;/td>&lt;td>Best Buy&lt;/td>&lt;td>599&lt;/td>&lt;td>18.719&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>CORSAIR Vengeance RGB 32GB (2 x 16GB) 288-Pin PC RAM DDR5 6000 (PC5 48000) Custom Lab Cherry Blossom Desktop Memory Model CMH32GX5M2B6000Z30WCB - Whit&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>599.99&lt;/td>&lt;td>18.75&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>CORSAIR - Vengeance 32GB (2 x 16GB) 288-Pin PC RAM DDR5 6000 (PC5 48000) Desktop Memory Model CMK32GX5M2B6000Z30W - White&lt;/td>&lt;td>Best Buy&lt;/td>&lt;td>604.99&lt;/td>&lt;td>18.906&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>CORSAIR Vengeance 32GB (2 x 16GB) 288-Pin PC RAM DDR5 6000 (PC5 48000) Desktop Memory Model CMK32GX5M2B6000Z30W&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>604.99&lt;/td>&lt;td>18.906&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>CORSAIR - Vengeance RGB 32GB (2 x 16GB) 288-Pin PC RAM DDR5 6000 (PC5 48000) Desktop Memory Model CMH32GX5M2B6000Z30W - White&lt;/td>&lt;td>Best Buy&lt;/td>&lt;td>619.99&lt;/td>&lt;td>19.375&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>CORSAIR Vengeance RGB 32GB (2 x 16GB) 288-Pin PC RAM DDR5 6000 (PC5 48000) Desktop Memory Model CMH32GX5M2B6000C30W&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>619.99&lt;/td>&lt;td>19.375&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>CORSAIR Vengeance RGB 32GB (2 x 16GB) 288-Pin PC RAM DDR5 6000 (PC5 48000) Desktop Memory Model CMH32GX5M2B6000C30&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>619.99&lt;/td>&lt;td>19.375&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance RGB 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>CORSAIR 32GB VENGEANCE RGB DDR5 6000 MT/s DIMM Memory Kit (Gray, 2 x 16GB)&lt;/td>&lt;td>B&amp;amp;H Photo-Video-Audio&lt;/td>&lt;td>449.99&lt;/td>&lt;td>14.062&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance RGB 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>CORSAIR - Vengeance RGB 32GB (2 x 16GB) 288-Pin PC RAM DDR5 6000 (PC5 48000) Desktop Memory Model CMH32GX5M2B6000C38 - Black&lt;/td>&lt;td>Best Buy&lt;/td>&lt;td>469.59&lt;/td>&lt;td>14.675&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance RGB 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>CORSAIR Vengeance RGB 32GB (2 x 16GB) 288-Pin PC RAM DDR5 6000 (PC5 48000) Desktop Memory Model CMH32GX5M2E6000C36W&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>489.99&lt;/td>&lt;td>15.312&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance RGB 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>CORSAIR VENGEANCE RGB 32GB (2x16GB) DDR5 6000MHz RAM&lt;/td>&lt;td>Altex Electronics&lt;/td>&lt;td>499.99&lt;/td>&lt;td>15.625&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance RGB 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>CORSAIR Vengeance RGB 32GB (2 x 16GB) 288-Pin PC RAM DDR5 6000 (PC5 48000) Desktop Memory Model CMH32GX5M2B6000C38&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>509.99&lt;/td>&lt;td>15.937&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance RGB 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>CORSAIR Vengeance RGB 32GB (2 x 16GB) 288-Pin PC RAM DDR5 6000 (PC5 48000) Custom Lab Cherry Blossom Desktop Memory Model CMH32GX5M2B6000Z30WCB - Whit&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>599.99&lt;/td>&lt;td>18.75&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance RGB 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>CORSAIR - Vengeance RGB 32GB (2 x 16GB) 288-Pin PC RAM DDR5 6000 (PC5 48000) Desktop Memory Model CMH32GX5M2B6000Z30W - White&lt;/td>&lt;td>Best Buy&lt;/td>&lt;td>619.99&lt;/td>&lt;td>19.375&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance RGB 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>CORSAIR - Vengeance RGB 32GB (2 x 16GB) 288-Pin PC RAM DDR5 6000 (PC5 48000) Desktop Memory Model CMH32GX5M2B6000C30W - White&lt;/td>&lt;td>Best Buy&lt;/td>&lt;td>619.99&lt;/td>&lt;td>19.375&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance RGB 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>CORSAIR Vengeance RGB 32GB (2 x 16GB) 288-Pin PC RAM DDR5 6000 (PC5 48000) Custom Lab Cherry Blossom Desktop Memory Model CMH32GX5M2B6000Z30CB - Gray&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>619.99&lt;/td>&lt;td>19.375&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance RGB 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>CORSAIR Vengeance RGB 32GB (2 x 16GB) 288-Pin PC RAM DDR5 6000 (PC5 48000) Desktop Memory Model CMH32GX5M2B6000C30&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>619.99&lt;/td>&lt;td>19.375&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance RGB 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>CORSAIR Vengeance RGB 32GB (2 x 16GB) 288-Pin PC RAM DDR5 6000 (PC5 48000) Desktop Memory Model CMH32GX5M2B6000Z30W&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>619.99&lt;/td>&lt;td>19.375&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p class="csv-table__note">Rendered at build time from &lt;a href="https://techfuelhq.com/data/ram-price-observations.csv">the raw CSV&lt;/a> — the table and the download can never disagree.&lt;/p>
&lt;p>&lt;strong>Gate status, verbatim:&lt;/strong> 3 of 12 tracked kits produced qualifying offers;
the index metric (median cheapest $/GB across kits) activates at 6. Direct
retailer stock is not independently confirmed at the listing page yet, so
every row carries &lt;code>verification_status: discovery_only&lt;/code>.&lt;/p>
&lt;h2 id="what-gets-rejected-and-why-thats-the-point">What gets rejected, and why that&amp;rsquo;s the point&lt;/h2>
&lt;p>Of 546 listings reviewed in the day-one capture, 525 were rejected, each with
recorded reasons: marketplace and third-party sellers (the largest bucket),
listings that don&amp;rsquo;t state the 32GB capacity or the 2x16GB split in the title,
wrong speed for the tracked SKU, used/renewed condition, and prices outside a
sanity band. A price index built on listings a script &lt;em>guessed&lt;/em> about would
be smoother — and worthless. The rejection log ships with the dataset.&lt;/p>
&lt;h2 id="method-exactly">Method, exactly&lt;/h2>
&lt;p>Captures run against Google Shopping (US, English) via DataForSEO&amp;rsquo;s merchant
API, one exact-model query per tracked kit. An offer qualifies only if the
seller matches a named direct-retailer allowlist (Best Buy, Newegg, B&amp;amp;H,
Micro Center, Adorama, Walmart first-party, and peers — marketplace suffixes
excluded), the title states the exact kit line, speed, 32GB capacity, and
2x16GB split (a &amp;ldquo;Dual Channel&amp;rdquo; declaration on a 32GB listing counts as the
split), condition is new, and the USD price sits inside a $60–900 band. The
band&amp;rsquo;s ceiling was raised from $500 on day one when real direct-retailer
offers at $469–499 for the &lt;em>cheapest&lt;/em> kit proved the old ceiling was written
for a market that no longer exists — that correction is recorded in the
change log, not hidden.&lt;/p>
&lt;p>Amazon is excluded by design (see FAQ). The full collector, product basket,
tests, raw responses, and rejection logs are in the site&amp;rsquo;s repository.&lt;/p>
&lt;h2 id="use-the-data-cc-by-40">Use the data (CC BY 4.0)&lt;/h2>
&lt;p>Download the day-one observations:
&lt;a href="https://techfuelhq.com/data/ram-price-observations.csv">ram-price-observations.csv&lt;/a> — one row per
qualifying offer, with capture date, kit, price, $/GB, seller, and
verification status. Once the activation gate opens, the daily index series
publishes at &lt;code>/data/ram-price-index.csv&lt;/code> (median cheapest $/GB across kits,
one row per UTC day). License: Creative Commons Attribution 4.0 — attribute
as &amp;ldquo;TechFuelHQ DDR5 RAM Price Index&amp;rdquo; linking to this page.&lt;/p>
&lt;p>Context for the crisis itself: the
&lt;a href="https://techfuelhq.com/articles/ram-ssd-price-crisis-2026/">RAM &amp;amp; SSD price crisis explainer&lt;/a> and
the &lt;a href="https://techfuelhq.com/articles/ddr5-ram-buying-guide-2025/">DDR5 buying guide&lt;/a> — the guide&amp;rsquo;s
price-tracking data is what earned this site its first external news citation,
and this index is that work made repeatable.&lt;/p>
&lt;h2 id="change-log">Change log&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>0.9.2 (2026-08-14)&lt;/strong> — day-three capture (24 qualifying offers, same 3
Corsair kits, cheapest unchanged at $449.99). Correction: the rendered
observation table had advanced to the 2026-08-14 capture while the prose
above it still described only days one and two, so a reader met a table
dated later than anything the page acknowledged. The prose now names the
capture the table actually serves.&lt;/li>
&lt;li>&lt;strong>0.9.1 (2026-08-13)&lt;/strong> — day-two capture (581 reviewed / 23 qualifying / 3
kits, cheapest unchanged). The page now renders the full qualifying
observation table straight from the raw CSV at build time, so the visible
table and the download can never disagree.&lt;/li>
&lt;li>&lt;strong>0.9.0 (2026-08-12)&lt;/strong> — pilot capture and method publication. Four method
corrections made against measured evidence on day one, all recorded: price
ceiling $500 → $900 (285 real listings died on the stale band); &amp;ldquo;Dual
Channel&amp;rdquo; accepted as an explicit module-split marker (Newegg writes Trident
Z5 Neo kits this way); per-product offer de-duplication (a Corsair offer
was being consumed and mis-rejected under another kit&amp;rsquo;s query); basket v1.1
swapped two kits with zero direct-retailer presence (ADATA XPG Lancer,
Patriot Viper Venom) for Dominator Titanium 6000 and Flare X5 5600.&lt;/li>
&lt;/ul></description></item><item><title>HDD Price Index: Dated $/TB for 8TB NAS Drives from Direct US Retailers (Pilot)</title><link>https://techfuelhq.com/data/hdd-price-index/</link><pubDate>Wed, 12 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/data/hdd-price-index/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · Published 2026-08-12 · ~5 min read · St. Louis County, MO&lt;/p>
&lt;h2 id="the-short-version">The short version&lt;/h2>
&lt;p>Consumer NAS drive prices rose roughly 30-50% through the 2026 supply squeeze
as WD and Seagate steered nearline output toward AI and cloud buyers, and most
of the $/TB numbers that circulate are undated screenshots or grey-market
recertified listings quoted as if they were new-drive prices. This page starts
a dated, checkable record: a $/TB index for &lt;strong>8TB 3.5-inch internal drives&lt;/strong>
— the mainstream homelab size — observed at &lt;strong>named direct US retailers
only&lt;/strong>, with the method, the acceptance rules, every rejection reason, and the
raw data published alongside the numbers.&lt;/p>
&lt;p>It is labeled a &lt;strong>pilot&lt;/strong> because the index metric has an activation gate it
has not passed yet. Day one produced exactly one qualifying observation, and
rather than loosen the rules to manufacture a fuller table, the gate status is
printed here verbatim.&lt;/p>
&lt;h2 id="day-one-observations-2026-08-12">Day-one observations (2026-08-12)&lt;/h2>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Drive&lt;/th>
&lt;th scope="col" style="text-align: right">Cheapest qualifying offer&lt;/th>
&lt;th scope="col" style="text-align: right">$/TB&lt;/th>
&lt;th scope="col">Retailer&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>WD Red Pro 8TB NAS (7200 RPM)&lt;/td>
&lt;td style="text-align: right">$402.99&lt;/td>
&lt;td style="text-align: right">$50.37&lt;/td>
&lt;td>Best Buy&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>1 qualifying offer across 1 drive line, out of 673 listings reviewed for 12
tracked models (four NAS, two surveillance, two enterprise, three desktop
lines, plus IronWolf Pro). For scale: WD Red Pro 8TB listed around $220-240
through most of 2024, so today&amp;rsquo;s cheapest qualifying offer is roughly &lt;strong>1.7x&lt;/strong>
its pre-squeeze street price.&lt;/p>
&lt;p>&lt;strong>Gate status, verbatim:&lt;/strong> 1 of 12 tracked drives produced qualifying offers;
the index metric (median cheapest $/TB across drives) activates at 6. The
capture&amp;rsquo;s blocking reasons: &amp;ldquo;Direct retailer stock status is not independently
confirmed.&amp;rdquo;; &amp;ldquo;Exact seller capacity/variant must be verified on the retailer
page before publication.&amp;rdquo;; &amp;ldquo;Only 1 of 12 models produced eligible rows; the
minimum is 6.&amp;rdquo; Every published row carries
&lt;code>verification_status: discovery_only&lt;/code>.&lt;/p>
&lt;h2 id="what-gets-rejected-and-why-thats-the-point">What gets rejected, and why that&amp;rsquo;s the point&lt;/h2>
&lt;p>672 of 673 reviewed listings were rejected, each with recorded machine-readable
reasons (a listing can carry several): 583 came from sellers off the
direct-retailer allowlist — eBay storefronts, recertified-drive houses,
white-label resellers, marketplace suffixes; 202 never stated the 8TB capacity
in the title; 130 carried prices outside the sanity band; 55 were multi-packs
or bundles; 52 named a sibling line (IronWolf &lt;strong>Pro&lt;/strong> under the IronWolf
query, SkyHawk &lt;strong>AI&lt;/strong> under SkyHawk); 33 were external or enclosure products;
5 were used, recertified, or open-box.&lt;/p>
&lt;p>The capacity bucket is the HDD-specific finding: direct retailers frequently
publish family-level Google Shopping titles — real examples from this capture
include &amp;ldquo;Gold Hard Drive WD&amp;rdquo; and &amp;ldquo;Exos 7E10 Hard Drive Seagate&amp;rdquo; at $399.99 —
that never say which capacity the price belongs to. A tracker that guessed
would fill its table faster and be worthless. The rejection log ships with the
dataset.&lt;/p>
&lt;h2 id="method-exactly">Method, exactly&lt;/h2>
&lt;p>Captures run against Google Shopping (US, English) via DataForSEO&amp;rsquo;s merchant
API, one exact-model query per tracked drive. An offer qualifies only if the
seller matches a named direct-retailer allowlist (Best Buy, Newegg, B&amp;amp;H,
Micro Center, Adorama, Walmart first-party, and peers — marketplace suffixes
excluded), the title states the exact line and the 8TB capacity, no
sibling-superset line token appears, the product is a single internal drive
(external/enclosure listings and multi-pack markers like &amp;ldquo;2-Pack&amp;rdquo;, &amp;ldquo;2 x&amp;rdquo;, or
&amp;ldquo;20PK&amp;rdquo; are rejected), condition is new (used, refurbished, recertified, and
white-label all rejected), and the USD price sits inside a $100-600 band.&lt;/p>
&lt;p>Two method corrections were made against measured evidence on day one, both
recorded in the change log below: the price ceiling was raised from $400
after a real single-drive offer — the WD Red Pro at $402.99 — died on the old
band as its only rejection reason, and a multi-pack guard was added in the
same pass because pack listings ($599.98 to $1,479.96 for 2- and 4-packs in
the same capture) pass every title rule and would otherwise have entered the
raised band as fake singles.&lt;/p>
&lt;p>Amazon is excluded by design (see FAQ). The full collector, product basket,
tests, raw responses, and rejection logs are in the site&amp;rsquo;s repository.&lt;/p>
&lt;h2 id="use-the-data-cc-by-40">Use the data (CC BY 4.0)&lt;/h2>
&lt;p>Download the day-one observations:
&lt;a href="https://techfuelhq.com/data/hdd-price-observations.csv">hdd-price-observations.csv&lt;/a> — one row per
qualifying offer, with capture date, drive, price, $/TB, seller, and
verification status. Once the activation gate opens, the daily index series
publishes at &lt;code>/data/hdd-price-index.csv&lt;/code> (median cheapest $/TB across drives,
one row per UTC day). License: Creative Commons Attribution 4.0 — attribute
as &amp;ldquo;TechFuelHQ HDD Price Index&amp;rdquo; linking to this page.&lt;/p>
&lt;p>Deciding between the drive lines this index tracks? The
&lt;a href="https://techfuelhq.com/homelab/seagate-ironwolf-vs-ironwolf-pro-vs-exos-2026/">IronWolf vs IronWolf Pro vs Exos comparison&lt;/a>
covers workload ratings and warranty, the
&lt;a href="https://techfuelhq.com/homelab/best-budget-nas-builds-2025/">budget NAS build guide&lt;/a> prices whole
builds in the drive crunch, and the
&lt;a href="https://techfuelhq.com/tools/nas-storage-calculator/">NAS storage calculator&lt;/a> turns raw capacity
into usable space under RAID.&lt;/p>
&lt;h2 id="every-qualifying-observation-latest-capture">Every qualifying observation, latest capture&lt;/h2>
&lt;p>The pilot&amp;rsquo;s entire qualifying set — currently one drive. That thinness is the
finding, and the table renders from the raw CSV at build time so it updates
the moment the data does.&lt;/p>
&lt;div class="table-wrap csv-table">
&lt;table>
&lt;thead>
&lt;tr>&lt;th>Capture Date Utc&lt;/th>&lt;th>Product Label&lt;/th>&lt;th>Title&lt;/th>&lt;th>Seller&lt;/th>&lt;th>Price Usd&lt;/th>&lt;th>Usd per Tb&lt;/th>&lt;th>Verification Status&lt;/th>&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>&lt;td>2026-08-12&lt;/td>&lt;td>WD Red Pro 8TB NAS (WD8005FFBX)&lt;/td>&lt;td>WD Red Pro 8TB 3.5&amp;#34; 7200RPM SATA III Hard Drive&lt;/td>&lt;td>Best Buy&lt;/td>&lt;td>402.99&lt;/td>&lt;td>50.37&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p class="csv-table__note">Rendered at build time from &lt;a href="https://techfuelhq.com/data/hdd-price-observations.csv">the raw CSV&lt;/a> — the table and the download can never disagree.&lt;/p>
&lt;h2 id="change-log">Change log&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>0.9.0 (2026-08-12)&lt;/strong> — pilot capture and method publication. Two method
corrections made against measured evidence on day one, both recorded: price
ceiling $400 → $600 (a genuine WD Red Pro 8TB single at Best Buy, $402.99,
was rejected by the stale ceiling as its only failing check), and a
multi-pack/bundle guard added alongside the raise (measured leak shapes:
&amp;ldquo;WD 2-Pack 8TB Red Plus&amp;rdquo; $739.98, &amp;ldquo;Seagate 8TB BarraCuda (OEM Packaging,
2-Pack)&amp;rdquo; $599.98, &amp;ldquo;2 x WD Red Plus 8TB&amp;rdquo; $699.98, 20-pack IronWolf rows —
all state the line and capacity, so only the guard keeps them out of the
raised band). Run 2&amp;rsquo;s results were collected through DataForSEO&amp;rsquo;s
tasks-ready endpoint after a queue-delay timeout; no tasks were re-posted
and no rows were lost.&lt;/li>
&lt;/ul></description></item><item><title>RTX 5080 Local LLM Throughput: Measured Tokens/Second Dataset</title><link>https://techfuelhq.com/data/rtx-5080-llm-throughput/</link><pubDate>Wed, 12 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/data/rtx-5080-llm-throughput/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · Published 2026-08-12 · ~4 min read · St. Louis County, MO&lt;/p>
&lt;h2 id="the-short-version">The short version&lt;/h2>
&lt;p>This is a measured dataset, not a spec-sheet estimate: real decode and prefill
tokens/second for local LLMs on the same retail RTX 5080 that runs this site&amp;rsquo;s
&lt;a href="https://techfuelhq.com/data/gpu/rog-astral-rtx-5080-oc-2026-06-09/">open bench dataset&lt;/a>. Three
models spanning 3B to 20.9B parameters, two context windows, two prompt sizes,
three repetitions per cell, ollama&amp;rsquo;s native counters, temperature 0.&lt;/p>
&lt;p>Per-GPU pages exist elsewhere for the RTX 5090, 4090, and 5060 — none for the
5080 when this dataset was first captured (checked 2026-08-12). This page is
the 5080 entry, from a card someone actually owns.&lt;/p>
&lt;h2 id="the-numbers-capture-2026-08-12">The numbers (capture 2026-08-12)&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">Context&lt;/th>
&lt;th scope="col" style="text-align: right">Decode tok/s&lt;/th>
&lt;th scope="col" style="text-align: right">Prefill tok/s&lt;/th>
&lt;th scope="col" style="text-align: right">Load ms&lt;/th>
&lt;th scope="col" style="text-align: right">VRAM MiB*&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>gpt-oss:20b (20.9B)&lt;/td>
&lt;td>MXFP4&lt;/td>
&lt;td style="text-align: right">4,096&lt;/td>
&lt;td style="text-align: right">190.1 / 187.3&lt;/td>
&lt;td style="text-align: right">9,078 / 10,465&lt;/td>
&lt;td style="text-align: right">298 / 280&lt;/td>
&lt;td style="text-align: right">14,067&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>gpt-oss:20b (20.9B)&lt;/td>
&lt;td>MXFP4&lt;/td>
&lt;td style="text-align: right">16,384&lt;/td>
&lt;td style="text-align: right">188.6 / 187.7&lt;/td>
&lt;td style="text-align: right">9,287 / 10,554&lt;/td>
&lt;td style="text-align: right">299 / 280&lt;/td>
&lt;td style="text-align: right">14,355&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qwen 2.5 7B (7.6B)&lt;/td>
&lt;td>Q4_K_M&lt;/td>
&lt;td style="text-align: right">4,096&lt;/td>
&lt;td style="text-align: right">180.0 / 176.8&lt;/td>
&lt;td style="text-align: right">10,152 / 9,672&lt;/td>
&lt;td style="text-align: right">130 / 123&lt;/td>
&lt;td style="text-align: right">6,190&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qwen 2.5 7B (7.6B)&lt;/td>
&lt;td>Q4_K_M&lt;/td>
&lt;td style="text-align: right">16,384&lt;/td>
&lt;td style="text-align: right">179.7 / 176.6&lt;/td>
&lt;td style="text-align: right">10,133 / 9,984&lt;/td>
&lt;td style="text-align: right">128 / 128&lt;/td>
&lt;td style="text-align: right">7,034&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qwen 2.5 14B (14.8B)&lt;/td>
&lt;td>Q4_K_M&lt;/td>
&lt;td style="text-align: right">4,096&lt;/td>
&lt;td style="text-align: right">96.7 / 94.5&lt;/td>
&lt;td style="text-align: right">5,202 / 4,876&lt;/td>
&lt;td style="text-align: right">183 / 126&lt;/td>
&lt;td style="text-align: right">10,841&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qwen 2.5 14B (14.8B)&lt;/td>
&lt;td>Q4_K_M&lt;/td>
&lt;td style="text-align: right">16,384&lt;/td>
&lt;td style="text-align: right">97.0 / 94.6&lt;/td>
&lt;td style="text-align: right">5,226 / 4,865&lt;/td>
&lt;td style="text-align: right">131 / 129&lt;/td>
&lt;td style="text-align: right">13,157&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Llama 3.2 3B (3.2B)&lt;/td>
&lt;td>Q4_K_M&lt;/td>
&lt;td style="text-align: right">4,096&lt;/td>
&lt;td style="text-align: right">312.0 / 298.2&lt;/td>
&lt;td style="text-align: right">18,197 / 17,681&lt;/td>
&lt;td style="text-align: right">163 / 156&lt;/td>
&lt;td style="text-align: right">15,682*&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Llama 3.2 3B (3.2B)&lt;/td>
&lt;td>Q4_K_M&lt;/td>
&lt;td style="text-align: right">16,384&lt;/td>
&lt;td style="text-align: right">312.9 / 298.6&lt;/td>
&lt;td style="text-align: right">17,886 / 19,397&lt;/td>
&lt;td style="text-align: right">163 / 158&lt;/td>
&lt;td style="text-align: right">5,495&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>Paired values are the ~500-token / ~1,650-token prompt cells. Every value is
the median of 3 runs.&lt;/p>
&lt;p>*The starred Llama VRAM reading includes gpt-oss:20b still resident from the
previous bench — see the FAQ. The 5,495 MiB row is the model alone.&lt;/p>
&lt;p>Three readings worth naming:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Decode speed is flat across context at these prompt sizes.&lt;/strong> 4k to 16k
&lt;code>num_ctx&lt;/code> moves gpt-oss:20b by less than 2 tok/s. Context &lt;em>capacity&lt;/em> costs
VRAM (Qwen: 10.6 → 12.8 GiB), not decode speed, until the prompt itself
gets long.&lt;/li>
&lt;li>&lt;strong>The 20B model is the surprise.&lt;/strong> gpt-oss:20b&amp;rsquo;s MXFP4 quantization decodes
twice as fast as the dense 14B at Q4_K_M and matches the dense 7B —
architecture and quantization beat parameter count.&lt;/li>
&lt;li>&lt;strong>Prefill is not the bottleneck at these sizes.&lt;/strong> Even the slowest model
ingests ~5,000 tok/s; a 1,650-token prompt costs a third of a second.&lt;/li>
&lt;/ul>
&lt;p>The standout result has its own explainer now: &lt;a href="https://techfuelhq.com/articles/mxfp4-vs-q4km-rtx-5080/">why the 21B MoE doubles the dense 14B&lt;/a> — the bandwidth arithmetic, shown in full against these rows.&lt;/p>
&lt;h2 id="method-exactly">Method, exactly&lt;/h2>
&lt;p>The capture script (in the site repository) drives ollama&amp;rsquo;s
&lt;code>/api/generate&lt;/code> and records its native &lt;code>eval_count&lt;/code>/&lt;code>eval_duration&lt;/code> and
&lt;code>prompt_eval_count&lt;/code>/&lt;code>prompt_eval_duration&lt;/code> — the timers the runtime itself
keeps — never wall-clock division. Each repetition prepends a unique nonce so
every run pays a full prefill; without it, warm repetitions hit ollama&amp;rsquo;s
prompt cache and report ~60,000 tok/s cache-hit rates that measure nothing
(we caught exactly that in the first capture attempt and rejected those rows).
Generation is pinned: temperature 0, seed 42, 256-token target output. A cell
enters the CSV only when all 3 repetitions pass mechanical checks (enough
tokens generated for a stable rate; a genuine full-prompt prefill observed).&lt;/p>
&lt;p>Bench environment, recorded per row: NVIDIA GeForce RTX 5080 (16 GiB), driver
610.88, ollama 0.32.1, Windows 11, Ryzen 7 7800X3D. Model identity is pinned
by digest in the CSV, because a tag like &lt;code>qwen2.5:14b&lt;/code> can silently move.&lt;/p>
&lt;h2 id="limitations-honestly">Limitations, honestly&lt;/h2>
&lt;p>One retail card, one driver, one runtime. These are &lt;em>this unit&amp;rsquo;s&lt;/em> numbers —
silicon lottery, thermals, and runtime version all move results; that is why
each row carries its digest, driver, and date instead of claiming to be a
universal constant. The VRAM column is whole-GPU &lt;code>nvidia-smi&lt;/code> at measurement
time (see FAQ). llama.cpp direct, vLLM, and image-generation throughput are
planned lanes, not covered yet.&lt;/p>
&lt;h2 id="use-the-data-cc-by-40">Use the data (CC BY 4.0)&lt;/h2>
&lt;p>Download the CSV: &lt;a href="https://techfuelhq.com/data/rtx-5080-llm-throughput.csv">rtx-5080-llm-throughput.csv&lt;/a>.
License: Creative Commons Attribution 4.0. Attribute as &amp;ldquo;TechFuelHQ RTX 5080
LLM Throughput Dataset&amp;rdquo; linking to this page. Sizing a build for local AI?
Pair these measured rows with the
&lt;a href="https://techfuelhq.com/tools/llm-vram-calculator/">LLM VRAM calculator&lt;/a> and the
&lt;a href="https://techfuelhq.com/tools/llm-speed-calculator/">LLM speed calculator&lt;/a> — the estimators tell
you what should fit; this table shows what one real card actually did.&lt;/p>
&lt;h2 id="the-full-matrix-rendered-from-the-raw-csv">The full matrix, rendered from the raw CSV&lt;/h2>
&lt;p>Every measured cell, straight from the downloadable file at build time.&lt;/p>
&lt;div class="table-wrap csv-table">
&lt;table>
&lt;thead>
&lt;tr>&lt;th>Capture Date Utc&lt;/th>&lt;th>Method Version&lt;/th>&lt;th>Gpu&lt;/th>&lt;th>Driver&lt;/th>&lt;th>Ollama Version&lt;/th>&lt;th>Model&lt;/th>&lt;th>Model Digest12&lt;/th>&lt;th>Parameter Size&lt;/th>&lt;th>Quantization&lt;/th>&lt;th>Num Ctx&lt;/th>&lt;th>Prompt Tokens&lt;/th>&lt;th>Reps&lt;/th>&lt;th>Median Decode Tok S&lt;/th>&lt;th>Median Prefill Tok S&lt;/th>&lt;th>Median Load Ms&lt;/th>&lt;th>Vram Resident Mib&lt;/th>&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>&lt;td>2026-08-12&lt;/td>&lt;td>llm-throughput-ollama-v1&lt;/td>&lt;td>NVIDIA GeForce RTX 5080&lt;/td>&lt;td>610.88&lt;/td>&lt;td>0.32.1&lt;/td>&lt;td>gpt-oss:20b&lt;/td>&lt;td>17052f91a42e&lt;/td>&lt;td>20.9B&lt;/td>&lt;td>MXFP4&lt;/td>&lt;td>4096&lt;/td>&lt;td>503&lt;/td>&lt;td>3&lt;/td>&lt;td>190.14&lt;/td>&lt;td>9078.28&lt;/td>&lt;td>297.7&lt;/td>&lt;td>14067&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-12&lt;/td>&lt;td>llm-throughput-ollama-v1&lt;/td>&lt;td>NVIDIA GeForce RTX 5080&lt;/td>&lt;td>610.88&lt;/td>&lt;td>0.32.1&lt;/td>&lt;td>gpt-oss:20b&lt;/td>&lt;td>17052f91a42e&lt;/td>&lt;td>20.9B&lt;/td>&lt;td>MXFP4&lt;/td>&lt;td>4096&lt;/td>&lt;td>1658&lt;/td>&lt;td>3&lt;/td>&lt;td>187.27&lt;/td>&lt;td>10464.66&lt;/td>&lt;td>279.5&lt;/td>&lt;td>14060&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-12&lt;/td>&lt;td>llm-throughput-ollama-v1&lt;/td>&lt;td>NVIDIA GeForce RTX 5080&lt;/td>&lt;td>610.88&lt;/td>&lt;td>0.32.1&lt;/td>&lt;td>gpt-oss:20b&lt;/td>&lt;td>17052f91a42e&lt;/td>&lt;td>20.9B&lt;/td>&lt;td>MXFP4&lt;/td>&lt;td>16384&lt;/td>&lt;td>503&lt;/td>&lt;td>3&lt;/td>&lt;td>188.63&lt;/td>&lt;td>9286.61&lt;/td>&lt;td>299.2&lt;/td>&lt;td>14355&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-12&lt;/td>&lt;td>llm-throughput-ollama-v1&lt;/td>&lt;td>NVIDIA GeForce RTX 5080&lt;/td>&lt;td>610.88&lt;/td>&lt;td>0.32.1&lt;/td>&lt;td>gpt-oss:20b&lt;/td>&lt;td>17052f91a42e&lt;/td>&lt;td>20.9B&lt;/td>&lt;td>MXFP4&lt;/td>&lt;td>16384&lt;/td>&lt;td>1658&lt;/td>&lt;td>3&lt;/td>&lt;td>187.73&lt;/td>&lt;td>10554.32&lt;/td>&lt;td>280.2&lt;/td>&lt;td>14355&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-12&lt;/td>&lt;td>llm-throughput-ollama-v1&lt;/td>&lt;td>NVIDIA GeForce RTX 5080&lt;/td>&lt;td>610.88&lt;/td>&lt;td>0.32.1&lt;/td>&lt;td>qwen2.5:14b&lt;/td>&lt;td>7cdf5a0187d5&lt;/td>&lt;td>14.8B&lt;/td>&lt;td>Q4_K_M&lt;/td>&lt;td>4096&lt;/td>&lt;td>488&lt;/td>&lt;td>3&lt;/td>&lt;td>96.65&lt;/td>&lt;td>5202.23&lt;/td>&lt;td>182.5&lt;/td>&lt;td>10841&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-12&lt;/td>&lt;td>llm-throughput-ollama-v1&lt;/td>&lt;td>NVIDIA GeForce RTX 5080&lt;/td>&lt;td>610.88&lt;/td>&lt;td>0.32.1&lt;/td>&lt;td>qwen2.5:14b&lt;/td>&lt;td>7cdf5a0187d5&lt;/td>&lt;td>14.8B&lt;/td>&lt;td>Q4_K_M&lt;/td>&lt;td>4096&lt;/td>&lt;td>1674&lt;/td>&lt;td>3&lt;/td>&lt;td>94.48&lt;/td>&lt;td>4876.41&lt;/td>&lt;td>125.8&lt;/td>&lt;td>10855&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-12&lt;/td>&lt;td>llm-throughput-ollama-v1&lt;/td>&lt;td>NVIDIA GeForce RTX 5080&lt;/td>&lt;td>610.88&lt;/td>&lt;td>0.32.1&lt;/td>&lt;td>qwen2.5:14b&lt;/td>&lt;td>7cdf5a0187d5&lt;/td>&lt;td>14.8B&lt;/td>&lt;td>Q4_K_M&lt;/td>&lt;td>16384&lt;/td>&lt;td>488&lt;/td>&lt;td>3&lt;/td>&lt;td>97.02&lt;/td>&lt;td>5225.96&lt;/td>&lt;td>131.3&lt;/td>&lt;td>13157&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-12&lt;/td>&lt;td>llm-throughput-ollama-v1&lt;/td>&lt;td>NVIDIA GeForce RTX 5080&lt;/td>&lt;td>610.88&lt;/td>&lt;td>0.32.1&lt;/td>&lt;td>qwen2.5:14b&lt;/td>&lt;td>7cdf5a0187d5&lt;/td>&lt;td>14.8B&lt;/td>&lt;td>Q4_K_M&lt;/td>&lt;td>16384&lt;/td>&lt;td>1674&lt;/td>&lt;td>3&lt;/td>&lt;td>94.58&lt;/td>&lt;td>4864.67&lt;/td>&lt;td>128.9&lt;/td>&lt;td>13159&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-12&lt;/td>&lt;td>llm-throughput-ollama-v1&lt;/td>&lt;td>NVIDIA GeForce RTX 5080&lt;/td>&lt;td>610.88&lt;/td>&lt;td>0.32.1&lt;/td>&lt;td>llama3.2:3b&lt;/td>&lt;td>a80c4f17acd5&lt;/td>&lt;td>3.2B&lt;/td>&lt;td>Q4_K_M&lt;/td>&lt;td>4096&lt;/td>&lt;td>471&lt;/td>&lt;td>3&lt;/td>&lt;td>311.96&lt;/td>&lt;td>18196.57&lt;/td>&lt;td>162.8&lt;/td>&lt;td>15682&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-12&lt;/td>&lt;td>llm-throughput-ollama-v1&lt;/td>&lt;td>NVIDIA GeForce RTX 5080&lt;/td>&lt;td>610.88&lt;/td>&lt;td>0.32.1&lt;/td>&lt;td>llama3.2:3b&lt;/td>&lt;td>a80c4f17acd5&lt;/td>&lt;td>3.2B&lt;/td>&lt;td>Q4_K_M&lt;/td>&lt;td>4096&lt;/td>&lt;td>1657&lt;/td>&lt;td>3&lt;/td>&lt;td>298.21&lt;/td>&lt;td>17681.08&lt;/td>&lt;td>156.2&lt;/td>&lt;td>15682&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-12&lt;/td>&lt;td>llm-throughput-ollama-v1&lt;/td>&lt;td>NVIDIA GeForce RTX 5080&lt;/td>&lt;td>610.88&lt;/td>&lt;td>0.32.1&lt;/td>&lt;td>llama3.2:3b&lt;/td>&lt;td>a80c4f17acd5&lt;/td>&lt;td>3.2B&lt;/td>&lt;td>Q4_K_M&lt;/td>&lt;td>16384&lt;/td>&lt;td>471&lt;/td>&lt;td>3&lt;/td>&lt;td>312.89&lt;/td>&lt;td>17885.62&lt;/td>&lt;td>162.9&lt;/td>&lt;td>5495&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-12&lt;/td>&lt;td>llm-throughput-ollama-v1&lt;/td>&lt;td>NVIDIA GeForce RTX 5080&lt;/td>&lt;td>610.88&lt;/td>&lt;td>0.32.1&lt;/td>&lt;td>llama3.2:3b&lt;/td>&lt;td>a80c4f17acd5&lt;/td>&lt;td>3.2B&lt;/td>&lt;td>Q4_K_M&lt;/td>&lt;td>16384&lt;/td>&lt;td>1657&lt;/td>&lt;td>3&lt;/td>&lt;td>298.59&lt;/td>&lt;td>19397.36&lt;/td>&lt;td>158.0&lt;/td>&lt;td>5501&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-12&lt;/td>&lt;td>llm-throughput-ollama-v1&lt;/td>&lt;td>NVIDIA GeForce RTX 5080&lt;/td>&lt;td>610.88&lt;/td>&lt;td>0.32.1&lt;/td>&lt;td>qwen2.5:7b&lt;/td>&lt;td>845dbda0ea48&lt;/td>&lt;td>7.6B&lt;/td>&lt;td>Q4_K_M&lt;/td>&lt;td>4096&lt;/td>&lt;td>488&lt;/td>&lt;td>3&lt;/td>&lt;td>180.02&lt;/td>&lt;td>10152.28&lt;/td>&lt;td>129.8&lt;/td>&lt;td>6190&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-12&lt;/td>&lt;td>llm-throughput-ollama-v1&lt;/td>&lt;td>NVIDIA GeForce RTX 5080&lt;/td>&lt;td>610.88&lt;/td>&lt;td>0.32.1&lt;/td>&lt;td>qwen2.5:7b&lt;/td>&lt;td>845dbda0ea48&lt;/td>&lt;td>7.6B&lt;/td>&lt;td>Q4_K_M&lt;/td>&lt;td>4096&lt;/td>&lt;td>1674&lt;/td>&lt;td>3&lt;/td>&lt;td>176.79&lt;/td>&lt;td>9672.39&lt;/td>&lt;td>123.4&lt;/td>&lt;td>6190&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-12&lt;/td>&lt;td>llm-throughput-ollama-v1&lt;/td>&lt;td>NVIDIA GeForce RTX 5080&lt;/td>&lt;td>610.88&lt;/td>&lt;td>0.32.1&lt;/td>&lt;td>qwen2.5:7b&lt;/td>&lt;td>845dbda0ea48&lt;/td>&lt;td>7.6B&lt;/td>&lt;td>Q4_K_M&lt;/td>&lt;td>16384&lt;/td>&lt;td>488&lt;/td>&lt;td>3&lt;/td>&lt;td>179.66&lt;/td>&lt;td>10133.1&lt;/td>&lt;td>127.9&lt;/td>&lt;td>7022&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-12&lt;/td>&lt;td>llm-throughput-ollama-v1&lt;/td>&lt;td>NVIDIA GeForce RTX 5080&lt;/td>&lt;td>610.88&lt;/td>&lt;td>0.32.1&lt;/td>&lt;td>qwen2.5:7b&lt;/td>&lt;td>845dbda0ea48&lt;/td>&lt;td>7.6B&lt;/td>&lt;td>Q4_K_M&lt;/td>&lt;td>16384&lt;/td>&lt;td>1674&lt;/td>&lt;td>3&lt;/td>&lt;td>176.61&lt;/td>&lt;td>9984.37&lt;/td>&lt;td>127.7&lt;/td>&lt;td>7034&lt;/td>&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p class="csv-table__note">Rendered at build time from &lt;a href="https://techfuelhq.com/data/rtx-5080-llm-throughput.csv">the raw CSV&lt;/a> — the table and the download can never disagree.&lt;/p>
&lt;h2 id="change-log">Change log&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>1.0.2 (2026-08-14)&lt;/strong> — VRAM correction, no re-measurement. The prose and FAQ were
converting the CSV&amp;rsquo;s &lt;code>vram_resident_mib&lt;/code> column by 1000 and calling the result GiB;
every narrative footprint was ~2.4% high. Recomputed at 1024 (gpt-oss:20b is
13.7–14.0 GiB resident, not 14.0–14.4). The measured table was already correct.&lt;/li>
&lt;li>&lt;strong>1.0.1 (2026-08-12)&lt;/strong> — added Qwen 2.5 7B (Q4_K_M): 176.6-180.0 tok/s
decode, ~10k tok/s prefill, 6.0-6.9 GiB resident measured alone — four
models now span 3B-20.9B.&lt;/li>
&lt;li>&lt;strong>1.0.0 (2026-08-12)&lt;/strong> — first capture: gpt-oss:20b, Qwen 2.5 14B,
Llama 3.2 3B × 4k/16k context × ~500/~1,650-token prompts, 3 reps per cell,
ollama 0.32.1, driver 610.88. First-capture defect worth recording: warm-run
prompt-cache contamination was detected and eliminated by per-rep nonces
before any row entered the dataset.&lt;/li>
&lt;/ul></description></item><item><title>What DDR5 RAM Actually Costs Right Now: 16GB to 128GB Kit Price Check</title><link>https://techfuelhq.com/articles/ddr5-ram-prices-2026/</link><pubDate>Sat, 01 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/articles/ddr5-ram-prices-2026/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · Published 2026-08-01 · Prices last checked 2026-08-01 · ~9 min read · St. Louis County, MO&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 style="margin:0 0 0.5rem 0;font-weight:700;color:#c8ff00;letter-spacing:0.04em;text-transform:uppercase;font-size:0.85rem;">Prices last checked: August 1, 2026&lt;/p>
&lt;p style="margin:0 0 0.6rem 0;line-height:1.6;">Reading Newegg's own DDR5-6000 CL30 listings that morning: a single &lt;strong>16GB module opened at $214.99&lt;/strong>, a &lt;strong>32GB (2x16GB) kit at $399.99&lt;/strong>, a &lt;strong>64GB (2x32GB) kit at $869.99&lt;/strong>, and the cheapest &lt;strong>128GB (2x64GB) kit at $2,999.99&lt;/strong>. The independent US tracker WhereIsMyRam put the 32GB DDR5-6000 CL30 floor at $400 the same day and showed the market up 13.7% over the prior 30 days.&lt;/p>
&lt;p style="margin:0;font-size:0.9rem;color:#a0a0b8;">These are observed listing prices on one dated morning, not a live feed. Every figure below links to the page it came from. For why memory got this expensive, see &lt;a href="https://techfuelhq.com/articles/ram-ssd-price-crisis-2026/">the 2026 RAM and SSD price crisis&lt;/a>; for which specific kit to buy, see the &lt;a href="https://techfuelhq.com/articles/ddr5-ram-buying-guide-2025/">DDR5 buying guide&lt;/a>.&lt;/p>
&lt;/div>
&lt;p>If you searched for what a 32GB DDR5-6000 CL30 kit costs, the answer on August 1, 2026 is roughly &lt;strong>$400 to $420&lt;/strong>, with the cheapest listing at $399.99. That is the number this page exists to give you, with the date attached and a link to where it came from, because a memory price without a date is close to useless in 2026.&lt;/p>
&lt;p>Below: the same treatment for every capacity tier, the per-gigabyte math that makes one of them a bad deal, what moved last month, and a straight answer on whether to buy now.&lt;/p>
&lt;h2 id="16gb-the-cheapest-entry-and-the-worst-per-gigabyte-deal">16GB: the cheapest entry, and the worst per-gigabyte deal&lt;/h2>
&lt;p>&lt;em>Some links below are affiliate links; if you buy through them TechFuel HQ may earn a small commission at no extra cost to you. As an Amazon Associate I earn from qualifying purchases. Commissions never influence which products get recommended — see our &lt;a href="https://techfuelhq.com/disclosure/">disclosure&lt;/a>.&lt;/em>&lt;/p>
&lt;p>Newegg&amp;rsquo;s &lt;a 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%3D16gb%2Bddr5%2B6000%2Bcl30" rel="nofollow sponsored noopener">16GB DDR5-6000 CL30 listings&lt;/a> on August 1, 2026 opened with a single Patriot Viper Venom 16GB module (PVV516G60C30) at &lt;strong>$214.99&lt;/strong>, timings 30-40-40-76 at 1.35V. The cheapest two-stick 16GB kit in that same listing was G.SKILL&amp;rsquo;s Flare X5 2x8GB at &lt;strong>$264.99&lt;/strong>.&lt;/p>
&lt;p>Divide those out and 16GB is the tier that punishes you. The $214.99 module is about &lt;strong>$13.44 per gigabyte&lt;/strong> by my arithmetic. The 32GB kit below is $12.50 per gigabyte. You are paying more per gigabyte for less memory, and the cheapest 16GB option here is a single module rather than a kit, so a two-slot board runs with one of its memory channels empty until you buy a second stick.&lt;/p>
&lt;p>Buy 16GB only if the budget is hard-capped and you know the machine&amp;rsquo;s job. Anything that touches modern games, browser tabs by the dozen, or a container or two has outgrown it. Our breakdown of &lt;a href="https://techfuelhq.com/articles/how-much-ram-do-you-need-2026/">how much RAM you actually need&lt;/a> walks the capacity question by workload rather than by price.&lt;/p>
&lt;h2 id="32gb-ddr5-6000-cl30-the-number-most-people-came-for">32GB DDR5-6000 CL30: the number most people came for&lt;/h2>
&lt;p>This is the tier the search traffic is asking about, so here is the full listing spread from Newegg&amp;rsquo;s &lt;a 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%3Dddr5%2B6000%2Bcl30" rel="nofollow sponsored noopener">DDR5-6000 CL30 results&lt;/a> on August 1, 2026:&lt;/p>
&lt;p>The XPG LANCER 2x16GB (AX5U6000C3016G-DCLABK) was the cheapest at &lt;strong>$399.99&lt;/strong>, carrying Newegg&amp;rsquo;s own &amp;ldquo;lowest price in 30 days&amp;rdquo; flag. The RGB version of the same kit and Patriot&amp;rsquo;s Viper Elite 5 2x16GB both listed at &lt;strong>$409.99&lt;/strong>. V-COLOR&amp;rsquo;s Manta XSky was &lt;strong>$419.99&lt;/strong>. From there the branded tier climbs fast: Team T-Force Delta RGB at &lt;strong>$489.99&lt;/strong>, Corsair Vengeance RGB at &lt;strong>$509.99&lt;/strong>, and G.SKILL&amp;rsquo;s Trident Z5 Neo RGB at &lt;strong>$599.99&lt;/strong>. Those are list prices; several carried stacking promo codes at the time of the check, so the number at checkout can land below the number on the tile.&lt;/p>
&lt;p>That $200 spread between the cheapest and most expensive 32GB CL30 kit is the single most actionable fact on this page. Every kit in it carries the same rated speed and the same rated latency. In a normal market, paying up for a familiar brand is a defensible $30 decision. At current pricing it is a $200 one.&lt;/p>
&lt;p>Cross-checking against a second source: &lt;a href="https://whereismyram.com/us/price-chart" rel="noopener">WhereIsMyRam&amp;rsquo;s US price chart&lt;/a> listed the DDR5-6000 CL30 32GB minimum at &lt;strong>$400&lt;/strong> on the same day, within a dollar of Newegg&amp;rsquo;s floor. The tracker aggregates US retail listings and states that Amazon prices are excluded from its charts, which is why I use it as the independent check here.&lt;/p>
&lt;p>Two more figures from that tracker worth knowing before you buy a speed grade: DDR5-6000 CL36 sat at &lt;strong>$380&lt;/strong> against $400 for CL30, so tightening the timings at 6000 cost about &lt;strong>$20&lt;/strong> at this capacity. DDR5-6400 CL32 was &lt;strong>$390&lt;/strong> and DDR5-5600 CL36 was &lt;strong>$376&lt;/strong>.&lt;/p>
&lt;h3 id="the-live-direct-retailer-observations-behind-this-section">The live direct-retailer observations behind this section&lt;/h3>
&lt;p>These rows come from the &lt;a href="https://techfuelhq.com/data/ram-price-index/">TechFuelHQ RAM price index&lt;/a>
collector — named direct US retailers only, marketplace sellers rejected,
refreshed by a daily capture and re-rendered here on every build:&lt;/p>
&lt;div class="table-wrap csv-table">
&lt;table>
&lt;thead>
&lt;tr>&lt;th>Capture Date Utc&lt;/th>&lt;th>Product Label&lt;/th>&lt;th>Seller&lt;/th>&lt;th>Price Usd&lt;/th>&lt;th>Usd per Gb&lt;/th>&lt;th>Verification Status&lt;/th>&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Dominator Titanium 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Best Buy&lt;/td>&lt;td>649.99&lt;/td>&lt;td>20.312&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Dominator Titanium 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>649.99&lt;/td>&lt;td>20.312&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Dominator Titanium 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>649.99&lt;/td>&lt;td>20.312&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>B&amp;amp;H Photo-Video-Audio&lt;/td>&lt;td>449.99&lt;/td>&lt;td>14.062&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Best Buy&lt;/td>&lt;td>449.99&lt;/td>&lt;td>14.062&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Best Buy&lt;/td>&lt;td>479.99&lt;/td>&lt;td>15.0&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Best Buy&lt;/td>&lt;td>499.99&lt;/td>&lt;td>15.625&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>505.99&lt;/td>&lt;td>15.812&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Central Computers&lt;/td>&lt;td>529.99&lt;/td>&lt;td>16.562&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Best Buy&lt;/td>&lt;td>539.99&lt;/td>&lt;td>16.875&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>539.99&lt;/td>&lt;td>16.875&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Best Buy&lt;/td>&lt;td>599&lt;/td>&lt;td>18.719&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>599.99&lt;/td>&lt;td>18.75&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Best Buy&lt;/td>&lt;td>604.99&lt;/td>&lt;td>18.906&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>604.99&lt;/td>&lt;td>18.906&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Best Buy&lt;/td>&lt;td>619.99&lt;/td>&lt;td>19.375&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>619.99&lt;/td>&lt;td>19.375&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>619.99&lt;/td>&lt;td>19.375&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance RGB 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>B&amp;amp;H Photo-Video-Audio&lt;/td>&lt;td>449.99&lt;/td>&lt;td>14.062&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance RGB 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Best Buy&lt;/td>&lt;td>469.59&lt;/td>&lt;td>14.675&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance RGB 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>489.99&lt;/td>&lt;td>15.312&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance RGB 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Altex Electronics&lt;/td>&lt;td>499.99&lt;/td>&lt;td>15.625&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance RGB 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>509.99&lt;/td>&lt;td>15.937&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance RGB 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>599.99&lt;/td>&lt;td>18.75&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance RGB 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Best Buy&lt;/td>&lt;td>619.99&lt;/td>&lt;td>19.375&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance RGB 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Best Buy&lt;/td>&lt;td>619.99&lt;/td>&lt;td>19.375&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance RGB 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>619.99&lt;/td>&lt;td>19.375&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance RGB 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>619.99&lt;/td>&lt;td>19.375&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;tr>&lt;td>2026-08-16&lt;/td>&lt;td>Corsair Vengeance RGB 32GB (2x16GB) DDR5-6000 CL30&lt;/td>&lt;td>Newegg.com&lt;/td>&lt;td>619.99&lt;/td>&lt;td>19.375&lt;/td>&lt;td>discovery_only&lt;/td>&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p class="csv-table__note">Rendered at build time from &lt;a href="https://techfuelhq.com/data/ram-price-observations.csv">the raw CSV&lt;/a> — the table and the download can never disagree.&lt;/p>
&lt;h2 id="64gb-double-the-capacity-for-slightly-more-than-double-the-money">64GB: double the capacity for slightly more than double the money&lt;/h2>
&lt;p>Newegg&amp;rsquo;s &lt;a 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%3D64gb%2Bddr5%2B6000%2Bcl30" rel="nofollow sponsored noopener">64GB DDR5-6000 CL30 listings&lt;/a> on August 1, 2026 bottomed out at V-COLOR&amp;rsquo;s Manta XFinity RGB 2x32GB (TMXFL3260830KWK) at &lt;strong>$869.99&lt;/strong>. G.SKILL&amp;rsquo;s Trident Z5 Neo RGB was &lt;strong>$995.55&lt;/strong>, Kingston&amp;rsquo;s FURY Beast &lt;strong>$1,049.99&lt;/strong>, and Corsair&amp;rsquo;s Vengeance 2x32GB &lt;strong>$1,159.99&lt;/strong>.&lt;/p>
&lt;p>At $869.99 the 64GB tier runs about &lt;strong>$13.59 per gigabyte&lt;/strong>, roughly 9% worse per gigabyte than the 32GB kit. So the honest framing is not &amp;ldquo;64GB costs twice as much as 32GB.&amp;rdquo; It costs about 2.2 times as much, and the extra 32GB you are buying arrives at a worse rate than the first 32GB did.&lt;/p>
&lt;p>Ignore that penalty if a real workload needs the capacity: virtual machines, large video timelines, a local model that spills out of VRAM. Do not accept it to buy 64GB &amp;ldquo;to be safe&amp;rdquo; on a gaming build. At these prices, unused capacity is the most expensive thing on a parts list.&lt;/p>
&lt;h2 id="128gb-the-tier-where-the-math-breaks">128GB: the tier where the math breaks&lt;/h2>
&lt;p>Two very different products both get sold as 128GB, and the gap between them is enormous.&lt;/p>
&lt;p>Going through 2x64GB modules, Newegg&amp;rsquo;s &lt;a 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%3D128gb%2Bddr5%2B6000" rel="nofollow sponsored noopener">128GB DDR5-6000 listings&lt;/a> started at V-COLOR&amp;rsquo;s Manta XFinity RGB at &lt;strong>$2,999.99&lt;/strong>, and note that it is CL32 rather than CL30 (1.35V, 32-45-45-96). G.SKILL&amp;rsquo;s Flare X5 and Ripjaws S5 2x64GB kits were &lt;strong>$3,249.99&lt;/strong> at CL34, and the Trident Z5 Neo RGB was &lt;strong>$3,299.99&lt;/strong>. That $2,999.99 entry point is about &lt;strong>$23.44 per gigabyte&lt;/strong>, nearly double the 32GB rate.&lt;/p>
&lt;p>Going through four 32GB modules instead, the same &lt;a 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%3D128gb%2Bddr5%2Bkit" rel="nofollow sponsored noopener">128GB kit search&lt;/a> showed A-Tech&amp;rsquo;s 4x32GB DDR5-5600 CL46 kit at &lt;strong>$1,858.33&lt;/strong> and Kingston&amp;rsquo;s FURY Beast 4x32GB DDR5-5200 CL40 at &lt;strong>$2,399.99&lt;/strong>. The A-Tech kit is roughly &lt;strong>$14.52 per gigabyte&lt;/strong>, which puts it back in line with the rest of the ladder and saves about $1,142 against the 2x64GB route.&lt;/p>
&lt;p>The catch is real, not theoretical. You give up the 6000 speed grade, you accept looser timings, and you fill all four DIMM slots, which our &lt;a href="https://techfuelhq.com/articles/ddr5-ram-buying-guide-2025/">DDR5 buying guide&lt;/a> covers as the configuration that most reliably costs you rated speed. For a workstation or homelab box where capacity is the entire point and memory clock is not, that trade is usually correct. For anything where the RAM speed matters, the 2x64GB premium is what the convenience costs.&lt;/p>
&lt;h2 id="what-moved-over-the-last-month">What moved over the last month&lt;/h2>
&lt;p>&lt;a href="https://whereismyram.com/us/" rel="noopener">WhereIsMyRam&amp;rsquo;s US market summary&lt;/a> on August 1, 2026 showed a &lt;strong>7-day change of +0.9%&lt;/strong> and a &lt;strong>30-day change of +13.7%&lt;/strong>, across 1,293 in-stock references, and labeled the week a strong upward trend. The tracker follows 2x16GB kits, and the cheapest tracked configuration at any speed was the $376 DDR5-5600 CL36 entry above.&lt;/p>
&lt;p>That 30-day figure is a market-wide aggregate across those 1,293 references, not the move on any one kit. The tracked market rose nearly 14% while a buyer waited.&lt;/p>
&lt;p>The honest complication comes from the same tracker: at the individual configuration level it describes DDR5-6000 CL30 as trading at its cheapest level in recent weeks, and Newegg flags the $399.99 XPG LANCER as its own lowest price in 30 days. Both are true. Specific SKUs dip inside a rising market when retailers clear individual lines. Read that as a reason to buy a well-priced kit today, not as a tier that keeps falling.&lt;/p>
&lt;h2 id="buy-now-or-wait-the-call-and-the-reasoning">Buy now or wait: the call, and the reasoning&lt;/h2>
&lt;p>Buy when you need it. Not because prices are good, but because the supply picture that sets them has no near-term fix.&lt;/p>
&lt;p>&lt;a href="https://www.trendforce.com/presscenter/news/20260730-13158.html" rel="noopener">TrendForce&amp;rsquo;s July 30, 2026 memory outlook&lt;/a> puts the DRAM sufficiency ratio at about &lt;strong>-1% to -2% for 2026&lt;/strong> and expects the supply-demand gap to widen further in 2027, with DRAM prices on an upward trajectory. Its structural explanation matters more than the forecast: HBM manufacturing requires significantly more wafer input than conventional DRAM, so higher wafer starts do not translate proportionally into additional bit output. More fab capacity does not automatically mean more DIMMs.&lt;/p>
&lt;p>Notably, TrendForce splits the two halves of the memory market in that same release. NAND flash supply loosens in the second half of 2027 as new capacity arrives and consumer demand stays weak. DRAM does not. If you have been assuming RAM and SSDs recover together, that assumption is now explicitly contradicted by the forecaster.&lt;/p>
&lt;p>The independent read agrees. PCWorld&amp;rsquo;s &lt;a href="https://www.pcworld.com/article/3116546/investigation-ram-prices-are-falling-dont-fall-for-it.html" rel="noopener">April 24, 2026 investigation&lt;/a> into the softening that showed up in some regional markets argued the dips were inventory and demand-elasticity effects on top of a structurally tight market rather than a real reversal. Analyst Patrick Moorhead, quoted in that piece, expected conditions to start improving in Q4 2027 and said he did not think the market would be, in his words, &amp;ldquo;normalized until 2030.&amp;rdquo;&lt;/p>
&lt;p>So the timing bet is not &amp;ldquo;wait a month.&amp;rdquo; Taking the earlier of those two dates, it is &amp;ldquo;wait until late 2027.&amp;rdquo; If your build can genuinely sit idle for five quarters, waiting is defensible. If it cannot, you are paying an option premium on a market two named sources expect to keep climbing.&lt;/p>
&lt;h2 id="when-not-to-upgrade">When NOT to upgrade&lt;/h2>
&lt;p>The buy-now advice above applies to memory you actually need. It is not an argument for touching a working machine. Four cases where the right move is to leave it alone:&lt;/p>
&lt;p>&lt;strong>You are on 32GB and nothing is swapping.&lt;/strong> Open your task manager under your real workload, not while idle. If committed memory sits below your installed capacity, more RAM buys you nothing. At $400 a kit, &amp;ldquo;future-proofing&amp;rdquo; is the most expensive placebo in a 2026 build.&lt;/p>
&lt;p>&lt;strong>You are running DDR4 and it is stable.&lt;/strong> A DDR4-to-DDR5 move is a platform change: new CPU, new board, new memory. At $399.99 for the 32GB kit, the memory line alone is now one of the largest items in that upgrade. Unless the CPU is the actual bottleneck, that money does more work in a GPU.&lt;/p>
&lt;p>&lt;strong>You want to go from CL36 to CL30 at the same capacity.&lt;/strong> The timing difference costs about $20 when you are already buying, per the tracker figures above. Buying a whole replacement kit to get it means paying $400 to retire working memory. Take tighter timings on a purchase you were making anyway, never as a standalone upgrade.&lt;/p>
&lt;p>&lt;strong>You are adding a second module to reach an odd total.&lt;/strong> Memory is sold in matched kits because the modules in one are validated to run together at their rated profile; two sticks bought separately carry no such validation. At current prices a pairing that will not hold its rated speed is an expensive experiment. If you need more, buy a matched kit and sell the old one.&lt;/p>
&lt;p>For what a build looks like when memory is priced as the fixed cost it has become, our &lt;a href="https://techfuelhq.com/pc-builds/budget-am5-1080p-gaming-pc-2026/">budget AM5 build&lt;/a> was specced around this market rather than against it.&lt;/p>
&lt;h2 id="how-these-numbers-were-checked">How these numbers were checked&lt;/h2>
&lt;p>Every price on this page was read on &lt;strong>August 1, 2026&lt;/strong> from a public retail listing page or an independent price tracker, and each one links to the exact page it came from. Newegg listings supplied the per-capacity figures; WhereIsMyRam supplied the independent cross-check and the market movement figures. The per-gigabyte figures are my own division of those listed prices by capacity, shown so you can check the arithmetic.&lt;/p>
&lt;p>Two limits, stated plainly. The retailer links are search pages, so they show today&amp;rsquo;s prices rather than the ones printed here, which means these exact figures are not reproducible later from the link. And these are list prices: promo codes moved several kits below their listed number on the day I checked, so treat every figure here as a ceiling.&lt;/p>
&lt;p>There is no first-party bench data on this page and no test bench behind it. This is a dated price observation, which is what the question calls for. Prices at these retailers move daily. Treat the figures here as the shape of the market on the date printed, and confirm the live number at the link before you spend.&lt;/p>
&lt;h2 id="the-bottom-line">The bottom line&lt;/h2>
&lt;p>As of August 1, 2026, DDR5-6000 CL30 runs about &lt;strong>$12.50 per gigabyte at 32GB&lt;/strong>, &lt;strong>$13.44 at 16GB&lt;/strong> and &lt;strong>$13.59 at 64GB&lt;/strong>. At 128GB the cheapest DDR5-6000 option is a CL32 kit at &lt;strong>$23.44 per gigabyte&lt;/strong>, or about $14.52 if you drop to a 4x32GB DDR5-5600 kit. The 32GB tier is both the volume sweet spot and the best rate on the ladder, which is unusual and worth taking advantage of.&lt;/p>
&lt;p>Buy the capacity your workload actually uses, take the cheapest listing that meets your spec rather than the familiar brand, and do not wait for a correction that the supply forecasts do not support. If you are still deciding which specific kit, the &lt;a href="https://techfuelhq.com/articles/ddr5-ram-buying-guide-2025/">DDR5 buying guide&lt;/a> has the picks; if you want the full explanation of how memory got here, &lt;a href="https://techfuelhq.com/articles/ram-ssd-price-crisis-2026/">the price crisis piece&lt;/a> has the cause.&lt;/p>
&lt;footer style="margin-top:40px;padding-top:24px;border-top:1px solid rgba(255,255,255,0.06);">
&lt;em>Prices observed 2026-08-01 from public Newegg listing pages and the WhereIsMyRam US tracker, both linked inline. Supply and forecast context from TrendForce (2026-07-30) and PCWorld (2026-04-24), linked inline. Per-gigabyte figures are derived from the listed prices. Found a figure that has moved or a mistake? Email &lt;a href="mailto:hello@techfuelhq.com">hello@techfuelhq.com&lt;/a> with the article URL and the section, per our &lt;a href="https://techfuelhq.com/editorial-standards/">editorial standards&lt;/a>.&lt;/em>
&lt;/footer></description></item><item><title>Best Hardware for Frigate NVR (2026)</title><link>https://techfuelhq.com/homelab/best-hardware-frigate-nvr-2026/</link><pubDate>Thu, 30 Jul 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/homelab/best-hardware-frigate-nvr-2026/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · Published 2026-07-30 · Updated 2026-07-30 · ~12 min read · St. Louis County, MO&lt;/p>
&lt;p>&lt;em>Some retailer links below are Amazon affiliate links; if you buy through them TechFuel HQ may earn a small commission at no extra cost to you. As an Amazon Associate I earn from qualifying purchases. Commissions never influence which products get recommended — see our &lt;a href="https://techfuelhq.com/disclosure/">disclosure&lt;/a>.&lt;/em>&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 style="margin:0 0 0.5rem 0;font-weight:700;color:#c8ff00;letter-spacing:0.04em;text-transform:uppercase;font-size:0.85rem;">TL;DR · Frigate hardware, sized by camera count&lt;/p>
&lt;ul style="margin:0.25rem 0 0 0;padding-left:1.25rem;line-height:1.55;">
&lt;li>&lt;strong>1–6 cameras, low activity:&lt;/strong> an &lt;strong>Intel N100/N150 mini PC&lt;/strong> with 16GB RAM. Frigate's own list names the N100-based Beelink EQ13 for "several 1080p cameras with low-medium activity."&lt;/li>
&lt;li>&lt;strong>6–12 cameras:&lt;/strong> step to a &lt;strong>modern Core i-series&lt;/strong> box (Frigate names the 1220P and 125H classes) and 16GB.&lt;/li>
&lt;li>&lt;strong>12+ cameras, high activity:&lt;/strong> multiple accelerators or a discrete GPU, per Frigate's planning docs.&lt;/li>
&lt;li>&lt;strong>Skip the Coral.&lt;/strong> Frigate now says it is "no longer recommended for new Frigate installations" outside low-power edge cases. Use the iGPU via OpenVINO — it's free.&lt;/li>
&lt;li>&lt;strong>Check AVX before you buy used.&lt;/strong> Frigate requires AVX+AVX2; Celeron and Pentium parts before 2020's Tiger Lake "typically lack AVX."&lt;/li>
&lt;li>&lt;strong>The drive is where the money leaks.&lt;/strong> A 4TB Seagate SkyHawk at $149.99 is $37.50/TB; a 1TB WD Purple at $162.94 costs &lt;em>more&lt;/em> for a quarter of the space. Prices dated 2026-07-30.&lt;/li>
&lt;/ul>
&lt;p style="margin:0.75rem 0 0 0;font-size:0.9rem;color:#a0a0b8;">Requirements and capability wording are quoted from Frigate's own documentation. Prices are a live Amazon US snapshot taken 2026-07-30 and move week to week — check the retailer link before buying. We do not own a Frigate rig and publish no first-party benchmarks here.&lt;/p>
&lt;/div>
&lt;p>Most &amp;ldquo;Frigate hardware&amp;rdquo; pages answer a narrower question than the one people actually ask. They list a minimum spec — 4GB, AVX2, an accelerator — and stop. But the thing you actually need to know is &lt;em>how much box do I need for my number of cameras&lt;/em>, and that answer is scattered across a docs page, a GitHub discussion, and a Facebook group.&lt;/p>
&lt;p>It&amp;rsquo;s a conspicuous gap. Ask Google right now and its AI Overview summarises the requirements and then closes by asking &lt;em>you&lt;/em> for the missing input: &amp;ldquo;If you tell me how many cameras you plan to use and their resolutions, I can help you pick the right mini PC or processor configuration.&amp;rdquo; (AI Overview for &amp;ldquo;frigate hardware requirements&amp;rdquo;, US/English, observed 2026-07-30; this wording varies between sessions and is not stable.) The machine knows what the table should contain. None of the top-ranking results we checked for that query on 2026-07-30 published it.&lt;/p>
&lt;p>So here it is, sized by camera count, with every requirement traced to Frigate&amp;rsquo;s own documentation, and every price dated and attributed to the listing it came from.&lt;/p>
&lt;h2 id="the-three-gates-before-you-spend-anything">The three gates before you spend anything&lt;/h2>
&lt;p>&lt;strong>AVX and AVX2, or nothing works.&lt;/strong> Frigate&amp;rsquo;s &lt;a href="https://docs.frigate.video/frigate/planning_setup/" rel="noopener">planning guide&lt;/a> requires &amp;ldquo;a CPU with AVX + AVX2 instructions.&amp;rdquo; Most modern processors carry both — but the exception is exactly the hardware people buy for a cheap NVR. Frigate spells it out: &amp;ldquo;Intel Celeron and Pentium models prior to the 2020 Tiger Lake generation typically lack AVX.&amp;rdquo; That cheap used mini-desktop with a Celeron is a dead end. Check the specific model on Intel&amp;rsquo;s ARK before you buy, not after.&lt;/p>
&lt;p>&lt;strong>Hardware decoding, which is not the same as detection.&lt;/strong> Frigate&amp;rsquo;s &lt;a href="https://docs.frigate.video/configuration/hardware_acceleration_video/" rel="noopener">video decoding docs&lt;/a> say &amp;ldquo;it is highly recommended to use an integrated or discrete GPU for hardware acceleration video decoding in Frigate,&amp;rdquo; because pulling apart camera streams is the CPU-heavy half of the workload. This is the part people under-buy: they budget for an AI accelerator and forget that decoding eats a CPU alive without an iGPU.&lt;/p>
&lt;p>&lt;strong>RAM, in three published tiers.&lt;/strong> Frigate gives real numbers rather than a vague &amp;ldquo;more is better&amp;rdquo;:&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Tier&lt;/th>
&lt;th scope="col">Frigate&amp;rsquo;s wording&lt;/th>
&lt;th scope="col">What it assumes&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>4GB&lt;/strong>&lt;/td>
&lt;td>&amp;ldquo;generally sufficient for a very basic Frigate setup&amp;rdquo;&lt;/td>
&lt;td>A few cameras, plus a dedicated detector&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>8GB&lt;/strong>&lt;/td>
&lt;td>&amp;ldquo;should be considered the minimum&amp;rdquo;&lt;/td>
&lt;td>Once enrichments run — face recognition, license plates&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>16GB&lt;/strong>&lt;/td>
&lt;td>&amp;ldquo;is highly recommended&amp;rdquo;&lt;/td>
&lt;td>8+ cameras, or heavy enrichment use&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>Note that Frigate also holds recording cache in &lt;code>/dev/shm&lt;/code>, sized separately from the above. Our &lt;a href="https://techfuelhq.com/tools/frigate-nvr-storage-calculator/">Frigate NVR storage calculator&lt;/a> computes that value alongside the disk estimate, because getting it wrong is a common first-install failure.&lt;/p>
&lt;h2 id="the-camera-count-ladder">The camera-count ladder&lt;/h2>
&lt;p>Frigate publishes activity-based guidance in its planning docs, and names specific machines in its &lt;a href="https://docs.frigate.video/frigate/hardware/" rel="noopener">recommended hardware&lt;/a> list. Neither is a buying table on its own. Combined, they are:&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Cameras&lt;/th>
&lt;th scope="col">Activity&lt;/th>
&lt;th scope="col">Frigate&amp;rsquo;s guidance&lt;/th>
&lt;th scope="col">Practical box&lt;/th>
&lt;th scope="col">Detector&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>1–6&lt;/strong>&lt;/td>
&lt;td>Low&lt;/td>
&lt;td>a single, entry-level AI accelerator is sufficient&lt;/td>
&lt;td>Intel N100/N150 mini PC, 16GB&lt;/td>
&lt;td>iGPU via OpenVINO&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>6–12&lt;/strong>&lt;/td>
&lt;td>Moderate&lt;/td>
&lt;td>more processing power required&lt;/td>
&lt;td>Modern Core i-series (Frigate names 1220P, 125H classes), 16GB&lt;/td>
&lt;td>iGPU via OpenVINO&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>12+&lt;/strong>&lt;/td>
&lt;td>High&lt;/td>
&lt;td>multiple entry-level AI accelerators, or a more powerful single unit such as a discrete GPU&lt;/td>
&lt;td>Desktop/server CPU + discrete GPU or Hailo&lt;/td>
&lt;td>Hailo-8 or dGPU&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>40+&lt;/strong>&lt;/td>
&lt;td>Commercial&lt;/td>
&lt;td>a modern discrete GPU&lt;/td>
&lt;td>Server-class, out of scope here&lt;/td>
&lt;td>dGPU&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>Frigate&amp;rsquo;s own capability notes for the named machines: the &lt;strong>Beelink EQ13&lt;/strong> (N100) &amp;ldquo;can run object detection on several 1080p cameras with low-medium activity&amp;rdquo;; the &lt;strong>1220P&lt;/strong> class &amp;ldquo;can handle a large number of 1080p cameras with high activity&amp;rdquo;; the &lt;strong>125H&lt;/strong> class &amp;ldquo;can handle a significant number of 1080p cameras with high activity.&amp;rdquo;&lt;/p>
&lt;p>&lt;strong>Activity matters as much as count.&lt;/strong> Frigate gates object detection behind &lt;a href="https://docs.frigate.video/configuration/motion_detection/" rel="noopener">motion detection&lt;/a>, so a quiet scene costs far less to run than a busy one. Six cameras pointed at a quiet side yard is a genuinely different load from six cameras on a busy street, and Frigate&amp;rsquo;s own tiering is written in those terms — which is why a flat &amp;ldquo;cameras → CPU&amp;rdquo; table from any other site is misleading. If your cameras see constant motion, size up one row.&lt;/p>
&lt;h2 id="the-coral-question-settled-by-the-people-who-make-frigate">The Coral question, settled by the people who make Frigate&lt;/h2>
&lt;p>This is where most of the internet is out of date, including the AI Overview&amp;rsquo;s own sources.&lt;/p>
&lt;p>Frigate&amp;rsquo;s hardware documentation now states plainly: &lt;strong>&amp;ldquo;The Coral is no longer recommended for new Frigate installations, except in deployments with particularly low power requirements or hardware incapable of utilizing alternative AI accelerators for object detection.&amp;rdquo;&lt;/strong> Frigate adds that it &amp;ldquo;will continue to provide support for the Coral TPU for as long as practicably possible,&amp;rdquo; so nobody with a working Coral is stranded.&lt;/p>
&lt;p>Two things follow, and they save real money:&lt;/p>
&lt;p>&lt;strong>On an Intel box, the free option is the right one.&lt;/strong> The integrated GPU handles decoding via Quick Sync &lt;em>and&lt;/em> runs detection through Frigate&amp;rsquo;s OpenVINO detector. One chip, both jobs, zero add-in cost. For the 1–12 camera range that covers most homes, this is the whole answer.&lt;/p>
&lt;p>&lt;strong>Where a dedicated accelerator genuinely helps, it&amp;rsquo;s Hailo now.&lt;/strong> Frigate states that it &amp;ldquo;supports both the Hailo-8 and Hailo-8L AI Acceleration Modules on compatible hardware platforms,&amp;rdquo; and lists them among its officially supported detectors. They are not cheap — and the price gap against the deprecated part is stark:&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Accelerator&lt;/th>
&lt;th scope="col">Price (2026-07-30)&lt;/th>
&lt;th scope="col">Status in Frigate&amp;rsquo;s docs&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Coral M.2, Dual Edge TPU&lt;/td>
&lt;td>&lt;a href="https://www.amazon.com/dp/B0CY231Q61?tag=techfuelhq-20" rel="nofollow sponsored">$55.99&lt;/a>&lt;/td>
&lt;td>&amp;ldquo;No longer recommended for new installations&amp;rdquo;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Hailo AI HAT+ (Pi 5), listed at 13 TOPS&lt;/td>
&lt;td>&lt;a href="https://www.amazon.com/dp/B0DNQMYWMY?tag=techfuelhq-20" rel="nofollow sponsored">$129.99&lt;/a>&lt;/td>
&lt;td>Supported detector&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Hailo-8 M.2, listed at 26 TOPS&lt;/td>
&lt;td>&lt;a href="https://www.amazon.com/dp/B0FBFTW5QJ?tag=techfuelhq-20" rel="nofollow sponsored">$214.99&lt;/a>&lt;/td>
&lt;td>Supported detector&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>Yes, the 26 TOPS Hailo-8 costs nearly four times the deprecated Coral, and the 13 TOPS HAT+ about twice. That tension is real, and none of the top-ranking pages we checked on 2026-07-30 resolves it, so here is the resolution: &lt;strong>on an Intel machine you buy neither.&lt;/strong> OpenVINO on the iGPU is already paid for. Reach for a Hailo when you are on hardware with no usable iGPU — a Raspberry Pi 5, say — or when you are past a dozen busy cameras.&lt;/p>
&lt;p>&lt;strong>One shopping warning.&lt;/strong> Searching for these modules returns a swamp. In an automated Amazon US product search for &amp;ldquo;Hailo-8L M.2&amp;rdquo; on 2026-07-30, the returned listings included a Raspberry Pi case at $94.99, an NVMe adapter HAT at $25.99, and — in paid slots — CNC carbide inserts and a linear-motion stage. Read the title on every listing. The cheapest genuine Hailo-8 module we could verify was $214.99, not the $25.99 that a price sort will happily show you.&lt;/p>
&lt;h2 id="boxes-worth-buying-priced-2026-07-30">Boxes worth buying, priced 2026-07-30&lt;/h2>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Machine&lt;/th>
&lt;th scope="col">Why&lt;/th>
&lt;th scope="col">Specs&lt;/th>
&lt;th scope="col">Price&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>GMKtec G3S&lt;/strong> (entry)&lt;/td>
&lt;td>Lowest-cost pick in this table, for 1–4 low-activity cameras — but see the RAM caveat below&lt;/td>
&lt;td>N95 · 8GB · 256GB SSD&lt;/td>
&lt;td>&lt;a href="https://www.amazon.com/dp/B0GD7NRS93?tag=techfuelhq-20" rel="nofollow sponsored">$249.99&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Beelink EQ-series&lt;/strong> (N150)&lt;/td>
&lt;td>Newer N-series part; ships with RAM and storage included&lt;/td>
&lt;td>N150 · 12GB LPDDR5 · 500GB&lt;/td>
&lt;td>&lt;a href="https://www.amazon.com/dp/B0DP289JGC?tag=techfuelhq-20" rel="nofollow sponsored">$309&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Beelink S12 Pro&lt;/strong> (best for most)&lt;/td>
&lt;td>16GB out of the box — the tier Frigate calls &amp;ldquo;highly recommended&amp;rdquo;&lt;/td>
&lt;td>N100 · 16GB DDR4 · 500GB&lt;/td>
&lt;td>&lt;a href="https://www.amazon.com/dp/B0GY42SQ3L?tag=techfuelhq-20" rel="nofollow sponsored">$339&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>&lt;strong>The trap that costs the most money in 2026: barebone boxes.&lt;/strong> A barebone mini PC with no RAM and no SSD looks like the value play, and it is not. RAM prices rose steeply through the 2026 memory shortage. The sticker on a barebone unit is a down payment — once you add a DDR5 SO-DIMM kit and an NVMe drive, a &amp;ldquo;cheap&amp;rdquo; barebone routinely lands &lt;em>above&lt;/em> a complete box that shipped with both. Buy the machine that already includes RAM and storage, or buy a used enterprise micro that does. We work through that math in detail in our &lt;a href="https://techfuelhq.com/homelab/best-mini-pcs-homelab-2026/">best mini PCs for a homelab&lt;/a> guide.&lt;/p>
&lt;p>If your NVR will also be your smart-home hub, the sizing question changes and we cover it separately in &lt;a href="https://techfuelhq.com/homelab/best-mini-pc-home-assistant-2026/">best mini PC for Home Assistant&lt;/a> — that page is about a Home Assistant box that also watches a few cameras. This page is about a machine whose main job is cameras. If you want both roles isolated on one machine, our &lt;a href="https://techfuelhq.com/tutorials/home-assistant-proxmox-2026/">Home Assistant on Proxmox guide&lt;/a> covers the virtualisation route.&lt;/p>
&lt;h2 id="storage-where-the-real-money-leaks">Storage: where the real money leaks&lt;/h2>
&lt;p>Frigate&amp;rsquo;s docs are clear on roles. SSDs &amp;ldquo;are designed with advanced wear-leveling algorithms&amp;rdquo; and give you a responsive UI and quick clip retrieval — good for the OS and database. For the relentless 24/7 write load of recording, Frigate points at NVR-rated drives like WD Purple and Seagate SkyHawk, &amp;ldquo;engineered for 24/7 operation and continuous write workloads.&amp;rdquo;&lt;/p>
&lt;p>Then you go shopping and find the pricing is a minefield. Live Amazon US, 2026-07-30:&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Drive&lt;/th>
&lt;th scope="col">Price&lt;/th>
&lt;th scope="col">Cost per TB&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Seagate SkyHawk 4TB&lt;/strong> (ST4000VXZ16)&lt;/td>
&lt;td>&lt;a href="https://www.amazon.com/dp/B0B1JPYH2Z?tag=techfuelhq-20" rel="nofollow sponsored">$149.99&lt;/a>&lt;/td>
&lt;td>&lt;strong>$37.50&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>WD Purple 6TB (WD60PURZ)&lt;/td>
&lt;td>&lt;a href="https://www.amazon.com/dp/B071V6SVK2?tag=techfuelhq-20" rel="nofollow sponsored">$289.99&lt;/a>&lt;/td>
&lt;td>$48.33&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>WD Purple 4TB (WD44PURZ)&lt;/td>
&lt;td>&lt;a href="https://www.amazon.com/dp/B0G6BSNYZ8?tag=techfuelhq-20" rel="nofollow sponsored">$219&lt;/a>&lt;/td>
&lt;td>$54.75&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>WD Purple 3TB (WD33PURZ)&lt;/td>
&lt;td>&lt;a href="https://www.amazon.com/dp/B0C18ZBDFS?tag=techfuelhq-20" rel="nofollow sponsored">$215&lt;/a>&lt;/td>
&lt;td>$71.67&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>WD Purple 1TB (WD11PURZ)&lt;/td>
&lt;td>&lt;a href="https://www.amazon.com/dp/B0CD2X2MTW?tag=techfuelhq-20" rel="nofollow sponsored">$162.94&lt;/a>&lt;/td>
&lt;td>$162.94&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>Read that bottom row twice. &lt;strong>The 1TB WD Purple at $162.94 costs more than the 4TB SkyHawk at $149.99&lt;/strong> — you can buy four times the capacity for $12.95 less. And at identical 4TB capacity in the same NVR-rated class, the WD Purple carries a 46% premium over the SkyHawk.&lt;/p>
&lt;p>Two rules fall out of it, both bounded to these prices. &lt;strong>At this pricing, sub-4TB surveillance drives are never the value pick&lt;/strong> — run the per-TB number before buying a small one; the pattern usually reflects small capacities being stocked for replacement buyers rather than builders. And &lt;strong>check both brands at your target capacity every time&lt;/strong>, because the badge premium moves and neither brand is reliably cheaper.&lt;/p>
&lt;p>Three caveats stated plainly. These are single-listing snapshots taken on one day at one retailer, and they look high against pre-2026 street prices — drive prices move faster than we can re-publish, so treat the per-TB column as a method rather than a price list. Model numbers, capacities and the TOPS figures above are as given in the retailer listings on 2026-07-30, not verified against manufacturer spec sheets. And on annual workload rating — often cited as the reason to pay the WD premium — &lt;a href="https://www.seagate.com/products/video-analytics/skyhawk-hard-drive/" rel="noopener">Seagate states&lt;/a> that SkyHawk drives &amp;ldquo;can support workloads up to 180TB per year,&amp;rdquo; the same figure the WD Purple listing quotes. On that specification the two are equivalent, so it is not a reason to pay 46% more. We have not tested any of these drives; every rating here is the manufacturer&amp;rsquo;s own. For drive selection beyond surveillance duty, see &lt;a href="https://techfuelhq.com/homelab/best-nas-hard-drives-2026/">best NAS hard drives&lt;/a>.&lt;/p>
&lt;p>&lt;strong>Size it before you buy it.&lt;/strong> Retention days, camera count, resolution, and codec drive the number far more than intuition suggests — going from 1080p to 4K on eight cameras is not a small adjustment. Put your actual numbers into the &lt;a href="https://techfuelhq.com/tools/frigate-nvr-storage-calculator/">Frigate NVR storage calculator&lt;/a> and buy against the result. It also computes the &lt;code>/dev/shm&lt;/code> value Frigate needs, which is the setting most first-time installs get wrong.&lt;/p>
&lt;h2 id="dont-forget-the-network-side">Don&amp;rsquo;t forget the network side&lt;/h2>
&lt;p>Cameras need power and bandwidth, and PoE switches are budgeted in watts, not ports. A switch with eight PoE ports and a 60W budget will not run eight 15W cameras. Work out the real figure with our &lt;a href="https://techfuelhq.com/tools/poe-budget-calculator/">PoE budget calculator&lt;/a> before ordering, because &amp;ldquo;8-port PoE&amp;rdquo; tells you almost nothing about what it can actually power.&lt;/p>
&lt;h2 id="what-wed-actually-buy">What we&amp;rsquo;d actually buy&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Four 1080p cameras on a quiet property:&lt;/strong> Beelink S12 Pro (N100, 16GB) at $339, OpenVINO on the iGPU, one 4TB SkyHawk at $149.99. No accelerator. Around $490 all-in before cameras.&lt;/li>
&lt;li>&lt;strong>Eight cameras, mixed activity:&lt;/strong> the same 16GB tier is Frigate&amp;rsquo;s &amp;ldquo;highly recommended&amp;rdquo; line — stay on it, step the CPU to a Core i-series box, and move to 6TB or dual 4TB drives.&lt;/li>
&lt;li>&lt;strong>Twelve or more, busy scenes:&lt;/strong> this is where Frigate&amp;rsquo;s docs say multiple accelerators or a real GPU, and where a Hailo-8 at $214.99 starts earning its price.&lt;/li>
&lt;/ul>
&lt;p>The honest summary: for the majority of home installs, Frigate is not demanding hardware. It&amp;rsquo;s demanding about &lt;em>two specific things&lt;/em> — AVX2 and hardware decoding — and generous about everything else. Most people over-buy the accelerator and under-buy the drive. Do it the other way around.&lt;/p>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;p>Frigate&amp;rsquo;s own documentation, fetched 2026-07-30:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://docs.frigate.video/frigate/hardware/" rel="noopener">Recommended hardware&lt;/a> — named machines, capability wording, Coral and Hailo status&lt;/li>
&lt;li>&lt;a href="https://docs.frigate.video/frigate/planning_setup/" rel="noopener">Planning a new installation&lt;/a> — RAM tiers, AVX requirement, camera-count guidance, drive recommendations&lt;/li>
&lt;li>&lt;a href="https://docs.frigate.video/configuration/hardware_acceleration_video/" rel="noopener">Video decoding&lt;/a> — hardware acceleration guidance&lt;/li>
&lt;li>&lt;a href="https://docs.frigate.video/configuration/object_detectors/" rel="noopener">Object detectors&lt;/a> — OpenVINO and Hailo detector configuration&lt;/li>
&lt;/ul>
&lt;p>Prices are a live Amazon US snapshot taken 2026-07-30 via automated retail lookup, with product titles read individually to exclude accessories and bundles. Per-TB figures are our arithmetic on those listed prices. We do not own a Frigate installation and publish no first-party benchmarks on this page; all capability claims are Frigate&amp;rsquo;s own words, quoted and linked.&lt;/p></description></item><item><title>PSU Tier List 2026: Power Supply Tiers, Every Row Sourced</title><link>https://techfuelhq.com/articles/psu-tier-list/</link><pubDate>Wed, 29 Jul 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/articles/psu-tier-list/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · Published 2026-07-29 · ~14 min read · St. Louis County, MO&lt;/p>
&lt;img src="https://techfuelhq.com/images/articles/psu-tier-list.svg" alt="The 2026 PSU tier list: 28 power supplies in four tiers plus an avoid class. Tier S, the units reviewers benchmark against — Corsair RMx 2024, NZXT C850/C1000, FSP Hydro Ti Pro, be quiet! Dark Power 13. Tier A, excellent but held out of S by one finding — Seasonic Vertex GX, Corsair HXi, Super Flower Leadex VII, Corsair SF Platinum SFX. Tier B, good with a caveat — Seasonic Focus GX, Corsair RMe, MSI MPG A1000G, Thermaltake GF3, Montech Century II. Tier C, budget class — XPG Core Reactor II VE, DeepCool PN850D, Thermaltake Smart BM3, Corsair CX750. Avoid, documented failures — Gigabyte GP-P750GM and P850GM, unbranded case-bundled units." 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>Search for a PSU tier list right now and the top results include a &lt;a href="https://linustechtips.com/topic/631048-psu-tier-list-old/" rel="noopener">Linus Tech Tips forum thread&lt;/a> whose own title says &lt;strong>[OLD]&lt;/strong>, posted in July 2016; the &lt;a href="https://cultists.network/140/psu-tier-list/" rel="noopener">Cultists Network list&lt;/a>, whose current revision 17.0g is dated November 2023; and a scattering of YouTube Shorts. Power supplies moved on: ATX 3.1, the revised 12V-2x6 connector, and a generation of refreshed platforms arrived after most of those lists stopped being maintained.&lt;/p>
&lt;p>This page is our answer: a tier database of 28 current power supply families, rebuilt from scratch for the ATX 3.x era. It has two rules the old lists never enforced, and one column none of them carry.&lt;/p>
&lt;p>The rules: &lt;strong>every specification traces to a source linked in its row&lt;/strong> — the manufacturer&amp;rsquo;s own page where one is reachable, otherwise the professional review that published the specification — and &lt;strong>every tier placement leans on a test linked right next to it&lt;/strong>, meaning Cybenetics certification data and hands-on reviews from outlets that load-test on real equipment. Where we could not verify something, the cell is blank. Blank beats guessed.&lt;/p>
&lt;p>The column nobody else has: what these units do at the &lt;strong>low loads a 24/7 homelab actually runs at&lt;/strong>, where the 80 PLUS badge on the box is silent. More on that below the table.&lt;/p>
&lt;h2 id="how-the-tiers-are-decided">How the tiers are decided&lt;/h2>
&lt;p>Tier letters are our editorial call, but they are derived from stated criteria, so you can audit any placement:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Tier S&lt;/strong> — a top-of-class professional verdict, a 10-year-or-longer warranty, and either elite measured performance or elite efficiency and noise results. These are the units reviewers compare everything else against.&lt;/li>
&lt;li>&lt;strong>Tier A&lt;/strong> — excellent units with strong professional verdicts and warranties of at least seven years, held out of S by one real finding: price, a transient-response result, a shorter warranty than the class leaders, or weak light-load efficiency.&lt;/li>
&lt;li>&lt;strong>Tier B&lt;/strong> — good units with a caveat you should know before buying: a louder fan profile, an older ATX 3.0 revision still on shelves, a warranty we could not verify, or a rival that simply tests better at the same price.&lt;/li>
&lt;li>&lt;strong>Tier C&lt;/strong> — the budget class. Fine choices when right-sized and bought at the right price, with bigger compromises: Bronze certification, fixed cabling, shorter warranties, or weak efficiency at the extremes.&lt;/li>
&lt;li>&lt;strong>Avoid&lt;/strong> — reserved for units whose failures a professional outlet has documented and stood behind. Two entries qualify, both cited.&lt;/li>
&lt;/ul>
&lt;p>Four housekeeping notes, because honesty about method is the whole point of this page. First, several 2023–2024 lines were silently refreshed from ATX 3.0/12VHPWR to ATX 3.1/12V-2x6; where the professional review covers the older build, the row says which revision the verdict describes. Second, we name a unit&amp;rsquo;s OEM platform only when the linked review states it — PSU platform attribution is a folklore-rich area and we do not repeat folklore. Third, rows for units with no independent test behind them were left out; the ones we considered and dropped are listed at the bottom of this page.&lt;/p>
&lt;p>The fourth note is an exception we want on the record rather than buried. One row — the EVGA SuperNOVA 1000 GT — carries no independent lab test, because no major outlet ever published one for the GT line. It is in the table anyway, in Tier C, because we ran one for an extended period in a working build and published &lt;a href="https://techfuelhq.com/reviews/evga-supernova-1000-gt-review-2026/">our own long-term review&lt;/a>. That is first-party experience, not a lab bench, and its row says so. It is the only row that rests on our own bench rather than an outlet&amp;rsquo;s, and if that distinction matters more to you than the hands-on account, treat the row as informational.&lt;/p>
&lt;h2 id="the-2026-psu-tier-list">The 2026 PSU tier list&lt;/h2>
&lt;p>Filter by the wattage class you are shopping and the price band you can stomach. Every row stays in the page for search engines and AI assistants regardless of filters; the chips only hide rows on your screen.&lt;/p>
&lt;div class="ptl-wrap">
&lt;div class="ptl-meta">
&lt;span class="ptl-badge">28 units, every placement sourced&lt;/span>
&lt;span class="ptl-lic">updated 2026-07-29 &amp;middot; open data (&lt;a href="https://techfuelhq.com/data/psu-tier-list.json">JSON&lt;/a>)&lt;/span>
&lt;/div>
&lt;div class="ptl-filters" id="ptl-filters" hidden>
&lt;span class="ptl-filter-label">Wattage:&lt;/span>
&lt;button class="ptl-chip ptl-on" data-watt="all">All&lt;/button>
&lt;button class="ptl-chip" data-watt="750">650&amp;ndash;750W&lt;/button>
&lt;button class="ptl-chip" data-watt="850">850W&lt;/button>
&lt;button class="ptl-chip" data-watt="1000">1000W+&lt;/button>
&lt;button class="ptl-chip" data-watt="sfx">SFX&lt;/button>
&lt;span class="ptl-filter-label ptl-gap">Price class:&lt;/span>
&lt;button class="ptl-chip ptl-on" data-budget="all">All&lt;/button>
&lt;button class="ptl-chip" data-budget="premium">Premium&lt;/button>
&lt;button class="ptl-chip" data-budget="mainstream">Mainstream&lt;/button>
&lt;button class="ptl-chip" data-budget="budget">Budget&lt;/button>
&lt;/div>
&lt;h3 class="ptl-tier ptl-tier-s" id="tier-s">Tier S — the units reviewers benchmark against&lt;/h3>
&lt;div class="ptl-scroll">
&lt;table class="ptl-table">
&lt;caption class="ptl-cap">Tier S power supplies &amp;mdash; each row lists the unit's specification as published by the source linked in that row, and the sourced reason for its placement.&lt;/caption>
&lt;thead>
&lt;tr>
&lt;th scope="col">Power supply&lt;/th>
&lt;th scope="col">Wattages&lt;/th>
&lt;th scope="col">Standard&lt;/th>
&lt;th scope="col">Efficiency&lt;/th>
&lt;th scope="col">Warranty&lt;/th>
&lt;th scope="col">At 24/7 idle load&lt;/th>
&lt;th scope="col">Why it is here&lt;/th>
&lt;th scope="col">Sources&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr data-watt="750 850 1000" data-budget="mainstream">
&lt;th scope="row" class="ptl-model">Corsair RMx (2024, ATX 3.1)&lt;/th>
&lt;td class="ptl-nowrap">750–1000W&lt;/td>
&lt;td class="ptl-nowrap">ATX 3.1&lt;span class="ptl-sub">12V-2x6&lt;/span>&lt;/td>
&lt;td>Cybenetics Gold&lt;/td>
&lt;td class="ptl-nowrap">10 yr&lt;/td>
&lt;td class="ptl-lowload">77.2% at 20W and 0.018W standby (Cybenetics, 115V); 89.5% at 100W in KitGuru&amp;#39;s 240V testing&lt;/td>
&lt;td class="ptl-why">KitGuru rated the RM850x (2024) 9/10 with a Must Have award for power quality, build quality and cabling, on a CWT platform. Corsair rates this generation via Cybenetics rather than an 80 PLUS badge (per KitGuru). Cybenetics also measured the lowest standby draw of any ATX unit here.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://www.corsair.com/us/en/p/psu/cp-9020270-na/rmx-series-rm850x-fully-modular-power-supply-cp-9020270-na" rel="nofollow noopener" target="_blank">spec&lt;/a> &amp;middot; &lt;a href="https://www.kitguru.net/components/power-supplies/zardon/corsair-rm850x-atx-v3-1-3rd-gen-2024-review/all/1/" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr data-watt="850 1000" data-budget="premium">
&lt;th scope="row" class="ptl-model">NZXT C850 / C1000 Gold (ATX 3.1)&lt;/th>
&lt;td class="ptl-nowrap">850–1000W&lt;/td>
&lt;td class="ptl-nowrap">ATX 3.1&lt;span class="ptl-sub">12V-2x6 600W&lt;/span>&lt;/td>
&lt;td>80 PLUS Gold&lt;span class="ptl-sub">Cybenetics Gold&lt;/span>&lt;span class="ptl-sub">noise A&lt;/span>&lt;/td>
&lt;td class="ptl-nowrap">10 yr&lt;/td>
&lt;td class="ptl-lowload">Hardware Busters: efficient at light and super-light loads, high even at 2% load (~20W)&lt;/td>
&lt;td class="ptl-why">Hardware Busters measured the C1000 (CWT CXT platform) at top overall performance for its class, quiet up to ~790W with strong light-load efficiency; KitGuru scored the white version 9/10. Its only recurring criticism is price.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://hwbusters.com/psus/nzxt-c1000-atx-v3-1-psu-review/" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr data-watt="850 1000" data-budget="premium">
&lt;th scope="row" class="ptl-model">FSP Hydro Ti Pro&lt;/th>
&lt;td class="ptl-nowrap">850–1000W&lt;/td>
&lt;td class="ptl-nowrap">ATX 3.0&lt;span class="ptl-sub">12VHPWR 600W&lt;/span>&lt;/td>
&lt;td>80 PLUS Titanium&lt;span class="ptl-sub">Cybenetics Titanium&lt;/span>&lt;span class="ptl-sub">noise A&amp;#43;&amp;#43;&lt;/span>&lt;/td>
&lt;td class="ptl-nowrap">10 yr&lt;/td>
&lt;td class="ptl-lowload">74.1% at a 20W (2%) load, 0.076W standby, 12.65 dBA average noise (Cybenetics, 1000W unit)&lt;/td>
&lt;td class="ptl-why">KitGuru scored the in-house FSP Titanium platform 9.5/10. Cybenetics measured a 12.65 dBA average noise level — the quietest unit in this table — alongside a top-tier low-load result, which is exactly what a 24/7 box wants.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://www.fsplifestyle.com/en/product/HydroTIPRO1000W.html" rel="nofollow noopener" target="_blank">spec&lt;/a> &amp;middot; &lt;a href="https://www.kitguru.net/components/power-supplies/zardon/fsp-hydro-ti-pro-1000w-titanium-2023-review/" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr data-watt="750 850 1000" data-budget="premium">
&lt;th scope="row" class="ptl-model">be quiet! Dark Power 13&lt;/th>
&lt;td class="ptl-nowrap">750–1000W&lt;/td>
&lt;td class="ptl-nowrap">ATX 3.1&lt;span class="ptl-sub">12V-2x6&lt;/span>&lt;/td>
&lt;td>80 PLUS Titanium&lt;/td>
&lt;td class="ptl-nowrap">10 yr&lt;/td>
&lt;td class="ptl-lowload">74.5% at 20W, 0.068W standby (Cybenetics, 115V, 1000W); Club386&amp;#39;s own bench measured 72.0% at 20W and 92.5% at 80W&lt;/td>
&lt;td class="ptl-why">Club386 awarded the Dark Power 13 1000W Recommended for electrical performance, quiet running and thermal management, and Cybenetics measured roughly 18 dBA average noise — near-silent, with a solid mid-pack low-load result. Current pages state ATX 3.1 with native 12V-2x6; the reviewed launch build was ATX 3.0.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://www.bequiet.com/en/powersupply/4042" rel="nofollow noopener" target="_blank">spec&lt;/a> &amp;middot; &lt;a href="https://www.club386.com/be-quiet-dark-power-13-1000w-psu-review-pcie-5-0-done-right/" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;h3 class="ptl-tier ptl-tier-a" id="tier-a">Tier A — excellent, held out of S by one finding&lt;/h3>
&lt;div class="ptl-scroll">
&lt;table class="ptl-table">
&lt;caption class="ptl-cap">Tier A power supplies &amp;mdash; each row lists the unit's specification as published by the source linked in that row, and the sourced reason for its placement.&lt;/caption>
&lt;thead>
&lt;tr>
&lt;th scope="col">Power supply&lt;/th>
&lt;th scope="col">Wattages&lt;/th>
&lt;th scope="col">Standard&lt;/th>
&lt;th scope="col">Efficiency&lt;/th>
&lt;th scope="col">Warranty&lt;/th>
&lt;th scope="col">At 24/7 idle load&lt;/th>
&lt;th scope="col">Why it is here&lt;/th>
&lt;th scope="col">Sources&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr data-watt="750 850 1000" data-budget="premium">
&lt;th scope="row" class="ptl-model">Seasonic Vertex GX (ATX 3.1)&lt;/th>
&lt;td class="ptl-nowrap">750–1200W&lt;/td>
&lt;td class="ptl-nowrap">ATX 3.1&lt;span class="ptl-sub">12V-2x6&lt;/span>&lt;/td>
&lt;td>80 PLUS Gold&lt;span class="ptl-sub">Cybenetics Gold&lt;/span>&lt;span class="ptl-sub">noise A-&lt;/span>&lt;/td>
&lt;td class="ptl-nowrap">12 yr&lt;/td>
&lt;td class="ptl-lowload">&lt;span class="ptl-none">no published low-load data&lt;/span>&lt;/td>
&lt;td class="ptl-why">Hardware Busters called the Vertex GX-1200 reliable and class-leadingly quiet — the reviewer runs them on his own test benches — while noting CWT-based rivals score 2–4% higher on raw performance and that it costs more. The ATX 3.1 refresh extended the warranty to 12 years, the longest in this table.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://seasonic.com/vertex-gx/" rel="nofollow noopener" target="_blank">spec&lt;/a> &amp;middot; &lt;a href="https://hwbusters.com/psus/seasonic-vertex-gx-1200-psu-review/" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr data-watt="1000" data-budget="premium">
&lt;th scope="row" class="ptl-model">Corsair HXi (2025, ATX 3.1)&lt;/th>
&lt;td class="ptl-nowrap">1000–1500W&lt;/td>
&lt;td class="ptl-nowrap">ATX 3.1&lt;span class="ptl-sub">12V-2x6 cables (2×8-pin feed)&lt;/span>&lt;/td>
&lt;td>80 PLUS Platinum&lt;span class="ptl-sub">Cybenetics Platinum&lt;/span>&lt;span class="ptl-sub">noise A&amp;#43;&lt;/span>&lt;/td>
&lt;td class="ptl-nowrap">10 yr&lt;/td>
&lt;td class="ptl-lowload">Above 70% at 2% load (~24W on the 1200W unit) per Hardware Busters; low standby draw&lt;/td>
&lt;td class="ptl-why">Hardware Busters found the HX1200i (CWT semi-digital) tightly regulated, silent, and full-power-capable at 47C, with iCUE monitoring and per-rail OCP control. Held out of S for a transient response and light-load efficiency that trail the very best at this price. Worth knowing rather than holding against it: there is no native 12V-2x6 header — the 600W GPU cable feeds from two 8-pin sockets, an arrangement the reviewer considers safer.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://www.corsair.com/us/en/p/psu/cp-9020307-na/hx1200i-fully-modular-ultra-low-noise-platinum-atx-1200-watt-pc-power-supply-cp-9020307-na" rel="nofollow noopener" target="_blank">spec&lt;/a> &amp;middot; &lt;a href="https://hwbusters.com/psus/corsair-hx1200i-atx-v3-1-2025-psu-review/" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr data-watt="750 850 1000" data-budget="premium">
&lt;th scope="row" class="ptl-model">Super Flower Leadex VII (XG / PRO)&lt;/th>
&lt;td class="ptl-nowrap">750–1300W&lt;/td>
&lt;td class="ptl-nowrap">ATX 3.1&lt;span class="ptl-sub">16-pin cable (8&amp;#43;8-pin feed)&lt;/span>&lt;/td>
&lt;td>80 PLUS Gold&lt;span class="ptl-sub">Cybenetics Platinum&lt;/span>&lt;span class="ptl-sub">noise A-&lt;/span>&lt;/td>
&lt;td class="ptl-nowrap">10 yr&lt;/td>
&lt;td class="ptl-lowload">Below 70% at 2% load (~17W) and elevated vampire power (Hardware Busters, PRO 850W) — a gaming-first unit&lt;/td>
&lt;td class="ptl-why">Hardware Busters names the Leadex VII XG the best-performing 850W unit in its category and rated the PRO&amp;rsquo;s load regulation superb, on Super Flower&amp;rsquo;s in-house platform. Docked from S here for the homelab dimension: measured under 70% at a 2% load, high standby draw, and a weak 5VSB rail — plus sky-high inrush current and no native 12V-2x6 header.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://hwbusters.com/psus/super-flower-leadex-vii-pro-850w-atx-v3-1-psu-review/" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr data-watt="750 850 1000" data-budget="premium">
&lt;th scope="row" class="ptl-model">be quiet! Straight Power 12&lt;/th>
&lt;td class="ptl-nowrap">750–1500W&lt;/td>
&lt;td class="ptl-nowrap">ATX 3.1&lt;span class="ptl-sub">12V-2x6&lt;/span>&lt;/td>
&lt;td>80 PLUS Platinum&lt;/td>
&lt;td class="ptl-nowrap">10 yr&lt;/td>
&lt;td class="ptl-lowload">&lt;span class="ptl-none">no published low-load data&lt;/span>&lt;/td>
&lt;td class="ptl-why">XDA Developers rated the 750W unit 9/10 as a solid high-end pick for current AMD, Intel and NVIDIA hardware, with price the main drawback. Platinum-class, 135mm Silent Wings fan, and the current pages carry native 12V-2x6. We found no published light-load measurements for it, so its homelab standing is unproven.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://www.bequiet.com/en/powersupply/4110" rel="nofollow noopener" target="_blank">spec&lt;/a> &amp;middot; &lt;a href="https://www.xda-developers.com/be-quiet-straight-power-12-psu-review/" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr data-watt="sfx" data-budget="premium">
&lt;th scope="row" class="ptl-model">Corsair SF Platinum (2024, SFX)&lt;span class="ptl-form">SFX&lt;/span>&lt;/th>
&lt;td class="ptl-nowrap">750–1000W&lt;/td>
&lt;td class="ptl-nowrap">ATX 3.1&lt;span class="ptl-sub">12V-2x6&lt;/span>&lt;/td>
&lt;td>80 PLUS Platinum&lt;span class="ptl-sub">Cybenetics Platinum&lt;/span>&lt;/td>
&lt;td class="ptl-nowrap">7 yr&lt;/td>
&lt;td class="ptl-lowload">75.7% at 20W, 0.047W standby (Cybenetics, SF750)&lt;/td>
&lt;td class="ptl-why">KitGuru rated the SF850 9/10 Must Have — high-quality power and stellar build on a Great Wall platform — making this the default SFX answer. Cybenetics measured the SF750 at 75.7% even at a 20W load, strong for a small-form-factor unit. The 7-year warranty (vs 10+ elsewhere) keeps it out of Tier S under our criteria.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://www.corsair.com/us/en/explorer/diy-builder/power-supply-units/sf750sf850sf1000-platinum-atx-31-everything-you-need-to-know/" rel="nofollow noopener" target="_blank">spec&lt;/a> &amp;middot; &lt;a href="https://www.kitguru.net/components/power-supplies/zardon/corsair-sf850-platinum-2024-psu-review/all/1/" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr data-watt="750 850 1000" data-budget="mainstream">
&lt;th scope="row" class="ptl-model">XPG Core Reactor II&lt;/th>
&lt;td class="ptl-nowrap">650–1200W&lt;/td>
&lt;td class="ptl-nowrap">ATX 3.1&lt;span class="ptl-sub">12V-2x6 (current SKU)&lt;/span>&lt;/td>
&lt;td>80 PLUS Gold&lt;span class="ptl-sub">Cybenetics Platinum&lt;/span>&lt;/td>
&lt;td class="ptl-nowrap">10 yr&lt;/td>
&lt;td class="ptl-lowload">71.5% at a 17W (2%) load, 0.040W standby (Cybenetics, 850W)&lt;/td>
&lt;td class="ptl-why">Tech4Gamers scored the 1200W unit 9.3/10 Recommended as an excellent performance-per-dollar choice on CWT&amp;rsquo;s upgraded CSZ platform, and Cybenetics measured the 850W at 71.5% down at a 17W (2%) load. Launched as ATX 3.0/12VHPWR; current pages state ATX 3.1 with 12V-2x6.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://www.xpg.com/us/xpg/pc-components-core-reactor-ii" rel="nofollow noopener" target="_blank">spec&lt;/a> &amp;middot; &lt;a href="https://tech4gamers.com/xpg-core-reactor-ii-1200w-review/" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;h3 class="ptl-tier ptl-tier-b" id="tier-b">Tier B — good, with a caveat worth knowing&lt;/h3>
&lt;div class="ptl-scroll">
&lt;table class="ptl-table">
&lt;caption class="ptl-cap">Tier B power supplies &amp;mdash; each row lists the unit's specification as published by the source linked in that row, and the sourced reason for its placement.&lt;/caption>
&lt;thead>
&lt;tr>
&lt;th scope="col">Power supply&lt;/th>
&lt;th scope="col">Wattages&lt;/th>
&lt;th scope="col">Standard&lt;/th>
&lt;th scope="col">Efficiency&lt;/th>
&lt;th scope="col">Warranty&lt;/th>
&lt;th scope="col">At 24/7 idle load&lt;/th>
&lt;th scope="col">Why it is here&lt;/th>
&lt;th scope="col">Sources&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr data-watt="750 850 1000" data-budget="mainstream">
&lt;th scope="row" class="ptl-model">Seasonic Focus GX (ATX 3.1, V4)&lt;/th>
&lt;td class="ptl-nowrap">750–1000W&lt;/td>
&lt;td class="ptl-nowrap">ATX 3.1&lt;span class="ptl-sub">12V-2x6&lt;/span>&lt;/td>
&lt;td>80 PLUS Gold&lt;span class="ptl-sub">Cybenetics Platinum&lt;/span>&lt;span class="ptl-sub">noise A-&lt;/span>&lt;/td>
&lt;td class="ptl-nowrap">10 yr&lt;/td>
&lt;td class="ptl-lowload">Above 70% at 2% load, but the reviewer called light-load efficiency unsatisfying (Hardware Busters)&lt;/td>
&lt;td class="ptl-why">The internet&amp;rsquo;s reflex recommendation now tests mid-pack: Hardware Busters found the GX-850 V4 well built with Cybenetics Platinum efficiency, but concluded the NZXT C850, Corsair RM850x and Leadex VII XG all outperform it, and criticized an aggressive fan profile and a high launch price. Still a sound in-house Seasonic platform with a 10-year warranty.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://seasonic.com/focus-gx-atx-3/" rel="nofollow noopener" target="_blank">spec&lt;/a> &amp;middot; &lt;a href="https://hwbusters.com/psus/seasonic-focus-gx-850-v4-atx-v3-1-psu-review/" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr data-watt="750 850 1000" data-budget="mainstream">
&lt;th scope="row" class="ptl-model">Corsair RMe (ATX 3.1)&lt;/th>
&lt;td class="ptl-nowrap">750–1200W&lt;/td>
&lt;td class="ptl-nowrap">ATX 3.1&lt;span class="ptl-sub">12V-2x6&lt;/span>&lt;/td>
&lt;td>80 PLUS Gold&lt;span class="ptl-sub">Cybenetics Platinum&lt;/span>&lt;span class="ptl-sub">noise A-&lt;/span>&lt;/td>
&lt;td class="ptl-nowrap">7 yr&lt;/td>
&lt;td class="ptl-lowload">69.6% at 20W, 0.049W standby (Cybenetics, 115V) — weak for an always-on box; 89.3% at 100W in KitGuru&amp;#39;s 240V testing&lt;/td>
&lt;td class="ptl-why">KitGuru rated the RM850e (2025, HEC platform) 8/10 Worth Buying — a decent mid-range performer for RTX 5070 Ti-class builds. It gives up measurable ground and three warranty years to its RMx sibling, and Cybenetics measured it at just 69.6% at a 20W load — the weakest 20W result among the tiered units here, and well off its own RMx sibling&amp;rsquo;s 77.2%.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://www.corsair.com/us/en/p/psu/cp-9020263-na/rme-series-rm850e-fully-modular-low-noise-atx-power-supply-cp-9020263-na" rel="nofollow noopener" target="_blank">spec&lt;/a> &amp;middot; &lt;a href="https://www.kitguru.net/components/power-supplies/zardon/corsair-rm850e-atx-3-1-2025-psu-review/all/1/" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr data-watt="850 1000" data-budget="mainstream">
&lt;th scope="row" class="ptl-model">MSI MPG A850G / A1000G PCIE5&lt;/th>
&lt;td class="ptl-nowrap">850–1000W&lt;/td>
&lt;td class="ptl-nowrap">ATX 3.1&lt;span class="ptl-sub">12V-2x6 600W&lt;/span>&lt;/td>
&lt;td>80 PLUS Gold&lt;span class="ptl-sub">Cybenetics Gold&lt;/span>&lt;span class="ptl-sub">noise Standard&amp;#43;&amp;#43;&lt;/span>&lt;/td>
&lt;td class="ptl-nowrap">10 yr&lt;/td>
&lt;td class="ptl-lowload">Strong at light and super-light loads per Hardware Busters (exact figures unpublished)&lt;/td>
&lt;td class="ptl-why">Hardware Busters found the A1000G (CWT CSZ) fairly priced and genuinely ATX 3.1-compliant with a true 12V-2x6 header and strong light-load efficiency, but trailing same-platform rivals like the Toughpower GF3 and Core Reactor II on ripple suppression.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://www.msi.com/Power-Supply/MPG-A1000G-PCIE5/Specification" rel="nofollow noopener" target="_blank">spec&lt;/a> &amp;middot; &lt;a href="https://hwbusters.com/psus/msi-mpg-a1000g-pcie5-atx-v3-1-psu-review/" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr data-watt="750 850 1000" data-budget="budget">
&lt;th scope="row" class="ptl-model">MSI MAG A750GLS PCIE5&lt;/th>
&lt;td class="ptl-nowrap">650–1000W&lt;/td>
&lt;td class="ptl-nowrap">ATX 3.1&lt;span class="ptl-sub">16-pin 450W&lt;/span>&lt;/td>
&lt;td>80 PLUS Gold&lt;span class="ptl-sub">Cybenetics Platinum&lt;/span>&lt;span class="ptl-sub">noise A&lt;/span>&lt;/td>
&lt;td class="ptl-nowrap">&amp;mdash;&lt;/td>
&lt;td class="ptl-lowload">High efficiency across all load ranges including light loads (Hardware Busters)&lt;/td>
&lt;td class="ptl-why">Hardware Busters says the A750GLS (Huntkey-built at 650/750W) fixes the A-GL line&amp;rsquo;s noise problem and takes the performance lead from the Corsair RM750e at an affordable price, measuring Cybenetics Platinum efficiency with an A noise rating. Held at B only because no source we found states its warranty — an odd omission MSI should fix, and the one thing standing between this unit and Tier A. If you want the best cheap Gold unit here, buy this over its older A850GL stablemate.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://www.msi.com/Power-Supply/MAG-A750GLS-PCIE5/Specification" rel="nofollow noopener" target="_blank">spec&lt;/a> &amp;middot; &lt;a href="https://hwbusters.com/psus/msi-mag-a750gls-pcie5-atx-v3-1-psu-review/" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr data-watt="850 1000" data-budget="mainstream">
&lt;th scope="row" class="ptl-model">Thermaltake Toughpower GF3&lt;/th>
&lt;td class="ptl-nowrap">850–1000W&lt;/td>
&lt;td class="ptl-nowrap">ATX 3.0&lt;span class="ptl-sub">12VHPWR 600W&lt;/span>&lt;/td>
&lt;td>80 PLUS Gold&lt;span class="ptl-sub">Cybenetics Gold&lt;/span>&lt;span class="ptl-sub">noise Standard&amp;#43;&lt;/span>&lt;/td>
&lt;td class="ptl-nowrap">10 yr&lt;/td>
&lt;td class="ptl-lowload">Highly efficient at light and super-light loads; sub-20 dBA up to 540W (Hardware Busters)&lt;/td>
&lt;td class="ptl-why">Hardware Busters rated the GF3 1000W (CWT CSZ) a decent ATX 3.0 unit with high build quality that shines at light and super-light loads and stays under 20 dBA up to 540W — but it gets loud beyond that (Cybenetics Standard+) and does not beat the RM1000x. Note a documented cable discrepancy: the review reports Thermaltake documentation putting the bundled 16-pin cable at 450W while the reviewer measured its sense pins configured for 600W. Thermaltake&amp;rsquo;s current product page states 600W.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://www.thermaltake.com/toughpower-gf3-1000w-gold-tt-premium-edition.html" rel="nofollow noopener" target="_blank">spec&lt;/a> &amp;middot; &lt;a href="https://hwbusters.com/psus/thermaltake-toughpower-gf3-1000w-atx-v3-0-psu-review/" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr data-watt="750 850" data-budget="budget">
&lt;th scope="row" class="ptl-model">Thermaltake Toughpower GF A3&lt;/th>
&lt;td class="ptl-nowrap">750–850W&lt;/td>
&lt;td class="ptl-nowrap">ATX 3.1&lt;span class="ptl-sub">12V-2x6 450W&lt;/span>&lt;/td>
&lt;td>80 PLUS Gold&lt;span class="ptl-sub">Cybenetics Platinum&lt;/span>&lt;span class="ptl-sub">noise A-&lt;/span>&lt;/td>
&lt;td class="ptl-nowrap">10 yr&lt;/td>
&lt;td class="ptl-lowload">Below 70% at 2% load (~17W); good at normal light loads (Hardware Busters)&lt;/td>
&lt;td class="ptl-why">Hardware Busters called the GF A3 850W (HKC-built sample) a worth-considering budget unit: Cybenetics Platinum efficiency and roughly 7 dBA quieter on average than the same-priced MSI MAG A850GL. Its flags: high inrush current, both EPS connectors sharing one cable, and under 70% efficiency at a 2% load.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://www.thermaltake.com/toughpower-gf-a3-gold-850w-tt-premium-edition.html" rel="nofollow noopener" target="_blank">spec&lt;/a> &amp;middot; &lt;a href="https://hwbusters.com/psus/thermaltake-toughpower-gf-a3-850w-psu-review/" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr data-watt="750 850 1000" data-budget="premium">
&lt;th scope="row" class="ptl-model">Cooler Master GX III Gold&lt;/th>
&lt;td class="ptl-nowrap">750–1250W&lt;/td>
&lt;td class="ptl-nowrap">ATX 3.1&lt;span class="ptl-sub">12V-2x6 600W (3.1 SKU)&lt;/span>&lt;/td>
&lt;td>80 PLUS Gold&lt;span class="ptl-sub">Cybenetics Platinum&lt;/span>&lt;span class="ptl-sub">noise Standard&amp;#43;&amp;#43;&lt;/span>&lt;/td>
&lt;td class="ptl-nowrap">10 yr&lt;/td>
&lt;td class="ptl-lowload">High efficiency in all load ranges incl. light loads (Hardware Busters); CM claims Titanium-level light-load efficiency at 115V&lt;/td>
&lt;td class="ptl-why">Hardware Busters found the Lite-On-built GX III 850W efficient across all load ranges with a great APFC, but not competitive at the $170 it carried at review time, with weak ATX 3.x transient response and a fan the reviewer doubted would outlast the 10-year warranty. Cooler Master now sells a separate ATX 3.1 SKU with a native 90-degree 12V-2x6.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://www.coolermaster.com/en-global/products/gx-iii-gold-850-atx-3-1.html" rel="nofollow noopener" target="_blank">spec&lt;/a> &amp;middot; &lt;a href="https://hwbusters.com/psus/cooler-master-gx-iii-850w-atx-v3-0-psu-review/" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr data-watt="750 850" data-budget="premium">
&lt;th scope="row" class="ptl-model">Cooler Master V850 Gold i&lt;/th>
&lt;td class="ptl-nowrap">750–850W&lt;/td>
&lt;td class="ptl-nowrap">ATX 3.0&lt;span class="ptl-sub">12VHPWR 450W&lt;/span>&lt;/td>
&lt;td>80 PLUS Gold&lt;span class="ptl-sub">Cybenetics Platinum&lt;/span>&lt;span class="ptl-sub">noise Standard&amp;#43;&amp;#43;&lt;/span>&lt;/td>
&lt;td class="ptl-nowrap">10 yr&lt;/td>
&lt;td class="ptl-lowload">High efficiency on all load ranges incl. super-light loads (Hardware Busters)&lt;/td>
&lt;td class="ptl-why">Hardware Busters rated the Chicony-built V850i high-performance and high-build-quality with high efficiency at every load range, but called its $185 review-time price stiff against $100–165 rivals and the &amp;lsquo;semi-digital&amp;rsquo; branding overstated (only fan control and monitoring are digital).&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://hwbusters.com/psus/cooler-master-v850i-gold-psu-review/" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr data-watt="750 850" data-budget="budget">
&lt;th scope="row" class="ptl-model">MSI MAG A750GL / A850GL PCIE5&lt;/th>
&lt;td class="ptl-nowrap">750–850W&lt;/td>
&lt;td class="ptl-nowrap">ATX 3.0&lt;span class="ptl-sub">16-pin 450W (marked 600W)&lt;/span>&lt;/td>
&lt;td>80 PLUS Gold&lt;/td>
&lt;td class="ptl-nowrap">&amp;mdash;&lt;/td>
&lt;td class="ptl-lowload">Below 70% at 2% load (~17W); platform needs boosting at light loads (Hardware Busters)&lt;/td>
&lt;td class="ptl-why">Hardware Busters called the A850GL (CWT GPX) decent, compact and well-priced with good ripple suppression — but noisy even at light loads, under 70% efficient at a 2% load, and shipping a 16-pin cable marked 600W that is actually configured for 450W. Warranty is contested (5 years per the review&amp;rsquo;s spec table, 10 in current retail titles; MSI&amp;rsquo;s own datasheet omits it), so we print neither.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://www.msi.com/Power-Supply/MAG-A850GL-PCIE5/Specification" rel="nofollow noopener" target="_blank">spec&lt;/a> &amp;middot; &lt;a href="https://hwbusters.com/psus/msi-mag-a850gl-pcie5-850w-psu-review/" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr data-watt="750 850 1000" data-budget="mainstream">
&lt;th scope="row" class="ptl-model">be quiet! Pure Power 12 M&lt;/th>
&lt;td class="ptl-nowrap">550–1000W&lt;/td>
&lt;td class="ptl-nowrap">ATX 3.0&lt;span class="ptl-sub">12VHPWR 600W&lt;/span>&lt;/td>
&lt;td>80 PLUS Gold&lt;/td>
&lt;td class="ptl-nowrap">10 yr&lt;/td>
&lt;td class="ptl-lowload">74.9% at 20W, 81.8% at 40W, 86.3% at 60W (Club386); Cybenetics: 77.0% at 20W at 230V&lt;/td>
&lt;td class="ptl-why">Club386 concluded the HEC-built 1000W unit performs like a Dark Power in all but name, and its measured 74.9% at a 20W load is one of the better low-load results here — a quiet, homelab-friendly pick from the ATX 3.0/12VHPWR generation, backed by 10 years.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://www.bequiet.com/en/powersupply/4072" rel="nofollow noopener" target="_blank">spec&lt;/a> &amp;middot; &lt;a href="https://www.club386.com/be-quiet-pure-power-12-m-1000w-psu-review-the-one-to-go-for/" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr data-watt="750 850 1000" data-budget="mainstream">
&lt;th scope="row" class="ptl-model">Super Flower Leadex III Gold (ATX 3.1)&lt;/th>
&lt;td class="ptl-nowrap">650–1300W&lt;/td>
&lt;td class="ptl-nowrap">ATX 3.1&lt;span class="ptl-sub">12V-2x6 on 1000W&amp;#43; (unconfirmed at 850W)&lt;/span>&lt;/td>
&lt;td>80 PLUS Gold&lt;span class="ptl-sub">Cybenetics Gold&lt;/span>&lt;/td>
&lt;td class="ptl-nowrap">10 yr&lt;/td>
&lt;td class="ptl-lowload">&lt;span class="ptl-none">no published low-load data&lt;/span>&lt;/td>
&lt;td class="ptl-why">Vortez gave the 850W GOLD UP an award as the cheapest route into ATX 3.1/PCIe 5.1 at its $139.99 launch price, on Super Flower&amp;rsquo;s in-house platform with a 10-year warranty. Check the exact SKU before buying: Super Flower&amp;rsquo;s own catalog page states the native 12V-2x6 cable applies to the 1000W and 1300W models only, and we could not confirm from either source whether the 850W SKU bundles one.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://www.super-flower.com.tw/tw/products-detail/195/" rel="nofollow noopener" target="_blank">spec&lt;/a> &amp;middot; &lt;a href="https://www.vortez.net/articles_pages/super_flower_leadex_iii_gold_atx_3_1_850w_psu_review,7.html" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr data-watt="750 850 1000" data-budget="budget">
&lt;th scope="row" class="ptl-model">Montech Century II Gold&lt;/th>
&lt;td class="ptl-nowrap">550–1200W&lt;/td>
&lt;td class="ptl-nowrap">ATX 3.1&lt;span class="ptl-sub">12V-2x6&lt;/span>&lt;/td>
&lt;td>80 PLUS Gold&lt;span class="ptl-sub">Cybenetics Gold&lt;/span>&lt;span class="ptl-sub">noise 26.9 dBA avg&lt;/span>&lt;/td>
&lt;td class="ptl-nowrap">10 yr&lt;/td>
&lt;td class="ptl-lowload">Passable but not exceptional at very low loads (Tom&amp;#39;s Hardware, 1050W)&lt;/td>
&lt;td class="ptl-why">The budget pick that punches up: Tom&amp;rsquo;s Hardware gave the 1050W an Editor&amp;rsquo;s Choice for solid electrical performance at a modest price, and Cybenetics&amp;rsquo; own report on the 850W measured ETA Gold with a 26.9 dBA average. Tom&amp;rsquo;s cautions: a single 12V-2x6, and a young OEM (XWY, founded by ex-HKC engineers). Note Montech&amp;rsquo;s marketing says Platinum; Cybenetics&amp;rsquo; report says Gold — we print the report.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://www.montechpc.com/century-ii-850w" rel="nofollow noopener" target="_blank">spec&lt;/a> &amp;middot; &lt;a href="https://www.tomshardware.com/pc-components/power-supplies/montech-century-ii-gold-1050w-atx-3-1-power-supply-review" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;h3 class="ptl-tier ptl-tier-c" id="tier-c">Tier C — budget class, fine when right-sized&lt;/h3>
&lt;div class="ptl-scroll">
&lt;table class="ptl-table">
&lt;caption class="ptl-cap">Tier C power supplies &amp;mdash; each row lists the unit's specification as published by the source linked in that row, and the sourced reason for its placement.&lt;/caption>
&lt;thead>
&lt;tr>
&lt;th scope="col">Power supply&lt;/th>
&lt;th scope="col">Wattages&lt;/th>
&lt;th scope="col">Standard&lt;/th>
&lt;th scope="col">Efficiency&lt;/th>
&lt;th scope="col">Warranty&lt;/th>
&lt;th scope="col">At 24/7 idle load&lt;/th>
&lt;th scope="col">Why it is here&lt;/th>
&lt;th scope="col">Sources&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr data-watt="750 850" data-budget="budget">
&lt;th scope="row" class="ptl-model">XPG Core Reactor II VE&lt;/th>
&lt;td class="ptl-nowrap">650–850W&lt;/td>
&lt;td class="ptl-nowrap">ATX 3.1&lt;span class="ptl-sub">12V-2x6&lt;/span>&lt;/td>
&lt;td>80 PLUS Gold&lt;span class="ptl-sub">Cybenetics Gold&lt;/span>&lt;/td>
&lt;td class="ptl-nowrap">7 yr&lt;/td>
&lt;td class="ptl-lowload">72.6% at a 17W (2%) load, 0.016W standby (Cybenetics, 850W)&lt;/td>
&lt;td class="ptl-why">Tech4Gamers scored the CWT-built Value Edition 8.9/10 as a solid affordable pick performing above its Gold badge. It trades three warranty years (7 vs 10) and some refinement against the non-VE — and posts the lowest measured standby draw of any unit here (0.016W). A strong C, and a genuinely good cheap always-on unit.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://www.xpg.com/en/xpg/pc-components-core-reactor-ii-ve?tab=spec" rel="nofollow noopener" target="_blank">spec&lt;/a> &amp;middot; &lt;a href="https://tech4gamers.com/xpg-core-reactor-ii-ve-850w-review/" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr data-watt="750 850" data-budget="budget">
&lt;th scope="row" class="ptl-model">DeepCool PN750D / PN850D&lt;/th>
&lt;td class="ptl-nowrap">750–850W&lt;/td>
&lt;td class="ptl-nowrap">ATX 3.1&lt;span class="ptl-sub">12V-2x6 600W&lt;/span>&lt;/td>
&lt;td>80 PLUS Gold&lt;span class="ptl-sub">Cybenetics Gold&lt;/span>&lt;span class="ptl-sub">noise Standard&amp;#43;&amp;#43;&lt;/span>&lt;/td>
&lt;td class="ptl-nowrap">10 yr&lt;/td>
&lt;td class="ptl-lowload">Below 70% at 2% load; inefficient 5VSB rail (Hardware Busters)&lt;/td>
&lt;td class="ptl-why">Hardware Busters found the PN850D (CWT GPW budget platform) ATX 3.1-ready with tight load regulation, full power at 47C and a 10-year warranty — but non-modular, louder than 33 dBA on average, under 70% at a 2% load, and at its $90 review-time price too close to better units.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://www.deepcool.com/products/PowerSupplyUnits/powersupplyunits/PN850D-V2-ATX3.1-Direct-Power-Supply/2024/18394.shtml" rel="nofollow noopener" target="_blank">spec&lt;/a> &amp;middot; &lt;a href="https://hwbusters.com/psus/deepcool-pn850d-atx-v3-1-psu-review/" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr data-watt="750 850" data-budget="budget">
&lt;th scope="row" class="ptl-model">Thermaltake Smart BM3 Bronze&lt;/th>
&lt;td class="ptl-nowrap">550–850W&lt;/td>
&lt;td class="ptl-nowrap">ATX 3.1&lt;span class="ptl-sub">12V-2x6 300W&lt;/span>&lt;/td>
&lt;td>80 PLUS Bronze&lt;/td>
&lt;td class="ptl-nowrap">5 yr&lt;/td>
&lt;td class="ptl-lowload">&lt;span class="ptl-none">no published low-load data&lt;/span>&lt;/td>
&lt;td class="ptl-why">eTeknix found the BM3 850W hit a sweet spot for a decent gaming PC — semi-modular, compact, cool and quiet, with mid-load efficiency measuring at Silver-to-Gold levels despite the Bronze badge. Its 16-pin tops out at 300W, so pair it with mid-range cards only.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://www.thermaltake.com/smart-bm3-bronze-750w-tt-premium-edition.html" rel="nofollow noopener" target="_blank">spec&lt;/a> &amp;middot; &lt;a href="https://www.eteknix.com/thermaltake-smart-bm3-850w-semi-modular-power-supply-review/12/" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr data-watt="750" data-budget="budget">
&lt;th scope="row" class="ptl-model">Corsair CX750 (2023, non-modular)&lt;/th>
&lt;td class="ptl-nowrap">550–750W&lt;/td>
&lt;td class="ptl-nowrap">&amp;mdash;&lt;/td>
&lt;td>80 PLUS Bronze&lt;/td>
&lt;td class="ptl-nowrap">5 yr&lt;/td>
&lt;td class="ptl-lowload">&lt;span class="ptl-none">no published low-load data&lt;/span>&lt;/td>
&lt;td class="ptl-why">PC Guide rates the current non-modular CX750 4/5 as a strong budget choice at the right price, at the cost of efficiency and modularity. No page we found states an ATX 3.x claim or a 16-pin connector for this SKU, so treat it as a classic 8-pin-era budget unit; Corsair&amp;rsquo;s newer CX-M (2025) refresh is the ATX 3.1 semi-modular sibling.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://www.corsair.com/us/en/p/psu/cp-9020279-na/cx-series-cx750-750-watt-80-plus-bronze-atx-power-supply-cp-9020279-na" rel="nofollow noopener" target="_blank">spec&lt;/a> &amp;middot; &lt;a href="https://www.pcguide.com/psu/corsair-cx750-review/" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr data-watt="750" data-budget="budget">
&lt;th scope="row" class="ptl-model">MSI MAG A750BN PCIE5&lt;/th>
&lt;td class="ptl-nowrap">750W&lt;/td>
&lt;td class="ptl-nowrap">ATX 2.4&lt;span class="ptl-sub">12VHPWR 300W (fixed cable)&lt;/span>&lt;/td>
&lt;td>80 PLUS Bronze&lt;/td>
&lt;td class="ptl-nowrap">&amp;mdash;&lt;/td>
&lt;td class="ptl-lowload">Gold-level efficiency below ~50% load, dropping to Bronze at high loads (LTT Labs)&lt;/td>
&lt;td class="ptl-why">Do not let the PCIE5 branding fool you: LTT Labs&amp;rsquo; lab test identifies this as an ATX 2.4 unit with a permanently attached 300W 12VHPWR cable and no UVP protection — though it passed their testing and measured Gold-level efficiency below half load. A fine strictly-budget choice if you understand exactly what it is.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://storage-asset.msi.com/datasheet/power-supply/id/MAG-A750BN-PCIE5.pdf" rel="nofollow noopener" target="_blank">spec&lt;/a> &amp;middot; &lt;a href="https://www.lttlabs.com/products/power-supplies/mag-a750bn-pcie5" rel="nofollow noopener" target="_blank">review&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr data-watt="750 850 1000" data-budget="budget">
&lt;th scope="row" class="ptl-model">EVGA SuperNOVA 1000 GT&lt;/th>
&lt;td class="ptl-nowrap">650–1000W&lt;/td>
&lt;td class="ptl-nowrap">&amp;mdash;&lt;span class="ptl-sub">4×6&amp;#43;2 PCIe (12VHPWR adapter included)&lt;/span>&lt;/td>
&lt;td>80 PLUS Gold&lt;/td>
&lt;td class="ptl-nowrap">10 yr&lt;/td>
&lt;td class="ptl-lowload">&lt;span class="ptl-none">no published low-load data&lt;/span>&lt;/td>
&lt;td class="ptl-why">The one row here with no independent lab test — no major outlet published one for the GT line — so it rests on first-party experience: we ran one under an RTX 5080 build for an extended period and rated it 4.3/5. Specifications come from EVGA&amp;rsquo;s launch announcement rather than a live product page, since evga.com no longer serves them. EVGA&amp;rsquo;s wind-down also means the nominal 10-year warranty may have no service behind it. Clearance or used pricing only, valued as a zero-warranty unit.&lt;/td>
&lt;td class="ptl-src">&lt;a href="https://techfuelhq.com/reviews/evga-supernova-1000-gt-review-2026/">our review&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p class="ptl-note">A row's &lt;em>review&lt;/em> link goes to the test the placement leans on; &lt;em>spec&lt;/em> goes to the manufacturer page behind the wattage, standard and warranty figures. Where a manufacturer page was unreachable, the review is the source for both and no spec link appears. Cells we could not source are left blank &amp;mdash; blank beats guessed.&lt;/p>
&lt;h3 class="ptl-tier ptl-tier-avoid" id="tier-avoid">Avoid &amp;mdash; documented problems, not vibes&lt;/h3>
&lt;div class="ptl-avoid">
&lt;p class="ptl-avoid-name">Gigabyte GP-P750GM / GP-P850GM&lt;/p>
&lt;p class="ptl-avoid-body">Documented catastrophic-failure pattern: over-power protection set at 120-150% of rating, a sample that exploded during Tom&amp;#39;s Hardware testing, and — as reported in that same Tom&amp;#39;s Hardware coverage of GamersNexus&amp;#39; investigation — half of a ten-unit GamersNexus sample failing. A revised version exists (new PCB, OPP lowered), but revised stock is externally indistinguishable from pre-fix stock — Tom&amp;#39;s Hardware advises against buying unless the production batch is certain.&lt;/p>
&lt;p class="ptl-avoid-src">Documented by: &lt;a href="https://www.tomshardware.com/news/psu-expert-aris-mpitziopoulos-responds-to-gigabyte-exploding-psu-shenanigans" rel="nofollow noopener" target="_blank">Tom&amp;#39;s Hardware (expert response)&lt;/a> &amp;middot; &lt;a href="https://www.tomshardware.com/reviews/gigabyte-gp-p750gm-power-supply-review/6" rel="nofollow noopener" target="_blank">Tom&amp;#39;s Hardware (revised-unit review)&lt;/a>&lt;/p>
&lt;/div>
&lt;div class="ptl-avoid">
&lt;p class="ptl-avoid-name">No-name case-bundled units (exemplar: Equites T500)&lt;/p>
&lt;p class="ptl-avoid-body">Teardown coverage documented a decorative iron block adding fake weight, no input protections including OCP, and a real capability estimated at roughly half the labeled 500W. The class is still sold bundled inside ultra-cheap cases. Buy only safety-certified units from brands that appear in professional test databases.&lt;/p>
&lt;p class="ptl-avoid-src">Documented by: &lt;a href="https://www.tomshardware.com/pc-components/power-supplies/redditor-finds-heavy-block-of-iron-shavings-inside-cheap-psu-also-appears-to-lack-safety-protections" rel="nofollow noopener" target="_blank">Tom&amp;#39;s Hardware&lt;/a> &amp;middot; &lt;a href="https://tech.yahoo.com/general/articles/disaster-psu-good-reminder-why-120834715.html" rel="nofollow noopener" target="_blank">PC Gamer (via Yahoo syndication)&lt;/a>&lt;/p>
&lt;/div>
&lt;/div>&lt;script type="application/ld+json">{
"@context": "https://schema.org",
"@type": "Dataset",
"creator": {
"@type": "Organization",
"name": "TechFuelHQ",
"url": "https://techfuelhq.com/"
},
"dateModified": "2026-07-29",
"description": "A maintained tier database of current ATX 3.x-era power supplies. Each row's specifications come from the manufacturer page linked in the row; each tier placement leans on the professional review linked in the row. Rows we cannot source are omitted.",
"distribution": [
{
"@type": "DataDownload",
"contentUrl": "https://techfuelhq.com/data/psu-tier-list.json",
"encodingFormat": "application/json"
}
],
"identifier": "techfuelhq-psu-tier-list",
"isAccessibleForFree": true,
"keywords": [
"PSU tier list",
"power supply ranking",
"ATX 3.1",
"12V-2x6",
"PSU efficiency"
],
"license": "https://creativecommons.org/licenses/by/4.0/",
"measurementTechnique": "Editorial tier placement derived from manufacturer specifications and published professional PSU testing (Cybenetics certification data and hands-on reviews), with each row citing its sources.",
"name": "TechFuelHQ PSU Tier List 2026",
"publisher": {
"@type": "Organization",
"name": "TechFuelHQ",
"url": "https://techfuelhq.com/"
},
"url": "https://techfuelhq.com/articles/psu-tier-list/#the-2026-psu-tier-list",
"variableMeasured": [
"tier placement",
"wattage range",
"ATX standard",
"80 PLUS / Cybenetics efficiency certification",
"warranty length"
],
"version": "1"
}&lt;/script>
&lt;script>
(function () {
var wrap = document.getElementById('ptl-filters');
if (!wrap) return;
wrap.hidden = false;
var state = { watt: 'all', budget: 'all' };
function apply() {
document.querySelectorAll('.ptl-table tbody tr').forEach(function (tr) {
var watts = (tr.getAttribute('data-watt') || '').split(' ');
var okW = state.watt === 'all' || watts.indexOf(state.watt) !== -1;
var okB = state.budget === 'all' || tr.getAttribute('data-budget') === state.budget;
tr.style.display = (okW &amp;&amp; okB) ? '' : 'none';
});
document.querySelectorAll('.ptl-table').forEach(function (tbl) {
var any = Array.prototype.some.call(tbl.querySelectorAll('tbody tr'), function (tr) {
return tr.style.display !== 'none';
});
var block = tbl.closest('.ptl-scroll');
var head = block &amp;&amp; block.previousElementSibling;
block.style.display = any ? '' : 'none';
if (head &amp;&amp; head.classList.contains('ptl-tier')) head.style.display = any ? '' : 'none';
});
}
wrap.addEventListener('click', function (e) {
var b = e.target.closest('.ptl-chip');
if (!b) return;
var key = b.hasAttribute('data-watt') ? 'watt' : 'budget';
state[key] = b.getAttribute(key === 'watt' ? 'data-watt' : 'data-budget');
wrap.querySelectorAll('.ptl-chip[data-' + key + ']').forEach(function (c) { c.classList.remove('ptl-on'); });
b.classList.add('ptl-on');
apply();
});
})();
&lt;/script>
&lt;style>
.ptl-wrap{margin:1.5rem 0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif}
.ptl-meta{display:flex;flex-wrap:wrap;gap:.5rem 1rem;align-items:baseline;margin-bottom:.6rem}
.ptl-badge{background:#c8ff00;color:#0b0f1e;font-weight:700;font-size:.8rem;padding:2px 10px;border-radius:20px}
.ptl-lic{font-size:.78rem;color:#8f9bb3}
.ptl-lic a{color:#8f9bb3}
.ptl-filters{display:flex;flex-wrap:wrap;gap:.4rem;align-items:center;margin:.8rem 0 .4rem;padding:.6rem .8rem;border:1px solid #1e1e3a;border-radius:8px}
.ptl-filter-label{font-size:.78rem;color:#7a869c;font-weight:600}
.ptl-gap{margin-left:.8rem}
.ptl-chip{background:rgba(255,255,255,.05);color:#c8c8dc;border:1px solid #1e1e3a;border-radius:20px;padding:2px 12px;font-size:.8rem;cursor:pointer}
.ptl-chip.ptl-on{background:#c8ff00;color:#0b0f1e;font-weight:700;border-color:#c8ff00}
.ptl-tier{margin:1.6rem 0 .5rem;font-size:1.05rem}
.ptl-tier-s{color:#c8ff00}
.ptl-tier-a{color:#7dd88f}
.ptl-tier-b{color:#6ab0f3}
.ptl-tier-c{color:#f0b060}
.ptl-tier-avoid{color:#ed6a5a}
.ptl-avoid{border:1px solid rgba(237,106,90,.35);border-radius:8px;padding:.7rem .9rem;margin:.6rem 0}
.ptl-avoid-name{font-weight:700;margin:0 0 .3rem;color:#ed6a5a}
.ptl-avoid-body{font-size:.86rem;line-height:1.55;color:#c8c8dc;margin:0 0 .35rem}
.ptl-avoid-src{font-size:.78rem;color:#8f9bb3;margin:0}
.ptl-avoid-src a{color:#8f9bb3}
.ptl-scroll{overflow-x:auto;border:1px solid #1e1e3a;border-radius:8px}
.ptl-table{width:100%;border-collapse:collapse;font-size:.88rem;min-width:1040px}
.ptl-cap{caption-side:top;text-align:left;font-size:.78rem;color:#8f9bb3;padding:.55rem .8rem;line-height:1.5}
.ptl-table th,.ptl-table td{text-align:left;padding:.55rem .8rem;border-top:1px solid #1e1e3a;vertical-align:top}
.ptl-table thead th{border-top:none;border-bottom:1.5px solid rgba(200,255,0,.3);color:#7a869c;font-weight:600;font-size:.76rem;white-space:nowrap}
.ptl-model{font-weight:700;white-space:nowrap}
.ptl-form{display:block;font-weight:400;font-size:.72rem;color:#8f9bb3}
.ptl-sub{display:block;font-size:.72rem;color:#8f9bb3;margin-top:1px}
.ptl-nowrap{white-space:nowrap}
.ptl-why{min-width:16rem;max-width:26rem;font-size:.84rem;line-height:1.5;color:#c8c8dc}
.ptl-lowload{min-width:11rem;max-width:15rem;font-size:.8rem;line-height:1.45;color:#a0a0b8}
.ptl-none{color:#6b7488;font-style:italic}
.ptl-why p{margin:0}
.ptl-src{white-space:nowrap;font-size:.8rem}
.ptl-src a{color:#8f9bb3}
.ptl-note{font-size:.8rem;color:#8f9bb3;margin:.7rem 0 0;line-height:1.55}
&lt;/style>
&lt;h2 id="how-to-read-it">How to read it&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Tiers rank quality, not size.&lt;/strong> A Tier S 750W unit is not &amp;ldquo;better&amp;rdquo; for your build than a Tier B 1000W unit if your build needs 1000W. Size first — our &lt;a href="https://techfuelhq.com/tools/psu-wattage-calculator/">PSU wattage calculator&lt;/a> does the arithmetic from your actual parts, and our &lt;a href="https://techfuelhq.com/articles/what-psu-for-rtx-5080-2026/">RTX 50-series PSU guide&lt;/a> walks the GPU-specific cases, 5070 through 5090. Then use this table to pick the best unit at that wattage.&lt;/li>
&lt;li>&lt;strong>Standard and connector matter more than they used to.&lt;/strong> ATX 3.1 with a native 12V-2x6 is the current target for a modern GPU build. 12VHPWR-era units still work — the connector revision improved contact reliability margins, not compatibility. Watch the cable ratings printed in the rows, because the marking and the wiring do not always agree: Hardware Busters found MSI&amp;rsquo;s MAG A850GL shipping a 16-pin cable marked 600W whose sense pins were configured for 450W, and found the opposite on Thermaltake&amp;rsquo;s GF3 1000W, where the documented 450W figure sat against a cable the reviewer measured as configured for 600W. Trust a measured review over a printed number.&lt;/li>
&lt;li>&lt;strong>Warranty is a quality signal.&lt;/strong> The industry&amp;rsquo;s best platforms carry 10–12 years because their makers expect them to survive it. A blank warranty cell means none of that unit&amp;rsquo;s sources stated one — which is itself worth knowing.&lt;/li>
&lt;li>&lt;strong>Efficiency badges are a floor, not a curve.&lt;/strong> The certification column describes a unit at its tested load points, which start at 20% for every 80 PLUS level below Titanium. It tells you nothing about the loads an idle machine spends its life at — which is the next section.&lt;/li>
&lt;/ul>
&lt;p>If a unit you own is misbehaving — random restarts, black screens under load, coil whine that changed character — the tier list will not diagnose it; our &lt;a href="https://techfuelhq.com/articles/psu-failure-symptoms-2026/">PSU failure symptoms guide&lt;/a> walks the actual triage.&lt;/p>
&lt;h2 id="the-247-homelab-dimension-nobodys-tier-list-covers">The 24/7 homelab dimension nobody&amp;rsquo;s tier list covers&lt;/h2>
&lt;p>Here is the gap in every PSU badge on every box. The 80 PLUS program publishes minimum efficiency thresholds at 20%, 50% and 100% of rated load for every level; only Titanium publishes a minimum at 10% load, per Bel Fuse&amp;rsquo;s published threshold tables. Below the tested points the certification says nothing about how a unit behaves. Intel&amp;rsquo;s ATX v3 design guide addresses this directly, adding a low-load point at 10W (or 2% of capacity on units above 500W) that requires 60% efficiency and recommends 70% — the guide&amp;rsquo;s stated reasoning being that desktop idle power has fallen so far since 2005 that power-supply loss now dominates what an idle machine pulls from the wall.&lt;/p>
&lt;p>Now put that next to what always-on hardware actually draws. ServeTheHome measured a Minisforum MS-02 Ultra at 19W idle at the wall and a ZimaCube 2 Pro at 25–30W; a typical N100 mini PC runs single digits to low teens. A homelab box spends the overwhelming majority of its hours at exactly the loads the badge never measured.&lt;/p>
&lt;p>The measured numbers make the point better than the argument does. Cybenetics publishes full light-load tables for the units it certifies, and down at a genuine idle load, current Gold-and-above 750–1000W units span &lt;strong>68% to 78%&lt;/strong>:&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Unit&lt;/th>
&lt;th scope="col">Load&lt;/th>
&lt;th scope="col">Efficiency&lt;/th>
&lt;th scope="col">Standby draw&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>be quiet! Pure Power 12 M 1000W&lt;/td>
&lt;td>20W&lt;/td>
&lt;td>77.8%&lt;/td>
&lt;td>0.055W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Corsair RM850x (2024)&lt;/td>
&lt;td>20W&lt;/td>
&lt;td>77.2%&lt;/td>
&lt;td>0.018W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Corsair SF750 Platinum (2024)&lt;/td>
&lt;td>20W&lt;/td>
&lt;td>75.7%&lt;/td>
&lt;td>0.047W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Seasonic Focus GX-750 (ATX 3.1)&lt;/td>
&lt;td>20W&lt;/td>
&lt;td>74.5%&lt;/td>
&lt;td>0.064W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>be quiet! Dark Power 13 1000W&lt;/td>
&lt;td>20W&lt;/td>
&lt;td>74.5%&lt;/td>
&lt;td>0.068W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>FSP Hydro Ti Pro 1000W&lt;/td>
&lt;td>20W (2%)&lt;/td>
&lt;td>74.1%&lt;/td>
&lt;td>0.076W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>XPG Core Reactor II VE 850W&lt;/td>
&lt;td>17W (2%)&lt;/td>
&lt;td>72.6%&lt;/td>
&lt;td>0.016W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>MSI MAG A850GL 850W&lt;/td>
&lt;td>20W&lt;/td>
&lt;td>72.1%&lt;/td>
&lt;td>0.055W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>XPG Core Reactor II 850W&lt;/td>
&lt;td>17W (2%)&lt;/td>
&lt;td>71.5%&lt;/td>
&lt;td>0.040W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Corsair RM850e&lt;/td>
&lt;td>20W&lt;/td>
&lt;td>69.6%&lt;/td>
&lt;td>0.049W&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>FSP Hydro G Pro 1000W&lt;/td>
&lt;td>20W (2%)&lt;/td>
&lt;td>68.0%&lt;/td>
&lt;td>0.071W&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>&lt;em>All figures at 115V, from each unit&amp;rsquo;s Cybenetics evaluation report (every report linked in Sources). The load column states the exact point measured: Cybenetics&amp;rsquo; low-load row is 2% of rated capacity on units above 500W — 20W on a 1000W unit, 17W on an 850W one — and its light-load table also publishes a fixed 20W point. This list covers the units with published Cybenetics light-load data, which is not the same set as the tier table above; the FSP Hydro G Pro is here for the measurement, not as a tiered recommendation.&lt;/em>&lt;/p>
&lt;p>Two practical conclusions fall out of this table.&lt;/p>
&lt;p>&lt;strong>Right-size an always-on box even harder than a gaming PC.&lt;/strong> Fifty watts on a 1000W unit is a 5% load — below every point the badge tested, and near the bottom of every curve above. The same 50W on a smaller quality unit sits meaningfully higher up its curve. Four families in the table reach down to 550W — the Pure Power 12 M, Century II Gold, Smart BM3 and CX750 — and our &lt;a href="https://techfuelhq.com/tools/psu-wattage-calculator/">wattage calculator&lt;/a> will tell you whether your parts list fits one. Resist the instinct to buy double.&lt;/p>
&lt;p>&lt;strong>When the box runs 24/7, pick from the top of the low-load column.&lt;/strong> The spread above is real but modest — at a 30W idle, the gap between the best and worst rows works out to a handful of watts at the wall. What makes it worth acting on is that an always-on node multiplies those watts by 8,760 hours a year, across every node you run, and the same units that measure well down here tend to be the quieter, better-built ones anyway. Our &lt;a href="https://techfuelhq.com/homelab/24-7-homelab-idle-power-costs-2026/">24/7 homelab idle power costs&lt;/a> breakdown has the measured draws and annual math for the hardware itself; the &lt;a href="https://techfuelhq.com/tools/power-cost-calculator/">power cost calculator&lt;/a> turns your own wattage and electricity rate into a yearly figure. And if the box matters enough to run 24/7, it matters enough to put behind a &lt;a href="https://techfuelhq.com/homelab/ups-power-sizing-homelab-2026/">properly sized UPS&lt;/a>.&lt;/p>
&lt;p>One honest boundary: for a gaming desktop that idles a few hours a day, none of this moves your bill meaningfully; a few watts across a few idle hours is noise. This section exists because homelab duty cycles are the inverse of gaming duty cycles: 90-plus percent idle, every day, forever.&lt;/p>
&lt;h2 id="your-psu-is-not-in-this-table-here-is-how-to-tier-it-yourself">Your PSU is not in this table. Here is how to tier it yourself&lt;/h2>
&lt;p>The database covers 28 current families, so plenty of perfectly good older units are absent. The method behind every row above is reproducible in about five minutes, using the same public sources:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Find it in the Cybenetics database.&lt;/strong> Search &lt;a href="https://www.cybenetics.com/" rel="noopener">cybenetics.com&lt;/a> for the exact model. A per-unit report gives you measured average efficiency, the light-load table this page leans on, noise in dBA, and standby draw — far more than the badge on the box. No listing at all is itself information: it means no independent lab published full-range numbers.&lt;/li>
&lt;li>&lt;strong>Read what the platform is, from a review rather than a forum.&lt;/strong> A hands-on review from an outlet that load-tests will name the OEM platform and how it behaved at temperature. If the only thing you can find is a spec sheet and opinions, treat the unit as untested rather than good.&lt;/li>
&lt;li>&lt;strong>Check the warranty against the class.&lt;/strong> Current quality platforms run 10–12 years. A 3–5 year warranty on a modern unit is the manufacturer telling you what it expects.&lt;/li>
&lt;li>&lt;strong>Check the connector against your card.&lt;/strong> Confirm the 16-pin cable&amp;rsquo;s actual rating, not its marking — two units in this table have a mismatch between the two.&lt;/li>
&lt;/ol>
&lt;p>If it clears all four, it belongs somewhere in Tier A or B whether or not we have listed it. If it fails step one &lt;em>and&lt;/em> step two, that is the real warning sign — not a missing tier letter.&lt;/p>
&lt;h2 id="the-questions-builders-keep-asking">The questions builders keep asking&lt;/h2>
&lt;h3 id="should-i-be-worried-about-my-psus-tier">Should I be worried about my PSU&amp;rsquo;s tier?&lt;/h3>
&lt;p>If your current unit is running a system it is sized for and behaving normally, no. Tier lists earn their keep at purchase time, when the units in a price bracket look identical on the box. An installed, stable, correctly sized unit from a reputable maker does not become risky because a spreadsheet ranks something else higher.&lt;/p>
&lt;h3 id="is-a-lower-tier-psu-dangerous-with-a-high-end-gpu">Is a lower-tier PSU dangerous with a high-end GPU?&lt;/h3>
&lt;p>Tier C in this table means compromised, not dangerous. Every C row rests on a test — an outlet&amp;rsquo;s, or in the single flagged case above, ours — and where a protection is missing, the row says so outright: the MSI MAG A750BN&amp;rsquo;s entry records that LTT Labs found no under-voltage protection, which is the kind of detail you want printed rather than smoothed over. What deserves genuine caution is the Avoid class, where the failures are documented rather than theoretical, and mismatched sizing: a 300W-rated 16-pin cable feeding a 350W card is a real problem no tier letter fixes. Check the connector column, then check your wattage math.&lt;/p>
&lt;h3 id="should-i-replace-a-working-eight-year-old-power-supply">Should I replace a working eight-year-old power supply?&lt;/h3>
&lt;p>Not on age alone, but the calculus shifts once a unit is well past its warranty. Capacitors degrade with heat and hours, and an old supply that was sized for the card you had in 2018 is often genuinely undersized for a modern one — which is the condition that stresses it hardest. If it is out of warranty, feeding a much bigger GPU than it was bought for, or showing any of the &lt;a href="https://techfuelhq.com/articles/psu-failure-symptoms-2026/">failure symptoms&lt;/a>, replace it proactively rather than after it takes something with it. If it is comfortably sized and behaving, leave it alone.&lt;/p>
&lt;h2 id="what-is-deliberately-not-here">What is deliberately not here&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Seasonic Vertex PX, Super Flower Leadex VII Platinum PRO&lt;/strong> — manufacturer specs verified, but we found no independent lab test of those specific lines. Spec-sheet-only rows do not get tier letters here.&lt;/li>
&lt;li>&lt;strong>Seasonic Prime TX and be quiet! Dark Power Pro 13&lt;/strong> — these now exist only at 1300W and above, a halo class this table does not cover. Both are well-regarded; neither is a mainstream buy.&lt;/li>
&lt;li>&lt;strong>Montech Century G5&lt;/strong> — gone from Montech&amp;rsquo;s own catalog with no professional review we could find; its successor Century II Gold is in the table instead.&lt;/li>
&lt;li>&lt;strong>Whole brands, and this is scope rather than judgment&lt;/strong> — Thermalright, Lian Li, ASUS, Gigabyte&amp;rsquo;s current lines, Antec, SilverStone and Phanteks are absent because v1.0 research covered the vendors above, not because their units were assessed and rejected. They are first in line for the next revision.&lt;/li>
&lt;li>&lt;strong>Successor lines we saw but did not verify&lt;/strong> — be quiet! Dark Power 14 and Pure Power 13 M, MSI&amp;rsquo;s GS-suffix refreshes beyond the A750GLS, FSP&amp;rsquo;s ATX 3.1 Hydro refreshes. They join the table when a verifiable test exists; that is what a living database means.&lt;/li>
&lt;li>&lt;strong>OEM folklore&lt;/strong> — platform attributions you may have seen elsewhere for units whose linked reviews do not state one.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Revision 1.0 — published 2026-07-29, 28 units. Next scheduled review: October 2026.&lt;/strong> Corrections and additions are welcome at &lt;a href="mailto:hello@techfuelhq.com">hello@techfuelhq.com&lt;/a> — bring a source and we will check it against the same standard we held ourselves to. The underlying dataset is downloadable as &lt;a href="https://techfuelhq.com/data/psu-tier-list.json">open JSON&lt;/a> under CC BY 4.0, and it carries the same revision stamp, so you can diff it against any later version.&lt;/p>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;p>Certification and specification primaries: &lt;a href="https://cdrdv2-public.intel.com/336521/336521_Rev2p1a.pdf" rel="noopener">Intel ATX Version 3 Multi Rail PSU Design Guide, doc 336521&lt;/a> · &lt;a href="https://www.clearesult.com/80plus/program-details" rel="noopener">CLEAResult 80 PLUS program details&lt;/a> · &lt;a href="https://www.belfuse.com/resource-library/tech-paper/80-plus-why-you-need-titanium-power-supplies-in-your-data-center" rel="noopener">Bel Fuse 80 PLUS threshold tables&lt;/a> · &lt;a href="https://www.cybenetics.com/index.php?option=eta" rel="noopener">Cybenetics ETA methodology&lt;/a> · &lt;a href="https://www.corsair.com/us/en/explorer/diy-builder/power-supply-units/80-plus-vs-cybenetics/" rel="noopener">Corsair 80 PLUS vs Cybenetics explainer&lt;/a>&lt;/p>
&lt;p>Low-load measurements: Cybenetics evaluation reports for the &lt;a href="https://www.cybenetics.com/evaluations/psus/2399/" rel="noopener">Corsair RM850x&lt;/a>, &lt;a href="https://www.cybenetics.com/evaluations/psus/2630/en/" rel="noopener">Corsair RM850e&lt;/a>, &lt;a href="https://www.cybenetics.com/evaluations/psus/2352/" rel="noopener">Corsair SF750&lt;/a>, &lt;a href="https://www.cybenetics.com/evaluations/psus/2579/" rel="noopener">Seasonic Focus GX-750&lt;/a>, &lt;a href="https://www.cybenetics.com/evaluations/psus/2336/" rel="noopener">MSI MAG A850GL&lt;/a>, &lt;a href="https://www.cybenetics.com/evaluations/psus/2159/" rel="noopener">be quiet! Pure Power 12 M&lt;/a>, &lt;a href="https://www.cybenetics.com/evaluations/psus/2156/" rel="noopener">be quiet! Dark Power 13&lt;/a>, &lt;a href="https://www.cybenetics.com/evaluations/psus/2078/" rel="noopener">FSP Hydro G Pro&lt;/a>, &lt;a href="https://www.cybenetics.com/evaluations/psus/2101/en/" rel="noopener">FSP Hydro Ti Pro&lt;/a>, &lt;a href="https://www.cybenetics.com/evaluations/psus/2216/" rel="noopener">XPG Core Reactor II&lt;/a>, and &lt;a href="https://www.cybenetics.com/evaluations/psus/2397/" rel="noopener">XPG Core Reactor II VE&lt;/a>&lt;/p>
&lt;p>Homelab idle draw: &lt;a href="https://www.servethehome.com/minisforum-ms-02-ultra-review-intel-new-home-lab-king/4/" rel="noopener">ServeTheHome — Minisforum MS-02 Ultra power consumption&lt;/a> · &lt;a href="https://www.servethehome.com/zimacube-2-pro-review-intel-marvell-asmedia/5/" rel="noopener">ServeTheHome — ZimaCube 2 Pro power consumption&lt;/a> · &lt;a href="https://homelabstarter.com/homelab-power-consumption-guide/" rel="noopener">HomeLab Starter power consumption guide&lt;/a> · &lt;a href="https://www.xda-developers.com/i-stopped-wasting-money-on-high-wattage-psus-heres-what-actually-matters/" rel="noopener">XDA on PSU oversizing and the efficiency curve&lt;/a>&lt;/p>
&lt;p>Per-unit review and specification sources are linked directly in each table row.&lt;/p></description></item></channel></rss>