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