<?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>Wed, 26 Aug 2026 15:20: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>LM Studio vs Ollama on an RTX 5080: Measured (2026)</title><link>https://techfuelhq.com/self-hosted/ollama-vs-lm-studio-rtx-5080-2026/</link><pubDate>Wed, 26 Aug 2026 15:20:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/self-hosted/ollama-vs-lm-studio-rtx-5080-2026/</guid><description>&lt;p>Depending on which search result you trust, LM Studio is 46% faster than Ollama,
10-20% slower, or exactly the same speed. The Reddit thread that ranks first for
this query carries &amp;ldquo;3-4x faster&amp;rdquo; claims for Ollama, while a Stack Exchange question
a few results down asks why Ollama&amp;rsquo;s models run faster inside LM Studio. Those
claims cannot all be true on the same computer, so I put both apps on mine: one RTX 5080,
the same GGUF files loaded by both. Hard-linked, sha256-verified, the same bytes on
disk. Five runs per cell, at stock settings and again with settings matched.&lt;/p>
&lt;p>The apps are within 14% of each other everywhere. One wrong setting is worth 240%.&lt;/p>
&lt;h2 id="the-verdict-by-use-case">The verdict, by use case&lt;/h2>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">You want&lt;/th>
&lt;th scope="col">Run&lt;/th>
&lt;th scope="col">Why, measured&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>A background service, API, scripting, Docker&lt;/td>
&lt;td>&lt;strong>Ollama&lt;/strong>&lt;/td>
&lt;td>5-11% faster dense decode, 78-132 MB idle RAM, headless by design&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>A GUI, model browser, per-model tuning&lt;/td>
&lt;td>&lt;strong>LM Studio&lt;/strong>&lt;/td>
&lt;td>The interface is the product; decode within 5-11% of Ollama&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Fastest gpt-oss 20B on 16 GB&lt;/td>
&lt;td>&lt;strong>LM Studio + upstream GGUF&lt;/strong>&lt;/td>
&lt;td>242.8 vs 213.7 t/s, engine and conversion differences both in play&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Long prompts, RAG, big context ingestion&lt;/td>
&lt;td>&lt;strong>LM Studio&lt;/strong>&lt;/td>
&lt;td>Prefill 5-14% faster on every model tested&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Both at once&lt;/td>
&lt;td>&lt;strong>Fine&lt;/strong>&lt;/td>
&lt;td>Ran simultaneously on ports 11434/1234, 7,000 MiB total VRAM with two 3Bs&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>Neither app deserves a speed-based religion. Here is what one controlled rig
actually measures.&lt;/p>
&lt;h2 id="what-people-claim-vs-what-i-measured">What people claim vs what I measured&lt;/h2>
&lt;p>The top of this search results page disagrees with itself. The r/LocalLLaMA thread
that ranks first carries claims of Ollama being &amp;ldquo;3-4x&amp;rdquo; faster; a Medium post and
Codiste both say Ollama wins by 10-20%; atomic.chat says LM Studio generates 46%
faster; tech-insider.org titles its piece &amp;ldquo;Zero Performance Difference [Tested]&amp;rdquo;,
then prints Qwen 2.5 14B Q4_K_M at 25-30 tokens/sec on an RTX 4090, attributed to
community benchmarks. Every one of those pages is linked in the Sources block. My
RTX 5080 measures that exact model and quant at 97-102 t/s in both apps. Three to
four times their 4090 figure. A different machine and unknown settings on their
side, granted, and that is precisely the problem — this argument runs on numbers
nobody measured under stated conditions.&lt;/p>
&lt;p>With settings matched (context 4096, full GPU offload, temperature 0, seed 42, one
serving slot, medians of five fresh-prompt runs):&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Model&lt;/th>
&lt;th scope="col">App&lt;/th>
&lt;th scope="col" style="text-align: right">Decode&lt;/th>
&lt;th scope="col" style="text-align: right">Prefill (~450 tok)&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 0.32.15&lt;/td>
&lt;td style="text-align: right">&lt;strong>350.5 t/s&lt;/strong>&lt;/td>
&lt;td style="text-align: right">17,862 t/s&lt;/td>
&lt;td style="text-align: right">3,760&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Llama 3.2 3B&lt;/td>
&lt;td>LM Studio 0.4.21&lt;/td>
&lt;td style="text-align: right">316.0 t/s&lt;/td>
&lt;td style="text-align: right">&lt;strong>20,337 t/s&lt;/strong>&lt;/td>
&lt;td style="text-align: right">3,808&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qwen 2.5 14B&lt;/td>
&lt;td>Ollama 0.32.15&lt;/td>
&lt;td style="text-align: right">&lt;strong>102.2 t/s&lt;/strong>&lt;/td>
&lt;td style="text-align: right">5,038 t/s&lt;/td>
&lt;td style="text-align: right">10,356&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qwen 2.5 14B&lt;/td>
&lt;td>LM Studio 0.4.21&lt;/td>
&lt;td style="text-align: right">97.6 t/s&lt;/td>
&lt;td style="text-align: right">&lt;strong>5,567 t/s&lt;/strong>&lt;/td>
&lt;td style="text-align: right">10,405&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>gpt-oss 20B²&lt;/td>
&lt;td>Ollama 0.32.15&lt;/td>
&lt;td style="text-align: right">213.7 t/s&lt;/td>
&lt;td style="text-align: right">9,187 t/s&lt;/td>
&lt;td style="text-align: right">13,570&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>gpt-oss 20B²&lt;/td>
&lt;td>LM Studio 0.4.21&lt;/td>
&lt;td style="text-align: right">&lt;strong>242.8 t/s&lt;/strong>&lt;/td>
&lt;td style="text-align: right">&lt;strong>9,618 t/s&lt;/strong>&lt;/td>
&lt;td style="text-align: right">12,533&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>² Different conversions of the same model, because they have to be: Ollama ships its
own gpt-oss blob and LM Studio runs the ggml-org upstream MXFP4 file. More on that
below.&lt;/p>
&lt;p>Ollama decodes faster on dense models, by 10.9% on the 3B and 4.7% on the 14B. LM Studio
prefills faster on everything I tested and wins the MoE outright. Each side wins one
event, which is the same shape my &lt;a href="https://techfuelhq.com/self-hosted/ollama-vs-llamacpp-rtx-5080-2026/">Ollama vs llama.cpp bench&lt;/a>
found six days earlier, and none of it justifies &amp;ldquo;3-4x&amp;rdquo; folklore. The per-run
decode arrays, VRAM, RAM, LM Studio TTFT medians, and load times are in the
&lt;a href="https://techfuelhq.com/data/llm-server-compare/">same-GPU compare dataset&lt;/a>, CC BY 4.0.&lt;/p>
&lt;h2 id="same-engine-underneath-same-process-name">Same engine underneath, same process name&lt;/h2>
&lt;p>The process tables captured with every run show the same thing on both sides: the
model being served by a &lt;code>llama-server.exe&lt;/code> process — Ollama&amp;rsquo;s from its install
directory, LM Studio&amp;rsquo;s from its backend extension directory. Both
apps are packaging around llama.cpp&amp;rsquo;s server, which is why the dense-model numbers
land within 11% of each other and why &amp;ldquo;which app is faster&amp;rdquo; is mostly a question
about versions and defaults.&lt;/p>
&lt;p>The versions matter more than the wrapper. Ollama 0.32.15 runs its vendored
llama.cpp at commit 9d77fa172; LM Studio 0.4.21 downloaded its llama.cpp runtime
2.29.1 on first launch. The installer shipped 2.28.2 engines, still on disk next to the newer one. The
app updated itself before I ran anything. Worth knowing
if you pin versions for reproducibility. Six days and fourteen patch-version
increments separate my two captures of Ollama on this rig, and its 3B decode moved
from 319 t/s (0.32.1, August 20) to 351 (0.32.15, August 26). Some of that is
engine updates. Some may be capture-window conditions, since the earlier run
predates the quiet-window discipline described in the method. By the time I
finished writing, Ollama had already promoted 0.33.0. Any LM-Studio-vs-Ollama
benchmark without version numbers is a screenshot of a moving target.&lt;/p>
&lt;h2 id="the-defaults-are-the-real-story">The defaults are the real story&lt;/h2>
&lt;p>The plan for this piece treated &amp;ldquo;defaults as installed&amp;rdquo; and &amp;ldquo;settings normalized&amp;rdquo;
as separate test conditions on the expectation that packaging differences would
show up in the numbers, and the dense models shrugged at every bit of it: Qwen 2.5
14B ran 98.2 t/s at LM Studio&amp;rsquo;s stock settings and 97.6 normalized while the 3B
moved about 1%. When the model fits comfortably, stock settings are fine. Stop
tuning.&lt;/p>
&lt;p>Two defaults are not fine, and both fail silently.&lt;/p>
&lt;p>&lt;strong>LM Studio&amp;rsquo;s automatic GPU offload quietly benched gpt-oss at 186 t/s&lt;/strong> — 23%
below the 243 the same app hits with settings tuned. Stock, LM Studio loads
models at 8,192 context across 4 parallel slots with GPU offload on &amp;ldquo;auto&amp;rdquo;, and
my first normalized pass changed all three at once. So I re-ran the stock
configuration changing only the offload slider, nothing else. Result: 244.9 t/s,
the entire gap, from one setting. Context length and slot count contributed
nothing measurable. On a 16 GB card, auto had chosen to hold part of the MoE&amp;rsquo;s
weights on the CPU, and no warning appears anywhere. Setting GPU offload to max
was worth 31% on this card.&lt;/p>
&lt;p>&lt;strong>Ollama&amp;rsquo;s context slider is a 3.4x foot-gun.&lt;/strong> Ollama&amp;rsquo;s documented default for a
16 GB card is a 4,096-token context, and at that default the 3B decodes at 351 t/s,
100% GPU-resident. This machine&amp;rsquo;s Ollama had its app-settings context slider at
256k from earlier use, a value Ollama clamps to this model&amp;rsquo;s 131,072-token
maximum. Still far past what fits. With nothing else changed, the same 2 GB model loaded
an 18 GB footprint, split 22%/78% across CPU and GPU, and decoded at 102 t/s. A
3.4x slowdown from one setting, and &lt;code>ollama ps&lt;/code> is the only place that shows you
why. I would bet money this explains a large share of the &amp;ldquo;Ollama was crawling for
me&amp;rdquo; posts in that Reddit thread; it is also presumably invisible to anyone
benchmarking only fresh installs.&lt;/p>
&lt;p>If one number from this page survives in your memory, make it this pair. The gap
between these two apps is at most 14%. The gap between a good and a bad memory
setting is 240%.&lt;/p>
&lt;h2 id="memory-vram-is-a-tie-ram-is-not">Memory: VRAM is a tie, RAM is not&lt;/h2>
&lt;p>Wherever both apps loaded the identical file, GPU memory matched within 50 MiB —
3,760 vs 3,808 on the 3B, 10,356 vs 10,405 on the 14B. Same bytes, same engine,
same memory. The gpt-oss row differs by 1,037 MiB because the conversions differ;
Ollama&amp;rsquo;s fork has allocated about a gigabyte more than upstream in every capture
I have run, on either engine.&lt;/p>
&lt;p>System RAM is where the apps genuinely part ways. Idle with no model, the Ollama
service tree held 78-132 MB across my checks; LM Studio&amp;rsquo;s GUI and server held
709-928 MB across the quiet-window observations (one transitional reading hit
3.1 GB mid-unload and is excluded as a non-idle state; it is in the raw JSON).
Loaded, LM Studio&amp;rsquo;s runtime keeps the memory-mapped model file hot in its working
set. With gpt-oss resident, its process tree reported about 13 GB of RAM alongside
the 12.5 GB of VRAM, where Ollama&amp;rsquo;s runner released its mapping and sat near
2.1 GB. Mapped file pages are evictable cache, so this is not a hard requirement,
but on a machine with 16-32 GB of RAM running other work, Ollama is the lighter
tenant: five to six times lighter loaded, five to twelve times lighter idle.
tech-insider.org&amp;rsquo;s &amp;ldquo;5x Memory Gap&amp;rdquo; headline has the right direction and, at idle,
roughly the right magnitude; the spread depends mostly on what the Electron GUI
is doing.&lt;/p>
&lt;p>Load times were closer than I expected: 2.3-2.8s for the 3B on both apps, 5.5s vs
7.7s on the 14B, 8.1s vs 8.4s on gpt-oss, warm caches throughout.&lt;/p>
&lt;h2 id="the-portability-catch-travels">The portability catch travels&lt;/h2>
&lt;p>My llama.cpp piece found that Ollama&amp;rsquo;s gpt-oss:20b blob declares architecture
&lt;code>gptoss&lt;/code>, which upstream llama.cpp rejects. LM Studio reproduces the refusal
verbatim: importing the blob works, the file indexes, and loading it dies with
&lt;code>unknown model architecture: 'gptoss'&lt;/code> from its 2.29.1 runtime. So the one model
Ollama co-launched still cannot leave Ollama, now confirmed against two external
consumers of the file.&lt;/p>
&lt;p>Everything else travels beautifully. &lt;code>lms import&lt;/code> took Ollama&amp;rsquo;s Llama 3.2 and
Qwen 2.5 blobs by path, and with the hard-link option both apps share one physical
copy of the weights. I verified it: each blob shows a link count of three (Ollama&amp;rsquo;s
store, my staging copy, LM Studio&amp;rsquo;s models directory all naming the same bytes),
and the files hash identically to Ollama&amp;rsquo;s own blob digests. The listings ship
with the raw evidence. In the other direction, Ollama
imports any GGUF with a one-line Modelfile (&lt;code>FROM /path/to/file.gguf&lt;/code> and
&lt;code>ollama create&lt;/code>), though it copies rather than links. Running both apps against
one model library costs you nothing but the gpt-oss exception.&lt;/p>
&lt;h2 id="which-one-belongs-on-your-machine">Which one belongs on your machine&lt;/h2>
&lt;p>Run Ollama when the model is infrastructure: a service that starts at boot, feeds
&lt;a href="https://techfuelhq.com/tutorials/ollama-docker-gpu-2026/">Docker containers&lt;/a>, answers on 11434 from
&lt;a href="https://techfuelhq.com/articles/self-hosted-ai-stack-2026/">whatever stack you build on it&lt;/a>, and stays
out of RAM when idle. The local-LLM tutorials on this site ride on it for exactly
that reason, and its dense-decode edge is real if modest.&lt;/p>
&lt;p>Run LM Studio when the model is an appliance: you want to browse Hugging Face
quants visually, flip a sampling parameter without editing a Modelfile, watch
token streams in a chat pane, and still get an OpenAI-compatible server on 1234
when an app needs one. Its per-model load settings are the granular control Ollama
hides behind environment variables, the same control that makes the auto-offload
default worth checking before you benchmark anything.&lt;/p>
&lt;p>Run both when the fits above split your week. They coexist on one card, share
model files one direction cleanly, and the second app costs you a few hundred
megabytes of idle RAM. Measured with both 3Bs resident: 7,000 MiB of total GPU
memory including the desktop&amp;rsquo;s ~1.1 GB baseline, and sequential requests answered
at 298 and 230 t/s. That is lower than the solo medians, though those coexistence
runs capped generation at 64 tokens, so they are not directly comparable to the
256-token table above. My &lt;a href="https://techfuelhq.com/tools/llm-vram-calculator/">VRAM calculator&lt;/a>
and &lt;a href="https://techfuelhq.com/tools/llm-speed-calculator/">speed calculator&lt;/a> both apply unchanged to either
app, because underneath they are the same engine. That is the finding of this whole
exercise. Pick by workflow. Fix your settings. The
&lt;a href="https://techfuelhq.com/articles/local-llm-by-gpu-vram-2026/">by-GPU model guide&lt;/a> covers what fits in
your VRAM either way.&lt;/p>
&lt;h2 id="method-and-limits">Method and limits&lt;/h2>
&lt;p>Both apps measured 2026-08-26 on the same box, an RTX 5080 16 GB on driver 610.88
under Windows 11. Ollama 0.32.15, upgraded from 0.32.1 the same morning — the
newest release at bench time, with 0.33.0 promoted while this was being written
and not tested here. LM Studio 0.4.21, installed fresh that morning, runtime
self-updated to llama.cpp-cuda12 2.29.1. Models: Llama 3.2 3B Q4_K_M (blob dde5aa3fc5ff…),
Qwen 2.5 14B Q4_K_M (blob 2049f5674b1e…), gpt-oss 20B MXFP4 — Ollama&amp;rsquo;s blob
e7b273f96360… on its side, ggml-org&amp;rsquo;s upstream file on LM Studio&amp;rsquo;s side, whose
sha256 27cd6c432c76… matches the hash Hugging Face publishes. Rates come from each
app&amp;rsquo;s own counters (Ollama&amp;rsquo;s eval fields; LM Studio&amp;rsquo;s /api/v0 stats), cross-checked
by wall-clock recomputation. Decode figures are medians of five runs, long-prefill
figures medians of three (a fourth warmup run is discarded), every run carrying a
unique prompt nonce to defeat prompt caches. The gpt-oss offload finding was
re-verified with a single-variable run — stock configuration, only the offload
slider moved — recorded with the rest of the raw JSON. LM Studio&amp;rsquo;s prefill rate is derived from
time-to-first-token minus one decoded token, because its API does not split prompt
evaluation out the way Ollama&amp;rsquo;s does; the long-prefill TTFTs live in the raw JSON
captures if you want to re-derive. One app under test at a time, the other fully killed, except in
the coexistence check.&lt;/p>
&lt;p>What I did not test: Mac and MLX (where the loudest &amp;ldquo;LM Studio is faster&amp;rdquo; claims
come from, and where nothing on this page applies), AMD cards, multi-GPU, LM
Studio&amp;rsquo;s chat UI as opposed to its server, concurrent multi-request serving, and
NVFP4 quantization — no NVFP4 conversion of this model set existed to test. Mid-capture I caught
a background indexing job on my own machine depressing 3B decode by 15%; it was
suspended and every published number re-measured on a quiet system, which is one
more reason to distrust any benchmark that does not say what else the box was
doing. All raw JSON captures live in the repo, and the
&lt;a href="https://techfuelhq.com/data/llm-server-compare/">dataset page&lt;/a> is the citable record. These numbers
carry version stamps because they moved 3-10% in two weeks on one of the apps
alone; date everything, including mine.&lt;/p></description></item><item><title>The Self-Hosted SSO Tax: A Verified Tracker (2026)</title><link>https://techfuelhq.com/self-hosted/self-hosted-sso-tax-2026/</link><pubDate>Wed, 26 Aug 2026 14:45:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/self-hosted/self-hosted-sso-tax-2026/</guid><description>&lt;p>On August 9, 2026, PLANKA shipped version 2.2.0 and removed OIDC single sign-on from its
free Community edition, which meant anyone who updated a working board found every
SSO-based user on it deactivated, admins included. Three days after the announcement, the
thread on GitHub was closed and locked, sitting at 86 thumbs-down. That thread is why this
page exists.&lt;/p>
&lt;p>The practice has a name. &lt;a href="https://sso.tax/" rel="noopener">sso.tax&lt;/a>, whose entries go back to 2018,
tracks SaaS vendors that treat single sign-on as a luxury add-on, and its fork
&lt;a href="https://ssotax.org/" rel="noopener">ssotax.org&lt;/a> carries the same torch. Both lists measure per-user
cloud pricing, which is the right lens for SaaS and the wrong one for software you run
yourself. Neither covers what hit self-hosters this year: an app that runs on your
hardware, under an open license or close to one, where the login method is still the
feature behind the paywall.&lt;/p>
&lt;p>Nobody was keeping the list for self-hosted software. So I built it. I verified every row
on this page against the vendor&amp;rsquo;s own pricing pages and repositories on
&lt;strong>August 25, 2026&lt;/strong>, and each row links its receipt. A row I could not verify that day did
not ship.&lt;/p>
&lt;h2 id="what-is-the-self-hosted-sso-tax">What is the self-hosted SSO tax?&lt;/h2>
&lt;p>The SSO tax is the practice of charging extra for single sign-on. In SaaS it shows up as
an enterprise tier priced far above the plan you wanted. In self-hosted software it shows
up as an open-core split, where the code is free to run while SAML or OIDC login sits in
a paid edition, behind a license key, or inside a subscription that can cost more per
month than the hardware under it. Same tax, new venue.&lt;/p>
&lt;p>Why it stings more at home than in the office is worth spelling out. Once you run five or
six services, an identity provider such as Keycloak or &lt;a href="https://techfuelhq.com/tutorials/authentik-sso-self-hosted-2026/">Authentik&lt;/a>
is what turns them into one system. One account per person. One password policy, one place
to enforce two-factor, one switch to cut a user off everywhere. An app that paywalls SSO
opts out of that system unless you pay, and the price is usually set for companies, not
for a family of four. That gap is the tax.&lt;/p>
&lt;h2 id="what-counts-and-what-does-not">What counts, and what does not&lt;/h2>
&lt;p>A tracker like this earns links only if its rules are stated before its accusations. Here
are mine.&lt;/p>
&lt;p>&lt;strong>Class A, retroactive removal.&lt;/strong> A feature that shipped in the free edition moves behind
a paywall, and existing free users lose it on update. The community calls this a
rug-pull. It is the most serious class because it converts deployed users into hostages
of their own upgrade path, people who picked the app in good faith on the feature set it
shipped with and now get to choose between paying up and rebuilding somewhere else.
PLANKA&amp;rsquo;s OIDC removal is the 2026 example.&lt;/p>
&lt;p>&lt;strong>Class B, gated from day one.&lt;/strong> SSO was never free in the self-hosted edition. This is a
defensible business model and most rows below sit in this class. It still belongs on the
tracker, because you should price it in before you adopt the app, and because the free
alternatives column exists.&lt;/p>
&lt;p>&lt;strong>Class C, the quote wall.&lt;/strong> No published price at all. You cannot know the tax without
talking to sales. The original sso.tax maintains a separate list for these vendors, and
the same pattern appears in self-hosted pricing.&lt;/p>
&lt;p>Three things deliberately do not count. Paid support or hosting around a fully free
feature is the fair way to fund open source, and the free-side table below
names projects doing exactly that. Gating in a vendor&amp;rsquo;s hosted cloud while the
self-hosted build stays free is a SaaS matter, already covered by sso.tax. And a free
evaluation edition does not make a feature free. Mattermost&amp;rsquo;s &amp;ldquo;Entry&amp;rdquo; edition includes
SAML, and Mattermost&amp;rsquo;s own pricing page describes it as a limited-use edition of
Enterprise Advanced for technical evaluation.&lt;/p>
&lt;p>One more fairness rule. Where a vendor grandfathers old versions, the row says so. PLANKA
does not disable anything remotely, and older releases keep working. That matters, and a
tracker that hides it is a rant.&lt;/p>
&lt;h2 id="saml-oidc-ldap-not-the-same-thing">SAML, OIDC, LDAP: not the same thing&lt;/h2>
&lt;p>Every row below names the exact protocol, because &amp;ldquo;SSO&amp;rdquo; without a protocol name is how
wrong accusations happen.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>SAML 2.0.&lt;/strong> The XML-based enterprise standard. Common in corporate identity systems,
heavier to implement, and the single most frequently paywalled protocol on this page.&lt;/li>
&lt;li>&lt;strong>OIDC (OpenID Connect).&lt;/strong> The modern JSON/OAuth2-based standard. What Keycloak,
Authelia, and Authentik speak natively, and what most homelab setups want.&lt;/li>
&lt;li>&lt;strong>LDAP / Active Directory.&lt;/strong> Not SSO at all. A directory the app checks credentials
against. Users still type a password into each app, and there is no single session.
Several vendors sell &amp;ldquo;LDAP sync&amp;rdquo; as a separate paid feature.&lt;/li>
&lt;li>&lt;strong>Social login.&lt;/strong> OAuth2 against Google, GitHub, or similar. Convenient, and not the
same as bringing your own identity provider.&lt;/li>
&lt;li>&lt;strong>Forward-auth.&lt;/strong> A reverse proxy asks an authenticator before passing traffic. Guards
the front door without the app&amp;rsquo;s cooperation. More on its limits below.&lt;/li>
&lt;/ul>
&lt;h2 id="the-tracker-self-hosted-apps-that-charge-for-sso">The tracker: self-hosted apps that charge for SSO&lt;/h2>
&lt;p>Every row verified against the linked source on &lt;strong>2026-08-25&lt;/strong>. Prices are the vendor&amp;rsquo;s
published numbers on that date, in the currency they publish. &amp;ldquo;Moved&amp;rdquo; means the feature
left a free edition on the stated date. &amp;ldquo;Gated&amp;rdquo; means it was paid from the start as far as
the vendor&amp;rsquo;s current material shows, with no claim about earlier history.&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">App&lt;/th>
&lt;th scope="col">What is paid&lt;/th>
&lt;th scope="col">Cheapest tier with it (2026-08-25)&lt;/th>
&lt;th scope="col">Class&lt;/th>
&lt;th scope="col">Free route that remains&lt;/th>
&lt;th scope="col">Receipt&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>PLANKA&lt;/strong> (kanban)&lt;/td>
&lt;td>OIDC SSO, removed from Community in v2.2.0 (2026-08-09); updating deactivates SSO-only users&lt;/td>
&lt;td>Pro, self-hosted €36/mo (€432/yr)&lt;/td>
&lt;td>&lt;strong>Moved&lt;/strong> (Aug 2026)&lt;/td>
&lt;td>Password login; TOTP 2FA now free; stay on ≤2.1.1 unsupported; &lt;a href="https://vikunja.io/docs/openid/" rel="noopener">Vikunja&lt;/a> has free OIDC&lt;/td>
&lt;td>&lt;a href="https://github.com/plankanban/planka/issues/1754" rel="noopener">Issue #1754&lt;/a> · &lt;a href="https://planka.app/pricing" rel="noopener">pricing&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Mattermost&lt;/strong> (team chat)&lt;/td>
&lt;td>SAML and OpenID Connect for production use sit on paid plans (the SAML docs list &amp;ldquo;Entry&amp;rdquo; too — an evaluation-only edition, see the free-route cell)&lt;/td>
&lt;td>Professional and up, quote-based (&amp;ldquo;prepaid annual subscriptions&amp;rdquo;)&lt;/td>
&lt;td>Gated + quote wall&lt;/td>
&lt;td>Free &amp;ldquo;Entry&amp;rdquo; edition includes SAML but is &amp;ldquo;a limited-use edition &amp;hellip; for technical evaluation&amp;rdquo; per the pricing page; Zulip ships SAML/OIDC free&lt;/td>
&lt;td>&lt;a href="https://docs.mattermost.com/administration-guide/onboard/sso-saml.html" rel="noopener">SAML docs&lt;/a> · &lt;a href="https://mattermost.com/pricing/" rel="noopener">pricing&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Grafana&lt;/strong> (dashboards)&lt;/td>
&lt;td>SAML — &amp;ldquo;Available in Grafana Enterprise and Grafana Cloud&amp;rdquo;&lt;/td>
&lt;td>Enterprise, quote-based&lt;/td>
&lt;td>Gated + quote wall&lt;/td>
&lt;td>Generic OAuth stays in the OSS build — its docs carry no edition banner, unlike SAML&amp;rsquo;s&lt;/td>
&lt;td>&lt;a href="https://grafana.com/docs/grafana/latest/setup-grafana/configure-security/configure-authentication/saml/" rel="noopener">SAML docs&lt;/a> · &lt;a href="https://grafana.com/docs/grafana/latest/setup-grafana/configure-security/configure-authentication/generic-oauth/" rel="noopener">OAuth docs&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Metabase&lt;/strong> (BI)&lt;/td>
&lt;td>SAML — &amp;ldquo;only available on Pro and Enterprise plans (both self-hosted and on Metabase Cloud)&amp;rdquo;&lt;/td>
&lt;td>Pro, $575/mo&lt;/td>
&lt;td>Gated&lt;/td>
&lt;td>Open-source edition, without SSO&lt;/td>
&lt;td>&lt;a href="https://www.metabase.com/docs/latest/people-and-groups/authenticating-with-saml" rel="noopener">SAML docs&lt;/a> · &lt;a href="https://www.metabase.com/pricing/" rel="noopener">pricing&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Teleport&lt;/strong> (infra access)&lt;/td>
&lt;td>SSO via OIDC, SAML, or Active Directory — Enterprise versions only, per vendor FAQ&lt;/td>
&lt;td>Enterprise, quote-based&lt;/td>
&lt;td>Gated + quote wall&lt;/td>
&lt;td>Community edition (the FAQ does not enumerate its auth methods)&lt;/td>
&lt;td>&lt;a href="https://goteleport.com/docs/faq/" rel="noopener">FAQ&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Passbolt&lt;/strong> (passwords)&lt;/td>
&lt;td>SSO (Microsoft, Google, OpenID) and LDAP provisioning at Pro; AD FS at Enterprise&lt;/td>
&lt;td>Pro, $4.90/user/mo billed annually, 10-user minimum&lt;/td>
&lt;td>Gated&lt;/td>
&lt;td>Community edition, without SSO/LDAP; Vaultwarden documents free OIDC&lt;/td>
&lt;td>&lt;a href="https://www.passbolt.com/pricing" rel="noopener">Pricing&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Bitwarden&lt;/strong> (passwords)&lt;/td>
&lt;td>&amp;ldquo;Passwordless SSO integration&amp;rdquo; at Enterprise; Teams lacks it&lt;/td>
&lt;td>Enterprise, $6/user/mo billed annually&lt;/td>
&lt;td>Gated&lt;/td>
&lt;td>&lt;a href="https://techfuelhq.com/homelab/vaultwarden-vs-bitwarden-2026/">Vaultwarden&lt;/a>, unofficial, free OIDC&lt;/td>
&lt;td>&lt;a href="https://bitwarden.com/pricing/business/" rel="noopener">Business pricing&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>n8n&lt;/strong> (automation)&lt;/td>
&lt;td>&amp;ldquo;SSO, SAML and LDAP&amp;rdquo; at Business tier&lt;/td>
&lt;td>Business, €667/mo billed annually&lt;/td>
&lt;td>Gated&lt;/td>
&lt;td>Free &lt;a href="https://techfuelhq.com/tutorials/n8n-self-hosted-docker-2026/">self-hosted Community build&lt;/a>, email login&lt;/td>
&lt;td>&lt;a href="https://n8n.io/pricing/" rel="noopener">Pricing&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Plane&lt;/strong> (project mgmt)&lt;/td>
&lt;td>SAML and OIDC implementations — the pricing table marks both Enterprise Grid only&lt;/td>
&lt;td>Enterprise Grid, quote-based&lt;/td>
&lt;td>Gated + quote wall&lt;/td>
&lt;td>CE self-host auth is passwords and magic links; Vikunja has free OIDC&lt;/td>
&lt;td>&lt;a href="https://plane.so/pricing" rel="noopener">Pricing&lt;/a> · &lt;a href="https://developers.plane.so/self-hosting/govern/authentication" rel="noopener">self-host docs&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>OpenProject&lt;/strong> (project mgmt)&lt;/td>
&lt;td>SSO providers (CAS, SAML, OpenID Connect, Kerberos, Okta), reserved for paid Enterprise plans&lt;/td>
&lt;td>Enterprise plans, from €10.95/user/mo billed annually with 25-seat minimums&lt;/td>
&lt;td>Gated&lt;/td>
&lt;td>Community edition (password logins)&lt;/td>
&lt;td>&lt;a href="https://www.openproject.org/pricing/" rel="noopener">Pricing table&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Seafile&lt;/strong> (file sync)&lt;/td>
&lt;td>SAML 2.0 / ADFS, manual-labeled &amp;ldquo;(Pro)&amp;rdquo;&lt;/td>
&lt;td>Pro edition (per-user pricing not published on checked pages)&lt;/td>
&lt;td>Gated&lt;/td>
&lt;td>CE keeps OAuth, Shibboleth, and remote-user; &lt;a href="https://techfuelhq.com/tutorials/nextcloud-aio-docker-setup-2026/">Nextcloud&lt;/a> has an official free SSO app&lt;/td>
&lt;td>&lt;a href="https://manual.seafile.com/latest/config/saml2/" rel="noopener">Manual&lt;/a> · &lt;a href="https://manual.seafile.com/latest/config/single_sign_on/" rel="noopener">SSO overview&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>Two notes on reading it. The seat minimums matter more than the per-user price, because
SSO on Passbolt starts at 10 paid seats — $49 a month at its listed rate even if only
three people ever log in — and OpenProject&amp;rsquo;s plans carry 25-seat minimums on top of the
per-user number. And a quote wall is itself data. Five of eleven rows publish no number
at all.&lt;/p>
&lt;p>The table is honest about what it does not know. Portainer folklore says Business Edition
gates OAuth, and Portainer&amp;rsquo;s &lt;a href="https://docs.portainer.io/admin/settings/authentication/oauth" rel="noopener">current documentation&lt;/a>
shows OAuth providers with no edition restriction, so there is no Portainer row. The same
discipline removed a Rocket.Chat row from a draft of this page: their plan matrix lists
basic SAML, LDAP, and custom OAuth in Community, so what they charge for is advanced
identity sync, not SSO itself — that story sits in the retreats section below. Absence
from this table is not an endorsement. It means I could not verify an SSO paywall from
the primary source on build day.&lt;/p>
&lt;h2 id="what-happened-with-planka-sso">What happened with Planka SSO&lt;/h2>
&lt;p>The case that made this page worth building deserves the neutral version.&lt;/p>
&lt;p>On August 7, 2026, the PLANKA team posted &lt;a href="https://github.com/plankanban/planka/issues/1754" rel="noopener">issue #1754&lt;/a>,
announcing that OIDC/SSO would leave the Community edition with the next release. Their
words were direct. &amp;ldquo;SSO was always meant to be a Pro/enterprise feature on our side.&amp;rdquo; They
also cited support load, over 100 SSO setup requests a month by their count. Version
2.2.0 shipped on August 9. The thread was closed and locked on August 10, at 86
thumbs-down out of 96 reactions.&lt;/p>
&lt;p>The mechanics are the sharp edge. Updating to 2.2.0 deactivates every SSO-based user,
because those accounts have no password. An admin has to set passwords and reactivate them
one by one. If the admin account itself was SSO-based, that person is locked out unless
they create a new admin through the documented script first. The team&amp;rsquo;s own warning says
to plan the migration before updating.&lt;/p>
&lt;p>The fair-side ledger, stated plainly. Nothing is disabled remotely, and 2.1.1 keeps
working for as long as you accept running without updates. The same release moved TOTP
two-factor along with auto-logout and trusted devices from Pro into Community, so account
security in the free tier went up while identity federation went out. Pro costs €36 a month
self-hosted, which is priced for teams, and their stated line is that account security
stays free while enterprise identity is paid.&lt;/p>
&lt;p>If you run PLANKA with SSO today, the realistic options are four. Pay for Pro. Convert
users to password logins plus the newly free TOTP. Freeze on 2.1.1 and accept the
security trade of no updates. Or migrate boards to Vikunja, which speaks OIDC free. I
have not tested a PLANKA-to-Vikunja migration, so check Vikunja&amp;rsquo;s importers against your
data before committing to that path.&lt;/p>
&lt;h2 id="self-hosted-apps-where-sso-stays-free">Self-hosted apps where SSO stays free&lt;/h2>
&lt;p>The counterexamples are the strongest argument that free SSO is viable. Same verification
date, same receipt discipline.&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">App&lt;/th>
&lt;th scope="col">Free identity support (verified 2026-08-25)&lt;/th>
&lt;th scope="col">Receipt&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Zulip&lt;/strong> (team chat)&lt;/td>
&lt;td>Email, LDAP/AD, SAML, OIDC, social (Google, GitHub, GitLab, Discord, Apple), JWT — no plan restrictions in the auth docs&lt;/td>
&lt;td>&lt;a href="https://zulip.readthedocs.io/en/stable/production/authentication-methods.html" rel="noopener">Auth methods&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>BookStack&lt;/strong> (wiki)&lt;/td>
&lt;td>OIDC &amp;ldquo;as a primary method of authentication,&amp;rdquo; SAML 2.0 and LDAP alongside&lt;/td>
&lt;td>&lt;a href="https://www.bookstackapp.com/docs/admin/oidc-auth/" rel="noopener">OIDC docs&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Paperless-ngx&lt;/strong> (documents)&lt;/td>
&lt;td>OIDC and social auth via django-allauth since v2.5.0, plus remote-user&lt;/td>
&lt;td>&lt;a href="https://docs.paperless-ngx.com/advanced_usage/" rel="noopener">Advanced usage&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Vikunja&lt;/strong> (kanban/tasks)&lt;/td>
&lt;td>OIDC against &amp;ldquo;Authentik, Keycloak or similar&amp;rdquo;&lt;/td>
&lt;td>&lt;a href="https://vikunja.io/docs/openid/" rel="noopener">OpenID docs&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Vaultwarden&lt;/strong> (passwords)&lt;/td>
&lt;td>OIDC SSO with per-provider guides; a master password is still required&lt;/td>
&lt;td>&lt;a href="https://github.com/dani-garcia/vaultwarden/wiki/Enabling-SSO-support-using-OpenId-Connect" rel="noopener">Wiki&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Nextcloud&lt;/strong> (files+)&lt;/td>
&lt;td>Official &amp;ldquo;SSO &amp;amp; SAML&amp;rdquo; app maintained by Nextcloud GmbH, installable from the app store&lt;/td>
&lt;td>&lt;a href="https://apps.nextcloud.com/apps/user_saml" rel="noopener">App store&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>Zulip is the row I would show a vendor. A team chat server competing in the same
category as Mattermost above ships SAML and OIDC free in every self-hosted deployment,
LDAP too. It can be done.&lt;/p>
&lt;p>We run several of these ourselves. Our &lt;a href="https://techfuelhq.com/tutorials/paperless-ngx-docker-setup-2026/">Paperless-ngx setup guide&lt;/a>
and &lt;a href="https://techfuelhq.com/tutorials/nextcloud-aio-docker-setup-2026/">Nextcloud AIO walkthrough&lt;/a> cover two of
the six, and the &lt;a href="https://techfuelhq.com/articles/self-hosted-apps-replace-saas-2026/">self-hosted starter list&lt;/a>
puts them in context.&lt;/p>
&lt;h2 id="your-escape-hatches">Your escape hatches&lt;/h2>
&lt;p>&lt;strong>Run your own identity provider.&lt;/strong> Keycloak speaks OIDC free, and so do Authelia and
Authentik. Our &lt;a href="https://techfuelhq.com/homelab/authelia-vs-authentik-2026/">Authelia vs Authentik comparison&lt;/a>
picks between the two for a homelab, with the &lt;a href="https://techfuelhq.com/tutorials/authentik-sso-self-hosted-2026/">Authentik setup tutorial&lt;/a>
as the follow-through. Every app in the free-side table plugs into any of them.&lt;/p>
&lt;p>&lt;strong>Forward-auth for the rest, with honesty about its limits.&lt;/strong> Authelia or Authentik in
front of your reverse proxy will challenge visitors before any backend sees traffic. For
a single-user homelab that is often all the SSO you need. What it cannot do is put
per-user identity inside an app whose native SSO is paywalled. The app still sees its own
local accounts. One login at the door, separate accounts behind it. That is the honest
limit, and any guide promising otherwise is selling something.&lt;/p>
&lt;p>&lt;strong>Pick apps by the auth column before you deploy.&lt;/strong> The cheapest time to avoid the SSO
tax is before your data lives in the app. That is the real use of this tracker, and it
pairs with our &lt;a href="https://techfuelhq.com/tools/selfhost-breakeven/">break-even calculator&lt;/a> when the alternative
is paying for the hosted product instead.&lt;/p>
&lt;h2 id="related-retreats-not-sso-same-pattern">Related retreats: not SSO, same pattern&lt;/h2>
&lt;p>Three events, 2021 through 2026, belong in the same memory even though none is an SSO
paywall. Different classes, labeled as such.&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Project&lt;/th>
&lt;th scope="col">What happened&lt;/th>
&lt;th scope="col">Class&lt;/th>
&lt;th scope="col">Receipt&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Rocket.Chat&lt;/strong> (team chat)&lt;/td>
&lt;td>Advanced identity sync (role mapping, extended attribute sync, background sync) moved to paid plans in a late-September 2021 release; the announcement kept &amp;ldquo;all the basic functionalities of LDAP, SAML, Social Logins and Custom OAuth&amp;rdquo; in Community, and the current plan matrix still lists them there&lt;/td>
&lt;td>Advanced-tier migration&lt;/td>
&lt;td>&lt;a href="https://forums.rocket.chat/t/upcoming-changes-to-identity-management-integrations/11994" rel="noopener">2021 announcement&lt;/a> · &lt;a href="https://docs.rocket.chat/docs/authentication-across-plans" rel="noopener">plan matrix&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>MinIO&lt;/strong> (object storage)&lt;/td>
&lt;td>Admin features stripped from the community web console between the 2025-04-22 and 2025-05-24 releases; management moved to the &lt;code>mc&lt;/code> CLI or the paid AIStor product&lt;/td>
&lt;td>Feature removal&lt;/td>
&lt;td>&lt;a href="https://github.com/minio/minio/discussions/21316" rel="noopener">Discussion #21316&lt;/a> · &lt;a href="https://blocksandfiles.com/2025/06/19/minio-removes-management-features-from-basic-community-edition-object-storage-code/" rel="noopener">Blocks &amp;amp; Files&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Cal.com&lt;/strong> (scheduling)&lt;/td>
&lt;td>Announced on April 14, 2026 that the production codebase was going closed source, citing AI-assisted vulnerability discovery; a version of the codebase released to the community as Cal.diy under MIT&lt;/td>
&lt;td>License retreat&lt;/td>
&lt;td>&lt;a href="https://cal.com/blog/cal-com-goes-closed-source-why" rel="noopener">Cal.com blog&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>Four dated incidents on this page span 2021 through 2026. The common thread is that the
sharp edge sits in the migration path, wherever the announcement lands. Watch changelogs,
and treat identity features as the canary.&lt;/p>
&lt;h2 id="the-maintainers-side">The maintainer&amp;rsquo;s side&lt;/h2>
&lt;p>This page is not an argument that maintainers owe anyone free SSO, because building and
then supporting SAML against every corporate identity provider that ever shipped a
quirky metadata file is genuinely expensive work that someone has to fund. PLANKA&amp;rsquo;s
hundred-requests-a-month figure is their own number, and I believe the shape of it. Enterprise identity is the classic open-core line because the buyers are
enterprises, and a project that funds development by charging them is behaving better
than one that quietly abandons its free edition.&lt;/p>
&lt;p>Paying is sometimes the right call. If a team of 30 depends on OpenProject with Okta,
€10.95 per user per month is a rounding error against migration cost. What this tracker
exists to catch is narrower — removals from deployed free editions and upgrade paths
that deactivate users, plus security features priced behind quote walls. Those are
choices, and the first table records who made them.&lt;/p>
&lt;h2 id="how-this-page-is-maintained">How this page is maintained&lt;/h2>
&lt;p>Each row carries the date it was verified and a link to the source that backs it. When an
app changes its tiers, the row gets re-verified against that same source and the update
log at the bottom of this page records the change. New incidents get a dated row when a
primary source exists, and the lastmod stamp above reflects the latest pass.&lt;/p>
&lt;p>Corrections are welcome, including from maintainers. If a row misstates your pricing or
your history, use the contact route on our &lt;a href="https://techfuelhq.com/about/">about page&lt;/a> and it will be checked
against your source and fixed. The table data is available under
&lt;a href="https://creativecommons.org/licenses/by/4.0/" rel="noopener">CC BY 4.0&lt;/a>, the same license as our
&lt;a href="https://techfuelhq.com/data/">measured datasets&lt;/a>. Cite the page, take the table.&lt;/p></description></item><item><title>Critical Process Died? Check the Drive First (2026)</title><link>https://techfuelhq.com/articles/critical-process-died-2026/</link><pubDate>Wed, 26 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/articles/critical-process-died-2026/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · 2026-08-26 · ~10 min read · St. Louis County, MO&lt;/p>
&lt;p>&lt;em>Some retailer links below are Amazon affiliate links; if you buy through them TechFuel HQ may earn a small commission at no extra cost to you. As an Amazon Associate I earn from qualifying purchases. Commissions never influence what gets recommended — see our &lt;a href="https://techfuelhq.com/disclosure/">disclosure&lt;/a>.&lt;/em>&lt;/p>
&lt;p>Two minutes. That&amp;rsquo;s what the most useful test for &lt;strong>CRITICAL_PROCESS_DIED&lt;/strong> costs, and most of the guides I&amp;rsquo;ve read bury it beneath the same &lt;code>sfc /scannow&lt;/code>, DISM, and &amp;ldquo;reset your PC&amp;rdquo; ritual. The stop code (&lt;code>0x000000EF&lt;/code>) means a process Windows refuses to run without has terminated. Those processes, and everything they depend on, live on your system drive, so the drive&amp;rsquo;s own health report is the cheapest evidence you can collect. Collect it first. A bad result rewrites the entire plan; a clean one costs you nothing.&lt;/p>
&lt;p>The other thing the generic checklists skip: &lt;strong>your situation changes the order.&lt;/strong> A PC that crashes once a day but reaches the desktop, a PC stuck in a boot loop, and a PC that blue-screens at the logo every single time are three different problems wearing the same stop code. Start by picking your lane.&lt;/p>
&lt;h2 id="what-critical_process_died-means">What CRITICAL_PROCESS_DIED means&lt;/h2>
&lt;p>Windows designates a short list of processes as critical. If one of them terminates, the OS declares its own integrity suspect and stops on purpose. Microsoft&amp;rsquo;s bug-check reference for &lt;code>0xEF&lt;/code> names the built-in set: &lt;code>csrss.exe&lt;/code>, &lt;code>wininit.exe&lt;/code>, &lt;code>logonui.exe&lt;/code>, &lt;code>smss.exe&lt;/code>, &lt;code>services.exe&lt;/code>, &lt;code>conhost.exe&lt;/code>, and &lt;code>winlogon.exe&lt;/code>. These handle sessions, logins, and services. Windows cannot limp along without them, so it doesn&amp;rsquo;t try.&lt;/p>
&lt;p>That framing explains why this code is so unhelpfully broad. Anything that kills or corrupts one protected process fires the same blue screen: a system file damaged on disk, an update that shipped a bad component, a driver or antivirus interfering with a process it shouldn&amp;rsquo;t touch, a drive returning garbage when the process&amp;rsquo;s code is read, or RAM corrupting it after it loaded. The code names the &lt;em>victim&lt;/em>, never the killer. The rest of this page identifies the killer cheaply, in an order that doesn&amp;rsquo;t destroy evidence.&lt;/p>
&lt;h2 id="step-1-which-of-the-three-situations-are-you-in">Step 1: Which of the three situations are you in?&lt;/h2>
&lt;!-- ========== SIGNATURE VISUAL: 0xEF SITUATION FORK (three-lane router, distinct grammar) ========== -->
&lt;div class="visual-block">
&lt;div style="background:#0b1017;border:1px solid rgba(96,165,250,0.18);border-radius:10px;padding:24px 20px 18px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;">
&lt;div style="margin-bottom:16px;">
&lt;div style="font-size:19px;font-weight:700;color:#eaf1fb;letter-spacing:-0.3px;">CRITICAL_PROCESS_DIED: pick your lane before you touch anything&lt;/div>
&lt;div style="font-size:12.5px;color:#8fa2ba;margin-top:6px;line-height:1.5;">Same stop code, three different problems. The fix order below depends on which of these describes your machine &amp;#8212; and one lane carries real data risk.&lt;/div>
&lt;/div>
&lt;div style="display:flex;flex-direction:column;gap:8px;">
&lt;div style="display:flex;gap:12px;align-items:flex-start;background:rgba(96,165,250,0.09);border-left:3px solid #60a5fa;border-radius:0 6px 6px 0;padding:11px 13px;min-width:0;">
&lt;div style="font-family:ui-monospace,monospace;font-size:11px;font-weight:700;color:#0b1017;background:#60a5fa;border-radius:4px;padding:4px 8px;flex-shrink:0;">A&lt;/div>
&lt;div style="min-width:0;">&lt;div style="font-size:13.5px;font-weight:700;color:#dbe8fb;">You can still reach the desktop&lt;/div>&lt;div style="font-size:11.5px;color:#cdd9e8;line-height:1.45;">It crashes, reboots, and lets you back in. You have the easiest lane: run the drive check now (&lt;strong style="color:#e6edf6;">Step 3&lt;/strong>), then work the software half (&lt;strong style="color:#e6edf6;">Step 4&lt;/strong>).&lt;/div>&lt;/div>
&lt;/div>
&lt;div style="display:flex;gap:12px;align-items:flex-start;background:rgba(246,169,74,0.09);border-left:3px solid #f6a94a;border-radius:0 6px 6px 0;padding:11px 13px;min-width:0;">
&lt;div style="font-family:ui-monospace,monospace;font-size:11px;font-weight:700;color:#0b1017;background:#f6a94a;border-radius:4px;padding:4px 8px;flex-shrink:0;">B&lt;/div>
&lt;div style="min-width:0;">&lt;div style="font-size:13.5px;font-weight:700;color:#f6e6cf;">Boot loop &amp;#8212; it starts, blue-screens, repeats&lt;/div>&lt;div style="font-size:11.5px;color:#cdd9e8;line-height:1.45;">Sometimes it offers &amp;#8220;Preparing Automatic Repair.&amp;#8221; Your path runs through the recovery environment (&lt;strong style="color:#e6edf6;">Step 5&lt;/strong>): uninstall the last update, reach Safe Mode, run the drive check from there.&lt;/div>&lt;/div>
&lt;/div>
&lt;div style="display:flex;gap:12px;align-items:flex-start;background:rgba(248,113,113,0.08);border-left:3px solid #f87171;border-radius:0 6px 6px 0;padding:11px 13px;min-width:0;">
&lt;div style="font-family:ui-monospace,monospace;font-size:11px;font-weight:700;color:#0b1017;background:#f87171;border-radius:4px;padding:4px 8px;flex-shrink:0;">C&lt;/div>
&lt;div style="min-width:0;">&lt;div style="font-size:13.5px;font-weight:700;color:#f4dede;">Instant blue screen at the logo, every time&lt;/div>&lt;div style="font-size:11.5px;color:#cdd9e8;line-height:1.45;">Safe Mode fails too. Highest data risk in this lane &amp;#8212; secure files first (&lt;strong style="color:#e6edf6;">Step 2&lt;/strong>), then test the drive outside Windows (&lt;strong style="color:#e6edf6;">Steps 5&amp;#8211;7&lt;/strong>).&lt;/div>&lt;/div>
&lt;/div>
&lt;/div>
&lt;div style="margin-top:15px;padding-top:12px;border-top:1px solid rgba(96,165,250,0.12);font-size:11px;color:#7f8ea3;line-height:1.5;display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;">
&lt;span>Different code on your screen? Each one routes differently &amp;#8212; the stop-code map on our restart-loop hub matches each blue screen to its own fix path.&lt;/span>
&lt;span style="font-family:ui-monospace,monospace;font-size:10px;color:#4f5c6e;">techfuelhq.com&lt;/span>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>One more routing check before you commit to this page. If your blue screens alternate between codes, the &lt;em>pattern&lt;/em> outranks any single code: in this cluster&amp;rsquo;s triage, a machine that also throws &lt;a href="https://techfuelhq.com/articles/dpc-watchdog-violation-2026/">DPC_WATCHDOG_VIOLATION&lt;/a> moves storage up the list, one mixing in &lt;a href="https://techfuelhq.com/articles/kernel-security-check-failure-2026/">KERNEL_SECURITY_CHECK_FAILURE&lt;/a> moves RAM up, and a machine that sometimes restarts with no blue screen at all belongs in the &lt;a href="https://techfuelhq.com/articles/pc-keeps-restarting-2026/">PC keeps restarting&lt;/a> flow, which covers power-side causes this page won&amp;rsquo;t.&lt;/p>
&lt;h2 id="step-2-if-your-files-matter-secure-them-before-any-repair">Step 2: If your files matter, secure them before any repair&lt;/h2>
&lt;p>Skip this step only if everything on the machine is backed up or expendable.&lt;/p>
&lt;p>Every mainstream fix for &lt;code>0xEF&lt;/code> writes to the system drive. &lt;code>chkdsk /r&lt;/code> remaps sectors, &lt;code>sfc&lt;/code> and DISM rewrite system files, and a reset reinstalls Windows on top of whatever is there. On a healthy drive that&amp;rsquo;s fine. On a failing drive it&amp;rsquo;s the worst possible order: heavy writes push a marginal drive further along, and a reinstall destroys the crash evidence while planting your fresh OS on the same dying hardware. The safe sequence is the reverse. Copy or image first, repair second.&lt;/p>
&lt;p>So, before the repair steps:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Lane A (desktop works):&lt;/strong> copy your irreplaceable files to an external drive or cloud storage now, while the machine is up. Ten minutes, zero risk.&lt;/li>
&lt;li>&lt;strong>Lane B (boot loop):&lt;/strong> reach Safe Mode via the recovery environment (Step 5) and copy files out from there.&lt;/li>
&lt;li>&lt;strong>Lane C (no boot at all):&lt;/strong> pull the drive and read it from another PC over a USB adapter or enclosure, or boot a Linux live USB and copy files off without touching Windows. If the drive is already making mechanical noises (clicking, grinding), stop powering it entirely and read our &lt;a href="https://techfuelhq.com/articles/hard-drive-clicking-2026/">hard drive clicking&lt;/a> triage; every additional spin-up of a failing mechanical drive costs you data.&lt;/li>
&lt;/ul>
&lt;p>The one command to withhold until your files are safe: &lt;code>chkdsk C: /r&lt;/code>. It&amp;rsquo;s on every list, and on a drive with pending sectors it forces reads and remaps across failing media, sometimes for hours. Run it after the copy, or after the SMART check clears the drive, never as move one.&lt;/p>
&lt;h2 id="step-3-check-the-drive-first--the-two-minute-test-the-checklists-bury">Step 3: Check the drive first — the two-minute test the checklists bury&lt;/h2>
&lt;p>Here&amp;rsquo;s the wedge, and the reason this page is ordered unlike the ones you&amp;rsquo;ve already read. I order checks by what they cost against what they can tell you, and nothing else on this list comes close: the drive check is free, takes about two minutes, and a bad result invalidates every software fix below it. &lt;code>sfc&lt;/code> repairing files that a dying drive keeps re-corrupting is a treadmill — the exact loop the long-running community threads describe, where the error clears for a day and returns.&lt;/p>
&lt;p>Install &lt;strong>CrystalDiskInfo&lt;/strong> (free, from Crystal Dew World), open it, and select your system drive (the one holding &lt;code>C:&lt;/code>). Read three things:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>The health banner.&lt;/strong> Good in blue is a pass. Caution or Bad on the boot drive, with this stop code, is your answer until proven otherwise.&lt;/li>
&lt;li>&lt;strong>SATA SSDs and hard drives:&lt;/strong> the raw values for 05 (Reallocated Sectors Count), C5 (Current Pending Sector Count), and C6 (Uncorrectable Sector Count). Zeros are a pass. Non-zero and climbing between checks means the drive is actively failing. Recheck in an hour and compare.&lt;/li>
&lt;li>&lt;strong>NVMe SSDs:&lt;/strong> Percentage Used (at or past 100% the drive has consumed its rated write endurance), Available Spare (falling toward its threshold), and Media and Data Integrity Errors (should be 0).&lt;/li>
&lt;/ol>
&lt;p>Three outcomes:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Clean drive&lt;/strong> → storage drops far down the suspect list. Continue to Step 4 and fix it in software with a clear conscience.&lt;/li>
&lt;li>&lt;strong>Warnings on the system drive&lt;/strong> → stop repairing. Go to Step 7: rescue what&amp;rsquo;s on it, then replace it. Any hour spent on DISM at this point is an hour the drive spends getting worse.&lt;/li>
&lt;li>&lt;strong>Clean, but the machine also intermittently loses sight of the drive&lt;/strong> (BIOS sometimes misses it, Explorer drops it, cold boots fail but restarts work). That&amp;rsquo;s a detection fault SMART can&amp;rsquo;t score. Work the connector, cable, and M.2 checks in &lt;a href="https://techfuelhq.com/articles/ssd-not-showing-up-2026/">SSD not showing up&lt;/a>; a drive that drops off the bus mid-session kills critical processes just as dead as a corrupt one.&lt;/li>
&lt;/ul>
&lt;p>I lead with this check on any blue-screening machine I touch, whatever the code turns out to be. It&amp;rsquo;s the highest information-per-minute test I know of in Windows troubleshooting. For &lt;code>0xEF&lt;/code> specifically, the community&amp;rsquo;s post-mortems back the ordering: the long-running r/techsupport thread in the sources ends at a dying system SSD behind recurring crashes under load, and BleepingComputer&amp;rsquo;s forum regulars open at the hardware layer too, starting with one-stick RAM isolation. That&amp;rsquo;s their experience, and experience isn&amp;rsquo;t telemetry; I have no cause-frequency data for this code, and I&amp;rsquo;ve seen none published. But when the free two-minute test and the expensive failure mode point at the same component, you run that test first.&lt;/p>
&lt;p>SMART has one honest limit, and the same r/techsupport thread is the proof. The drive that caused those recurring crashes still reported healthy — no pending sectors, no uncorrectable errors, just a quiet health-percentage slide from 99 to 95 over a few months — and cloning to a new SSD is what ended the crashes. So read a clean report as a screen rather than an acquittal. It moves storage down the list; disk errors in Event Viewer (Step 4) or a drive that intermittently vanishes move it right back up, whatever the banner says.&lt;/p>
&lt;h2 id="step-4-the-software-half-cheapest-fixes-first">Step 4: The software half, cheapest fixes first&lt;/h2>
&lt;p>Drive&amp;rsquo;s clean? Then it&amp;rsquo;s a software problem until proven otherwise, and the software checks also run cheapest-first.&lt;/p>
&lt;p>&lt;strong>Undo whatever changed.&lt;/strong> If the crashes started inside a week of a Windows update, remove it: &lt;strong>Settings → Windows Update → Update history → Uninstall updates&lt;/strong>, newest quality update first. If a driver updated right before the trouble (GPU, storage, antivirus), open Device Manager, right-click the device → &lt;strong>Properties → Driver → Roll Back Driver&lt;/strong>. A crash with a birthday usually has a parent, and removal is faster than repair.&lt;/p>
&lt;p>&lt;strong>Read the crash instead of guessing.&lt;/strong> Two built-in tools, five minutes:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Reliability Monitor&lt;/strong> (press Start, type &lt;code>reliability&lt;/code>) draws a day-by-day timeline. Look at what landed on the machine (updates, driver installs, app installs) immediately before the first red X. That timestamp correlation is the most useful piece of software evidence I know how to collect.&lt;/li>
&lt;li>&lt;strong>Event Viewer → Windows Logs → System&lt;/strong>, sorted around the crash time. Repeated disk/storage errors (source &lt;code>disk&lt;/code>, &lt;code>stornvme&lt;/code>, &lt;code>volmgr&lt;/code>) before each crash reopen the storage question no matter what SMART said. A service failing over and over names a software culprit.&lt;/li>
&lt;li>Want the exact victim? A free minidump reader (WhoCrashed or BlueScreenView) pointed at &lt;code>C:\Windows\Minidump&lt;/code> shows what was on the stack when the system stopped. For &lt;code>0xEF&lt;/code> a single dump often just confirms a critical process died. The pattern across several dumps is what talks, and if a third-party &lt;code>.sys&lt;/code> file keeps appearing, that driver is your suspect.&lt;/li>
&lt;/ul>
&lt;p>Then repair system files, in this order:&lt;/p>
&lt;pre tabindex="0">&lt;code>DISM /Online /Cleanup-Image /RestoreHealth
sfc /scannow
&lt;/code>&lt;/pre>&lt;p>Run both from an elevated Terminal, DISM first, because it repairs the component store that &lt;code>sfc&lt;/code> pulls its replacement files from. Reboot after. These two fix damaged Windows system files, a real &lt;code>0xEF&lt;/code> cause, and that is the whole list. They cannot fix a third-party driver, a filter driver from a misbehaving antivirus suite (uninstall it properly with the vendor&amp;rsquo;s removal tool if the timeline implicates it), or hardware.&lt;/p>
&lt;p>If crashes continue past this point with a clean drive, you&amp;rsquo;re into Step 6 territory: memory.&lt;/p>
&lt;h2 id="step-5-locked-out--the-boot-loop-path-through-winre">Step 5: Locked out — the boot-loop path through WinRE&lt;/h2>
&lt;p>Lanes B and C run the same fixes without a desktop. Before you start, grab your BitLocker recovery key from another device (aka.ms/myrecoverykey, signed into your Microsoft account), because recovery tools can demand it. Windows opens the door itself. Microsoft&amp;rsquo;s documented trigger is two consecutive failed attempts to start Windows, and the standard field method exploits exactly that: hold the power button to kill the machine the moment the Windows logo appears, twice, then boot a third time into &amp;ldquo;Preparing Automatic Repair&amp;rdquo; → &lt;strong>Advanced options&lt;/strong>.&lt;/p>
&lt;p>From &lt;strong>Troubleshoot → Advanced options&lt;/strong>, in this order:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Startup Repair.&lt;/strong> Let it run once. It fixes a specific class of boot-path damage and takes minutes.&lt;/li>
&lt;li>&lt;strong>Uninstall Updates → latest quality update.&lt;/strong> The cheapest targeted move when the loop began right after Patch Tuesday.&lt;/li>
&lt;li>&lt;strong>Startup Settings → restart → 4 (Safe Mode)&lt;/strong> or &lt;strong>5 (with networking)&lt;/strong>. Reaching Safe Mode is the big prize: it loads a minimal driver set, and from there you can run the Step 3 drive check, copy files out, roll back drivers, and uninstall recently added software. A machine stable in Safe Mode but crashing normally is pointing at a third-party driver or service.&lt;/li>
&lt;li>&lt;strong>System Restore&lt;/strong>, if you have restore points, returns Windows&amp;rsquo; own files and registry to a pre-crash state without touching your documents.&lt;/li>
&lt;li>&lt;strong>Command Prompt&lt;/strong>, for the offline file repair: &lt;code>sfc /scannow /offbootdir=C:\ /offwindir=C:\Windows&lt;/code>. One catch. WinRE sometimes letters your Windows volume differently, so run &lt;code>diskpart&lt;/code> → &lt;code>list volume&lt;/code> first and substitute the letter that actually carries Windows.&lt;/li>
&lt;/ol>
&lt;p>The one tile I would leave alone for now is &lt;strong>Reset this PC&lt;/strong>. A reset is the reinstall-first play. It forfeits your files-first sequencing (Lane C readers may not have copied anything out), and if the underlying cause is the drive, you&amp;rsquo;ll watch the fresh install fail the same way in a week. Reset is a fine last software step once the drive has been cleared and the files are safe.&lt;/p>
&lt;p>If even WinRE won&amp;rsquo;t load and Lane C is fully dark: reseat the drive and its cable (or the M.2 screw and slot), try the other SATA port, and test the drive in another machine per Step 2&amp;rsquo;s rescue path. At that point you are diagnosing hardware, not Windows.&lt;/p>
&lt;h2 id="step-6-ram-and-the-rest-of-the-ladder">Step 6: RAM and the rest of the ladder&lt;/h2>
&lt;p>Memory is the other part that kills critical processes — a protected process corrupted &lt;em>in RAM&lt;/em> dies just like one fed bad data from disk. The tests are free; the parts aren&amp;rsquo;t.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Run MemTest86&lt;/strong> from a USB stick overnight (or &lt;code>mdsched.exe&lt;/code>, the built-in Windows Memory Diagnostic, for a faster first pass). Any red errors condemn the configuration, not necessarily one stick.&lt;/li>
&lt;li>&lt;strong>Reseat, then isolate.&lt;/strong> With two or more sticks, reseat them, then test one at a time. The one-stick pass is the same move BleepingComputer&amp;rsquo;s regulars open with on this code, and it separates a bad module from a bad slot.&lt;/li>
&lt;li>&lt;strong>Running XMP or EXPO?&lt;/strong> Set memory back to default JEDEC speed and retest. An unstable memory overclock corrupts data identically to a failing stick, and this cluster&amp;rsquo;s RAM-first sibling covers that fork in depth: &lt;a href="https://techfuelhq.com/articles/kernel-security-check-failure-2026/">KERNEL_SECURITY_CHECK_FAILURE&lt;/a>.&lt;/li>
&lt;li>&lt;strong>Power sits at the bottom of the ladder.&lt;/strong> If the machine also hard-restarts with no blue screen, shuts off under load, or needs several tries to cold-boot, the storage and RAM symptoms may both be downstream of an unstable supply. Cross-check &lt;a href="https://techfuelhq.com/articles/psu-failure-symptoms-2026/">PSU failure symptoms&lt;/a> and the instant-black-cut diagnosis in &lt;a href="https://techfuelhq.com/articles/computer-randomly-turns-off-2026/">computer randomly turns off&lt;/a>.&lt;/li>
&lt;/ul>
&lt;p>Run the free tests before buying anything. Replacement parts are painfully expensive right now (the &lt;a href="https://techfuelhq.com/articles/ram-ssd-price-crisis-2026/">RAM &amp;amp; SSD price tracker&lt;/a> has current numbers), which makes a guessed-wrong purchase a three-figure mistake. Evidence first, wallet second.&lt;/p>
&lt;h2 id="step-7-if-the-drive-is-the-verdict--rescue-then-replace">Step 7: If the drive is the verdict — rescue, then replace&lt;/h2>
&lt;p>You&amp;rsquo;re here because the evidence corroborated the drive: SMART warnings on the boot drive (reallocated, pending, or uncorrectable sectors; NVMe media errors; Percentage Used pegged), disk errors marching through Event Viewer before each crash, or the strongest tell of all — the error came back after a clean reinstall.&lt;/p>
&lt;p>The order is fixed. &lt;strong>Data off first, then replace.&lt;/strong> Copy files out per Step 2&amp;rsquo;s lanes (Safe Mode if Windows still opens; USB enclosure on another PC if it doesn&amp;rsquo;t). If the drive holds something irreplaceable and is deteriorating fast, weigh a professional recovery service before more DIY power-on hours.&lt;/p>
&lt;p>Then swap it. A current-generation &lt;a href="https://www.amazon.com/s?k=1tb+nvme+ssd&amp;tag=techfuelhq-20" rel="nofollow sponsored noopener" target="_blank">1TB NVMe SSD&lt;/a> is the straightforward replacement for a desktop or laptop with an M.2 slot — check your board&amp;rsquo;s manual first, and a SATA-only machine needs a 2.5-inch SATA SSD instead. Our &lt;a href="https://techfuelhq.com/articles/best-nvme-ssd-homelab-2026/">homelab NVMe picks&lt;/a> hold up equally well as desktop boot drives. I would not reuse a drive with climbing reallocated sectors for anything — not as a game drive, not as scratch space. Its next failure has your data on it.&lt;/p>
&lt;p>Fresh drive, clean Windows install, restore your files, and &lt;code>0xEF&lt;/code> should be history. If it isn&amp;rsquo;t, the drive was only a casualty. Return to Step 6, because RAM or power was corrupting the drive&amp;rsquo;s traffic all along.&lt;/p>
&lt;h2 id="keeping-it-from-coming-back">Keeping it from coming back&lt;/h2>
&lt;p>A machine that has thrown &lt;code>0xEF&lt;/code> once earns two habits. Recheck CrystalDiskInfo in a month; sector counts that moved again settle any lingering doubt about a drive that squeaked by. And keep the pattern rule in reach: a rebuilt machine that starts throwing &lt;em>different&lt;/em> stop codes has only reshuffled the problem, and the changing-codes signature points at memory or power. Start at the &lt;a href="https://techfuelhq.com/articles/pc-keeps-restarting-2026/">stop-code map&lt;/a> rather than six separate code pages.&lt;/p>
&lt;p>Two cases sit outside this page. Domain-managed and BitLocker-locked corporate machines belong to your IT department, which holds keys and imaging tools you don&amp;rsquo;t. And one more exists: a &lt;code>0xEF&lt;/code> can come from third-party software whose service was configured with the restart-the-computer recovery option Microsoft documents for developers; the fix there is removing that software. Everything else above is reproducible on any Windows 10 or 11 PC with a USB stick and a screwdriver.&lt;/p>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;ul>
&lt;li>Stop-code identity and the critical-process list: Microsoft&amp;rsquo;s &lt;a href="https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/bug-check-0xef--critical-process-died" rel="noopener">Bug Check 0xEF: CRITICAL_PROCESS_DIED&lt;/a> reference — a critical system process terminated; built-in critical processes include csrss.exe, wininit.exe, logonui.exe, smss.exe, services.exe, conhost.exe, and winlogon.exe; a developer-created service with its recovery option set to restart the computer can also trigger the check.&lt;/li>
&lt;li>Recovery-environment entry behavior (WinRE starts automatically after two consecutive failed attempts to start Windows): Microsoft&amp;rsquo;s &lt;a href="https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/windows-recovery-environment--windows-re--technical-reference" rel="noopener">Windows Recovery Environment documentation&lt;/a>. Menu labels in Steps 4-5 follow current Windows 11 builds — see the wording note below. BitLocker recovery keys: &lt;a href="https://aka.ms/myrecoverykey" rel="noopener">aka.ms/myrecoverykey&lt;/a>.&lt;/li>
&lt;li>Repair-command syntax: Microsoft&amp;rsquo;s &lt;a href="https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/sfc" rel="noopener">sfc command reference&lt;/a> (including the offline &lt;code>/offbootdir&lt;/code> and &lt;code>/offwindir&lt;/code> forms) and &lt;a href="https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/repair-a-windows-image" rel="noopener">DISM image-repair documentation&lt;/a> (&lt;code>/Online /Cleanup-Image /RestoreHealth&lt;/code>).&lt;/li>
&lt;li>Community corroboration for the failing-drive association with recurring 0xEF (experience reports, not telemetry — read in full before citing): the &lt;a href="https://www.reddit.com/r/techsupport/comments/1fb6fh7/bsod_critical_process_died/" rel="noopener">r/techsupport thread&lt;/a> whose top answer traced recurring crashes to a dying system SSD that still showed healthy SMART, and BleepingComputer&amp;rsquo;s &lt;a href="https://www.bleepingcomputer.com/forums/t/816311/stop-code-critical-process-died-0xef/" rel="noopener">Stop Code: Critical Process Died (0xEF)&lt;/a> forum thread, where staff open with hardware isolation (one RAM stick, drive health).&lt;/li>
&lt;li>Tools: drive health via &lt;a href="https://crystalmark.info/en/software/crystaldiskinfo/" rel="noopener">CrystalDiskInfo&lt;/a> SMART/NVMe readouts — the NVMe fields (Percentage Used, Available Spare, Media and Data Integrity Errors) are defined in the &lt;a href="https://nvmexpress.org/specifications/" rel="noopener">NVM Express Base Specification&amp;rsquo;s&lt;/a> SMART/Health log; minidump reading via WhoCrashed (Resplendence) and BlueScreenView (NirSoft) against &lt;code>C:\Windows\Minidump&lt;/code>; memory via MemTest86 (PassMark) and Windows Memory Diagnostic (&lt;code>mdsched.exe&lt;/code>).&lt;/li>
&lt;li>Windows 10 end of standard support (October 14, 2025) and consumer Extended Security Updates: &lt;a href="https://www.microsoft.com/en-us/windows/end-of-support" rel="noopener">Microsoft&amp;rsquo;s Windows 10 end-of-support guidance&lt;/a>.&lt;/li>
&lt;/ul>
&lt;p>&lt;em>Written against current Windows 11 and Windows 10 builds; menu wording drifts across updates. Corrections: &lt;a href="mailto:hello@techfuelhq.com">hello@techfuelhq.com&lt;/a>.&lt;/em>&lt;/p></description></item><item><title>Home Assistant + llama.cpp: Fully Local LLM Voice, Measured (2026)</title><link>https://techfuelhq.com/tutorials/home-assistant-local-llm-voice-2026/</link><pubDate>Wed, 26 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/tutorials/home-assistant-local-llm-voice-2026/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · 2026-08-26 · ~14 min read · St. Louis County, MO&lt;/p>
&lt;img src="https://techfuelhq.com/images/tutorials/home-assistant-local-llm-voice-2026.svg" alt="Fully local Home Assistant voice pipeline: wake word audio to Whisper speech-to-text, the Assist pipeline and llama.cpp integration inside a Home Assistant VM, an OpenAI-compatible llama-server running a 3B-20B GGUF model on a GPU box, Assist tool calls actuating entities, and Piper text-to-speech returning the spoken answer, with measured component timings summarized below." width="1200" height="630" loading="eager" fetchpriority="high" style="display:block;margin:1.5rem auto;max-width:100%;height:auto;border:1px solid #1e1e3a;border-radius:8px;" />
&lt;p>144 milliseconds. That is how long a warm &amp;ldquo;turn on the kitchen lights&amp;rdquo; took to come back as a correct, executable tool call from a 4B model on my RTX 5080, measured at the same OpenAI-compatible endpoint Home Assistant&amp;rsquo;s new llama.cpp integration drives. The full pipeline adds speech-to-text on the front and Piper on the back. I measured those separately too. The honest headline is not the speed, though. On the same 24 spoken commands, the models people recommend for this job range from 71% to 96% correct, and the failure record includes a 3B model that answered a kitchen-scoped command by generating turn-offs for the &lt;em>entire house&lt;/em> — front-door lock included — until the server&amp;rsquo;s parser rejected the response. In Home Assistant&amp;rsquo;s tool mapping, turning off a lock opens the door.&lt;/p>
&lt;p>Home Assistant 2026.8 shipped a native &lt;a href="https://www.home-assistant.io/integrations/llama_cpp/" rel="noopener">llama.cpp integration&lt;/a> on August 5. The &lt;a href="https://www.home-assistant.io/blog/2026/08/05/release-20268/" rel="noopener">release post&lt;/a> describes it in one sentence: &amp;ldquo;Use a local llama.cpp server, or any OpenAI-compatible endpoint, as a conversation agent in Home Assistant.&amp;rdquo; The docs tell you which buttons to press. What they leave out (and what I could not find published anywhere) is which model to put behind it, what hardware that model needs, how many milliseconds each stage of the pipeline costs, and how often the model actuates the &lt;em>right&lt;/em> device. This guide is those numbers.&lt;/p>
&lt;h2 id="what-i-measured-and-what-i-did-not">What I measured, and what I did not&lt;/h2>
&lt;p>Every latency and accuracy figure on this page is first-party, from one bench: my Ryzen 7 7800X3D / RTX 5080 (16GB) machine, running llama.cpp build 10507 (&lt;code>llama-server&lt;/code>) on Windows, driver 610.88. The integration is a thin OpenAI-API client, so I benchmarked the exact request path it drives. Each request carried the same system prompt Home Assistant 2026.8.3 assembles (its default instructions, its device-control and area prompts, and a fixed 20-entity, 9-area &amp;ldquo;bench home&amp;rdquo; serialized the way &lt;a href="https://github.com/home-assistant/core/blob/2026.8.3/homeassistant/components/homeassistant/llm.py" rel="noopener">&lt;code>async_get_exposed_entities&lt;/code>&lt;/a> does it) and the same Assist tools (&lt;code>HassTurnOn&lt;/code>, &lt;code>HassTurnOff&lt;/code>, &lt;code>HassLightSet&lt;/code>, &lt;code>HassClimateSetTemperature&lt;/code>, &lt;code>HassSetPosition&lt;/code>, &lt;code>HassStopMoving&lt;/code>, &lt;code>GetLiveContext&lt;/code>), mirrored from the &lt;a href="https://github.com/home-assistant/core/blob/2026.8.3/homeassistant/components/intent/llm.py" rel="noopener">2026.8.3 intent-tools source&lt;/a>. Temperature 0, seed 42, five warm repetitions per cell, medians reported. The &lt;a href="https://techfuelhq.com/data/ha-voice-brain-bench-2026-08.csv">summary CSV&lt;/a> is published, and so are the &lt;a href="https://techfuelhq.com/data/ha-voice-bench/README.md">full receipts&lt;/a>: the corpus and scorer plus every raw per-request record.&lt;/p>
&lt;p>What I did not do is run Home Assistant itself on this bench. My HA-side steps below follow the official integration docs and the 2026.8.3 source rather than a click-through on this machine, and I say so here instead of pretending otherwise. Two consequences are worth knowing. First, my &amp;ldquo;command time&amp;rdquo; is the model-server leg only; Wyoming transport and Home Assistant&amp;rsquo;s own intent execution add a little on top. Second, my accuracy corpus was typed text at the API, and my Whisper timings used Piper-synthesized speech as input. That audio is clean and close-mic, which makes the STT accuracy numbers a ceiling rather than a promise about your echoey kitchen. Latency transfers. Perfect transcription rates don&amp;rsquo;t.&lt;/p>
&lt;h2 id="the-architecture-corrected">The architecture, corrected&lt;/h2>
&lt;p>Most early coverage of this integration calls it &amp;ldquo;built-in llama.cpp.&amp;rdquo; It is not, and the real design is better. The integration is a &lt;strong>client&lt;/strong>. You run &lt;a href="https://github.com/ggml-org/llama.cpp" rel="noopener">llama.cpp&lt;/a>&amp;rsquo;s &lt;code>llama-server&lt;/code> (or llama-cpp-python, or vLLM) anywhere on your network, and Home Assistant connects to its OpenAI-compatible endpoint, default &lt;code>http://localhost:8080/v1&lt;/code>. The &lt;a href="https://www.home-assistant.io/integrations/llama_cpp/" rel="noopener">integration page&lt;/a> lists it plainly, and the config flow asks for a URL, an optional API key, and then which model the server offers.&lt;/p>
&lt;p>That client design is exactly what a homelab wants. Your Home Assistant box stays a low-power N100 or &lt;a href="https://techfuelhq.com/tutorials/home-assistant-proxmox-2026/">a HAOS VM on Proxmox&lt;/a>, and the model runs wherever the compute already lives. A gaming PC. A workstation. The same host, if it has the memory. You can register several agents against different servers and models, each with its own instructions.&lt;/p>
&lt;p>Voice needs two more pieces, both older and both solid. &lt;strong>Whisper&lt;/strong> handles speech-to-text and &lt;strong>Piper&lt;/strong> handles text-to-speech, wired in over the Wyoming protocol as add-ons or standalone containers. One subtlety the docs never connect. Home Assistant&amp;rsquo;s low-power STT default, Speech-to-Phrase, is a &lt;em>closed&lt;/em> recognizer that matches against known sentence patterns, which is why it runs &amp;ldquo;under one second&amp;rdquo; on a Pi. An LLM agent exists precisely so you can say things no template anticipated, so it needs &lt;em>open-ended&lt;/em> Whisper STT. Choosing an LLM brain silently commits you to the heavier STT path. That is where the hardware question lives.&lt;/p>
&lt;h2 id="hardware-tiers-honestly">Hardware tiers, honestly&lt;/h2>
&lt;p>I sell nothing here. A voice brain does not need an RTX 5080. This bench has one, so that is the GPU I can measure, but the tiers below are what the numbers support.&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Tier&lt;/th>
&lt;th scope="col">What runs where&lt;/th>
&lt;th scope="col">What to expect&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Pi 4/5, HA Green&lt;/strong>&lt;/td>
&lt;td>Default Assist agent + Speech-to-Phrase. No LLM.&lt;/td>
&lt;td>Sub-second closed commands, per &lt;a href="https://www.home-assistant.io/voice_control/voice_remote_local_assistant/" rel="noopener">HA&amp;rsquo;s own docs&lt;/a>. Free-form language is beyond this tier.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>N100 mini PC&lt;/strong>&lt;/td>
&lt;td>HA + Whisper &lt;code>tiny/base-int8&lt;/code> locally; LLM server on another box&lt;/td>
&lt;td>The &lt;a href="https://techfuelhq.com/homelab/best-mini-pc-home-assistant-2026/">right HA host&lt;/a> either way. I did not bench an N100; HA&amp;rsquo;s own docs bracket it — ~8s STT on a Pi 4, under a second on a NUC — and my 7800X3D CPU column below is its upper bound.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Desktop CPU, no GPU&lt;/strong>&lt;/td>
&lt;td>Everything on one box, &lt;code>-ngl 0&lt;/code>&lt;/td>
&lt;td>Works for a 3-4B brain, with seconds-not-milliseconds cold starts. I tried to measure this tier and my numbers failed their own sanity check; the honesty note under the latency tables explains why they aren&amp;rsquo;t printed.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Used 8-12GB GPU&lt;/strong>&lt;/td>
&lt;td>Everything on one box&lt;/td>
&lt;td>Between my CPU notes and the 5080 column. A 3060 12GB fits the 7B with room. That is interpolation rather than measurement; I did not bench one.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>16GB GPU (this bench)&lt;/strong>&lt;/td>
&lt;td>14B at 96% accuracy, or 20B&lt;/td>
&lt;td>Warm commands in the 126-585 ms range across the ladder. The whole pipeline lands under a second.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>For sizing a specific model against a specific card, the &lt;a href="https://techfuelhq.com/tools/llm-vram-calculator/">VRAM calculator&lt;/a> does the arithmetic. My &lt;a href="#latency-results">measured VRAM residency per model&lt;/a> is in the results table.&lt;/p>
&lt;h2 id="step-1-run-llama-server-where-the-compute-is">Step 1: Run llama-server where the compute is&lt;/h2>
&lt;p>Grab a &lt;a href="https://github.com/ggml-org/llama.cpp/releases" rel="noopener">llama.cpp release&lt;/a> for your platform (CUDA build for NVIDIA), or use the official containers. Tool calling — the thing that lets the model actuate anything — runs through the Jinja chat-template engine. On the build I tested (10507) the server&amp;rsquo;s own &lt;code>--help&lt;/code> reports &lt;code>--jinja&lt;/code> as default-enabled, and I pass it explicitly anyway; older builds shipped it off, so if your agent chats but nothing actuates, &lt;code>--no-jinja&lt;/code> or an ancient build is the first thing to rule out.&lt;/p>
&lt;p>Windows or Linux binary:&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>llama-server -hf unsloth/Qwen3-4B-Instruct-2507-GGUF:Q4_K_M --host 0.0.0.0 --port &lt;span style="color:#ae81ff">8080&lt;/span> -ngl &lt;span style="color:#ae81ff">99&lt;/span> -c &lt;span style="color:#ae81ff">8192&lt;/span> --jinja --api-key changeme
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Docker with an NVIDIA GPU:&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 --gpus all -p 8080:8080 -v /path/to/models:/models ghcr.io/ggml-org/llama.cpp:server-cuda -m /models/Qwen3-4B-Instruct-2507-Q4_K_M.gguf --host 0.0.0.0 --port &lt;span style="color:#ae81ff">8080&lt;/span> --n-gpu-layers &lt;span style="color:#ae81ff">99&lt;/span> -c &lt;span style="color:#ae81ff">8192&lt;/span> --jinja --api-key changeme
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Notes from running this, not from the README:&lt;/p>
&lt;ul>
&lt;li>&lt;code>-hf user/repo:QUANT&lt;/code> downloads straight from Hugging Face and &lt;a href="https://github.com/ggml-org/llama.cpp/blob/master/tools/server/README.md" rel="noopener">defaults to Q4_K_M&lt;/a>. It saved me the download-and-point dance for every model in this guide.&lt;/li>
&lt;li>&lt;code>-ngl 99&lt;/code> offloads all layers to the GPU, and &lt;code>-ngl 0&lt;/code> forces CPU. &lt;code>-c 8192&lt;/code> gives the ~1,500-2,500-token Home Assistant prompt room to grow with your entity count.&lt;/li>
&lt;li>&lt;strong>If you already run Ollama&lt;/strong>, llama-server can load most of Ollama&amp;rsquo;s blobs directly from &lt;code>~/.ollama/models/blobs/&lt;/code>. That is how I benched Qwen2.5. The exception that cost me an evening was gpt-oss — Ollama&amp;rsquo;s blob for it carries its own architecture tag and will not load in llama-server, so you need the upstream GGUF conversion. I hit the same wall building the &lt;a href="https://techfuelhq.com/self-hosted/ollama-vs-llamacpp-rtx-5080-2026/">Ollama vs llama.cpp comparison&lt;/a>.&lt;/li>
&lt;li>Set &lt;code>--api-key&lt;/code> on anything listening beyond localhost. llama-server itself warns at startup that it ships with CORS open and no key.&lt;/li>
&lt;/ul>
&lt;p>Sanity-check with &lt;code>curl http://SERVER_IP:8080/health&lt;/code> before touching Home Assistant. It answers &lt;code>{&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;/code> once the model is loaded.&lt;/p>
&lt;h2 id="step-2-connect-home-assistant">Step 2: Connect Home Assistant&lt;/h2>
&lt;p>On Home Assistant 2026.8 or newer (I verified against 2026.8.3, the latest release as I write this), go to &lt;strong>Settings → Devices &amp;amp; services → Add integration → llama.cpp&lt;/strong>. The flow asks for the base URL — your server&amp;rsquo;s &lt;code>http://SERVER_IP:8080/v1&lt;/code> — plus the optional API key, then queries the server and prompts you to select the model. From the integration&amp;rsquo;s entry you add a &lt;strong>conversation agent&lt;/strong> subentry, which holds the two settings that matter.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Control Home Assistant&lt;/strong> grants the agent the Assist API. Without it you get a chatbot that can&amp;rsquo;t touch a switch.&lt;/li>
&lt;li>&lt;strong>Instructions&lt;/strong> is the system prompt, templated. The default plus the Assist API&amp;rsquo;s own guidance is what I benchmarked. Resist stuffing it until you&amp;rsquo;ve read the latency section, because every token you add here is prefill the model re-reads on a cold start.&lt;/li>
&lt;/ul>
&lt;p>The agent only sees entities you expose, under &lt;strong>Settings → Voice assistants → Expose&lt;/strong>. Expose deliberately. My bench home is 20 entities and its serialized state costs ~1,500-2,500 tokens of prompt depending on the model&amp;rsquo;s tokenizer. A 300-entity house pushes the prompt up with it, along with the cold-start prefill and the model&amp;rsquo;s targeting difficulty.&lt;/p>
&lt;p>Then build the voice side in &lt;strong>Settings → Voice assistants&lt;/strong>. Create an Assist pipeline, pick your llama.cpp agent as the conversation agent, Whisper for STT, Piper for TTS. Whisper and Piper install as add-ons on HAOS (defaults &lt;code>model: auto&lt;/code>, and Piper&amp;rsquo;s &lt;code>en_US-lessac-medium&lt;/code> voice — the exact voice in my TTS table), or as containers on any Docker host, including your GPU box:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>docker run -d -p 10300:10300 -v whisper-data:/data rhasspy/wyoming-whisper --model small-int8 --language en
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>There is a &lt;a href="https://docs.linuxserver.io/images/docker-faster-whisper/" rel="noopener">GPU build of faster-whisper&lt;/a> (&lt;code>lscr.io/linuxserver/faster-whisper:gpu&lt;/code>) if you want STT on the CUDA box too; my STT table below shows what that buys. Point Home Assistant&amp;rsquo;s Wyoming integration at port 10300 and the pipeline picks it up. Wake word (openWakeWord/microWakeWord on a satellite or the Voice Preview Edition puck) is the one stage I have no hardware to measure, so I leave it to HA&amp;rsquo;s docs.&lt;/p>
&lt;h2 id="model-choice-the-accuracy-table-i-went-looking-for-and-had-to-build">Model choice: the accuracy table I went looking for and had to build&lt;/h2>
&lt;p>Speed was never the interesting question. Every model below answers a warm command in under a second on a GPU. The question is whether the tool call that comes back does the right thing. I ran a fixed corpus of 24 typed commands against each model at temperature 0 — simple on/off, area-scoped commands (&amp;ldquo;turn off all the lights in the office&amp;rdquo;), parameters (brightness, color, thermostat), locks and covers, state queries, and five deliberately hard cases covering ambiguity, multi-area targeting, an implicit request, a command for a device that doesn&amp;rsquo;t exist, and a timer request when no timer tool is offered. Scoring is mechanical. Correct tool, correct target, correct parameters, against a published acceptance set. The corpus and scorer live in the &lt;a href="https://techfuelhq.com/data/ha-voice-bench/README.md">bench receipts&lt;/a> along with every raw response, so you can recompute any cell of this table.&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Model (Q4_K_M unless noted)&lt;/th>
&lt;th scope="col">Correct / 24&lt;/th>
&lt;th scope="col">Accuracy&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Qwen2.5-14B-Instruct&lt;/td>
&lt;td>23&lt;/td>
&lt;td>&lt;strong>95.8%&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>gpt-oss-20b (MXFP4)&lt;/td>
&lt;td>22&lt;/td>
&lt;td>91.7%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qwen2.5-7B-Instruct&lt;/td>
&lt;td>21&lt;/td>
&lt;td>87.5%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qwen3-4B-Instruct-2507&lt;/td>
&lt;td>20&lt;/td>
&lt;td>83.3%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Llama-3.2-3B-Instruct&lt;/td>
&lt;td>17&lt;/td>
&lt;td>70.8%&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>The failures are more instructive than the percentages, because they are not random. Each model has a signature way of being wrong.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Llama-3.2-3B floods, guesses, and crashes.&lt;/strong> Three of its 24 responses were rejected outright by llama-server&amp;rsquo;s tool-call parser — the model generated malformed tool output the server refused to hand back, which a Home Assistant user experiences as a failed interaction. The server log shows what it was trying to do on the kitchen-scoped &amp;ldquo;turn everything off&amp;rdquo; command: an enumeration of &lt;code>HassTurnOff&lt;/code> calls marching far beyond the kitchen through the whole bench home, the Front Door Lock among them, until the parse died. Home Assistant maps turn-off on a lock to opening it; the only thing between that response and an open front door was a parser error. Asked the ambiguous &amp;ldquo;turn off the lights,&amp;rdquo; it silently guessed one room instead of asking which. It turned on the nonexistent disco ball. And its answer to &amp;ldquo;Who wrote The Hobbit?&amp;rdquo; was a &lt;code>GetLiveContext&lt;/code> call with &lt;code>name: &amp;quot;The Hobbit&amp;quot;&lt;/code> — it looked the novel up as if it were a device in the house (rejection number three). Fast, cheap, and the one model here I would not connect to real locks.&lt;/li>
&lt;li>&lt;strong>Qwen3-4B drops the scope.&lt;/strong> Its area commands came back domain-correct but house-wide. &amp;ldquo;Turn off all the lights in the office&amp;rdquo; produced &lt;code>HassTurnOff {domain: [light]}&lt;/code> with no area, which would darken the whole house. Its instinct on ambiguity is investigation (&lt;code>GetLiveContext&lt;/code>) rather than actuation, which is at least safe.&lt;/li>
&lt;li>&lt;strong>Qwen2.5-7B under-reaches.&lt;/strong> It targeted the entity literally named &amp;ldquo;Office Lights&amp;rdquo; and left the desk lamp on. Technically responsive, functionally half a command. On the ambiguous prompt it enumerated and switched off lights in five rooms instead of asking which one. On the disco ball it checked live context before telling me no such device exists — reasonable behavior that still scored as a miss under the strict no-tool answer key, where the 4B and 14B simply said so without calling anything.&lt;/li>
&lt;li>&lt;strong>Qwen2.5-14B just… behaves.&lt;/strong> Its one miss in 24: asked what&amp;rsquo;s playing in the living room, it answered (correctly) straight from the entity snapshot in its prompt instead of calling &lt;code>GetLiveContext&lt;/code> as its instructions demand. Right answer, wrong route. On a real install, where that snapshot goes stale between commands, the habit can bite. It nearly had a second miss, but that one was mine — told to turn everything off in the kitchen, it also switched off the kitchen speaker, which my original answer key had forgotten existed. The model was more thorough than my gold labels. I corrected the key (corpus v1.0.1) and scored it as the pass it was.&lt;/li>
&lt;li>&lt;strong>gpt-oss-20b omits.&lt;/strong> It turned off the kitchen lights but forgot the dining room on the two-area command, and went off to inspect the thermostat instead of acting on &amp;ldquo;I&amp;rsquo;m cold.&amp;rdquo; Nothing dangerous, since its misses are omissions rather than overreach, but you feel its reasoning pass in the latency table below.&lt;/li>
&lt;/ul>
&lt;p>Home Assistant&amp;rsquo;s own prompt tells the model to ask for an area when a device-type command is ambiguous, and to prefer name-plus-domain targeting. The source is &lt;a href="https://github.com/home-assistant/core/blob/2026.8.3/homeassistant/components/intent/llm.py" rel="noopener">right here&lt;/a>. The spread above is how differently five models follow the same instructions.&lt;/p>
&lt;p>Two scoped notes. This is one fixed corpus at temperature 0 on one bench home, a reproducible comparison rather than a universal ranking, and the integration&amp;rsquo;s own default temperature is 0.7, which can only make behavior less deterministic. Also, a fine-tuned home-control model like &lt;a href="https://github.com/acon96/home-llm" rel="noopener">Home-LLM&lt;/a> exists precisely to attack this problem class; it predates the native integration and I did not bench it here.&lt;/p>
&lt;h2 id="latency-results">Latency results&lt;/h2>
&lt;p>Command completion time is the number that matters for actuation: request sent to complete tool call back. First-token time flatters voice pipelines; a tool call is only actionable when it is finished. &amp;ldquo;Cold&amp;rdquo; is the first request after the server loads, which prefills the entire system prompt. &amp;ldquo;Warm&amp;rdquo; is the median of five repeats, where llama-server&amp;rsquo;s prompt cache means only your new sentence gets processed. That cache is the single most important performance fact in this whole stack. The same request that costs a second cold on the 14B costs 371 ms warm.&lt;/p>
&lt;p>&lt;strong>LLM leg, RTX 5080 (all layers offloaded):&lt;/strong>&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Model&lt;/th>
&lt;th scope="col">Load&lt;/th>
&lt;th scope="col">Cold command&lt;/th>
&lt;th scope="col">Warm command&lt;/th>
&lt;th scope="col">Decode tok/s&lt;/th>
&lt;th scope="col">Server VRAM&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Llama-3.2-3B&lt;/td>
&lt;td>2.8 s&lt;/td>
&lt;td>284 ms&lt;/td>
&lt;td>126 ms&lt;/td>
&lt;td>287&lt;/td>
&lt;td>3,168 MiB&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qwen3-4B-2507&lt;/td>
&lt;td>2.6 s&lt;/td>
&lt;td>326 ms&lt;/td>
&lt;td>144 ms&lt;/td>
&lt;td>232&lt;/td>
&lt;td>3,873 MiB&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qwen2.5-7B&lt;/td>
&lt;td>4.9 s&lt;/td>
&lt;td>557 ms&lt;/td>
&lt;td>291 ms&lt;/td>
&lt;td>128&lt;/td>
&lt;td>5,033 MiB&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qwen2.5-14B&lt;/td>
&lt;td>26.0 s&lt;/td>
&lt;td>1.02 s&lt;/td>
&lt;td>371 ms&lt;/td>
&lt;td>86&lt;/td>
&lt;td>10,076 MiB&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>gpt-oss-20b&lt;/td>
&lt;td>19.6 s&lt;/td>
&lt;td>1.08 s&lt;/td>
&lt;td>585 ms&lt;/td>
&lt;td>212&lt;/td>
&lt;td>11,601 MiB&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>Server VRAM is nvidia-smi total-used delta, before load versus after generation, on a card with an ~865 MiB desktop baseline. Every row above came from a verified-quiet capture window, with the baseline recorded per run in the receipts. This box runs other inference workloads, and two earlier contaminated captures were discarded rather than published.&lt;/p>
&lt;p>&lt;strong>CPU only: the numbers I am not publishing.&lt;/strong> I ran the same bench script with &lt;code>-ngl 0&lt;/code> on the 7800X3D and got decode rates near 1 token per second on a 3B. Absurd for this CPU, and I know exactly why. This bench box is temporarily on a single stick of DDR5 (a dead stick is out for RMA), and during the CPU window other inference workloads on the machine were sharing that one memory channel. CPU decode is memory-bandwidth-bound, so those runs measured my bus contention instead of the tier. Numbers measured badly are worse than no numbers, so the CPU rows stay out of the table until I can capture them on a quiet, dual-channel box; the dataset will grow the rows when they&amp;rsquo;re real. What holds regardless of my bad window: CPU prefill of a ~2,100-token Home Assistant prompt is a cold-start cost measured in seconds rather than milliseconds, warm commands ride the prompt cache exactly as on the GPU, and Home Assistant&amp;rsquo;s own docs put open-ended Whisper — the other CPU-hungry stage — at ~8 seconds on a Pi 4 versus under a second on a NUC. A resident server plus a 3-4B model is the only CPU-only configuration I would attempt, and I would set expectations in seconds.&lt;/p>
&lt;p>&lt;strong>STT (faster-whisper, beam 1, on the 24 synthesized commands, ~2-3s of audio each):&lt;/strong>&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Model&lt;/th>
&lt;th scope="col">Device&lt;/th>
&lt;th scope="col">Median&lt;/th>
&lt;th scope="col">Verbatim match&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>tiny-int8&lt;/td>
&lt;td>RTX 5080&lt;/td>
&lt;td>46 ms&lt;/td>
&lt;td>83.3%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>tiny-int8&lt;/td>
&lt;td>CPU (7800X3D)&lt;/td>
&lt;td>253 ms&lt;/td>
&lt;td>83.3%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>base-int8&lt;/td>
&lt;td>RTX 5080&lt;/td>
&lt;td>69 ms&lt;/td>
&lt;td>79.2%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>base-int8&lt;/td>
&lt;td>CPU (7800X3D)&lt;/td>
&lt;td>475 ms&lt;/td>
&lt;td>79.2%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>small-int8&lt;/td>
&lt;td>RTX 5080&lt;/td>
&lt;td>99 ms&lt;/td>
&lt;td>87.5%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>small-int8&lt;/td>
&lt;td>CPU (7800X3D)&lt;/td>
&lt;td>1,401 ms&lt;/td>
&lt;td>87.5%&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>Two honest readings of that match column. First, the method-section reminder: the input audio is synthetically clean, so these are ceilings with a good mic, not field guarantees. Second, verbatim match is a harsh metric that cuts both ways. Several &amp;ldquo;misses&amp;rdquo; were harmless formatting (&amp;ldquo;Set the bedroom lights to 30%.&amp;rdquo; for &amp;ldquo;30 percent&amp;rdquo;, &amp;ldquo;10 minutes&amp;rdquo; for &amp;ldquo;ten minutes&amp;rdquo;), which the downstream LLM reads fine. The misses that matter are the garbled entity names: base-int8 heard &amp;ldquo;turn off the desk lamp&amp;rdquo; as &amp;ldquo;Turn off the disc lip,&amp;rdquo; and even small-int8 turned the disco ball into a &amp;ldquo;disco bowl.&amp;rdquo; A garbled name is a dead command no matter how good the model behind it is. (Base scoring below tiny here is a 24-sample quirk rather than a finding.)&lt;/p>
&lt;p>&lt;strong>TTS (Piper, &lt;code>en_US-lessac-medium&lt;/code>, the add-on&amp;rsquo;s default voice):&lt;/strong> a non-problem, and I can now say so with numbers. On the 7800X3D&amp;rsquo;s CPU, Piper synthesized the short acknowledgment &amp;ldquo;Turned on the kitchen lights.&amp;rdquo; in 93 ms, a 2.9-second sentence in 101 ms, and a deliberately long 8.9-second status answer in 315 ms — a real-time factor of 0.03-0.07. The voice model loads once, in 1.5 s. Piper is the one pipeline component where the Raspberry-Pi-class advice in HA&amp;rsquo;s docs simply extends upward: their voice page calls it &lt;a href="https://www.home-assistant.io/voice_control/voice_remote_local_assistant/" rel="noopener">&amp;ldquo;optimized for the Raspberry Pi 4&amp;rdquo;&lt;/a>, and a desktop CPU has an order of magnitude to spare.&lt;/p>
&lt;p>&lt;strong>Adding it up.&lt;/strong> A warm GPU pipeline — Whisper small on the card (99 ms), the 4B brain (144 ms), a short Piper acknowledgment (93 ms) — comes to roughly a third of a second of measured compute between end-of-speech and start-of-spoken-reply, before Wyoming transport and Home Assistant&amp;rsquo;s own execution overhead. That is inside the territory where an assistant feels instant. One honest asterisk. Like every OpenAI-style agent loop, the integration feeds the tool result back through the model to phrase the spoken confirmation (the loop is visible in &lt;a href="https://github.com/home-assistant/core/tree/2026.8.3/homeassistant/components/llama_cpp" rel="noopener">its conversation-entity source&lt;/a>), so the acknowledgment costs a second warm round trip. The actuation itself doesn&amp;rsquo;t wait for it. The lights are on before the voice says so.&lt;/p>
&lt;h2 id="tuning-notes-from-the-bench">Tuning notes from the bench&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Keep the server resident.&lt;/strong> Everything above says cold starts are the tax. If the server is on a box that sleeps, or something else evicts your VRAM, every &amp;ldquo;first command of the evening&amp;rdquo; pays load plus full prefill. This is also my argument against giant system prompts and exposing 300 entities.&lt;/li>
&lt;li>&lt;strong>&lt;code>--jinja&lt;/code>, again.&lt;/strong> It is the difference between tool calls and vibes. If your agent chats but nothing actuates, check this first.&lt;/li>
&lt;li>&lt;strong>Watch the token budget.&lt;/strong> The integration defaults to a &lt;a href="https://github.com/home-assistant/core/blob/2026.8.3/homeassistant/components/llama_cpp/const.py" rel="noopener">3,000-token response cap&lt;/a>; temperature 0.7 and top-p 1.0 live in the same file. My bench capped at 512, and the 3B&amp;rsquo;s whole-house flood ran that cap out mid-JSON before the parser rejected it. If you see failed responses in the logs, the model rather than the budget is usually the problem.&lt;/li>
&lt;li>&lt;strong>Qwen3 pickers, use the Instruct variant.&lt;/strong> Qwen&amp;rsquo;s hybrid &amp;ldquo;thinking&amp;rdquo; builds spend tokens reasoning before every answer. I did not bench one, and for voice I would not; the 2507 &lt;em>Instruct&lt;/em> line I benched answers directly. gpt-oss shows what reasoning costs even when it works: for the same warm command it generated 112 tokens where the 14B needed 30, which is most of why it sits at 585 ms warm even though its 212 tok/s decode is two and a half times the 14B&amp;rsquo;s.&lt;/li>
&lt;li>&lt;strong>Streaming is a chat feature.&lt;/strong> The integration exposes a streaming toggle, and it helps perceived latency when the model reads you a paragraph. A tool call is atomic. Nothing actuates until the JSON is complete.&lt;/li>
&lt;/ul>
&lt;h2 id="why-local-briefly">Why local, briefly&lt;/h2>
&lt;p>Because the audio of your kitchen never leaves your LAN, because it works when your ISP doesn&amp;rsquo;t, and because the per-query price is your electricity. I will not pretend the cloud assistants aren&amp;rsquo;t slicker at barge-in and follow-ups. They are, today. What you get here is a voice interface whose brain, vocabulary, and failure modes are yours to choose, measure, and fix. The accuracy table is exactly that. Pick the brain whose mistakes you can live with, and wire it to locks only when the answer is &amp;ldquo;none of them.&amp;rdquo;&lt;/p>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;ul>
&lt;li>Home Assistant 2026.8 release post (llama.cpp integration announcement): &lt;a href="https://www.home-assistant.io/blog/2026/08/05/release-20268/" rel="noopener">https://www.home-assistant.io/blog/2026/08/05/release-20268/&lt;/a>&lt;/li>
&lt;li>llama.cpp integration docs: &lt;a href="https://www.home-assistant.io/integrations/llama_cpp/" rel="noopener">https://www.home-assistant.io/integrations/llama_cpp/&lt;/a>&lt;/li>
&lt;li>HA 2026.8.3 source — Assist tools + prompts: &lt;a href="https://github.com/home-assistant/core/blob/2026.8.3/homeassistant/components/intent/llm.py" rel="noopener">https://github.com/home-assistant/core/blob/2026.8.3/homeassistant/components/intent/llm.py&lt;/a> · exposed-entity serialization + GetLiveContext: &lt;a href="https://github.com/home-assistant/core/blob/2026.8.3/homeassistant/components/homeassistant/llm.py" rel="noopener">https://github.com/home-assistant/core/blob/2026.8.3/homeassistant/components/homeassistant/llm.py&lt;/a> · the integration (defaults in const.py): &lt;a href="https://github.com/home-assistant/core/tree/2026.8.3/homeassistant/components/llama_cpp" rel="noopener">https://github.com/home-assistant/core/tree/2026.8.3/homeassistant/components/llama_cpp&lt;/a>&lt;/li>
&lt;li>Local voice pipeline + hardware guidance: &lt;a href="https://www.home-assistant.io/voice_control/voice_remote_local_assistant/" rel="noopener">https://www.home-assistant.io/voice_control/voice_remote_local_assistant/&lt;/a>&lt;/li>
&lt;li>Whisper / Piper add-on defaults: &lt;a href="https://github.com/home-assistant/addons/tree/master/whisper" rel="noopener">https://github.com/home-assistant/addons/tree/master/whisper&lt;/a> · &lt;a href="https://github.com/home-assistant/addons/tree/master/piper" rel="noopener">https://github.com/home-assistant/addons/tree/master/piper&lt;/a>&lt;/li>
&lt;li>wyoming-faster-whisper container: &lt;a href="https://github.com/rhasspy/wyoming-faster-whisper" rel="noopener">https://github.com/rhasspy/wyoming-faster-whisper&lt;/a> · GPU build: &lt;a href="https://docs.linuxserver.io/images/docker-faster-whisper/" rel="noopener">https://docs.linuxserver.io/images/docker-faster-whisper/&lt;/a>&lt;/li>
&lt;li>llama.cpp docker images: &lt;a href="https://github.com/ggml-org/llama.cpp/blob/master/docs/docker.md" rel="noopener">https://github.com/ggml-org/llama.cpp/blob/master/docs/docker.md&lt;/a>&lt;/li>
&lt;li>llama-server flag reference (&lt;code>-hf&lt;/code>, &lt;code>--jinja&lt;/code> default): &lt;a href="https://github.com/ggml-org/llama.cpp/blob/master/tools/server/README.md" rel="noopener">https://github.com/ggml-org/llama.cpp/blob/master/tools/server/README.md&lt;/a>&lt;/li>
&lt;li>Bench dataset (CSV, CC BY 4.0): &lt;a href="https://techfuelhq.com/data/ha-voice-brain-bench-2026-08.csv">/data/ha-voice-brain-bench-2026-08.csv&lt;/a> — method &lt;code>ha-voice-brain-v1&lt;/code>, corpus v1.0.1, captured 2026-08-25/26. Full receipts (corpus, scorer, raw per-request records, rescore output): &lt;a href="https://techfuelhq.com/data/ha-voice-bench/README.md">/data/ha-voice-bench/README.md&lt;/a>.&lt;/li>
&lt;/ul></description></item><item><title>Memory Management BSOD? Don't Buy RAM Yet (2026)</title><link>https://techfuelhq.com/articles/memory-management-bsod-2026/</link><pubDate>Wed, 26 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/articles/memory-management-bsod-2026/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · 2026-08-26 · ~11 min read · St. Louis County, MO&lt;/p>
&lt;p>&lt;em>One retailer link below is an Amazon affiliate link; if you buy through it TechFuel HQ may earn a small commission at no extra cost to you. As an Amazon Associate I earn from qualifying purchases. Commissions never influence what gets recommended — see our &lt;a href="https://techfuelhq.com/disclosure/">disclosure&lt;/a>.&lt;/em>&lt;/p>
&lt;p>&lt;strong>MEMORY_MANAGEMENT&lt;/strong> (stop code &lt;code>0x0000001A&lt;/code>) is the blue screen that sends people shopping. The name points straight at your RAM, the forum replies say &amp;ldquo;run memtest,&amp;rdquo; and in 2026 — with kit prices multiplied by the memory crunch — a replacement is a three-figure purchase you want to be sure about before you make it. Microsoft&amp;rsquo;s reference page for the bug check is blunter and more useful: it says a severe memory management error occurred - meaning Windows caught &lt;strong>its own memory bookkeeping corrupted&lt;/strong>. Bad RAM does that. So does a memory overclock the sticks were never guaranteed to hold, a driver writing where it shouldn&amp;rsquo;t, and a failing drive feeding corrupt paging data back into memory.&lt;/p>
&lt;p>That list is the whole reason for this guide&amp;rsquo;s order. Test first. RAM is a suspect — one of four. The free tests lead. The ten-minute test beats the overnight one, and the purchase waits until a test has condemned a stick.&lt;/p>
&lt;h2 id="the-new-ram-question-answered-first">The new-RAM question, answered first&lt;/h2>
&lt;p>The question people attach to this stop code, in these exact words in the forum threads about it, is &lt;em>do I need to buy new RAM?&lt;/em> Fair question. Here&amp;rsquo;s the honest answer.&lt;/p>
&lt;p>Not yet. Probably not at all. The diagnosis is free either way.&lt;/p>
&lt;p>Nobody publishes cause-frequency telemetry for stop codes, this site included, so instead of a percentage claim you get an ordering built from what each test costs you to run and what a wrong guess costs you to buy. The ranking is by price. A BIOS toggle costs ten minutes. An overnight MemTest86 run costs a night; a SMART check, two minutes. A mistaken RAM purchase in this market costs real money. In our own &lt;a href="https://techfuelhq.com/data/ram-price-index/">daily DDR5 price capture&lt;/a>, the cheapest qualifying 32GB (2x16GB) DDR5-6000 offer at a named direct US retailer was &lt;strong>$469.59 on August 24, 2026&lt;/strong> (a listing the index flags for looser timings than its line label; the cheapest non-RGB line sat at $479.99) - about five times the ~$80-100 this class sold for in mid-2025, per the tracked history in the &lt;a href="https://techfuelhq.com/articles/ddr5-ram-buying-guide-2025/">DDR5 buying guide&lt;/a>. The &lt;a href="https://techfuelhq.com/articles/ram-ssd-price-crisis-2026/">price-crisis explainer&lt;/a> covers why. At those prices, you run every free test before you spend a dollar.&lt;/p>
&lt;h2 id="step-1-read-the-signature---when-does-it-hit">Step 1. Read the signature - when does it hit?&lt;/h2>
&lt;p>The same stop code behaves differently depending on what&amp;rsquo;s causing it, and the pattern of &lt;em>when it appears&lt;/em> is the cheapest diagnostic you own. Each signature below starts you at a different step.&lt;/p>
&lt;!-- ========== SIGNATURE VISUAL: CRASH-SIGNATURE ROUTER (distinct grammar: timing-pattern rows -> fork) ========== -->
&lt;div class="visual-block">
&lt;div style="background:#161006;border:1px solid rgba(246,169,74,0.22);border-radius:10px;padding:24px 20px 18px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;">
&lt;div style="margin-bottom:15px;">
&lt;div style="font-size:19px;font-weight:700;color:#f8efdd;letter-spacing:-0.3px;">Match your crash pattern, start at that step&lt;/div>
&lt;div style="font-size:12.5px;color:#bfa476;margin-top:6px;line-height:1.5;">One stop code, several causes. The timing of the crashes routes you to the cheapest test that fits your machine &amp;#8212; ordered by cost of test, not by a frequency claim.&lt;/div>
&lt;/div>
&lt;div style="display:flex;flex-direction:column;gap:8px;">
&lt;div style="display:flex;gap:10px;align-items:baseline;background:rgba(246,169,74,0.09);border-left:3px solid #f6a94a;border-radius:0 6px 6px 0;padding:9px 12px;">
&lt;span style="font-size:11px;font-weight:700;color:#f7c07a;flex-shrink:0;width:150px;line-height:1.4;">New build, new sticks, XMP/EXPO just enabled, or a fresh BIOS update&lt;/span>
&lt;span style="font-size:11.5px;color:#dcd0b8;line-height:1.5;min-width:0;">The memory profile is the prime suspect &amp;#8212; the rated speed was never guaranteed. &lt;strong style="color:#f4e8d0;">Step 2 (JEDEC test) first.&lt;/strong>&lt;/span>
&lt;/div>
&lt;div style="display:flex;gap:10px;align-items:baseline;background:rgba(246,169,74,0.09);border-left:3px solid #f6a94a;border-radius:0 6px 6px 0;padding:9px 12px;">
&lt;span style="font-size:11px;font-weight:700;color:#f7c07a;flex-shrink:0;width:150px;line-height:1.4;">Only under load &amp;#8212; games, rendering, big compiles &amp;#8212; fine at idle&lt;/span>
&lt;span style="font-size:11.5px;color:#dcd0b8;line-height:1.5;min-width:0;">Marginal memory stability that holds until heat and bandwidth stress it. &lt;strong style="color:#f4e8d0;">Step 2 if you run a profile, then Step 3.&lt;/strong>&lt;/span>
&lt;/div>
&lt;div style="display:flex;gap:10px;align-items:baseline;background:rgba(248,113,113,0.08);border-left:3px solid #f87171;border-radius:0 6px 6px 0;padding:9px 12px;">
&lt;span style="font-size:11px;font-weight:700;color:#fca5a5;flex-shrink:0;width:150px;line-height:1.4;">Nothing changed, crashes getting gradually more frequent&lt;/span>
&lt;span style="font-size:11.5px;color:#dcd0b8;line-height:1.5;min-width:0;">The slow-degradation pattern &amp;#8212; a stick or a drive going bad over weeks. &lt;strong style="color:#f4e8d0;">Step 3 (MemTest86), then Step 4 (SMART).&lt;/strong>&lt;/span>
&lt;/div>
&lt;div style="display:flex;gap:10px;align-items:baseline;background:rgba(96,165,250,0.09);border-left:3px solid #60a5fa;border-radius:0 6px 6px 0;padding:9px 12px;">
&lt;span style="font-size:11px;font-weight:700;color:#93c5fd;flex-shrink:0;width:150px;line-height:1.4;">At boot, during disk-heavy work, or sfc keeps finding new corruption&lt;/span>
&lt;span style="font-size:11.5px;color:#dcd0b8;line-height:1.5;min-width:0;">Paging data coming back corrupt from the drive is in play. &lt;strong style="color:#f4e8d0;">Step 4 (drive health) before any RAM spend.&lt;/strong>&lt;/span>
&lt;/div>
&lt;div style="display:flex;gap:10px;align-items:baseline;background:rgba(148,163,184,0.10);border-left:3px solid #94a3b8;border-radius:0 6px 6px 0;padding:9px 12px;">
&lt;span style="font-size:11px;font-weight:700;color:#cbd5e1;flex-shrink:0;width:150px;line-height:1.4;">Laptop or stock OEM desktop &amp;#8212; no profile, nothing changed&lt;/span>
&lt;span style="font-size:11.5px;color:#dcd0b8;line-height:1.5;min-width:0;">Skip Step 2; there's no overclock to revert. &lt;strong style="color:#f4e8d0;">Step 3 to test the memory, then Steps 4-5.&lt;/strong>&lt;/span>
&lt;/div>
&lt;/div>
&lt;div style="margin-top:14px;padding-top:12px;border-top:1px solid rgba(246,169,74,0.15);font-size:11px;color:#9c8a66;line-height:1.5;display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;">
&lt;span>Seeing &lt;em>different&lt;/em> stop codes each time, or restarts with no blue screen at all? That's a whole-system problem &amp;#8212; use the &lt;strong style="color:#dcd0b8;">stop-code decoder in PC keeps restarting&lt;/strong> instead.&lt;/span>
&lt;span style="font-family:ui-monospace,monospace;font-size:10px;color:#6b5c3e;">techfuelhq.com&lt;/span>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>A different code on each crash, or hard restarts with no blue screen, means this page is too narrow for you - work the whole-system flow in &lt;a href="https://techfuelhq.com/articles/pc-keeps-restarting-2026/">PC keeps restarting&lt;/a> instead. And if your machine is a laptop or an unmodified OEM desktop, skip straight past the next section: there is no XMP/EXPO profile to revert, so your path is Step 3 onward.&lt;/p>
&lt;h2 id="step-2-the-ten-minute-test-that-beats-an-overnight-one">Step 2. The ten-minute test that beats an overnight one&lt;/h2>
&lt;p>This fork is for machines where a memory profile is enabled or the hardware recently changed - a self-built desktop running XMP (Intel) or EXPO (AMD), new sticks in an old board, a BIOS update that reset or &amp;ldquo;upgraded&amp;rdquo; memory settings.&lt;/p>
&lt;p>&lt;strong>XMP and EXPO are overclock profiles.&lt;/strong> The DDR5-6000 on the box is a factory-validated overclock, not the module&amp;rsquo;s default; out of the box, DDR5 runs at a JEDEC standard speed, typically 4800 or 5600. Whether the advertised profile holds depends on the sticks, the board, and your specific CPU&amp;rsquo;s memory controller together. When that combination can&amp;rsquo;t quite sustain the profile, it corrupts data in exactly the way 0x1A reports - and the sticks themselves are healthy. PassMark&amp;rsquo;s MemTest86 documentation says the same thing from the other direction: some memory errors only appear when BIOS timings are set aggressively, and their suggested check is to retest at standard non-XMP timings.&lt;/p>
&lt;p>So run the cheap experiment before the long one:&lt;/p>
&lt;ol>
&lt;li>Enter BIOS and &lt;strong>disable XMP/EXPO&lt;/strong> (set the memory profile to Auto/Default). Memory drops to JEDEC speed.&lt;/li>
&lt;li>Use the PC normally for a day - include whatever load used to trigger the crash.&lt;/li>
&lt;li>&lt;strong>Crashes stop?&lt;/strong> The profile was unstable. Your options, in order of effort — run at JEDEC permanently (the real-world cost is smaller than it sounds - the &lt;a href="https://techfuelhq.com/articles/ddr5-ram-buying-guide-2025/">DDR5 buying guide&lt;/a> carries the measured JEDEC-versus-rated numbers, mostly low single digits with one 12% outlier), try a milder profile, or tune voltages by hand if you know the platform.&lt;/li>
&lt;li>&lt;strong>Crashes continue?&lt;/strong> Good news, oddly: you&amp;rsquo;ve ruled out the profile for free. Leave it disabled and go to Step 3.&lt;/li>
&lt;/ol>
&lt;p>Two configurations earn a specific warning here. Populating all four DDR5 slots drops the speed a board can hold stable below the kit&amp;rsquo;s rated profile - the buying guide&amp;rsquo;s &lt;a href="https://techfuelhq.com/articles/ddr5-ram-buying-guide-2025/">four-DIMM section&lt;/a> covers how far and why. And a new AM5 build that has never been stable is the textbook case of an EXPO profile the board never validated — on a week-old machine, check this before anything else.&lt;/p>
&lt;h2 id="step-3-test-the-sticks-so-the-result-means-something">Step 3. Test the sticks so the result means something&lt;/h2>
&lt;p>The field&amp;rsquo;s standard advice is &amp;ldquo;run memtest.&amp;rdquo; The part nobody explains is how to read what comes back, so results get misread in both directions - people replace healthy kits, and people trust a quick pass that proved nothing.&lt;/p>
&lt;p>&lt;strong>Run the real test.&lt;/strong> &lt;a href="https://www.memtest86.com/" rel="noopener">MemTest86&lt;/a> boots from a USB stick, outside Windows, which matters because the test gets the hardware to itself instead of sharing it with the very memory manager whose crash you&amp;rsquo;re chasing. Set it running when you go to bed. A badly failing stick usually errors fast; marginal instability can take hours, and PassMark notes the first pass is shorter than the ones after it. Windows&amp;rsquo; built-in Memory Diagnostic (&lt;code>mdsched.exe&lt;/code>) is the tool Microsoft&amp;rsquo;s own 0x1A reference suggests, and it&amp;rsquo;s a reasonable quick screen — but it finishes in minutes, and minutes of testing is weak evidence against a fault that needs a warm, loaded system to show itself. Treat its &amp;ldquo;no errors&amp;rdquo; as &lt;em>nothing found yet&lt;/em>, never as proof the RAM is good.&lt;/p>
&lt;p>&lt;strong>Read the result like this.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Any error counts.&lt;/strong> PassMark&amp;rsquo;s troubleshooting doc is direct about this: in the vast majority of cases, reported errors are valid. There is no acceptable-errors threshold. One error is a fail.&lt;/li>
&lt;li>&lt;strong>A fail names a system first.&lt;/strong> Their same doc notes errors can also come from the CPU, its caches, or the motherboard - and from aggressive BIOS timings, which is why the JEDEC retest in Step 2 comes first. A kit that errors at XMP and passes at JEDEC is an unstable overclock rather than dead hardware.&lt;/li>
&lt;li>&lt;strong>Isolate to name the module.&lt;/strong> Two or more sticks, still erroring at JEDEC? Power down, pull all but one stick, test it alone in the same slot, then swap. The stick that errors alone is your answer; confirm the good stick passes in the same slot so you&amp;rsquo;ve also ruled out the slot itself.&lt;/li>
&lt;/ul>
&lt;p>Then let the crash tell you what it saw. Each 0x1A blue screen writes a minidump, and the first bug-check parameter carries a subcode saying which structure was corrupted. Open the latest dump from &lt;code>C:\Windows\Minidump&lt;/code> in WinDbg (from the Microsoft Store) and run &lt;code>!analyze -v&lt;/code> - the four parameters print at the top, and the &lt;a href="https://techfuelhq.com/articles/page-fault-in-nonpaged-area-2026/">PAGE_FAULT walkthrough&lt;/a> covers the mechanics of reading dumps in more detail. For 0x1A, &lt;a href="https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/bug-check-0x1a--memory-management" rel="noopener">Microsoft&amp;rsquo;s subcode table&lt;/a> turns the hex into a lead:&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Parameter 1&lt;/th>
&lt;th scope="col">What Microsoft&amp;rsquo;s table says it means&lt;/th>
&lt;th scope="col">Where it points&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>0x403&lt;/code>&lt;/td>
&lt;td>Page table and page frame numbers out of sync; probably a hardware error, especially when two parameters differ by a single bit&lt;/td>
&lt;td>A one-bit difference is the classic failing-stick signature - Step 3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>0x41790&lt;/code> / &lt;code>0x41792&lt;/code>&lt;/td>
&lt;td>A page table page, or a PTE, has been corrupted&lt;/td>
&lt;td>Memory corruption with no named culprit - Steps 2-3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>0x3f&lt;/code>&lt;/td>
&lt;td>An in-page operation failed a CRC check, with a page-file offset in the parameters&lt;/td>
&lt;td>Corrupt data came back &lt;strong>from the drive&lt;/strong> - Step 4&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>0x1233&lt;/code> / &lt;code>0x4477&lt;/code>&lt;/td>
&lt;td>A driver mapped or wrote memory illegally&lt;/td>
&lt;td>Software - Step 5, starting from the named driver&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>Use it as a compass. A subcode won&amp;rsquo;t close the case alone, but it stops you testing blind - &lt;code>0x3f&lt;/code> in particular moves the investigation to storage before you&amp;rsquo;ve spent anything on memory.&lt;/p>
&lt;h2 id="step-4-the-storage-crossover-nobody-checks">Step 4. The storage crossover nobody checks&lt;/h2>
&lt;p>Windows extends memory onto the drive — the page file holds data that was paged out and will be pulled back in, so a drive developing bad sectors can hand Windows corrupt &lt;em>memory&lt;/em>, and the in-page CRC subcode above is Microsoft documenting precisely that path. The result wears a memory error&amp;rsquo;s name while the fault sits in storage. SMART settles it.&lt;/p>
&lt;p>The check costs two minutes, which is why it belongs before any purchase.&lt;/p>
&lt;ul>
&lt;li>Run &lt;strong>CrystalDiskInfo&lt;/strong> and read the drive that holds your page file (almost always &lt;code>C:&lt;/code>). &lt;strong>Caution&lt;/strong> status, reallocated sectors, media errors, or a climbing percent-used figure on an NVMe drive all move the diagnosis to storage.&lt;/li>
&lt;li>A drive that&amp;rsquo;s also slow, disappearing from Explorer, or dropping out entirely gets the &lt;a href="https://techfuelhq.com/articles/ssd-not-showing-up-2026/">SSD not showing up&lt;/a> treatment - and back up before anything else, because a failing drive&amp;rsquo;s remaining life is a budget you spend carefully.&lt;/li>
&lt;li>Storage-flavored blue screens tend to travel together: if you&amp;rsquo;re also seeing DPC_WATCHDOG_VIOLATION, that code&amp;rsquo;s &lt;a href="https://techfuelhq.com/articles/dpc-watchdog-violation-2026/">storage-first guide&lt;/a> is the companion to this section.&lt;/li>
&lt;/ul>
&lt;p>One pattern is worth naming. &lt;code>sfc /scannow&lt;/code> that finds and repairs corruption, then finds &lt;em>new&lt;/em> corruption a few days later, is not sfc being thorough. Something is corrupting files between runs, and this whole page is the list of suspects.&lt;/p>
&lt;h2 id="step-5-drivers-and-windows---the-honestly-bounded-half">Step 5. Drivers and Windows - the honestly-bounded half&lt;/h2>
&lt;p>The software half is real, and it&amp;rsquo;s deliberately late in this order because its tests cost more time than a BIOS toggle and prove less than a memory test. Work it when the hardware half is clean, or immediately when a crash names a driver.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>A named &lt;code>.sys&lt;/code> on the blue screen or in the minidump goes first.&lt;/strong> Graphics drivers get a clean reinstall - the &lt;a href="https://techfuelhq.com/articles/gpu-driver-crash-fix-2026/">GPU driver crash guide&lt;/a> covers DDU properly. Anything else: identify the driver, update it, or roll it back.&lt;/li>
&lt;li>&lt;strong>Timing matches a Windows or driver update?&lt;/strong> Roll it back (Settings → Windows Update → Update history → Uninstall updates) and see whether the crashes leave with it.&lt;/li>
&lt;li>&lt;strong>System files:&lt;/strong> &lt;code>sfc /scannow&lt;/code>, then &lt;code>DISM /Online /Cleanup-Image /RestoreHealth&lt;/code>, from an admin Terminal. These repair the damage corruption already did; they do nothing about what caused it.&lt;/li>
&lt;li>&lt;strong>The stubborn case&lt;/strong> - crashes continue, dump names nothing, hardware tests clean - is Driver Verifier territory, and the &lt;a href="https://techfuelhq.com/articles/kernel-security-check-failure-2026/">KERNEL_SECURITY_CHECK_FAILURE guide&lt;/a> has the full walkthrough including the safe-mode escape hatch it requires. That code is 0x1A&amp;rsquo;s closest sibling: same corruption family, different tripwire.&lt;/li>
&lt;/ul>
&lt;p>What this half cannot do is fix electricity. A reinstall rebuilds every file and resets every driver, and an unstable profile or dying stick corrupts the new install on schedule. A 0x1A that comes back after a clean reinstall has told you, at the cost of your afternoon, that it was hardware all along — the free tests above would have said so first.&lt;/p>
&lt;h2 id="if-a-stick-really-is-dead---replacement-priced-honestly">If a stick really is dead - replacement, priced honestly&lt;/h2>
&lt;p>You&amp;rsquo;re here because a stick failed MemTest86 alone, at JEDEC speed, in a known-good slot. That&amp;rsquo;s a corroborated verdict, and it&amp;rsquo;s the point where spending money stops being a guess.&lt;/p>
&lt;p>Here is the 2026 reality from this site&amp;rsquo;s own tracking. I run a &lt;a href="https://techfuelhq.com/data/ram-price-index/">daily DDR5 price capture&lt;/a> against named direct US retailers; in the August 24, 2026 capture the cheapest qualifying 32GB (2x16GB) DDR5-6000 offer was &lt;strong>$469.59&lt;/strong> (a kit the index flags as looser-timed than its line&amp;rsquo;s CL30 label; the cheapest non-RGB line sat at $479.99, and that line&amp;rsquo;s true CL30 kits at $619.99) - versus the ~$80-100 the same class sold for in mid-2025. The &lt;a href="https://techfuelhq.com/articles/ram-ssd-price-crisis-2026/">crisis explainer&lt;/a> covers why prices tripled to quadrupled and when relief might come. Three rules keep the purchase from becoming a second problem:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Replace the kit, not the stick, when you run paired modules.&lt;/strong> Mixing a new stick into a surviving half-kit means unmatched silicon negotiating shared timings - the exact recipe for the marginal instability you just spent a week diagnosing. Kits are sold, binned, and validated together.&lt;/li>
&lt;li>&lt;strong>Don&amp;rsquo;t panic-buy four sticks.&lt;/strong> Two sticks of the capacity you need beats four sticks of half that; the &lt;a href="https://techfuelhq.com/articles/ddr5-ram-buying-guide-2025/">four-DIMM ceiling&lt;/a> applies double during a price crunch, when 2x32GB money is tempting to split into cheaper 4x16GB mistakes.&lt;/li>
&lt;li>&lt;strong>Size it once, deliberately.&lt;/strong> If you&amp;rsquo;re replacing anyway, the &lt;a href="https://techfuelhq.com/articles/how-much-ram-do-you-need-2026/">how much RAM do you need&lt;/a> breakdown is the five-minute read that stops both under- and over-buying. When you&amp;rsquo;ve settled on a spec, a &lt;a href="https://www.amazon.com/s?k=32gb+ddr5+6000+kit+2x16gb&amp;tag=techfuelhq-20" rel="nofollow sponsored noopener" target="_blank">matched 32GB DDR5-6000 kit&lt;/a> is the mainstream pick - check current prices against the index&amp;rsquo;s direct-retailer observations before you commit.&lt;/li>
&lt;/ol>
&lt;h2 id="keeping-it-stable">Keeping it stable&lt;/h2>
&lt;p>The fix that lasts is the boring one. Run the profile your specific combination proved it can hold - which sometimes means JEDEC, and that&amp;rsquo;s fine; the measured gap between JEDEC and a rated profile in typical desktop work is small enough that stability wins the trade. Two sticks, matched, in the slots your board&amp;rsquo;s manual names. Retest with MemTest86 after any BIOS update that touches memory settings, because &amp;ldquo;updated defaults&amp;rdquo; have re-enabled more than one profile that a machine had banished for cause.&lt;/p>
&lt;p>And keep the one habit that makes every future blue screen cheaper: when it crashes, read the stop code and the subcode before touching anything. The &lt;a href="https://techfuelhq.com/articles/pc-keeps-restarting-2026/">stop-code decoder&lt;/a> maps each code to its own guide - this page is the 0x1A entry in that family, &lt;a href="https://techfuelhq.com/articles/kernel-security-check-failure-2026/">0x139&lt;/a> and &lt;a href="https://techfuelhq.com/articles/page-fault-in-nonpaged-area-2026/">0x50&lt;/a> are its siblings, and the difference between them is exactly which test you run first.&lt;/p>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;ul>
&lt;li>Stop code identity and subcodes: Microsoft&amp;rsquo;s &lt;a href="https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/bug-check-0x1a--memory-management" rel="noopener">Bug Check 0x1A MEMORY_MANAGEMENT&lt;/a> reference (retrieved 2026-08-25) - the severe-memory-management-error definition, the parameter-1 subcode table including the probable-hardware-error and in-page CRC entries, and its suggestion to run Windows Memory Diagnostic. The multi-cause framing and test ordering here follow that document&amp;rsquo;s own subcode taxonomy, corroborated across Microsoft Q&amp;amp;A, Reddit r/techsupport and r/overclocking, Tom&amp;rsquo;s Hardware, and LinusTechTips forum threads on this code.&lt;/li>
&lt;li>Memory testing doctrine: PassMark&amp;rsquo;s &lt;a href="https://www.memtest86.com/troubleshooting.htm" rel="noopener">MemTest86 troubleshooting documentation&lt;/a> (retrieved 2026-08-25) - errors are valid in the vast majority of cases, not all errors are the RAM itself (CPU/cache/motherboard are possible), single-stick isolation as the method for naming a failing module, and retesting at standard non-XMP timings when BIOS settings are aggressive. Windows Memory Diagnostic (&lt;code>mdsched.exe&lt;/code>), WinDbg&amp;rsquo;s &lt;code>!analyze -v&lt;/code>, and CrystalDiskInfo SMART reading are standard documented tools.&lt;/li>
&lt;li>Pricing: TechFuelHQ&amp;rsquo;s own &lt;a href="https://techfuelhq.com/data/ram-price-index/">DDR5 RAM price index&lt;/a> - dated, per-capacity observations at named direct US retailers with the method and rejection log published; figures above are the 2026-08-24 capture. Market context in the &lt;a href="https://techfuelhq.com/articles/ram-ssd-price-crisis-2026/">RAM &amp;amp; SSD price crisis explainer&lt;/a>.&lt;/li>
&lt;/ul>
&lt;p>&lt;em>Windows 10/11 instructions, current for 2026 builds. Settings paths may sit one step elsewhere on older versions. Report problems to &lt;a href="mailto:hello@techfuelhq.com">hello@techfuelhq.com&lt;/a>.&lt;/em>&lt;/p></description></item><item><title>Why Hard Drives Got So Expensive in 2026 (and What to Do About It)</title><link>https://techfuelhq.com/articles/hdd-price-crisis-2026/</link><pubDate>Wed, 26 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/articles/hdd-price-crisis-2026/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · 2026-08-26 · ~12 min read · St. Louis County, MO&lt;/p>
&lt;img src="https://techfuelhq.com/images/articles/hdd-price-crisis-2026.svg" width="1200" height="630" loading="eager" fetchpriority="high" decoding="async" alt="Dated dollar-per-terabyte observations for new 8TB NAS and enterprise hard drives at direct US retailers, August 12 to 25, 2026: WD Red Pro swings between $47.50 and $61.14 per TB, WD Gold holds flat at $46.25, Seagate Exos 7E10 holds at $47.50, and Seagate IronWolf enters at $41.25 - all far above the $23.75 per TB July 2024 Amazon low camelcamelcamel tracked for the WD Red Pro SKU." style="display:block;margin:1.5rem auto;max-width:100%;height:auto;border:1px solid #1e1e3a;border-radius:8px;" />
&lt;p>$489.11. That is what Best Buy asked for a WD Red Pro 8TB on August 25, 2026 — the same listing, same retailer, that had listed at $402.99 two days earlier. A 21 percent jump in 48 hours, on a drive &lt;a href="https://camelcamelcamel.com/product/B0D1V2K4LJ" rel="noopener">camelcamelcamel tracked as low as $189.99&lt;/a> in July 2024.&lt;/p>
&lt;p>Multiply that shock across every NAS builder, backup hoarder, and Plex admin refreshing a cart this year and you get the anger filling an &lt;a href="https://www.reddit.com/r/homelab/comments/1lovwdx/hard_drive_prices_have_doubled_over_one_year_wtf/" rel="noopener">r/homelab thread titled &amp;ldquo;Hard drive prices have doubled over one year. WTF is going on&amp;rdquo;&lt;/a> (340+ comments when I pulled the SERP on August 25), plus fresh siblings in &lt;a href="https://www.reddit.com/r/selfhosted/comments/1qdsu88/why_hard_drives_becoming_so_expensive_in_2026/" rel="noopener">r/selfhosted&lt;/a> and &lt;a href="https://www.reddit.com/r/DataHoarder/comments/1r9d2jx/these_hdd_prices_are_getting_crazy_an_increase_of/" rel="noopener">r/DataHoarder&lt;/a>. The threads argue from screenshots. This page argues from a dated, downloadable price series I run myself, plus the primary statements from the two biggest makers of the drives you can buy.&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 · The 2026 hard drive squeeze&lt;/p>
&lt;ul style="margin:0.25rem 0 0 0;padding-left:1.25rem;line-height:1.55;">
&lt;li>&lt;strong>What happened:&lt;/strong> retail HDD prices rose 20-50% by early 2026 and kept going. ComputerBase's tracker had them &lt;strong>up 129% vs September 2025&lt;/strong> by mid-August. Our own three same-day captures put new 8TB drives at &lt;strong>$41-61 per TB&lt;/strong>, 1.7-2.6x the tracked 2024 low for the same Red Pro SKU.&lt;/li>
&lt;li>&lt;strong>Why:&lt;/strong> AI data centers bought the supply. WD says it is &lt;strong>sold out through calendar 2026&lt;/strong>; Seagate calls nearline capacity &lt;strong>fully allocated&lt;/strong>. Neither is expanding production.&lt;/li>
&lt;li>&lt;strong>When it ends:&lt;/strong> nothing citable points to consumer relief before &lt;strong>2027&lt;/strong>, and contracts already run into 2027-2028.&lt;/li>
&lt;li>&lt;strong>What to do:&lt;/strong> buy what the build needs and skip the stockpile. If a build is blocked on a drive, buy the low end of the measured range now; if you can wait a year, wait. The per-case calls are below.&lt;/li>
&lt;/ul>
&lt;/div>
&lt;h2 id="what-an-8tb-nas-drive-costs-right-now-measured">What an 8TB NAS drive costs right now, measured&lt;/h2>
&lt;p>I run a price capture against Google Shopping for twelve named 8TB drive lines — NAS, surveillance, enterprise, desktop — and publish every qualifying observation with its date in the &lt;a href="https://techfuelhq.com/data/hdd-price-index/">HDD price index&lt;/a>. The rules are strict on purpose. A listing only counts if it comes from a named direct US retailer (no marketplace storefronts), states the exact line and the 8TB capacity in its title, is a single new internal drive (no multi-packs, no external enclosures), and is not recertified or white-label. Most listings fail. On day one, 672 of 673 did.&lt;/p>
&lt;p>Here is what qualified in the day&amp;rsquo;s final capture on August 25, 2026 — the one published in the index&amp;rsquo;s downloadable CSV:&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Drive&lt;/th>
&lt;th scope="col" style="text-align: right">Price&lt;/th>
&lt;th scope="col" style="text-align: right">$/TB&lt;/th>
&lt;th scope="col">Retailer&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Seagate IronWolf 8TB&lt;/td>
&lt;td style="text-align: right">$329.99&lt;/td>
&lt;td style="text-align: right">$41.25&lt;/td>
&lt;td>Best Buy, Newegg&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>WD Gold 8TB&lt;/td>
&lt;td style="text-align: right">$369.99&lt;/td>
&lt;td style="text-align: right">$46.25&lt;/td>
&lt;td>Central Computers&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Seagate Exos 7E10 8TB&lt;/td>
&lt;td style="text-align: right">$379.99&lt;/td>
&lt;td style="text-align: right">$47.50&lt;/td>
&lt;td>Adorama&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>WD Red Pro 8TB&lt;/td>
&lt;td style="text-align: right">$379.99&lt;/td>
&lt;td style="text-align: right">$47.50&lt;/td>
&lt;td>Newegg&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>Four lines out of twelve. Every row carries &lt;code>verification_status: discovery_only&lt;/code>; I have not phoned a warehouse to confirm stock, and the index says so rather than hiding it. One open flag carried from the index: the Exos 7E10 row&amp;rsquo;s listing title reads SAS while the tracked part is the SATA variant, ST8000NM017B. Unresolved. That row stays discovery-only until a retailer page settles it.&lt;/p>
&lt;p>Two things in that table deserve their own paragraphs.&lt;/p>
&lt;p>&lt;strong>The WD Red Pro swing is real and I can show the receipts.&lt;/strong> One Best Buy listing, same product cluster and same seller across captures: $457.04 on August 22, down to $402.99 on August 23, up to $489.11 on August 25 (on August 24 the same cluster surfaced under Newegg instead, a seller flip the index does not treat as comparable). That is a 21 percent range inside four days on a single SKU at a single retailer. Anyone quoting you &amp;ldquo;the&amp;rdquo; price of a drive this month from one screenshot is off by up to a fifth before they finish typing.&lt;/p>
&lt;p>&lt;strong>Single snapshots lie even harder within a day.&lt;/strong> I ran three captures on August 25. The first saw the Red Pro at Best Buy for $489.11 and no first-party IronWolf anywhere; the third, twelve minutes later, saw the IronWolf at two direct retailers and the Red Pro at Newegg for $379.99, which is $109 under the Best Buy ask on the same Google product listing. Same afternoon, same method, different slices of Google Shopping&amp;rsquo;s inventory. This churn is exactly why the index refuses to publish a headline median until six of the twelve tracked lines qualify on the same day — a gate that has stayed closed since the pilot began on August 12 — and why the honest unit of evidence here is a dated series, not a screenshot.&lt;/p>
&lt;p>The marketplace premium showed up the same day. Across the day&amp;rsquo;s captures, marketplace storefronts on Newegg asked $469.99 and $513.99 for the same IronWolf 8TB that Newegg itself and Best Buy listed at $329.99 — 42 to 56 percent over the direct price. The index rejects those rows. Your cart should too.&lt;/p>
&lt;h2 id="step-1-what-kind-of-buyer-are-you">Step 1: what kind of buyer are you?&lt;/h2>
&lt;p>There is no one answer to &amp;ldquo;should I buy a hard drive right now.&amp;rdquo; There is an answer per situation, and the honest way to order them is by what a wrong call costs you, so that is the order used here.&lt;/p>
&lt;p>&lt;strong>Building a NAS you need this year.&lt;/strong> Buy, and buy the boring low end of the measured range. In the day&amp;rsquo;s captures that means the cheapest qualifying line, IronWolf 8TB at $41.25/TB, over the premium lines that ran $46-61. The &lt;a href="https://techfuelhq.com/homelab/best-nas-hard-drives-2026/">NAS drive buying guide&lt;/a> carries the actual picks and the CMR-vs-SMR rules; the &lt;a href="https://techfuelhq.com/homelab/seagate-ironwolf-vs-ironwolf-pro-vs-exos-2026/">Seagate line comparison&lt;/a> settles IronWolf vs Pro vs Exos. Waiting costs you a year of not having the machine, and nothing citable says next spring is cheaper.&lt;/p>
&lt;p>&lt;strong>Expanding an existing pool.&lt;/strong> Size the real need first with the &lt;a href="https://techfuelhq.com/tools/nas-storage-calculator/">NAS storage calculator&lt;/a>. RAID and filesystem overhead mean the terabytes you must buy are not the terabytes you get. Then buy only the expansion and skip the &amp;ldquo;while I&amp;rsquo;m at it&amp;rdquo; spare. At $41-61/TB, speculative spares are the most expensive comfort object in the hobby.&lt;/p>
&lt;p>&lt;strong>Backup-only.&lt;/strong> You need capacity once, not performance, and this is where used and recertified enterprise drives earn their keep if you accept the trade; more on that two sections down. A backup target with redundancy plus an offsite copy tolerates a cheaper drive; the &lt;a href="https://techfuelhq.com/tutorials/automated-offsite-backups-restic-2026/">restic offsite backup guide&lt;/a> covers the pipeline half.&lt;/p>
&lt;p>&lt;strong>Media hoarding at scale.&lt;/strong> You feel this market hardest, because $/TB is your whole cost model and on the tracked Red Pro SKU it doubled, from a $189.99 Amazon low in July 2024 to $379.99 listings now. Shop by $/TB across 8-16TB rather than assuming bigger is cheaper. Our July pull found the 12TB Red Plus pricier per TB than the 8TB. Recertified big-capacity CMR is the standing value play, eyes open.&lt;/p>
&lt;p>&lt;strong>No urgent need.&lt;/strong> Do nothing. Prices this distorted make &amp;ldquo;upgrade because it&amp;rsquo;s Tuesday&amp;rdquo; a luxury purchase. Check the &lt;a href="https://techfuelhq.com/data/hdd-price-index/">index&lt;/a> monthly; it exists so you can see a real trend instead of guessing from forum sentiment.&lt;/p>
&lt;h2 id="why-are-hard-drives-so-expensive-in-2026">Why are hard drives so expensive in 2026?&lt;/h2>
&lt;p>Because the people who make them sold out. Literally, and they said so in public.&lt;/p>
&lt;p>On Western Digital&amp;rsquo;s second-quarter earnings call, as reported by &lt;a href="https://www.heise.de/en/news/WD-and-Seagate-confirm-Hard-drives-for-2026-sold-out-11178917.html" rel="noopener">heise in February 2026&lt;/a>, CEO Irving Tan told analysts the company is &amp;ldquo;pretty much sold out for calendar year 2026,&amp;rdquo; with &amp;ldquo;firm purchase orders with our top seven customers through calendar year 2026&amp;rdquo; and, per the same report, long-term agreements with three major customers extending through 2027 and 2028. Seagate&amp;rsquo;s CEO Dave Mosley said the same thing in his own words: nearline capacity &lt;a href="https://www.heise.de/en/news/WD-and-Seagate-confirm-Hard-drives-for-2026-sold-out-11178917.html" rel="noopener">&amp;ldquo;fully allocated through calendar year 2026,&amp;rdquo;&lt;/a> with order-taking for the first half of 2027 expected &amp;ldquo;in the coming months.&amp;rdquo; Per heise&amp;rsquo;s report, nearline — the high-capacity 3.5-inch class that cloud and AI buyers take — is 87 percent of Seagate&amp;rsquo;s hard drive sales, and the company is not expanding production capacity to chase the spike.&lt;/p>
&lt;p>Sit with that combination for a second. The two biggest hard drive makers have pre-sold their output to a handful of hyperscale customers, years forward, at contract prices. Nobody cut a factory&amp;rsquo;s output this time. The factories are running; their output just has someone else&amp;rsquo;s name on it.&lt;/p>
&lt;p>Retail gets the remainder, and the remainder got expensive fast. Tom&amp;rsquo;s Hardware measured &lt;a href="https://www.tomshardware.com/pc-components/hdds/hard-drive-prices-have-surged-by-an-average-of-46-percent-since-september-iconic-24tb-seagate-barracuda-now-usd500-as-ai-claims-another-victim" rel="noopener">an average 46 percent rise across popular high-capacity drives between September 2025 and mid-January 2026&lt;/a>, with the 24TB BarraCuda crossing $500. heise put the broader retail rise at 20-50 percent by mid-February. By &lt;a href="https://www.computerbase.de/news/storage/speicherpreise-im-check-ein-neuer-hoechststand-ist-erreicht.98854/" rel="noopener">ComputerBase&amp;rsquo;s August 15, 2026 storage-price check&lt;/a> — a German price-comparison basket that deliberately excludes eBay and marketplace scalpers — hard drives stood 129 percent above September 2025, a new record for the series and still climbing month over month. German retail is not US retail, but it is the cleanest continuously-published basket anyone maintains, and our own US spot observations sit at 1.7x to 2.6x the tracked 2024 low, depending on the line.&lt;/p>
&lt;h2 id="why-did-it-hit-hard-drives-later-than-ram">Why did it hit hard drives later than RAM?&lt;/h2>
&lt;p>The &lt;a href="https://techfuelhq.com/articles/ram-ssd-price-crisis-2026/">RAM and SSD half of this story&lt;/a> broke first and broke harder: memory makers reallocated wafer capacity toward AI data-center memory, and consumer DDR5 and NVMe prices roughly tripled through 2025 into 2026. That page carries the mechanism and the numbers; the two-sentence version is that your DIMM lost a bidding war to a server.&lt;/p>
&lt;p>Hard drives lagged for a structural reason. DRAM and NAND trade close to spot: when wafers moved, consumer prices moved within weeks. Nearline hard drives sell overwhelmingly on long-term contracts, so the AI demand surge spent 2025 quietly consuming contract capacity before retail felt anything. ComputerBase&amp;rsquo;s single instrument shows the sequencing plainly: by August 2026 its RAM basket was up 345 percent from September 2025 while hard drives were up 129. The same shock, arriving through a slower pipe. The HDD story only broke into mainstream coverage in mid-January 2026, months after the RAM side&amp;rsquo;s climb began. If you extrapolate one from the other, the drive squeeze is the one with room left to run, which is also what the sold-out-through-2026 statements imply.&lt;/p>
&lt;h2 id="new-vs-recertified-vs-ssd-the-tb-math">New vs recertified vs SSD: the $/TB math&lt;/h2>
&lt;p>&lt;strong>New drives&lt;/strong> are the numbers in the table above: $41-61/TB across August 25&amp;rsquo;s captures, or 1.7x to 2.6x &lt;a href="https://camelcamelcamel.com/product/B0D1V2K4LJ" rel="noopener">the $23.75/TB July-2024 Amazon low camelcamelcamel tracked for the Red Pro SKU&lt;/a>. Enterprise buyers fare differently. &lt;a href="https://www.forbes.com/sites/tomcoughlin/2026/04/16/ssd-storage-capacity-prices-are-over-20-times-hdd-storage-capacity-prices/" rel="noopener">Forbes&amp;rsquo; Tom Coughlin puts a 30TB enterprise HDD at $668 in Q1 2026, about $22/TB and up 35 percent from Q2 2025&lt;/a>. A 30TB drive is cheaper per terabyte by construction, so part of that gap is capacity tier; the rest is who holds allocation. You are not on that list.&lt;/p>
&lt;p>&lt;strong>Recertified drives&lt;/strong> are the traditional escape hatch, and they still undercut new: our NAS guide&amp;rsquo;s July 3, 2026 pull found a recertified 16TB IronWolf Pro at &lt;a href="https://techfuelhq.com/homelab/best-nas-hard-drives-2026/">$31.25/TB, about 22 percent under the same model new&lt;/a>. But recert is a different product (seller warranty instead of manufacturer warranty, unknown prior duty), and its supply is drying up for the same reason new supply did. Recertified stock comes from returns, overstock, decommissioned fleets (none of it a steady pipeline), and &lt;a href="https://www.howtogeek.com/why-are-recertified-hard-drives-so-expensive-right-now/" rel="noopener">How-To Geek reported prices climbing back in October 2025&lt;/a> as data centers ran drives longer and returns got pressed back into service instead of hitting the recert channel. The index tracks new drives only and rejects recertified listings by rule, precisely so the two markets never blur into one number.&lt;/p>
&lt;p>&lt;strong>SSDs do not rescue you.&lt;/strong> The same AI demand hit flash at least as hard: ComputerBase&amp;rsquo;s August check had SSDs up 126 percent from September 2025, and Coughlin&amp;rsquo;s Q1 2026 enterprise comparison put QLC SSD capacity at 22.6 times the cost of equivalent HDD capacity. At retail, a 2TB NVMe ran $300-480 by mid-2026, which is $150-240/TB against our measured $41-61. Buy SSDs for speed. Bulk terabytes still belong to spinning rust, even angry-priced spinning rust.&lt;/p>
&lt;h2 id="when-will-hard-drive-prices-drop">When will hard drive prices drop?&lt;/h2>
&lt;p>Everything in this section is a projection and labeled as one; here is what the projections rest on.&lt;/p>
&lt;p>The supply side has told you its calendar. WD: sold out through calendar 2026, some agreements into 2027 and 2028. Seagate: fully allocated through 2026, order books for early 2027 opening &amp;ldquo;in the coming months&amp;rdquo; — a phrase from the February 2026 report that describes demand stretching into next year rather than easing. Neither company announced meaningful capacity expansion; Seagate explicitly said it is not expanding nearline production. Meanwhile the retail trackers were still printing record highs in mid-August 2026.&lt;/p>
&lt;p>So the floor of any honest forecast is: no relief while current supply is contractually spoken for, which is at minimum the rest of 2026. Whether 2027 brings actual consumer relief depends on AI storage demand cooling or new capacity arriving, and no source cited here commits to either. I am not going to invent a quarter. What I will commit to is the falsifiable version: the &lt;a href="https://techfuelhq.com/data/hdd-price-index/">index&lt;/a> publishes dated observations on a fixed method, so when the turn comes it will be visible in a CSV instead of argued from vibes. As of August 25, 2026, it has not come.&lt;/p>
&lt;h2 id="the-reliability-question-the-prices-force">The reliability question the prices force&lt;/h2>
&lt;p>At $24/TB, a dead drive was an annoyance. At $47-61/TB it is a budget event, and it changes two decisions.&lt;/p>
&lt;p>First, brand risk is now money. A &lt;a href="https://ieeexplore.ieee.org/document/11458693/" rel="noopener">peer-reviewed study of 443,156 Backblaze data-center drives&lt;/a> by Christoph Siemroth of the University of Essex and Yeomyung Park covered 1.66 million drive-years from 2013 through mid-2025, and it found HGST drives failing at about 41 percent of Seagate&amp;rsquo;s rate with WD near 52 percent, while Toshiba landed slightly worse than Seagate, holding age, capacity, form factor, and temperature constant. &lt;a href="https://www.blocksandfiles.com/disk/2026/08/07/hdd-failure-rates-by-manufacturer-revealed/5284845" rel="noopener">Blocks &amp;amp; Files&amp;rsquo; writeup&lt;/a> quotes the authors&amp;rsquo; conclusion plainly: &amp;ldquo;HGST HDDs are the most reliable, whereas Toshiba is the least reliable, closely followed by Seagate.&amp;rdquo; Those are enterprise-fleet statistics rather than a verdict on the specific NAS drive in your cart, and the authors flag the usual censoring caveats. But when the price of replacing a failure doubles, a measured factor-of-two difference in failure rate stops being trivia.&lt;/p>
&lt;p>Second, redundancy math shifted. RAID parity and a &lt;a href="https://techfuelhq.com/tutorials/automated-offsite-backups-restic-2026/">3-2-1 backup pipeline&lt;/a> used to be cheap insurance; now the insurance premium doubled along with the asset. That argues for buying the reliability question down with data rather than paying $60/TB for a badge; workload ratings and warranty terms per line are in the &lt;a href="https://techfuelhq.com/homelab/seagate-ironwolf-vs-ironwolf-pro-vs-exos-2026/">IronWolf vs Pro vs Exos comparison&lt;/a>.&lt;/p>
&lt;h2 id="how-i-track-this">How I track this&lt;/h2>
&lt;p>The numbers on this page that nobody else publishes come from a collector I run against Google Shopping&amp;rsquo;s US listings for twelve named 8TB drive lines. Every capture stores the complete raw API response, every accepted offer, and every rejected offer with machine-readable reasons; the qualifying observations publish as a dated CSV under CC BY 4.0 on the &lt;a href="https://techfuelhq.com/data/hdd-price-index/">HDD price index page&lt;/a>, method and change log included. Three captures ran for this article on August 25, 2026; their full evidence sits in the site&amp;rsquo;s repository alongside the dailies that preceded them.&lt;/p>
&lt;p>The index&amp;rsquo;s headline metric (median cheapest $/TB across lines) stays unpublished until six of twelve tracked lines qualify on one day, and that gate has not opened yet. The observations you saw above are exactly what they claim to be: dated, rule-filtered spot prices from direct retailers, nothing more. When a competitor, a Reddit thread, and an AI answer all quote different hard drive prices this year, the difference is usually the date and the seller class. Ours are stamped with both.&lt;/p>
&lt;p>If the price move matters to your build budget beyond drives, the &lt;a href="https://techfuelhq.com/articles/ram-ssd-price-crisis-2026/">RAM and SSD crisis page&lt;/a> covers the other half of the 2026 storage bill, and &lt;a href="https://techfuelhq.com/homelab/das-vs-nas-2026/">DAS vs NAS&lt;/a> settles whether you need a drive array at all before you price one.&lt;/p></description></item><item><title>Best Local LLM for Coding in 2026: Tested on a 16GB RTX 5080</title><link>https://techfuelhq.com/articles/best-local-llm-coding-2026/</link><pubDate>Tue, 25 Aug 2026 21:20:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/articles/best-local-llm-coding-2026/</guid><description>&lt;p>52 GB.&lt;/p>
&lt;p>That is the Q4_K_M download size of qwen3-coder-next, the model the top Reddit
answer and a front-page tech-site article both point you at when you search for
the best local coding LLM. My GPU has 16 GB. So, probably, does yours. The 5080,
the 4080, the 5070 Ti, the 4060 Ti 16GB are the cards people actually buy, and
most of the pages ranking &amp;ldquo;local&amp;rdquo; coding models never check whether their picks
load on any of them.&lt;/p>
&lt;p>So I checked. Then I went further. Every model that plausibly fits a 16GB card
went through the same eight coding tasks (bugfix, feature-from-spec,
test-writing, refactoring, explaining legacy code, SQL and regex, and a
two-turn agentic tool-calling exercise) on my own RTX 5080, twice each at temperature 0,
scored mechanically by executed checkers rather than by me nodding at the
output. The prompts are published as
&lt;a href="https://techfuelhq.com/data/coding-eval-tasks-v1.json">a versioned JSON file&lt;/a> so you can rerun the
whole thing tonight. Per-rep results are
&lt;a href="https://techfuelhq.com/data/rtx-5080-coding-eval-v1.csv">a CSV&lt;/a>. Tokens per second, VRAM figures,
and load times live in &lt;a href="https://techfuelhq.com/data/rtx-5080-llm-throughput/">the same open dataset&lt;/a>
that already tracks this card.&lt;/p>
&lt;p>Scope, stated plainly: one retail RTX 5080, ollama 0.32.1, driver 610.88,
August 2026. &amp;ldquo;Best&amp;rdquo; below means best in these tests on this card.&lt;/p>
&lt;h2 id="picks-as-of-august-2026-by-vram-tier">Picks as of August 2026, by VRAM tier&lt;/h2>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Your VRAM&lt;/th>
&lt;th scope="col">Pick&lt;/th>
&lt;th scope="col">Why&lt;/th>
&lt;th scope="col">First-party?&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>16 GB&lt;/td>
&lt;td>&lt;strong>gpt-oss:20b&lt;/strong>&lt;/td>
&lt;td>Only model to pass 8/8 tasks; fully resident at 178-190 tok/s&lt;/td>
&lt;td>Tested here&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>16 GB, quality ceiling&lt;/td>
&lt;td>&lt;strong>Qwen3-Coder 30B&lt;/strong> (offloaded)&lt;/td>
&lt;td>6/8 + best tool-calling; 74% GPU-resident, speed hangs on free system RAM&lt;/td>
&lt;td>Tested here&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>12 GB&lt;/td>
&lt;td>&lt;strong>qwen2.5-coder:14b&lt;/strong>&lt;/td>
&lt;td>9GB file fits; 5/8, solid for non-agentic work&lt;/td>
&lt;td>Task results tested here; no 12GB card owned&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>8 GB&lt;/td>
&lt;td>&lt;strong>qwen2.5-coder:7b&lt;/strong>&lt;/td>
&lt;td>4.7GB file fits; 4/8; completion and chat&lt;/td>
&lt;td>Task results tested here; no 8GB card owned&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>24 GB+&lt;/td>
&lt;td>Qwen3-Coder 30B fully resident&lt;/td>
&lt;td>Cited below; I don&amp;rsquo;t own the card&lt;/td>
&lt;td>No&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>Dated on purpose. Local-model rankings rot in weeks — the current dense
mid-size Qwen went 3.5 to 3.6 to 3.8 within months — so this table carries its
date and the &lt;a href="#method-limits-changelog">changelog&lt;/a> records revisions.
If the date reads stale, assume the picks are too.&lt;/p>
&lt;h2 id="what-the-top-ranking-lists-get-wrong">What the top-ranking lists get wrong&lt;/h2>
&lt;p>Before testing anything, I fit-checked the recommendations that currently rank
for this search against the registries they install from. Three verifiable
problems, receipts linked.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>A top-ranking 16GB guide recommends a model that does not exist.&lt;/strong> The page
(updated 2026-05-15, &lt;a href="https://web.archive.org/web/20260825204844/https://bestllmfor.com/guides/best-local-llm-16gb-vram/" rel="noopener">archived snapshot&lt;/a>)
recommends &amp;ldquo;Llama 3.3 14B Q5_K_M (10.1 GB),&amp;rdquo; with benchmark scores and a
December-2025 release story attached. &lt;a href="https://huggingface.co/meta-llama" rel="noopener">Meta&amp;rsquo;s own model catalog&lt;/a>
carries Llama 3.3 at exactly one size, 70B. The same page recommends a
&amp;ldquo;Qwen3-Coder 32B&amp;rdquo;; &lt;a href="https://ollama.com/library/qwen3-coder/tags" rel="noopener">the family ships at 30B and 480B&lt;/a>.&lt;/li>
&lt;li>&lt;strong>The community&amp;rsquo;s favorites often need 3-4x your VRAM.&lt;/strong> qwen3-coder-next,
genuinely excellent by every account, is
&lt;a href="https://ollama.com/library/qwen3-coder-next/tags" rel="noopener">a 52GB download at Q4_K_M&lt;/a>.
DeepSeek V4-Flash, a fixture of &amp;ldquo;self-hosted coding&amp;rdquo; lists, is
&lt;a href="https://huggingface.co/deepseek-ai" rel="noopener">291 billion parameters&lt;/a>. Kimi K2.7 Code&amp;rsquo;s
ollama entry is &lt;a href="https://ollama.com/library/kimi-k2.7-code/tags" rel="noopener">a cloud-routed tag&lt;/a>,
not local weights at all.&lt;/li>
&lt;li>&lt;strong>Speed claims travel without their hardware.&lt;/strong> The most-quoted number for
Qwen3-Coder 30B, 220 tok/s, comes from a guide whose own tier chart puts the
model in a &amp;ldquo;24GB sweet spot&amp;rdquo; and never names the GPU it ran. On a 16GB card
the same model cannot fully load. The measured number is below.&lt;/li>
&lt;/ul>
&lt;p>No accusation about how any of those pages got written. The errors speak for
themselves, and they are the reason this page exists: every number on it comes
from one named card, by a method you can rerun.&lt;/p>
&lt;h2 id="how-i-tested">How I tested&lt;/h2>
&lt;p>Same rig as &lt;a href="https://techfuelhq.com/data/rtx-5080-llm-throughput/">the throughput dataset&lt;/a>: retail
RTX 5080 (16,303 MiB), Ryzen 7 7800X3D, 32GB RAM, Windows 11, ollama 0.32.1,
driver 610.88. Models pinned by digest in the raw logs, because tags move.&lt;/p>
&lt;p>Eight tasks, each scored by a machine.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Bugfix.&lt;/strong> A binary search returning the wrong boundary; the fix must pass 8 cases.&lt;/li>
&lt;li>&lt;strong>Implement from spec.&lt;/strong> &lt;code>parse_duration(&amp;quot;1h30m15s&amp;quot;)&lt;/code>, with ten ValueError traps.&lt;/li>
&lt;li>&lt;strong>Write tests.&lt;/strong> Given a working LRU cache, write a &lt;code>check()&lt;/code> strong enough
to pass the real implementation and also kill a planted mutant that evicts
the wrong entry.&lt;/li>
&lt;li>&lt;strong>Refactor.&lt;/strong> Collapse triple copy-paste into a helper. Behavior must stay
identical across five input sets, and a helper function must exist.&lt;/li>
&lt;li>&lt;strong>Explain legacy code.&lt;/strong> An unlabeled Luhn implementation; name it.&lt;/li>
&lt;li>&lt;strong>SQL.&lt;/strong> A join with an aggregate and a HAVING filter, executed on seeded
SQLite and compared row-for-row, with boundary rows planted on purpose.&lt;/li>
&lt;li>&lt;strong>Regex.&lt;/strong> A semver matcher against 17 match/no-match cases via &lt;code>re.fullmatch&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Agentic tool-calling.&lt;/strong> Two function schemas, one two-step request. A pass
requires correct structured tool calls, the thing an agentic coding tool
(aider, opencode, Continue) consumes. Prose descriptions of what the model
&amp;ldquo;would&amp;rdquo; do score zero.&lt;/li>
&lt;/ol>
&lt;p>Identical prompts, temperature 0, seed 42, 8k context, two repetitions. A task
counts only when both reps pass; one-of-two is reported as flaky, never rounded
up. Two scoring defects I found and fixed during the build are worth naming,
because benchmark pages never admit these. My reference LRU crashed on a
capacity-0 probe, which punished exactly the models thorough enough to test
that edge. My refactor checker initially rejected helpers nested inside the
function, which is a perfectly good refactor. Both fixtures were fixed and
every affected task re-run for every model. The eval is versioned. So are its
mistakes.&lt;/p>
&lt;p>What this is not: SWE-bench. Eight tasks cannot rank frontier coding ability —
&lt;a href="https://aider.chat/docs/leaderboards/" rel="noopener">Aider&amp;rsquo;s leaderboard&lt;/a> exists for that.
They are built to separate &amp;ldquo;autocompletes plausibly&amp;rdquo; from &amp;ldquo;follows the spec,
checks the edges, and drives tools&amp;rdquo; at exactly the size class a 16GB card
forces on you.&lt;/p>
&lt;h2 id="the-16gb-tier-measured">The 16GB tier, measured&lt;/h2>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Model&lt;/th>
&lt;th scope="col">Bugfix&lt;/th>
&lt;th scope="col">Spec&lt;/th>
&lt;th scope="col">Tests&lt;/th>
&lt;th scope="col">Refactor&lt;/th>
&lt;th scope="col">Explain&lt;/th>
&lt;th scope="col">SQL&lt;/th>
&lt;th scope="col">Regex&lt;/th>
&lt;th scope="col">Tools&lt;/th>
&lt;th scope="col">Stable&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>gpt-oss:20b&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>&lt;strong>8/8&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qwen3-Coder 30B&lt;/td>
&lt;td>fail&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>1 of 2&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>6/8&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>devstral:24b¹&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>fail&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>fail&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>6/8&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>qwen2.5-coder:14b&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>fail&lt;/td>
&lt;td>fail&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>fail&lt;/td>
&lt;td>5/8&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>qwen2.5-coder:7b&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>fail&lt;/td>
&lt;td>fail&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>pass&lt;/td>
&lt;td>fail&lt;/td>
&lt;td>fail&lt;/td>
&lt;td>4/8&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>¹ devstral ran at 4k context; the exception is explained two sections down.&lt;/p>
&lt;p>&lt;strong>gpt-oss:20b swept it.&lt;/strong> Eight for eight, both repetitions. That includes the
only perfect two-turn tool-calling run, and a capacity-0 edge-case test on the
test-writing task strict enough to break my original checker. It is also the
fastest real option at this tier. The 13.4GB MXFP4 build stays fully
GPU-resident, decodes at 178-190 tok/s across two dated captures in
&lt;a href="https://techfuelhq.com/data/rtx-5080-llm-throughput/">the dataset&amp;rsquo;s controlled runs&lt;/a>, and held
~152-156 tok/s while doing actual eval work with a checker pipeline running
beside it. The eval settled something the throughput table couldn&amp;rsquo;t. The MoE
speed champion from &lt;a href="https://techfuelhq.com/articles/mxfp4-vs-q4km-rtx-5080/">the MXFP4 analysis&lt;/a> is
also the best-behaved coding model at this size.&lt;/p>
&lt;p>&lt;strong>Qwen3-Coder 30B is the interesting one.&lt;/strong> The community is right that it is
strong. Best-in-eval tool-calling (both calls, correct arguments, single turn),
clean SQL, clean regex, clean spec work. Two honest dents. It failed the
plainest task on the sheet, the binary-search boundary fix, in all four scored
repetitions across two runs. Its test-writing was flaky. And it does not fit:
ollama&amp;rsquo;s 19GB Q4_K_M ran &lt;strong>74% GPU-resident&lt;/strong> at 8k context, and
&lt;a href="https://techfuelhq.com/data/rtx-5080-llm-throughput/">the dataset&amp;rsquo;s controlled cells&lt;/a> put it at
&lt;strong>62 tok/s at 4k context and 52 at 16k&lt;/strong> — brisk for a spilling 19GB model
(the MoE only activates ~3B parameters per token), still a third of gpt-oss&amp;rsquo;s
rate. Treat even that number as conditional. The same model measured anywhere
from 0.7 to 83 tok/s across three host-memory states, which is the next
section&amp;rsquo;s story.&lt;/p>
&lt;p>&lt;strong>devstral is the specialist showing its age.&lt;/strong> Mistral&amp;rsquo;s dedicated agentic
coder (still the newest dedicated one on ollama, at over a year old) wrote the
best tests of any model here and tool-called cleanly. Its SWE tuning shows.
It also failed spec-following and regex, and its 14GB file plus KV cache would
not stay resident at 8k context on this card.&lt;/p>
&lt;p>&lt;strong>The qwen2.5-coder pair is what &amp;ldquo;coder model&amp;rdquo; meant in 2024, measured in 2026.&lt;/strong>
Both aced the bugfix, the refactor, the SQL task, and code explanation. Both failed the
same three modern requirements. Strict spec-following: each accepted &lt;code>&amp;quot;15s1h&amp;quot;&lt;/code>
as a valid duration, ignoring the stated unit order. Test-writing: the 14B&amp;rsquo;s
recency test asserts the wrong eviction victim, so the test itself
misunderstands LRU. And structured tool-calling, where both produced prose
descriptions instead of tool calls. Fine completion engines. Not agents.&lt;/p>
&lt;h3 id="system-ram-quietly-gates-offloaded-models">System RAM quietly gates offloaded models&lt;/h3>
&lt;p>Nobody&amp;rsquo;s tier list mentions this, and it cost me half a benchmarking night.
When a model spills past VRAM, its speed is hostage to free system RAM. Same
card, same model, same night: Qwen3-Coder 30B decoded at &lt;strong>83 tok/s&lt;/strong> with
~20GB of system RAM free, and at &lt;strong>under 1 tok/s&lt;/strong> while a pair of runaway
indexing jobs had the machine down to 1.2GB free and paging. The dense devstral
collapsed the same way at 8k context (0.8 tok/s) with far less spilled. If you
run a spilling model, budget real RAM headroom for the spilled layers, or stay
resident and keep the speed. &lt;a href="https://techfuelhq.com/tools/llm-vram-calculator/">The VRAM calculator&lt;/a>
tells you which side of that line a model lands on, and
&lt;a href="https://techfuelhq.com/articles/local-llm-by-gpu-vram-2026/">the VRAM tier guide&lt;/a> owns the fit math
in depth.&lt;/p>
&lt;h2 id="12-gb-and-8-gb-what-transfers-and-what-does-not">12 GB and 8 GB: what transfers and what does not&lt;/h2>
&lt;p>A VRAM-capped 5080 is not an 8GB card. Restricting my GPU would fake the memory
ceiling while keeping 5080 bandwidth and compute, so I did not do it, and no
number here pretends otherwise. What I can honestly hand you:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Task results transfer.&lt;/strong> qwen2.5-coder:14b at Q4_K_M is a 9GB file that
fits a 12GB card with context room. Its pass/fail rows above are properties
of the weights, not of my GPU. Same for qwen2.5-coder:7b (4.7GB) on 8GB cards.&lt;/li>
&lt;li>&lt;strong>Speed numbers do not transfer.&lt;/strong> My tokens per second came from a 960 GB/s
card. For the budget tier, &lt;a href="https://techfuelhq.com/tutorials/self-host-local-llm-rtx-5060-2026/">the RTX 5060 walkthrough&lt;/a>
has first-party numbers from that class of card. Beyond it, demand a GPU name
next to any tok/s figure you read.&lt;/li>
&lt;li>&lt;strong>The quality cliff lives in the quant.&lt;/strong> A 12GB card running the 14B at
Q4_K_M gets exactly the model I tested. Squeezing a larger model in via
Q2/Q3 quants gets you a different, worse model, whatever the tier.
&lt;a href="https://techfuelhq.com/articles/mxfp4-vs-q4km-rtx-5080/">The quant mechanics piece&lt;/a> shows why.&lt;/li>
&lt;/ul>
&lt;h2 id="24-gb-and-up-cited-rather-than-tested">24 GB and up, cited rather than tested&lt;/h2>
&lt;p>I don&amp;rsquo;t own a 24GB card, so this section is fit math and labeled third-party
positioning. No borrowed benchmarks.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Qwen3-Coder 30B fully resident&lt;/strong> is the obvious 24GB move. The same 19GB
file that spills here loads whole there, and its task profile above is
second-best on this page even with the handicap.&lt;/li>
&lt;li>&lt;strong>Qwen3.8-27B&lt;/strong>, the current dense mid-size Qwen (mid-August 2026):
&lt;a href="https://huggingface.co/unsloth/Qwen3.8-27B-GGUF" rel="noopener">Unsloth&amp;rsquo;s UD-Q4_K_M GGUF is 16.5GB&lt;/a>.
The weights alone match this card&amp;rsquo;s entire memory, the classic
one-gigabyte-too-far case. On 24GB it fits with room. Untested here.&lt;/li>
&lt;li>&lt;strong>Laguna XS 2.1&lt;/strong> (Poolside&amp;rsquo;s 33B) quantizes to roughly 19-20GB. Same story
as the 30B, without the MoE discount on offload.&lt;/li>
&lt;li>&lt;strong>qwen3-coder-next (52GB)&lt;/strong> and &lt;strong>gpt-oss:120b (65GB)&lt;/strong> are 48-64GB-class
machines&amp;rsquo; problems. &lt;a href="https://techfuelhq.com/articles/local-llm-by-gpu-vram-2026/">The VRAM tier guide&lt;/a>
covers that end.&lt;/li>
&lt;/ul>
&lt;h2 id="agentic-coding-which-models-drive-tools">Agentic coding: which models drive tools&lt;/h2>
&lt;p>The task that split the field cleanest is the one the field argues about most.
Given two function schemas and &amp;ldquo;create the directory, then write the file,&amp;rdquo;
scored on structured tool calls only:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>gpt-oss:20b&lt;/strong> made the correct create-directory call, took the tool result
back, and followed with a correct write-file call carrying the exact content.
Both reps. This is the loop an agentic coding tool runs all day.&lt;/li>
&lt;li>&lt;strong>Qwen3-Coder 30B&lt;/strong> emitted both calls with correct arguments in a single
turn. Also correct, arguably more efficient. One nuance for tinkerers:
ollama parses this model&amp;rsquo;s tool-call format at the engine level, so you get
structured calls even though its chat template never mentions tools.&lt;/li>
&lt;li>&lt;strong>devstral&lt;/strong> delivered a clean create-then-write across two turns.&lt;/li>
&lt;li>&lt;strong>qwen2.5-coder 7B and 14B&lt;/strong> described what they would do, in prose, both
reps, tools unused. If your workflow is aider-style automation, that is a
disqualifier no HumanEval score will warn you about.&lt;/li>
&lt;/ul>
&lt;h2 id="when-the-cloud-is-honestly-better">When the cloud is honestly better&lt;/h2>
&lt;p>If your daily work is large multi-file refactors across an unfamiliar codebase,
a frontier hosted model is still better than anything on this page, and no
amount of local-AI enthusiasm changes it. The local case is different and real.
Unlimited volume at zero marginal cost, with code that never leaves the
machine and keeps working offline. And, as of this eval, genuinely competent
spec-following and tool-driving at the 16-20B class.
&lt;a href="https://techfuelhq.com/tools/selfhost-breakeven/">The break-even calculator&lt;/a> does the cost half of
that argument with your numbers instead of mine.&lt;/p>
&lt;h2 id="running-the-winner">Running the winner&lt;/h2>
&lt;p>&lt;code>ollama pull gpt-oss:20b&lt;/code> and it fits with room to think at 8k context. The
practical notes from living with it during this eval: it spends tokens on
reasoning before answering (the 4096-token output budget here exists because a
2048 cap cut off one of its correct answers mid-fence), it held 178-190 tok/s
across the dataset&amp;rsquo;s two captures at 4k and 16k context alike, and it pairs with
&lt;a href="https://techfuelhq.com/self-hosted/ollama-vs-llamacpp-rtx-5080-2026/">Ollama or llama.cpp equally well&lt;/a>.
llama.cpp squeezes out a bit more decode if you want it. For the offloaded 30B
path instead, budget a ~15GB whole-GPU footprint, expect roughly 62 tok/s at 4k
context and 52 at 16k on this card when system RAM is free, and read
&lt;a href="https://techfuelhq.com/data/rtx-5080-llm-throughput/">the dataset&amp;rsquo;s offload note&lt;/a> before trusting
any single number for a spilling model — including mine.&lt;/p>
&lt;h2 id="method-limits-changelog">Method, limits, changelog&lt;/h2>
&lt;p>One card, one runner, one driver, eight tasks, two reps. Enough to rank what
fits a 16GB card for coding work. Nowhere near enough to rank frontier models.
Quantization was Q4_K_M-class throughout (MXFP4 for gpt-oss). NVFP4, the
Blackwell-only 4-bit path, shows
&lt;a href="https://github.com/ggml-org/llama.cpp/discussions/23627" rel="noopener">mixed community results&lt;/a>
and ollama does not expose it, so it stays cited rather than quoted. Task
outcomes are near-deterministic at temperature 0 but not guaranteed identical
across driver or runtime versions, which is why every rep sits in
&lt;a href="https://techfuelhq.com/data/rtx-5080-coding-eval-v1.csv">the published CSV&lt;/a> with its model digest
and runtime version attached.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>2026-08-26 — v1.&lt;/strong> Five models, eval v1, throughput dataset v1.1.0.&lt;/li>
&lt;/ul>
&lt;p>Corrections to measured rows land in
&lt;a href="https://techfuelhq.com/data/rtx-5080-llm-throughput/">the dataset changelog&lt;/a>; pick revisions land
here, dated. The next scheduled look is the next model-meta shift. Lately that
has been monthly.&lt;/p></description></item><item><title>Jellyfin Remote Access: Pick the Right Path for Your Situation (2026)</title><link>https://techfuelhq.com/tutorials/jellyfin-remote-access-2026/</link><pubDate>Tue, 25 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/tutorials/jellyfin-remote-access-2026/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · 2026-08-25 · ~12 min read · St. Louis County, MO&lt;/p>
&lt;img src="https://techfuelhq.com/images/tutorials/jellyfin-remote-access-2026.svg" alt="Decision diagram for Jellyfin remote access: four paths from a home Jellyfin server - Tailscale mesh VPN to your own phones and laptops, reverse proxy with a domain to family TVs and browsers, VPS relay via WireGuard or Pangolin for CGNAT connections, and Cloudflare Tunnel marked with a terms-of-service warning for video" width="1200" height="630" loading="eager" fetchpriority="high" style="display:block;margin:1.5rem auto;max-width:100%;height:auto;border:1px solid #1e1e3a;border-radius:8px;" />
&lt;p>Jellyfin does not have a relay. That single architecture fact generates the question this page answers. When a Plex user hits play from a hotel, Plex&amp;rsquo;s own infrastructure brokers the connection; when Plex put that convenience behind a paywall in 2025, the &lt;a href="https://techfuelhq.com/articles/jellyfin-vs-plex-2026/">migration wave toward Jellyfin&lt;/a> began, and every migrant hit the same wall about a week in. Jellyfin gives you a checkbox that says &lt;em>Allow remote connections to this server&lt;/em> and leaves the actual path from the outside world to your basement entirely to you.&lt;/p>
&lt;p>The r/jellyfin community answers this question so often that a post sitting at 279-plus upvotes as of late August 2026 is literally titled &lt;a href="https://www.reddit.com/r/jellyfin/comments/1vtff2e/im_kinda_tired_of_the_constant_remote_access/" rel="noopener">&amp;ldquo;I&amp;rsquo;m kinda tired of the constant remote access questions&amp;rdquo;&lt;/a> — 250-plus comments of people relitigating the same four options. Listing the options was never the hard part. Matching one to your situation is. So this guide routes first and explains second.&lt;/p>
&lt;div class="verdict-card" style="border:1px solid #c8ff00;border-left:4px solid #c8ff00;border-radius:6px;padding:1.25rem 1.5rem;margin:1.5rem 0 2rem 0;background:rgba(200,255,0,0.04);">
&lt;p>&lt;strong>TL;DR · Route yourself before reading anything else&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>&lt;tr>&lt;th>Your situation&lt;/th>&lt;th>Use this&lt;/th>&lt;/tr>&lt;/thead>
&lt;tbody>
&lt;tr>&lt;td>Just you, on your own phone and laptop&lt;/td>&lt;td>&lt;strong>Tailscale&lt;/strong> (Path 1)&lt;/td>&lt;/tr>
&lt;tr>&lt;td>You + household, every device can install apps&lt;/td>&lt;td>&lt;strong>Tailscale&lt;/strong>, apps on each device (Path 1)&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Family elsewhere, watching on smart TVs&lt;/td>&lt;td>&lt;strong>Reverse proxy + your own domain&lt;/strong> (Path 2)&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Family elsewhere on TVs, but your ISP uses CGNAT&lt;/td>&lt;td>&lt;strong>VPS relay: Pangolin or WireGuard bounce&lt;/strong> (Path 3)&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Non-technical viewers who will not install anything&lt;/td>&lt;td>&lt;strong>Reverse proxy&lt;/strong> - a URL in a browser is the only universal client (Path 2 or 3)&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Hotel room / a TV you do not own&lt;/td>&lt;td>&lt;strong>Travel streaming stick with Tailscale&lt;/strong>, or laptop + HDMI (device table below)&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Roku in another house&lt;/td>&lt;td>&lt;strong>Reverse proxy or VPS relay&lt;/strong> - no Tailscale client exists for Roku&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Tempted by Cloudflare Tunnel because it is free&lt;/td>&lt;td>&lt;strong>Read Path 4 first&lt;/strong> - video streaming sits against Cloudflare's CDN terms&lt;/td>&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;h2 id="why-just-use-tailscale-keeps-failing-people">Why &amp;ldquo;just use Tailscale&amp;rdquo; keeps failing people&lt;/h2>
&lt;p>Tailscale is the default answer in every thread, and for the person asking, it is usually right. It is also the answer I give for a solo setup, so this is not a takedown. The failures cluster in one place: &lt;strong>the devices you do not control.&lt;/strong>&lt;/p>
&lt;p>Tailscale reaches a device by running a client on it. The client coverage is better than most people assume in 2026 - there is an &lt;a href="https://tailscale.com/docs/install/android" rel="noopener">Android TV app in the Play Store&lt;/a>, an &lt;a href="https://tailscale.com/docs/install/amazon-fire" rel="noopener">Amazon Appstore app for Fire TV&lt;/a> (most devices after 2018, though Tailscale states it does not support the Fire TV Stick 4K Select), and an &lt;a href="https://tailscale.com/kb/1280/appletv" rel="noopener">Apple TV app&lt;/a>. But Tailscale&amp;rsquo;s &lt;a href="https://tailscale.com/kb/1347/installation" rel="noopener">supported-platform list&lt;/a> ends there for TVs. No Roku. No LG webOS. No Samsung Tizen. Jellyfin ships &lt;a href="https://jellyfin.org/downloads/clients/" rel="noopener">official apps for all three&lt;/a>, so the missing piece is the network path. Your mother-in-law&amp;rsquo;s Roku can run Jellyfin; it cannot run your VPN.&lt;/p>
&lt;p>The second failure is human. A tailnet wants an account relationship with every participant: you either share devices to their Tailscale account or manage logins for them. For a household that tolerates you, fine. For the relative who calls when the TV &amp;ldquo;stopped working,&amp;rdquo; each moving part you added is a future phone call. The 100-plus-comment version of this complaint is &lt;a href="https://www.reddit.com/r/jellyfin/comments/1tu1tvy/" rel="noopener">&amp;ldquo;I&amp;rsquo;m eyeing Jellyfin (currently use Plex w/ a Lifetime pass)&amp;rdquo;&lt;/a>, a holder of the old Plex deal asking whether Jellyfin can match that remote simplicity for non-technical family - and the honest answer is: only if you build the path that needs nothing installed, which is Path 2.&lt;/p>
&lt;p>So run Tailscale when you control the endpoints, and something with a plain HTTPS URL when you do not.&lt;/p>
&lt;h2 id="path-1-tailscale-or-another-mesh-vpn">Path 1: Tailscale (or another mesh VPN)&lt;/h2>
&lt;p>This is the path for you, your own devices, and a household that installs apps. It costs $0. The free &lt;a href="https://tailscale.com/pricing" rel="noopener">Personal plan&lt;/a> covers up to 6 users with unlimited devices, which is most homes.&lt;/p>
&lt;p>The mechanics are in our &lt;a href="https://techfuelhq.com/tutorials/tailscale-remote-access-homelab-2026/">Tailscale homelab guide&lt;/a> — client on the server, client on each viewer, then the Jellyfin apps talk to &lt;code>http://&amp;lt;tailscale-ip&amp;gt;:8096&lt;/code> from anywhere. The &lt;a href="https://techfuelhq.com/tutorials/jellyfin-setup-docker-homelab-2026/">Jellyfin Docker guide&lt;/a> covers the server side in Step 6. Traffic stays WireGuard-encrypted end to end, nothing is exposed to the internet, and CGNAT does not matter because every connection is outbound.&lt;/p>
&lt;p>Two honest caveats. Battery and cellular behavior on phones is solved, but every viewer&amp;rsquo;s device must keep its VPN toggled on, and the failure mode when it silently is not - &amp;ldquo;your server is down&amp;rdquo; - lands on you. And if you would rather self-host the coordination server too, that is &lt;a href="https://techfuelhq.com/networking/headscale-self-hosted-tailscale-2026/">Headscale&lt;/a>, with the same client math.&lt;/p>
&lt;p>Do not confuse this path with Tailscale Funnel, which publishes a tailnet service to the open internet through Tailscale&amp;rsquo;s relays. Tailscale &lt;a href="https://tailscale.com/kb/1223/funnel" rel="noopener">documents Funnel traffic as subject to non-configurable bandwidth limits&lt;/a> - a constraint that rules it out for pushing video at your family every evening.&lt;/p>
&lt;h2 id="path-2-reverse-proxy--your-own-domain">Path 2: Reverse proxy + your own domain&lt;/h2>
&lt;p>This is the path for family on TVs and for viewers who install nothing, because any client with a browser or a Jellyfin app that accepts a URL can reach it. It needs a public IPv4 address and ports 80/443 forwarded on your router. The only recurring cost is an ordinary domain registration, since the proxy automates a free Let&amp;rsquo;s Encrypt TLS certificate.&lt;/p>
&lt;p>This is the path I validated end to end while writing this guide, on a bare Windows box with no Docker, because the claim &amp;ldquo;a reverse proxy in front of Jellyfin is fiddly&amp;rdquo; deserved a test. It is not fiddly anymore. The sequence, timed:&lt;/p>
&lt;ol>
&lt;li>Jellyfin 10.11.11 portable zip unpacked to a folder and started: &lt;strong>about three minutes&lt;/strong> from download to a listening server on port 8096. No installer, no admin rights.&lt;/li>
&lt;li>The setup wizard&amp;rsquo;s &lt;em>Set up Remote Access&lt;/em> screen shows one checkbox — &lt;strong>Allow remote connections to this server&lt;/strong> — already checked by default. I verified the shipped network config afterward through the API: remote access on, UPnP &lt;strong>off&lt;/strong>, HTTPS &lt;strong>off&lt;/strong>, Known Proxies empty. Jellyfin never opens your router for you and never brings its own TLS - both are deliberately your job, and both are exactly what the proxy provides.&lt;/li>
&lt;li>&lt;a href="https://caddyserver.com/" rel="noopener">Caddy&lt;/a> as the proxy, one binary, and the entire working config is this:&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>media.yourdomain.com {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> reverse_proxy 127.0.0.1:8096
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>That is the whole file. With a real domain pointed at your IP, Caddy obtains and renews the Let&amp;rsquo;s Encrypt certificate on its own. Against my local instance I watched the three things that historically break proxied Jellyfin all come back clean: the web client served, logins authenticated, and the websocket upgrade returned &lt;code>101 Switching Protocols&lt;/code> with &lt;strong>zero&lt;/strong> websocket-specific configuration. That last one matters because Jellyfin&amp;rsquo;s &lt;a href="https://jellyfin.org/docs/general/post-install/networking/reverse-proxy/" rel="noopener">reverse-proxy docs&lt;/a> warn that not every proxy passes websockets by default - nginx wants explicit upgrade headers, and the equivalent toggle is the classic missed step in &lt;a href="https://techfuelhq.com/tutorials/nginx-proxy-manager-homelab-2026/">Nginx Proxy Manager&lt;/a>. Caddy is also what Jellyfin&amp;rsquo;s own docs recommend first, &amp;ldquo;for its ease of use.&amp;rdquo; On the same evidence, I concur. (Choosing between Caddy, NPM, and Traefik is &lt;a href="https://techfuelhq.com/homelab/caddy-vs-nginx-proxy-manager-vs-traefik-2026/">its own comparison&lt;/a>.)&lt;/p>
&lt;p>One Windows-specific wrinkle from the test worth passing on: Caddy&amp;rsquo;s self-signed local mode pauses on an interactive certificate-trust prompt. Irrelevant for the real deployment - public certificates involve no local trust store - but if you dry-run with &lt;code>local_certs&lt;/code> first, expect that prompt.&lt;/p>
&lt;p>Two settings finish the job properly. Add the proxy&amp;rsquo;s IP to &lt;strong>Known Proxies&lt;/strong> in Jellyfin&amp;rsquo;s networking settings, or every viewer shows up in your logs as the proxy&amp;rsquo;s address instead of their own - the docs flag this, and the fresh-install default I captured (empty list) means it is always on you to set. And leave Jellyfin itself listening on plain 8096 bound to localhost or the LAN; the proxy is the only thing that should face the world. &lt;strong>Never forward 8096 directly&lt;/strong> - that is unencrypted HTTP with your login page on it, and it is the port-forward horror story the community warnings are actually about.&lt;/p>
&lt;p>What kills this path is not skill. It is &lt;a href="https://techfuelhq.com/networking/tailscale-vs-cloudflare-tunnel-2026/">CGNAT&lt;/a> - if your ISP does not give you a real public IPv4, no amount of port forwarding helps, and dynamic-DNS tricks change nothing. Check before you buy a domain. If your router&amp;rsquo;s WAN address falls in the 100.64.x-100.127.x range (&lt;a href="https://www.rfc-editor.org/rfc/rfc6598" rel="noopener">RFC 6598 shared address space&lt;/a>), or the &amp;ldquo;what is my IP&amp;rdquo; number differs from the router&amp;rsquo;s WAN number, you are CGNATed and you want Path 3.&lt;/p>
&lt;h2 id="path-3-vps-relay---the-cgnat-escape-hatch">Path 3: VPS relay - the CGNAT escape hatch&lt;/h2>
&lt;p>This fits everything Path 2 fits, for the case where the ISP will not give you a public IP or you refuse to open home ports. The going figure in &lt;a href="https://www.reddit.com/r/jellyfin/comments/1uqgqil/" rel="noopener">the community threads&lt;/a> is about &lt;strong>$5/month&lt;/strong> for a small VPS.&lt;/p>
&lt;p>The idea is to rent the public IP you do not have. A minimal VPS gets the public endpoint; your home server connects outward to it; visitor traffic enters the VPS and rides that outbound tunnel home. Three implementations, in ascending order of hand-holding:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>WireGuard bounce&lt;/strong> - the DIY version. WireGuard on both ends, forwarding rules on the VPS. Full control, most assembly; our &lt;a href="https://techfuelhq.com/tutorials/wireguard-self-hosted-vpn-proxmox-2026/">WireGuard on Proxmox guide&lt;/a> covers the VPN half.&lt;/li>
&lt;li>&lt;strong>FRP&lt;/strong> (fast reverse proxy) - the same shape with a purpose-built tool, popular in the budget threads.&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://github.com/fosrl/pangolin" rel="noopener">Pangolin&lt;/a>&lt;/strong> - the project that broke out in 2026, and the reason this section is not just &amp;ldquo;run WireGuard.&amp;rdquo; It is a WireGuard-based, identity-aware tunneled reverse proxy: dashboard, per-app authentication, Let&amp;rsquo;s Encrypt handling, all self-hosted. Its &lt;a href="https://docs.pangolin.net/self-host/quick-install" rel="noopener">own requirements&lt;/a> state the deal plainly: a Linux server with a public IP, a domain, and ports 80/443 (TCP) plus 51820/21820 (UDP). At 22.5k GitHub stars it has become the default answer to &amp;ldquo;self-hosted Cloudflare Tunnel alternative,&amp;rdquo; and there is a &lt;a href="https://www.pangolin.net/pricing" rel="noopener">managed free tier&lt;/a> (5 users, 5 sites) if you want to try the model before renting anything.&lt;/li>
&lt;/ul>
&lt;p>The trade nobody advertises: every stream now transits the VPS, so your remote picture quality is capped by the VPS provider&amp;rsquo;s bandwidth and your home upload, whichever is worse. Budget VPS bandwidth caps are real; check the fine print against your bitrates before moving the family movie night onto one.&lt;/p>
&lt;h2 id="path-4-cloudflare-tunnel---free-easy-and-built-on-someone-elses-tolerance">Path 4: Cloudflare Tunnel - free, easy, and built on someone else&amp;rsquo;s tolerance&lt;/h2>
&lt;p>Cloudflare Tunnel deserves its reputation for polish: outbound-only connector, free HTTPS URL, CGNAT-proof, no client software for viewers. For a wiki or a dashboard I recommend it without hesitation - the &lt;a href="https://techfuelhq.com/networking/tailscale-vs-cloudflare-tunnel-2026/">full comparison against Tailscale&lt;/a> covers where it shines.&lt;/p>
&lt;p>For Jellyfin specifically, read the terms before you build on it. Cloudflare&amp;rsquo;s &lt;a href="https://www.cloudflare.com/service-specific-terms-application-services/" rel="noopener">service-specific terms&lt;/a>, as published on 2026-08-25, state that unless you are an Enterprise customer, &amp;ldquo;Cloudflare offers specific Paid Services (e.g., the Developer Platform, Images, and Stream) that you must use in order to serve video and other large files via the CDN,&amp;rdquo; and that Cloudflare &amp;ldquo;reserves the right to disable or limit your access to or use of the CDN&amp;rdquo; if you serve &amp;ldquo;video or a disproportionate percentage of pictures, audio files, or other large files&amp;rdquo; without them.&lt;/p>
&lt;p>Streaming your library through a free tunnel is exactly that. The record supports two observations at once. Enforcement against small personal servers is rare in practice — the community is full of people doing it quietly — and &lt;strong>no threshold is published anywhere&lt;/strong>, so any &amp;ldquo;under X TB you&amp;rsquo;re fine&amp;rdquo; claim you read is folklore, not policy. Both things are true, and together they mean the availability of your family&amp;rsquo;s media server depends on a policy Cloudflare applies at its own discretion. That is a fine risk for an experiment and a bad foundation for the thing your household relies on. There is also a mechanical constraint that bites before the policy does: the &lt;a href="https://developers.cloudflare.com/support/troubleshooting/http-status-codes/4xx-client-error/error-413/" rel="noopener">100 MB request-body cap&lt;/a> on free plans breaks large uploads through the same hostname.&lt;/p>
&lt;p>If the tunnel&amp;rsquo;s shape is what you want - outbound-only, no exposed home ports, URL for everyone - Pangolin in Path 3 is that shape with the policy risk replaced by a small VPS bill.&lt;/p>
&lt;h2 id="the-device-truth-table">The device truth table&lt;/h2>
&lt;p>The rows are where remote-access plans actually die. &amp;ldquo;Works&amp;rdquo; here means the normal Jellyfin app experience over that path.&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Device&lt;/th>
&lt;th scope="col">Jellyfin app&lt;/th>
&lt;th scope="col">Tailscale (Path 1)&lt;/th>
&lt;th scope="col">Proxy/relay URL (Paths 2-3)&lt;/th>
&lt;th scope="col">Reality check&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Android / Google TV&lt;/td>
&lt;td>&lt;a href="https://jellyfin.org/downloads/clients/" rel="noopener">Official&lt;/a>&lt;/td>
&lt;td>✅ &lt;a href="https://tailscale.com/docs/install/android" rel="noopener">Play Store client&lt;/a>&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>Best-covered TV platform: both paths work&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Fire TV&lt;/td>
&lt;td>Official (Android TV app)&lt;/td>
&lt;td>✅ &lt;a href="https://tailscale.com/docs/install/amazon-fire" rel="noopener">Amazon Appstore&lt;/a>, most post-2018 devices; &lt;strong>not&lt;/strong> the 4K Select stick&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>The travel-stick platform of choice&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Apple TV&lt;/td>
&lt;td>&lt;a href="https://github.com/jellyfin/Swiftfin" rel="noopener">Swiftfin&lt;/a> / Infuse&lt;/td>
&lt;td>✅ &lt;a href="https://tailscale.com/kb/1280/appletv" rel="noopener">App Store client&lt;/a>&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>Tailscale&amp;rsquo;s only non-Android TV client&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Roku&lt;/td>
&lt;td>Official&lt;/td>
&lt;td>❌ no client exists&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>The single strongest argument for Path 2/3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>LG webOS&lt;/td>
&lt;td>Official&lt;/td>
&lt;td>❌ no client&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>Same story as Roku&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Samsung Tizen&lt;/td>
&lt;td>Official&lt;/td>
&lt;td>❌ no client&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>Same story as Roku&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Xbox&lt;/td>
&lt;td>Official&lt;/td>
&lt;td>❌ no client&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>Console app, URL-based access only&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Phones / tablets / laptops&lt;/td>
&lt;td>Official&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>Everything works; these were never the problem&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Hotel / dorm TV&lt;/td>
&lt;td>none of yours&lt;/td>
&lt;td>via a stick you bring&lt;/td>
&lt;td>✅ if the TV has a browser (rough)&lt;/td>
&lt;td>See below&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>The hotel row earns its own paragraph, because &lt;a href="https://www.reddit.com/r/jellyfin/comments/1uqgqil/" rel="noopener">a 90-plus-comment thread on it&lt;/a> converged on answers that surprise people. Casting from your phone mostly fails in hotels: hotel Wi-Fi typically runs AP isolation, so your phone and a Chromecast cannot see each other even on the same network. The frequent travelers in that thread &lt;strong>bring a streaming stick with Tailscale and Jellyfin already signed in&lt;/strong>, plug it into the room TV&amp;rsquo;s HDMI, and give the stick the hotel Wi-Fi — the tunnel is outbound, so captive portals and CGNAT do not matter. The road warriors in that thread report usable HDMI inputs in the large majority of rooms, with the occasional welded-on &amp;ldquo;hospitality mode&amp;rdquo; remote as the exception. The zero-cleverness fallback is a laptop and an HDMI cable. A GL.iNet-class travel router running the VPN for the whole room is the deluxe version of the same idea.&lt;/p>
&lt;p>If you run Path 2 or 3, the hotel problem mostly dissolves. Your domain works in any browser, including the TV&amp;rsquo;s, and in any Jellyfin app on hardware you bring.&lt;/p>
&lt;h2 id="the-security-baseline-whichever-path-you-picked">The security baseline, whichever path you picked&lt;/h2>
&lt;p>Paths 1 and 3-via-Pangolin put authentication in front of Jellyfin; Path 2 puts Jellyfin&amp;rsquo;s own login on the internet. Either way:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Password quality is the whole game on a public login page.&lt;/strong> Long, unique, per user, no shared &amp;ldquo;family&amp;rdquo; account with a weak password. Jellyfin&amp;rsquo;s account system is the only thing between a scanner and your library on Path 2.&lt;/li>
&lt;li>&lt;strong>Update the server.&lt;/strong> Jellyfin 10.11.11 is current as I write this; security fixes ride ordinary releases, and a version pinned in 2024 and forgotten is how exposed services rot. The &lt;a href="https://techfuelhq.com/tutorials/jellyfin-setup-docker-homelab-2026/">setup guide&lt;/a> covers the container-update flow.&lt;/li>
&lt;li>&lt;strong>Set Known Proxies&lt;/strong> (Path 2/3), or your access logs record the proxy talking to itself while real client addresses vanish - which also breaks any fail2ban-style banning you add at the proxy layer later.&lt;/li>
&lt;li>&lt;strong>Do not log full request URLs at the proxy.&lt;/strong> Jellyfin&amp;rsquo;s docs note it sometimes passes &lt;code>api_key&lt;/code> in the URL; a proxy logging full paths writes credentials into its own logfiles.&lt;/li>
&lt;li>&lt;strong>Quick Connect ships enabled&lt;/strong> on a fresh 10.11.11 install - the code-based login on the sign-in page, verified on the test instance below. It is convenient for TV logins on your own tailnet; on a fully public instance, it is one more auth path you should consciously decide to keep or disable.&lt;/li>
&lt;/ul>
&lt;h2 id="what-i-tested-and-what-i-did-not">What I tested, and what I did not&lt;/h2>
&lt;p>The reverse-proxy path above is first-hand: Jellyfin 10.11.11 portable on Windows, Caddy 2.11.4 in front, wizard walked, defaults pulled from the live API, Quick Connect state read off the fresh install, websocket upgrade verified through the proxy, on 2026-08-25. The public-DNS leg ran against a local certificate authority rather than a routable domain, because I was not going to open ports on the network I ran the test from - the Let&amp;rsquo;s Encrypt half of Caddy&amp;rsquo;s job is its most automated part, but it is the one piece of Path 2 this test takes from documentation rather than observation. Tailscale&amp;rsquo;s TV-client coverage comes from Tailscale&amp;rsquo;s own install docs rather than a rack of TVs, and the hotel tactics come from the travel thread&amp;rsquo;s consensus, attributed as such; I have not road-tested them. I have not run Pangolin beyond its documentation and requirements - it is on the bench list, and if that test changes the Path 3 advice, this page moves with it.&lt;/p>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://jellyfin.org/docs/general/post-install/networking/" rel="noopener">https://jellyfin.org/docs/general/post-install/networking/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://jellyfin.org/docs/general/post-install/networking/reverse-proxy/" rel="noopener">https://jellyfin.org/docs/general/post-install/networking/reverse-proxy/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://jellyfin.org/downloads/clients/" rel="noopener">https://jellyfin.org/downloads/clients/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/jellyfin/Swiftfin" rel="noopener">https://github.com/jellyfin/Swiftfin&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://tailscale.com/kb/1347/installation" rel="noopener">https://tailscale.com/kb/1347/installation&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://tailscale.com/docs/install/android" rel="noopener">https://tailscale.com/docs/install/android&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://tailscale.com/docs/install/amazon-fire" rel="noopener">https://tailscale.com/docs/install/amazon-fire&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://tailscale.com/kb/1280/appletv" rel="noopener">https://tailscale.com/kb/1280/appletv&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://tailscale.com/kb/1223/funnel" rel="noopener">https://tailscale.com/kb/1223/funnel&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://tailscale.com/pricing" rel="noopener">https://tailscale.com/pricing&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.cloudflare.com/service-specific-terms-application-services/" rel="noopener">https://www.cloudflare.com/service-specific-terms-application-services/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/fosrl/pangolin" rel="noopener">https://github.com/fosrl/pangolin&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.pangolin.net/self-host/quick-install" rel="noopener">https://docs.pangolin.net/self-host/quick-install&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.pangolin.net/pricing" rel="noopener">https://www.pangolin.net/pricing&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.rfc-editor.org/rfc/rfc6598" rel="noopener">https://www.rfc-editor.org/rfc/rfc6598&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://caddyserver.com/docs/quick-starts/reverse-proxy" rel="noopener">https://caddyserver.com/docs/quick-starts/reverse-proxy&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.plex.tv/plans/" rel="noopener">https://www.plex.tv/plans/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.reddit.com/r/jellyfin/comments/1vtff2e/im_kinda_tired_of_the_constant_remote_access/" rel="noopener">https://www.reddit.com/r/jellyfin/comments/1vtff2e/im_kinda_tired_of_the_constant_remote_access/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.reddit.com/r/jellyfin/comments/1uqgqil/" rel="noopener">https://www.reddit.com/r/jellyfin/comments/1uqgqil/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.reddit.com/r/jellyfin/comments/1tu1tvy/" rel="noopener">https://www.reddit.com/r/jellyfin/comments/1tu1tvy/&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Windows VM Won't Boot After the Proxmox 9 Upgrade? Read the Error Before You Reinstall (2026)</title><link>https://techfuelhq.com/articles/proxmox-9-windows-vm-not-booting-2026/</link><pubDate>Tue, 25 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/articles/proxmox-9-windows-vm-not-booting-2026/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · Published 2026-08-25 · ~9 min read · St. Louis County, MO&lt;/p>
&lt;p>The host reboot after a &lt;a href="https://techfuelhq.com/tutorials/proxmox-ve-8-to-9-upgrade-2026/">Proxmox VE 8-to-9 upgrade&lt;/a> has a particular quiet moment. The console comes back. The containers go green. The Debian guests come up. And the one Windows VM lands on a blue recovery screen instead of a login: &lt;em>&amp;ldquo;Your PC/Device needs to be repaired&amp;hellip; 0xc0000001. An unexpected error has occurred.&amp;rdquo;&lt;/em>&lt;/p>
&lt;p>Nothing inside Windows changed. That is the tell.&lt;/p>
&lt;p>A guest that booted fine before the upgrade and refuses after it is reporting a change in the layer underneath — firmware type, disk controller, boot entries, or the host kernel itself. Which layer depends on what the failure looks like, and the failure tells you if you read it before touching anything. Reinstalling Windows, the move half the panic threads reach for, is the one response that cannot be right: it destroys a healthy guest to address a host-side change, and in the worst case reinstalls onto the exact configuration that triggers the bug.&lt;/p>
&lt;p>I maintain the upgrade guide this page pairs with, and I want to be straight about sourcing: I have not reproduced this failure on a lab host. Every fix below instead names the community thread or vendor document that confirmed it, chiefly the &lt;a href="https://forum.proxmox.com/threads/windows-server-2025-fails-to-boot-after-pve-9-2-linux-7-0-kernel-upgrade.183958/" rel="noopener">Proxmox forum thread&lt;/a> where the 0xc0000001 signature was worked to a confirmed fix, and the r/Proxmox reports that match it. Where a step was tried in those threads and did &lt;em>not&lt;/em> work, I say that too. That list of dead ends is half the value here.&lt;/p>
&lt;img src="https://techfuelhq.com/images/articles/proxmox-9-windows-vm-not-booting-2026.svg" alt="Diagnostic fork for a Windows VM that will not boot after a Proxmox VE 9 upgrade: the 0xc0000001 recovery screen maps to the kernel 7.0 SeaBIOS/MBR regression, a UEFI boot-menu drop maps to EFI boot entries, INACCESSIBLE BOOT DEVICE maps to a disk-controller change without its driver, and an instant reboot loop maps to the ostype setting." width="1200" height="675" loading="eager" fetchpriority="high" decoding="async" style="display:block;margin:1.5rem auto;max-width:100%;height:auto;border:1px solid #1e1e3a;border-radius:8px;" />
&lt;h2 id="what-the-failure-looks-like">What the failure looks like&lt;/h2>
&lt;p>Four screens, four different problems. Match yours before running a single command.&lt;/p>
&lt;div class="visual-block">
&lt;div style="background:#0a0a23;border:1px solid rgba(255,255,255,0.07);border-radius:10px;padding:26px 22px 20px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;">
&lt;div style="margin-bottom:18px;">
&lt;div style="font-size:19px;font-weight:700;color:#e8e8f0;letter-spacing:-0.3px;">The signature fork&lt;/div>
&lt;div style="font-size:12.5px;color:#9a9ab5;margin-top:5px;line-height:1.5;">The screen the VM stops on names the broken layer. Every fix in the ladder below belongs to exactly one of these forks &amp;mdash; running fixes from the wrong fork is how a one-reboot problem becomes a weekend.&lt;/div>
&lt;/div>
&lt;div style="display:flex;gap:9px;flex-wrap:wrap;">
&lt;div style="flex:1 1 260px;min-width:0;background:rgba(80,144,224,0.07);border:1px solid rgba(80,144,224,0.35);border-top:3px solid #5090e0;border-radius:8px;padding:13px 14px;">
&lt;div style="font-size:10px;letter-spacing:1.2px;color:#7db0f0;font-weight:700;">FORK A &amp;middot; HOST KERNEL&lt;/div>
&lt;div style="font-size:13px;font-weight:700;color:#e8e8f0;margin-top:6px;line-height:1.45;">Blue recovery screen: &lt;span style="font-family:ui-monospace,Menlo,Consolas,monospace;color:#7db0f0;">0xc0000001&lt;/span> &amp;ldquo;An unexpected error has occurred&amp;rdquo;&lt;/div>
&lt;div style="font-size:11.5px;color:#b8c4d8;margin-top:7px;line-height:1.55;">Reported on &lt;strong style="color:#d8e4f8;">SeaBIOS + MBR&lt;/strong> guests the moment the host moved to kernel 7.0. Same VM boots fine on the previous 6.17 kernel.&lt;/div>
&lt;div style="font-size:11px;color:#8b97ad;margin-top:7px;">&amp;#8594; Steps 1&amp;ndash;2, permanent fix in Step 5&lt;/div>
&lt;/div>
&lt;div style="flex:1 1 260px;min-width:0;background:rgba(255,160,64,0.07);border:1px solid rgba(255,160,64,0.35);border-top:3px solid #ffa040;border-radius:8px;padding:13px 14px;">
&lt;div style="font-size:10px;letter-spacing:1.2px;color:#ffb866;font-weight:700;">FORK B &amp;middot; EFI BOOT ENTRY&lt;/div>
&lt;div style="font-size:13px;font-weight:700;color:#e8e8f0;margin-top:6px;line-height:1.45;">Drops to the UEFI boot menu or shell &amp;mdash; picking the disk manually boots fine&lt;/div>
&lt;div style="font-size:11.5px;color:#d0c8b8;margin-top:7px;line-height:1.55;">The OS is intact; the &lt;strong style="color:#e8dcc8;">auto-boot chain&lt;/strong> is not. Reported on OVMF guests after 9.2 point updates, worst with boot disks on IDE.&lt;/div>
&lt;div style="font-size:11px;color:#8b97ad;margin-top:7px;">&amp;#8594; Step 3&lt;/div>
&lt;/div>
&lt;div style="flex:1 1 260px;min-width:0;background:rgba(224,90,90,0.07);border:1px solid rgba(224,90,90,0.35);border-top:3px solid #e05a5a;border-radius:8px;padding:13px 14px;">
&lt;div style="font-size:10px;letter-spacing:1.2px;color:#e88080;font-weight:700;">FORK C &amp;middot; DISK CONTROLLER&lt;/div>
&lt;div style="font-size:13px;font-weight:700;color:#e8e8f0;margin-top:6px;line-height:1.45;">BSOD: &lt;span style="font-family:ui-monospace,Menlo,Consolas,monospace;color:#e88080;">INACCESSIBLE BOOT DEVICE&lt;/span>&lt;/div>
&lt;div style="font-size:11.5px;color:#d8bcbc;margin-top:7px;line-height:1.55;">The boot disk's &lt;strong style="color:#f0d0d0;">bus type changed&lt;/strong> and Windows has no driver bound for it &amp;mdash; usually self-inflicted mid-troubleshoot, or after a restore that changed the controller.&lt;/div>
&lt;div style="font-size:11px;color:#8b97ad;margin-top:7px;">&amp;#8594; Step 4&lt;/div>
&lt;/div>
&lt;div style="flex:1 1 260px;min-width:0;background:rgba(200,255,0,0.06);border:1px solid rgba(200,255,0,0.3);border-top:3px solid #c8ff00;border-radius:8px;padding:13px 14px;">
&lt;div style="font-size:10px;letter-spacing:1.2px;color:#c8ff00;font-weight:700;">FORK D &amp;middot; GUEST TYPE FLAGS&lt;/div>
&lt;div style="font-size:13px;font-weight:700;color:#e8e8f0;margin-top:6px;line-height:1.45;">Instant reboot loop &amp;mdash; no error screen at all&lt;/div>
&lt;div style="font-size:11.5px;color:#d0d8b8;margin-top:7px;line-height:1.55;">Reported on a UEFI Windows 11 guest on kernel 7.0.14: the VM resets before Windows draws anything. Fixed in-thread by correcting &lt;span style="font-family:ui-monospace,Menlo,Consolas,monospace;color:#d8e880;">ostype&lt;/span> from win10 to win11.&lt;/div>
&lt;div style="font-size:11px;color:#8b97ad;margin-top:7px;">&amp;#8594; 30-second checks below&lt;/div>
&lt;/div>
&lt;/div>
&lt;div style="text-align:right;margin-top:10px;font-size:10px;color:#565672;">techfuelhq.com &amp;middot; signatures per forum.proxmox.com thread 183958 + r/Proxmox reports, mid-2026&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>One honest caveat on ordering. Nobody has failure-rate telemetry for this, me included, so the ladder below is ordered by cost of the test, cheapest and most reversible first. Anyone who tells you which of these causes is &amp;ldquo;most common&amp;rdquo; is guessing.&lt;/p>
&lt;h2 id="the-30-second-configuration-checks">The 30-second configuration checks&lt;/h2>
&lt;p>Before changing anything, pull the VM&amp;rsquo;s config on the host and read five lines:&lt;/p>
&lt;pre tabindex="0">&lt;code>qm config &amp;lt;vmid&amp;gt;
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>&lt;strong>&lt;code>bios:&lt;/code>&lt;/strong> is &lt;code>ovmf&lt;/code> or &lt;code>seabios&lt;/code> (absent means SeaBIOS, the default). This decides which fork you are in. A UEFI Windows install needs &lt;code>ovmf&lt;/code>; if this line says otherwise, something rewrote your config (a restore, a migration script, a manual edit).&lt;/li>
&lt;li>&lt;strong>&lt;code>efidisk0:&lt;/code>&lt;/strong> must exist on every OVMF VM. An OVMF guest with no EFI disk has nowhere to store boot entries, and boot-entry loss is exactly the Fork B symptom.&lt;/li>
&lt;li>&lt;strong>&lt;code>machine:&lt;/code>&lt;/strong> shows whether your virtual hardware moved. Windows VMs get their QEMU machine version pinned at creation (&lt;code>pc-q35-8.1&lt;/code>, say) precisely because, in the words of the Proxmox reference documentation, &amp;ldquo;Windows is sensitive to changes in the virtual hardware.&amp;rdquo; If yours shows a pinned version, the upgrade did not move it. If it shows &lt;code>latest&lt;/code> or a bare &lt;code>q35&lt;/code>, the upgrade silently jumped your virtual hardware to QEMU 11&amp;rsquo;s newest revision.&lt;/li>
&lt;li>&lt;strong>&lt;code>scsihw:&lt;/code> and the boot disk&amp;rsquo;s bus&lt;/strong> (&lt;code>scsi0:&lt;/code> / &lt;code>sata0:&lt;/code> / &lt;code>ide0:&lt;/code>) matter for Step 4, so note what they are. If Windows last booted from a &lt;code>scsi0&lt;/code> disk and the disk now hangs off &lt;code>ide0&lt;/code>, that mismatch is your Fork C.&lt;/li>
&lt;li>&lt;strong>&lt;code>ostype:&lt;/code>&lt;/strong> should be &lt;code>win11&lt;/code> for the Windows 11 / Server 2022 / Server 2025 generation and &lt;code>win10&lt;/code> for Windows 10 / Server 2016 / 2019 — the qm.conf reference defines win11 as &amp;ldquo;Microsoft Windows 11/2022/2025&amp;rdquo; and win10 as &amp;ldquo;10/2016/2019&amp;rdquo;, and Server 2022 on the win10 setting is a common leftover. The forum thread&amp;rsquo;s reboot-loop case (Fork D) was resolved by exactly this one-line correction on a UEFI Windows 11 guest, so check it before deeper surgery.&lt;/li>
&lt;/ul>
&lt;p>Five lines, under a minute, and you have usually already picked your fork.&lt;/p>
&lt;h2 id="why-proxmox-9-breaks-windows-vms-and-leaves-linux-guests-alone">Why Proxmox 9 breaks Windows VMs and leaves Linux guests alone&lt;/h2>
&lt;p>The &lt;a href="https://techfuelhq.com/tutorials/proxmox-ve-8-to-9-upgrade-2026/">8-to-9 upgrade&lt;/a> is not one change. Landing on the current 9.2 means Debian 13.5, QEMU 11.0, and the Linux 7.0 kernel all arrive at once, and each is a layer a guest boots through.&lt;/p>
&lt;p>The kernel is the loud one right now. Within days of kernel 7.0 reaching 9.2 hosts, the Proxmox forum thread above collected Windows Server guests failing with 0xc0000001 across three hosts with different storage back-ends — all SeaBIOS, all MBR boot disks, all fine again the moment the host booted the previous 6.17.13 kernel. The thread&amp;rsquo;s participants converged on a kernel regression affecting SeaBIOS/MBR guests specifically; no OVMF guest shows up among the failures, and one commenter reported his OVMF guests running fine on the same PVE version. As of this writing there is no Proxmox staff reply in that thread, so treat the diagnosis as strong community evidence rather than an official statement. The fix pattern it produced, though, was confirmed by two separate users in the linked discussion, which is more than most boot-failure folklore ever gets.&lt;/p>
&lt;p>QEMU 11 is the quiet one. Windows VMs carry a pinned machine version for stability, so most survive the QEMU jump untouched. The r/Proxmox comments on the same failure confirm the corollary: rolling the machine version back (&lt;code>pc-q35-8.0&lt;/code>) did &lt;em>not&lt;/em> fix the 0xc0000001 failure. Machine versions matter at the margins. Guests set to &lt;code>latest&lt;/code> get a large hardware jump, and QEMU&amp;rsquo;s own policy now removes machine versions from upstream after six years, so a config pinned to something ancient will eventually stop starting at all. Worth reading once and then not obsessing over.&lt;/p>
&lt;p>And Windows itself is simply the fussy tenant. It refuses to boot from a disk bus it was not prepared for (the documented INACCESSIBLE BOOT DEVICE failure in Step 4), its Boot Configuration Data store assumes the firmware handoff never changes shape, and a BitLocker-protected guest treats TPM changes as a reason to demand its recovery key. &lt;a href="https://techfuelhq.com/homelab/lxc-vs-vm-proxmox-2026/">Linux guests and containers&lt;/a> re-enumerate most of this on every boot and move on. That asymmetry (host change, Windows-only casualty) is the entire diagnostic frame of this page.&lt;/p>
&lt;h2 id="the-fix-ladder-least-invasive-first">The fix ladder, least invasive first&lt;/h2>
&lt;p>Each step says what it does, when it is the right one, and how to undo it.&lt;/p>
&lt;h3 id="step-1-update-the-host-before-you-change-the-vm">Step 1: update the host before you change the VM&lt;/h3>
&lt;p>The bug you hit may already be fixed. One commenter in the boot-menu thread reports a similar failure (his word — similar, not identical) that cleared up with a later Proxmox kernel or qemu-server update. Check and apply point updates on the host, reboot, and re-test the VM before touching its config.&lt;/p>
&lt;pre tabindex="0">&lt;code>apt update &amp;amp;&amp;amp; apt dist-upgrade
&lt;/code>&lt;/pre>&lt;p>&lt;strong>When it is the one.&lt;/strong> Always first. It costs a host reboot and nothing else, and every later step benefits from being on current packages. &lt;strong>How to revert.&lt;/strong> Nothing to revert.&lt;/p>
&lt;h3 id="step-2-boot-the-previous-kernel--the-confirmed-0xc0000001-fix">Step 2: boot the previous kernel — the confirmed 0xc0000001 fix&lt;/h3>
&lt;p>This is Fork A&amp;rsquo;s move, and it doubles as its diagnostic. Proxmox keeps the previous kernel installed; &lt;code>proxmox-boot-tool&lt;/code> can select it, and the selection works on both systemd-boot and GRUB hosts:&lt;/p>
&lt;pre tabindex="0">&lt;code>proxmox-boot-tool kernel list
proxmox-boot-tool kernel pin 6.17.13-13-pve --next-boot
reboot
&lt;/code>&lt;/pre>&lt;p>&lt;code>--next-boot&lt;/code> applies for one boot only. If the Windows VM comes up normally on 6.17 (as it did for the reporters in the forum thread, whose guests failed on kernel 7.0.6-2 and booted on 6.17.13-13), you have confirmed the kernel fork in one reboot with zero permanent changes. Then make it stick until you are ready for Step 5:&lt;/p>
&lt;pre tabindex="0">&lt;code>proxmox-boot-tool kernel pin 6.17.13-13-pve
&lt;/code>&lt;/pre>&lt;p>The cost is real, and I want it on the page: a pinned host is not running the kernel line that receives current fixes. You are trading an unbootable guest for a slightly stale host, which is the right trade this week and the wrong one forever. Record the pin somewhere you will see it, re-test on each new point release, and &lt;code>proxmox-boot-tool kernel unpin&lt;/code> the day the current kernel boots your guests again. If you run &lt;a href="https://techfuelhq.com/tutorials/gpu-passthrough-proxmox-vm-2026/">GPU passthrough&lt;/a>, you may already know this dance. Kernel pinning is the same escape hatch the passthrough community reaches for when a new kernel breaks VFIO.&lt;/p>
&lt;h3 id="step-3-repair-the-uefi-boot-path--when-manual-boot-works">Step 3: repair the UEFI boot path — when manual boot works&lt;/h3>
&lt;p>Fork B has the friendliest tell in the whole taxonomy: press Esc at the VM&amp;rsquo;s firmware splash, pick the Windows disk by hand, and it boots perfectly. The OS is fine. Only the automatic handoff is broken. Three sub-fixes, in cost order:&lt;/p>
&lt;p>&lt;strong>Boot order first.&lt;/strong> VM → Options → Boot Order. After upgrades and restores this list can end up pointing at the wrong device or de-selecting the boot disk entirely. Fix, cold-boot (full stop/start, not a guest reboot), done.&lt;/p>
&lt;p>&lt;strong>Get the boot disk off IDE.&lt;/strong> In the r/Proxmox thread where two of four Server 2022 guests dropped to the boot menu after a 9.2.9 update, the affected disks hung off IDE, and a commenter identified the mechanism as the BCD not supporting IDE EFI boot chaining, which is exactly why manual selection worked while auto-boot failed. Moving the boot disk to SCSI resolved it, with one caveat the reporter hit honestly — Windows needed a Safe Mode boot to bind the storage driver on first start after the move. Do it in Step 4&amp;rsquo;s driver-safe order rather than a blind detach/re-attach.&lt;/p>
&lt;p>&lt;strong>Rebuild the EFI vars and TPM state.&lt;/strong> This is the heavier variant, reported working across a fleet. Detach and delete the VM&amp;rsquo;s EFI disk and TPM state, re-add both fresh, and — the detail that made it stick — reset the TPM to factory keys before the first boot. The thread&amp;rsquo;s reporter found a plain rebuild did not stick (Windows booted once, then the failure returned on the next reboot); the commenter who recovered roughly two dozen VMs adds the factory-key reset before first boot as the step that makes it hold. Nobody in-thread tested the two variants side by side. &lt;strong>Before you touch either disk, have your BitLocker recovery key in hand.&lt;/strong> Clearing the TPM is on Microsoft&amp;rsquo;s own list of events that put a BitLocker device into recovery, so expect the recovery prompt at next boot — and without the key that screen is a lockout.&lt;/p>
&lt;p>&lt;strong>When it is the one.&lt;/strong> The manual-selection tell, or an OVMF guest whose &lt;code>efidisk0&lt;/code> is missing or damaged. &lt;strong>How to revert.&lt;/strong> Boot order and controller moves reverse in the GUI; a deleted EFI/TPM disk does not come back, which is why the recovery key comes first.&lt;/p>
&lt;h3 id="step-4-swap-the-disk-controller-without-losing-boot">Step 4: swap the disk controller without losing boot&lt;/h3>
&lt;p>Fork C is the one you can give yourself mid-troubleshoot, and the shape of it is worth thirty seconds. When the boot disk arrives on a bus Windows has not booted from before, Windows can fail before it is up — the standard explanation is that boot-critical storage drivers are only armed once Windows has actually used them. Whatever the exact mechanism, Proxmox&amp;rsquo;s driver documentation states the outcome flatly: installing the VirtIO drivers and switching the boot disk in one step &amp;ldquo;will result in a blue screen, claiming an &amp;lsquo;INACCESSIBLE BOOT DEVICE&amp;rsquo;.&amp;rdquo;&lt;/p>
&lt;p>So the swap is a two-boot procedure, per that same document:&lt;/p>
&lt;ol>
&lt;li>Load the &lt;a href="https://pve.proxmox.com/wiki/Windows_VirtIO_Drivers" rel="noopener">virtio-win ISO&lt;/a> in the VM&amp;rsquo;s CD drive and attach a small &lt;strong>temporary&lt;/strong> disk (1 GB) on the VirtIO SCSI bus.&lt;/li>
&lt;li>Boot Windows, install the drivers, and wait until the temp disk shows up in Disk Management. That appearance is the proof the driver is genuinely bound.&lt;/li>
&lt;li>Shut down. Remove the temporary disk, then detach the boot disk and re-attach it on the target bus (SCSI on the VirtIO SCSI single controller is what Proxmox&amp;rsquo;s Windows best-practices guide has you pick).&lt;/li>
&lt;li>Fix Options → Boot Order to point back at the boot disk, boot, and take the ISO out once you are up.&lt;/li>
&lt;/ol>
&lt;p>If you are already stuck on the blue screen because the bus changed underneath you, put the disk back on the old bus first. That is the one-minute undo (detach, re-attach on the previous bus type, restore boot order), and Windows boots because the old driver is still the one it trusts. Then do the procedure above properly. And a warning from the founding thread worth repeating: controller shuffling was tried against Fork A&amp;rsquo;s 0xc0000001 and did nothing — VirtIO SCSI single versus VirtIO SCSI, iothread on or off, none of it moved that failure. Controller surgery fixes controller problems. It does not fix kernel problems.&lt;/p>
&lt;h3 id="step-5-convert-seabiosmbr-to-uefi--the-permanent-fork-a-fix">Step 5: convert SeaBIOS/MBR to UEFI — the permanent Fork A fix&lt;/h3>
&lt;p>The kernel pin in Step 2 avoids the wedge; this removes it. The wedge condition is SeaBIOS firmware booting an MBR disk, so the reporter converted his Windows guests to UEFI/GPT and ran them on kernel 7.0 without issue — &amp;ldquo;everything runs now fine,&amp;rdquo; in his words in the r/Proxmox comments after migrating his whole fleet — and a second user in the same discussion, after converting his Server 2025 guest the same way, closed with &amp;ldquo;everything is ok.&amp;rdquo;&lt;/p>
&lt;p>Inside Windows, validate before you commit. &lt;code>mbr2gpt&lt;/code> refuses ineligible layouts (more than three primary partitions, extended/logical partitions present), and per Microsoft&amp;rsquo;s documentation BitLocker protection must be suspended first:&lt;/p>
&lt;pre tabindex="0">&lt;code>mbr2gpt /validate /allowFullOS
mbr2gpt /convert /allowFullOS
&lt;/code>&lt;/pre>&lt;p>The conversion rewrites the partition table in place, creates the EFI system partition, and migrates the BCD. Data stays, but there is no un-convert command, so this is a tested-backup-first operation. Then shut down and flip the Proxmox side to match, because a GPT disk under SeaBIOS boots nothing:&lt;/p>
&lt;ol>
&lt;li>Hardware → Add → &lt;strong>EFI Disk&lt;/strong>.&lt;/li>
&lt;li>Options (or Hardware → BIOS) → change &lt;strong>SeaBIOS&lt;/strong> to &lt;strong>OVMF (UEFI)&lt;/strong>.&lt;/li>
&lt;li>Re-check Boot Order, cold-start, and expect one trip through the firmware menu if the fresh EFI vars need the Windows Boot Manager entry selected once.&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>When it is the one.&lt;/strong> Fork A guests you want back on the current kernel line, done one VM at a time in a maintenance window. I would not run it on a domain controller before its backup restore had been tested. The tool is fine; &amp;ldquo;no undo command&amp;rdquo; plus &amp;ldquo;untested backup&amp;rdquo; is the combination you only get burned by once. &lt;strong>How to revert.&lt;/strong> You do not; you restore.&lt;/p>
&lt;h3 id="step-6-restore-the-pre-upgrade-backup">Step 6: restore the pre-upgrade backup&lt;/h3>
&lt;p>If you took the &lt;a href="https://techfuelhq.com/tutorials/proxmox-backup-server-3-2-1-2026/">tested backup the upgrade guide insists on&lt;/a>, the calm exit was available the whole time. Restore the guest as it was, pin the kernel if the restored VM still hits Fork A, and schedule the UEFI conversion for a quieter week. A restore also cleanly unwinds a troubleshooting session that changed five things: restored config, restored disk, known state.&lt;/p>
&lt;p>If you did not take one, let this be the page that converts you. Every fork above is survivable with a backup and console access; several are miserable without. The &lt;a href="https://techfuelhq.com/tutorials/proxmox-backup-server-3-2-1-2026/">3-2-1 setup&lt;/a> takes an evening.&lt;/p>
&lt;h2 id="what-not-to-do">What not to do&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Do not reinstall Windows.&lt;/strong> Wrong layer. The guest is healthy; the platform moved. In the kernel-regression case a fresh install onto SeaBIOS/MBR can hit the same wall on first boot.&lt;/li>
&lt;li>&lt;strong>Do not detach and re-attach disks &amp;ldquo;to see if it helps.&amp;rdquo;&lt;/strong> Every detach can drop the disk from the boot order, stacking a Fork B problem on top of whatever you had. Config changes here should be single, deliberate, and written down.&lt;/li>
&lt;li>&lt;strong>Do not upgrade the rest of the cluster while node one&amp;rsquo;s Windows guests are down.&lt;/strong> The failure travels with the kernel, and so does your blast radius. Diagnose on one node; pin or fix before the next node moves.&lt;/li>
&lt;li>&lt;strong>Do not run fixes from the wrong fork.&lt;/strong> The reporter&amp;rsquo;s threads already burned the hours for you: against 0xc0000001, controller swaps did nothing, iothread toggles did nothing, machine-version rollback to pc-q35-8.0 did nothing, and a QEMU 10-vs-11 switch did nothing. The kernel pin worked. The UEFI conversion worked. Match the signature, run its fix.&lt;/li>
&lt;/ul>
&lt;h2 id="prevent-it-on-the-next-node">Prevent it on the next node&lt;/h2>
&lt;p>Everything above compresses into three pre-upgrade lines for whatever you upgrade next:&lt;/p>
&lt;ol>
&lt;li>&lt;code>qm config&lt;/code> every Windows guest and record &lt;code>bios&lt;/code> / &lt;code>machine&lt;/code> / boot bus / &lt;code>ostype&lt;/code>. Thirty seconds per VM, and it turns any post-upgrade surprise into a diff instead of a mystery.&lt;/li>
&lt;li>Convert SeaBIOS/MBR Windows guests to UEFI &lt;strong>before&lt;/strong> the host jumps to kernel 7.0, on your schedule instead of during an outage.&lt;/li>
&lt;li>Take the tested backup. Then run the &lt;a href="https://techfuelhq.com/tutorials/proxmox-ve-8-to-9-upgrade-2026/">full pre-flight checklist&lt;/a> (pve8to9, NIC pinning, console access) and upgrade knowing the escape hatches on this page exist but expecting not to need them.&lt;/li>
&lt;/ol>
&lt;p>The upgrade itself is routine. The preparation is the whole job — and for Windows guests specifically, the preparation now includes knowing which firmware they boot with.&lt;/p>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;ul>
&lt;li>Proxmox forum — &amp;ldquo;Windows Server 2025 fails to boot after PVE 9.2 / Linux 7.0 Kernel upgrade&amp;rdquo; (the 0xc0000001 thread; kernel versions, controller/iothread and QEMU 10-vs-11 non-fixes, the ostype win10→win11 boot-loop fix): &lt;a href="https://forum.proxmox.com/threads/windows-server-2025-fails-to-boot-after-pve-9-2-linux-7-0-kernel-upgrade.183958/" rel="noopener">https://forum.proxmox.com/threads/windows-server-2025-fails-to-boot-after-pve-9-2-linux-7-0-kernel-upgrade.183958/&lt;/a>&lt;/li>
&lt;li>r/Proxmox — the same failure&amp;rsquo;s discussion thread (three hosts, SeaBIOS/MBR/VirtIO SCSI, broken 7.0.6-2-pve vs working 6.17.13-13-pve; machine-version-rollback non-fix; both UEFI-conversion confirmations): &lt;a href="https://www.reddit.com/r/Proxmox/comments/1trztwg/" rel="noopener">https://www.reddit.com/r/Proxmox/comments/1trztwg/&lt;/a>&lt;/li>
&lt;li>r/Proxmox — Server 2022 guests dropping to the boot menu after 9.2.9, manual disk selection working; IDE/EFI boot chaining diagnosis, EFI+TPM rebuild fix, the similar-failure-fixed-by-update report: &lt;a href="https://www.reddit.com/r/Proxmox/comments/1vgbstt/" rel="noopener">https://www.reddit.com/r/Proxmox/comments/1vgbstt/&lt;/a>&lt;/li>
&lt;li>Proxmox wiki — Paravirtualized Block Drivers for Windows (the temporary-disk procedure and the INACCESSIBLE BOOT DEVICE warning, quoted verbatim): &lt;a href="https://pve.proxmox.com/wiki/Paravirtualized_Block_Drivers_for_Windows" rel="noopener">https://pve.proxmox.com/wiki/Paravirtualized_Block_Drivers_for_Windows&lt;/a>&lt;/li>
&lt;li>Proxmox wiki — Windows 10 guest best practices (SCSI bus on the VirtIO SCSI single controller for Windows guests): &lt;a href="https://pve.proxmox.com/wiki/Windows_10_guest_best_practices" rel="noopener">https://pve.proxmox.com/wiki/Windows_10_guest_best_practices&lt;/a>&lt;/li>
&lt;li>Proxmox wiki — Host Bootloader (proxmox-boot-tool kernel list / pin / &amp;ndash;next-boot / unpin): &lt;a href="https://pve.proxmox.com/wiki/Host_Bootloader" rel="noopener">https://pve.proxmox.com/wiki/Host_Bootloader&lt;/a>&lt;/li>
&lt;li>Proxmox VE reference documentation — QEMU/KVM Virtual Machines (Windows machine-version pinning, machine-version removal policy): &lt;a href="https://pve.proxmox.com/pve-docs/chapter-qm.html" rel="noopener">https://pve.proxmox.com/pve-docs/chapter-qm.html&lt;/a>; ostype value definitions (win10 = 10/2016/2019, win11 = 11/2022/2025): &lt;a href="https://pve.proxmox.com/pve-docs/qm.conf.5.html" rel="noopener">https://pve.proxmox.com/pve-docs/qm.conf.5.html&lt;/a>&lt;/li>
&lt;li>Microsoft Learn — MBR2GPT (validate/convert syntax, /allowFullOS, disk prerequisites, BitLocker suspension, UEFI firmware requirement): &lt;a href="https://learn.microsoft.com/en-us/windows/deployment/mbr-to-gpt" rel="noopener">https://learn.microsoft.com/en-us/windows/deployment/mbr-to-gpt&lt;/a>&lt;/li>
&lt;li>Microsoft Learn — BitLocker recovery overview (&amp;ldquo;Turning off, disabling, deactivating, or clearing the TPM&amp;rdquo; as a recovery trigger): &lt;a href="https://learn.microsoft.com/en-us/windows/security/operating-system-security/data-protection/bitlocker/recovery-overview" rel="noopener">https://learn.microsoft.com/en-us/windows/security/operating-system-security/data-protection/bitlocker/recovery-overview&lt;/a>&lt;/li>
&lt;li>Proxmox VE roadmap — 9.2 release contents (Debian 13.5, kernel 7.0, QEMU 11.0), verified 2026-08-25: &lt;a href="https://pve.proxmox.com/wiki/Roadmap" rel="noopener">https://pve.proxmox.com/wiki/Roadmap&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Ollama vs llama.cpp vs LM Studio: 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 · Updated 2026-08-26 · ~4 min read · St. Louis County, MO&lt;/p>
&lt;h2 id="the-short-version">The short version&lt;/h2>
&lt;p>This page holds two captures on the same retail RTX 5080. On 2026-08-20 I ran
Ollama against bare llama.cpp; on 2026-08-26 I ran Ollama against LM Studio, same
GGUF bytes on both sides via hard links. Across both captures the pattern holds:
every one of these tools is llama.cpp underneath, decode differences on dense
models stay inside 11%, and the settings each app ships with move throughput far
more than the app choice does.&lt;/p>
&lt;p>Downloads: &lt;a href="https://techfuelhq.com/data/llm-server-compare-2026-08.csv">llm-server-compare-2026-08.csv&lt;/a>
(Ollama vs llama.cpp) and
&lt;a href="https://techfuelhq.com/data/llm-server-compare-2026-08-26-lmstudio.csv">llm-server-compare-2026-08-26-lmstudio.csv&lt;/a>
(Ollama vs LM Studio, both conditions). CC BY 4.0, per-run decode arrays included.&lt;/p>
&lt;h2 id="capture-2-ollama-03215-vs-lm-studio-0421-2026-08-26">Capture 2: Ollama 0.32.15 vs LM Studio 0.4.21 (2026-08-26)&lt;/h2>
&lt;p>Settings normalized on both sides: context 4096, full GPU offload, temperature 0,
seed 42, one serving slot, per-run prompt nonces throughout. Decode figures are
medians of five runs; long-prefill figures, measured at ~450 prompt tokens, are
medians of three with a warmup discarded. The decision-layer writeup is
&lt;a href="https://techfuelhq.com/self-hosted/ollama-vs-lm-studio-rtx-5080-2026/">the LM Studio comparison article&lt;/a>.&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Model&lt;/th>
&lt;th scope="col">App&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.15&lt;/td>
&lt;td style="text-align: right">&lt;strong>350.5 t/s&lt;/strong>&lt;/td>
&lt;td style="text-align: right">17,862 t/s&lt;/td>
&lt;td style="text-align: right">3,760&lt;/td>
&lt;td style="text-align: right">2.3s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Llama 3.2 3B&lt;/td>
&lt;td>LM Studio 0.4.21&lt;/td>
&lt;td style="text-align: right">316.0 t/s&lt;/td>
&lt;td style="text-align: right">&lt;strong>20,337 t/s&lt;/strong>&lt;/td>
&lt;td style="text-align: right">3,808&lt;/td>
&lt;td style="text-align: right">2.8s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qwen 2.5 14B&lt;/td>
&lt;td>Ollama 0.32.15&lt;/td>
&lt;td style="text-align: right">&lt;strong>102.2 t/s&lt;/strong>&lt;/td>
&lt;td style="text-align: right">5,038 t/s&lt;/td>
&lt;td style="text-align: right">10,356&lt;/td>
&lt;td style="text-align: right">5.5s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qwen 2.5 14B&lt;/td>
&lt;td>LM Studio 0.4.21&lt;/td>
&lt;td style="text-align: right">97.6 t/s&lt;/td>
&lt;td style="text-align: right">&lt;strong>5,567 t/s&lt;/strong>&lt;/td>
&lt;td style="text-align: right">10,405&lt;/td>
&lt;td style="text-align: right">7.7s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>gpt-oss 20B&lt;/td>
&lt;td>Ollama 0.32.15 (own fork)&lt;/td>
&lt;td style="text-align: right">213.7 t/s&lt;/td>
&lt;td style="text-align: right">9,187 t/s&lt;/td>
&lt;td style="text-align: right">13,570&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>LM Studio 0.4.21 (upstream MXFP4)&lt;/td>
&lt;td style="text-align: right">&lt;strong>242.8 t/s&lt;/strong>&lt;/td>
&lt;td style="text-align: right">&lt;strong>9,618 t/s&lt;/strong>&lt;/td>
&lt;td style="text-align: right">12,533&lt;/td>
&lt;td style="text-align: right">8.4s&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>At stock as-installed settings the dense rows barely move, but two defaults bite:
LM Studio&amp;rsquo;s automatic GPU offload held gpt-oss to 186.3 t/s, 23% below its own
tuned figure — and a single-variable re-run (stock config, only the offload slider
moved to max) recovered the whole gap at 244.9 t/s. Ollama&amp;rsquo;s app-level context
slider set to 256k (clamped to this model&amp;rsquo;s 131,072 maximum) dropped Llama 3.2 3B
from 351 to 102 t/s with the KV cache spilled to CPU. Both are recorded as their
own rows in the CSV and raw JSON. Idle app overhead: the Ollama service tree held
78-132 MB of RAM; LM Studio&amp;rsquo;s GUI plus server held 709-928 MB across quiet-window
observations (one 3.1 GB transitional reading mid-unload excluded, kept in the
raw JSON). Ollama&amp;rsquo;s engine is its vendored
llama.cpp at commit 9d77fa172; LM Studio&amp;rsquo;s is its packaged llama.cpp runtime
2.29.1 (CUDA 12) — and both run the model in a llama-server process.&lt;/p>
&lt;p>Ollama alone gained 3-10% decode over its own 08-20 numbers here (319→351 on the
3B; 195.8→213.5 on gpt-oss, defaults condition) across six days and fourteen
patch-version increments — with the caveat that the 08-20 capture predates this
page&amp;rsquo;s quiet-window discipline, so part of that spread may be ambient. Either way,
single-digit decode gaps between these tools do not survive a version bump.&lt;/p>
&lt;h2 id="capture-1-ollama-0321-vs-llamacpp-b10507-2026-08-20">Capture 1: Ollama 0.32.1 vs llama.cpp b10507 (2026-08-20)&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 per capture, and a short-prompt
prefill column retained only to document its own overhead artifact. Token counts for
identical text differ slightly between tools because each applies its own chat
template handling. The decision-layer writeups are
&lt;a href="https://techfuelhq.com/self-hosted/ollama-vs-llamacpp-rtx-5080-2026/">Ollama vs llama.cpp&lt;/a> and
&lt;a href="https://techfuelhq.com/self-hosted/ollama-vs-lm-studio-rtx-5080-2026/">Ollama vs LM Studio&lt;/a>; this page is
the citable record for both.&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. If the real question is a GUI desktop app rather than a second
server engine, that is a different comparison — I benched it separately in
&lt;a href="https://techfuelhq.com/self-hosted/ollama-vs-lm-studio-rtx-5080-2026/">Ollama vs LM Studio on the same card&lt;/a>. Our &lt;a href="https://techfuelhq.com/data/rtx-5080-llm-throughput/">RTX 5080 throughput dataset&lt;/a>
and the &lt;a href="https://techfuelhq.com/tutorials/self-host-local-llm-rtx-5060-2026/">RTX 5060 local LLM guide&lt;/a> both
ride on it for exactly that reason.&lt;/p>
&lt;p>Run llama-server when you want the newest engine the day it ships, exact control over
batching, context, and sampling, or the last few percent of decode speed. For these
models the engines share llama.cpp lineage; Ollama&amp;rsquo;s &lt;a href="https://github.com/ollama/ollama" rel="noopener">README&lt;/a>
lists llama.cpp among its supported backends, and the gpt-oss arch tag shows it also
ships its own engine paths. You are choosing how much of the engine&amp;rsquo;s surface to touch. Throughput is the wrong reason to switch in either direction — 2-6% is
less than the gain from one quantization step or one driver update.&lt;/p>
&lt;h2 id="method-and-limits">Method and limits&lt;/h2>
&lt;p>Both servers ran the same sha256-identical GGUF blobs from Ollama&amp;rsquo;s own store (except
the gpt-oss case above), one server resident at a time, fresh process per model, with
&lt;code>ollama stop&lt;/code> and process-tree kills between runs. Every request used a unique prompt
nonce; llama-server additionally got &lt;code>cache_prompt: false&lt;/code>. Generation pinned to
temperature 0, seed 42, 256 tokens (64 for the long-prefill pass), context 4096 on
both. Rates come from each server&amp;rsquo;s own timing counters, cross-checked by wall-clock
recomputation (within 2% throughout) and by llama-bench as a third instrument.&lt;/p>
&lt;p>The limits, named. One GPU, one box, three models, servers on default flags. Token counts for identical prompt text differed slightly between servers (433
vs 407 on the long prompt) because Ollama applies its chat template to /api/generate
while llama-server&amp;rsquo;s /completion takes the prompt raw — rates are per-token, so the
comparison holds, but byte-identical inputs produce slightly different token streams.
Ollama&amp;rsquo;s engine is a vendored llama.cpp build, so some of the decode gap is simply
engine version lag, and it will move with every release on both sides. Date everything;
this page says 2026-08-20.&lt;/p></description></item><item><title>MCP Server Resource Benchmark: RAM, Startup, Tools Dataset</title><link>https://techfuelhq.com/data/mcp-server-bench/</link><pubDate>Thu, 20 Aug 2026 00:48:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/data/mcp-server-bench/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · Published 2026-08-20 · ~3 min read · St. Louis County, MO&lt;/p>
&lt;h2 id="the-short-version">The short version&lt;/h2>
&lt;p>I benchmarked eleven of the most-recommended MCP servers for what they cost to keep
resident. The answer: &lt;strong>178-422MB of RAM each&lt;/strong> (median 188MB), ready in 0.5-1.9 seconds
warm, with tool counts from 1 to 26. A realistic concurrent five-server stack totals
&lt;strong>961.6MB&lt;/strong>, and two independent measurement paths confirmed that figure to the decimal.
Tool count barely predicts weight. The runtime and framework dominate.&lt;/p>
&lt;p>Download: &lt;a href="https://techfuelhq.com/data/mcp-server-bench-2026-08.csv">mcp-server-bench-2026-08.csv&lt;/a>. CC BY 4.0,
per-iteration arrays included.&lt;/p>
&lt;h2 id="the-measured-table">The measured table&lt;/h2>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Server&lt;/th>
&lt;th scope="col">Version&lt;/th>
&lt;th scope="col" style="text-align: right">Ready&lt;/th>
&lt;th scope="col" style="text-align: right">RSS&lt;/th>
&lt;th scope="col" style="text-align: right">Tools&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>GitHub (legacy npm)&lt;/td>
&lt;td>0.6.2&lt;/td>
&lt;td style="text-align: right">547ms&lt;/td>
&lt;td style="text-align: right">178MB&lt;/td>
&lt;td style="text-align: right">26&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Playwright&lt;/td>
&lt;td>1.63.0-alpha-2026-08-05&lt;/td>
&lt;td style="text-align: right">618ms&lt;/td>
&lt;td style="text-align: right">227MB&lt;/td>
&lt;td style="text-align: right">24&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Time (Python)&lt;/td>
&lt;td>1.29.0¹&lt;/td>
&lt;td style="text-align: right">619ms&lt;/td>
&lt;td style="text-align: right">181MB&lt;/td>
&lt;td style="text-align: right">2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Sequential-thinking&lt;/td>
&lt;td>0.2.0&lt;/td>
&lt;td style="text-align: right">666ms&lt;/td>
&lt;td style="text-align: right">186MB&lt;/td>
&lt;td style="text-align: right">1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Memory&lt;/td>
&lt;td>0.6.3&lt;/td>
&lt;td style="text-align: right">667ms&lt;/td>
&lt;td style="text-align: right">187MB&lt;/td>
&lt;td style="text-align: right">9&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Filesystem&lt;/td>
&lt;td>0.2.0&lt;/td>
&lt;td style="text-align: right">692ms&lt;/td>
&lt;td style="text-align: right">188MB&lt;/td>
&lt;td style="text-align: right">14&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Git (Python)&lt;/td>
&lt;td>1.29.0¹&lt;/td>
&lt;td style="text-align: right">699ms&lt;/td>
&lt;td style="text-align: right">185MB&lt;/td>
&lt;td style="text-align: right">12&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Fetch (Python)&lt;/td>
&lt;td>1.29.0¹&lt;/td>
&lt;td style="text-align: right">717ms&lt;/td>
&lt;td style="text-align: right">220MB&lt;/td>
&lt;td style="text-align: right">1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Context7&lt;/td>
&lt;td>4.0.2&lt;/td>
&lt;td style="text-align: right">815ms&lt;/td>
&lt;td style="text-align: right">214MB&lt;/td>
&lt;td style="text-align: right">2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Desktop Commander&lt;/td>
&lt;td>0.2.47&lt;/td>
&lt;td style="text-align: right">1,705ms&lt;/td>
&lt;td style="text-align: right">275MB&lt;/td>
&lt;td style="text-align: right">26&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qdrant (Python, 3.12 pin)&lt;/td>
&lt;td>1.29.0¹&lt;/td>
&lt;td style="text-align: right">1,881ms&lt;/td>
&lt;td style="text-align: right">422MB&lt;/td>
&lt;td style="text-align: right">2&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>¹ The four Python servers self-report 1.29.0 via serverInfo. That is a framework
version string rather than each package&amp;rsquo;s own release number.&lt;/p>
&lt;p>Controls on the same box: bare Node resident loop 52.1MB, bare Python loop 15.2MB.
Five-server concurrent stack components: memory 189.8, filesystem 187.1, fetch 221.7,
git 184.5, GitHub 178.5. Total: 961.6MB.&lt;/p>
&lt;h2 id="method">Method&lt;/h2>
&lt;p>Each iteration spawns the server fresh (npx or uvx, warm package cache after one
discarded warmup), completes the MCP initialize handshake over stdio, requests
tools/list, then samples RSS across the full descendant process tree. I report medians
of five iterations, three for the two servers benched later the same evening, marked in
the CSV. The bench script lives in our repo at ops/bench/mcp/mcp_bench.py. For the
decision layer, meaning which servers earn their memory and which to skip, read
&lt;a href="https://techfuelhq.com/self-hosted/best-mcp-servers-homelab-2026/">the companion article&lt;/a>.&lt;/p>
&lt;p>Known limitations, named: one Windows 11 machine, warm caches, stdio transport only,
readiness and listing timed rather than per-tool-call latency under load. The GitHub
entry is the legacy npm package; GitHub&amp;rsquo;s current first-party server ships as a Go
binary and hosted remote. Version 1.0.0 of this dataset; changes will be logged in the
update history above.&lt;/p></description></item><item><title>Unraid vs TrueNAS vs OMV vs Proxmox: NAS OS Pick (2026)</title><link>https://techfuelhq.com/storage/unraid-vs-truenas-vs-omv-vs-proxmox-2026/</link><pubDate>Thu, 20 Aug 2026 00:30:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/storage/unraid-vs-truenas-vs-omv-vs-proxmox-2026/</guid><description>&lt;p>Every NAS thread ends in the same four names, and one of them does not belong. I spent
an evening verifying the current state of all four against their own release notes,
pricing pages, and documentation, because so much of the standing advice on this
comparison describes products that no longer exist, and the details that changed are
exactly the ones that decide the purchase: TrueNAS SCALE is gone as a name, TrueNAS CORE is discontinued
as a product, Unraid&amp;rsquo;s &amp;ldquo;subscription&amp;rdquo; is not one, and Proxmox, the name that starts half
the arguments, does not serve a single network share out of the box and never claimed
it could.&lt;/p>
&lt;p>Here is the decision, then the evidence.&lt;/p>
&lt;h2 id="the-short-version">The short version&lt;/h2>
&lt;p>Two are free. One is worth paying for. One is a hypervisor wearing a costume.&lt;/p>
&lt;p>Mixed drives you already own, apps with minimum friction, money available: Unraid.
Uniform drives, integrity as the priority, 8GB of RAM to spare: TrueNAS Community
Edition. A weak or small box, Debian comfort, zero budget: openmediavault. And if
virtual machines are the actual point of the server, run Proxmox — with a NAS on top of
it, not instead of one.&lt;/p>
&lt;h2 id="the-august-2026-state-of-play">The August 2026 state of play&lt;/h2>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">&lt;/th>
&lt;th scope="col">Unraid&lt;/th>
&lt;th scope="col">TrueNAS CE&lt;/th>
&lt;th scope="col">openmediavault&lt;/th>
&lt;th scope="col">Proxmox VE&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Version&lt;/td>
&lt;td>7.3.2 (Jul 2026)&lt;/td>
&lt;td>25.10.6 (Aug 2026)&lt;/td>
&lt;td>8.5.6-1 (Aug 2026)&lt;/td>
&lt;td>9.2 (May 2026)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Cost&lt;/td>
&lt;td>$49 / $109 / $249 once&lt;/td>
&lt;td>Free&lt;/td>
&lt;td>Free&lt;/td>
&lt;td>Free²&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Storage&lt;/td>
&lt;td>mixed-size parity array&lt;/td>
&lt;td>ZFS only&lt;/td>
&lt;td>mdadm + 16 mountable filesystems&lt;/td>
&lt;td>for VM disks, not shares&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RAM floor¹&lt;/td>
&lt;td>none published&lt;/td>
&lt;td>8GB&lt;/td>
&lt;td>1GiB&lt;/td>
&lt;td>1GB (2GB + guests)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Apps&lt;/td>
&lt;td>Community Apps (Docker)&lt;/td>
&lt;td>TrueNAS Apps (Docker)&lt;/td>
&lt;td>omv-extras plugins&lt;/td>
&lt;td>VMs + LXC only&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>¹ Official documentation figures; Unraid&amp;rsquo;s getting-started docs publish no RAM number
(only a 4GB USB stick requirement) and its forum moderators suggest 4GB as the practical
minimum. ² Subscriptions run €120 (repo access only, no tickets) to €1,100 (unlimited
tickets) per socket per year; the free package repo is officially labeled not
recommended for production.&lt;/p>
&lt;h2 id="what-the-old-comparisons-get-wrong">What the old comparisons get wrong&lt;/h2>
&lt;p>The rename nobody indexed. TrueNAS SCALE became TrueNAS Community Edition with 25.04
&amp;ldquo;Fangtooth&amp;rdquo; in April 2025, and the FreeBSD-based CORE line is formally finished. The
software status page says it is no longer under active development, with 13.0-U6.8 and
13.3-U1.2 as the final builds. Any comparison still weighing &amp;ldquo;CORE vs SCALE&amp;rdquo; is a
museum piece.&lt;/p>
&lt;p>Unraid&amp;rsquo;s pricing produces the loudest arguments and the most misinformation. The
licenses are perpetual. The $36 a year on the Starter and Unleashed tiers is optional
and only gates new feature releases; your installed version keeps working and keeps
receiving security patches within its minor version. Lime Technology shipped 7.2.8 with a
WebGUI CVE fix three weeks after 7.3.2 was already current. Call it a subscription and
its forum will correct you, with citations.&lt;/p>
&lt;p>RAIDZ expansion stopped being a differentiator. TrueNAS shipped it in 24.10 in October
2024, sponsored by iXsystems, and Unraid&amp;rsquo;s ZFS pools gained the same one-drive-at-a-time
growth in 7.2.0 a year later. The classic &amp;ldquo;ZFS can&amp;rsquo;t grow one disk at a time&amp;rdquo; objection
is two years stale against TrueNAS and ten months stale against Unraid.&lt;/p>
&lt;p>openmediavault deserves both its reputation and its asterisk. It is the lightest real
NAS OS here, it is genuinely free, and the third-party omv-extras mergerfs and SnapRAID
plugins recreate Unraid&amp;rsquo;s mixed-drive economics without the license fee. The asterisk is structural: the
GitHub contributor graph shows 8,303 commits by the lead developer against 24 by the
next contributor. One maintainer carries the core. OMV 7 also quietly went end-of-life
in June 2026, so a fresh install today should start at OMV 8.&lt;/p>
&lt;h2 id="the-category-error">The category error&lt;/h2>
&lt;p>Proxmox VE describes itself as a server management platform for enterprise
virtualization. Its storage documentation lists NFS and SMB only as backends it mounts
from somewhere else, to hold VM disks and backups. There is no interface anywhere in it
for creating a share, and its community answers the recurring question without
hedging: &amp;ldquo;not a NAS software like TrueNAS,&amp;rdquo; in its own words. That settles it.&lt;/p>
&lt;p>So why is it in every NAS thread? Because homelabbers correctly run it as the base
layer and put the NAS on top — a TrueNAS or OMV virtual machine with disks passed
through, a fileserver LXC, or bare Samba on the underlying Debian. All of those work.
None of them makes Proxmox a NAS OS; they make it a hypervisor hosting one, which is a
different decision with different failure modes. If that is your situation, the real
question is which storage backend to run under Proxmox, and &lt;a href="https://techfuelhq.com/homelab/proxmox-truenas-unraid-storage-backend-2026/">we compare exactly
that&lt;/a> separately.&lt;/p>
&lt;h2 id="picking-by-your-actual-constraint">Picking by your actual constraint&lt;/h2>
&lt;p>&lt;strong>Your drives are a mixed bag.&lt;/strong> Unraid&amp;rsquo;s parity array takes different sizes in one
protected pool, and openmediavault reaches the same shape via the third-party omv-extras
mergerfs and SnapRAID plugins. TrueNAS will let you mix sizes but charges you for it:
ZFS caps every disk in a vdev at the smallest member&amp;rsquo;s capacity.&lt;/p>
&lt;p>&lt;strong>Your RAM is tight.&lt;/strong> TrueNAS officially wants 8GB plus 1GB per drive past eight. OMV
officially runs in 1GiB. On a repurposed thin client or an N100 with soldered memory,
that spread decides the argument by itself.&lt;/p>
&lt;p>&lt;strong>You want apps without ceremony.&lt;/strong> Unraid&amp;rsquo;s Community Apps store is, in my judgment,
the smoothest catalog in home NAS. TrueNAS moved its apps backend from Kubernetes to plain Docker in
24.10, which simplified life, though its forums carry real migration scars from that
transition, and the forum threads from the 25.04 virtualization overhaul read the
same way. OMV needs the omv-extras compose plugin before Docker exists
at all.&lt;/p>
&lt;p>&lt;strong>Your data is the point and nothing else is.&lt;/strong> TrueNAS. It is not close, because the
whole platform is organized around one job: ZFS end-to-end with checksumming, snapshots,
and replication, maintained by a company whose paying enterprise customers keep the
storage layer honest whether or not the home users complain loudly enough.&lt;/p>
&lt;p>&lt;strong>Budget rules everything.&lt;/strong> OMV and TrueNAS are free. Unraid&amp;rsquo;s $49 Starter covers six
attached devices, which fits most first builds; count your drives before assuming the
$109 tier. Run your drive plan through the &lt;a href="https://techfuelhq.com/tools/nas-storage-calculator/">RAID capacity
calculator&lt;/a> first — parity overhead changes the real
cost per usable terabyte more than the license does.&lt;/p>
&lt;p>Whatever wins, put it on hardware that idles politely. A NAS runs 24/7, so the
&lt;a href="https://techfuelhq.com/homelab/24-7-homelab-idle-power-costs-2026/">idle-power economics&lt;/a> compound annually,
and the &lt;a href="https://techfuelhq.com/homelab/best-budget-nas-builds-2025/">budget NAS builds&lt;/a> and
&lt;a href="https://techfuelhq.com/homelab/nas-from-old-pc-2026/">old-PC conversion guide&lt;/a> both start from that premise.&lt;/p>
&lt;h2 id="method-and-limits">Method and limits&lt;/h2>
&lt;p>Everything above was verified on 2026-08-20 against official release notes, pricing
pages, and documentation, with community claims labeled as community claims; the source
list below carries the URLs. Two honesty notes from the verification run: the
openmediavault docs site blocks automated fetchers, so its facts were checked against
the project&amp;rsquo;s own docs source repository (identical content), and a small number of
forum items were verified through search-index snippets rather than full page loads. What this page is not: a hands-on
bench of the four installers side by side. I have not run these four concurrently on
matched hardware, so you will find no throughput or power numbers here — when we
measure that, it will publish as a dataset with the raw files, like our other
measured work. Versions move fast in this space; if the table above and a vendor page
ever disagree, the vendor page has moved and this page&amp;rsquo;s lastmod tells you by how much.&lt;/p></description></item><item><title>Best MCP Servers for a Homelab: 11 Measured (2026)</title><link>https://techfuelhq.com/self-hosted/best-mcp-servers-homelab-2026/</link><pubDate>Wed, 19 Aug 2026 23:58:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/self-hosted/best-mcp-servers-homelab-2026/</guid><description>&lt;p>All four &amp;ldquo;favorite MCP servers&amp;rdquo; roundups I could find share one gap. None publishes a
single number. No memory footprint, no startup time, no latency. Enumerate and vibe is
the format. So I wrote a small benchmark, pointed it at eleven of the most-recommended
MCP servers, and measured what they actually cost to keep resident on a homelab box.&lt;/p>
&lt;p>The headline: &lt;strong>each server holds 178-422MB of RAM&lt;/strong>, and the popular advice to &amp;ldquo;just
connect everything&amp;rdquo; costs about &lt;strong>1GB for five servers&lt;/strong>, because I measured 961.6MB for
a real concurrent stack, two independent measurement paths agreed on it to the decimal,
and that is a gigabyte gone before a single model or container starts, spent on tooling
I touch a few times a day. Nobody mentions this. RAM is the quiet bill.&lt;/p>
&lt;h2 id="the-measured-table">The measured table&lt;/h2>
&lt;p>Fresh spawn per iteration, warm package cache, five iterations per server (three for
GitHub and Qdrant, benched later the same evening — the iterations column in the CSV
says which), medians reported. RSS covers the full process tree, because npx and uvx
both spawn children, and measuring only the parent undercounts 18x. Raw data ships as
&lt;a href="https://techfuelhq.com/data/mcp-server-bench-2026-08.csv">CSV&lt;/a> with a
&lt;a href="https://techfuelhq.com/data/mcp-server-bench/">versioned dataset page&lt;/a>, CC BY 4.0.&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Server&lt;/th>
&lt;th scope="col">Version&lt;/th>
&lt;th scope="col" style="text-align: right">Ready&lt;/th>
&lt;th scope="col" style="text-align: right">RSS&lt;/th>
&lt;th scope="col" style="text-align: right">Tools&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>GitHub (legacy npm)&lt;/td>
&lt;td>0.6.2&lt;/td>
&lt;td style="text-align: right">547ms&lt;/td>
&lt;td style="text-align: right">178MB&lt;/td>
&lt;td style="text-align: right">26&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Playwright&lt;/td>
&lt;td>1.63.0-alpha-2026-08-05&lt;/td>
&lt;td style="text-align: right">618ms&lt;/td>
&lt;td style="text-align: right">227MB&lt;/td>
&lt;td style="text-align: right">24&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Time (Python)&lt;/td>
&lt;td>1.29.0¹&lt;/td>
&lt;td style="text-align: right">619ms&lt;/td>
&lt;td style="text-align: right">181MB&lt;/td>
&lt;td style="text-align: right">2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Sequential-thinking&lt;/td>
&lt;td>0.2.0&lt;/td>
&lt;td style="text-align: right">666ms&lt;/td>
&lt;td style="text-align: right">186MB&lt;/td>
&lt;td style="text-align: right">1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Memory&lt;/td>
&lt;td>0.6.3&lt;/td>
&lt;td style="text-align: right">667ms&lt;/td>
&lt;td style="text-align: right">187MB&lt;/td>
&lt;td style="text-align: right">9&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Filesystem&lt;/td>
&lt;td>0.2.0&lt;/td>
&lt;td style="text-align: right">692ms&lt;/td>
&lt;td style="text-align: right">188MB&lt;/td>
&lt;td style="text-align: right">14&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Git (Python)&lt;/td>
&lt;td>1.29.0¹&lt;/td>
&lt;td style="text-align: right">699ms&lt;/td>
&lt;td style="text-align: right">185MB&lt;/td>
&lt;td style="text-align: right">12&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Fetch (Python)&lt;/td>
&lt;td>1.29.0¹&lt;/td>
&lt;td style="text-align: right">717ms&lt;/td>
&lt;td style="text-align: right">220MB&lt;/td>
&lt;td style="text-align: right">1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Context7&lt;/td>
&lt;td>4.0.2&lt;/td>
&lt;td style="text-align: right">815ms&lt;/td>
&lt;td style="text-align: right">214MB&lt;/td>
&lt;td style="text-align: right">2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Desktop Commander&lt;/td>
&lt;td>0.2.47&lt;/td>
&lt;td style="text-align: right">1,705ms&lt;/td>
&lt;td style="text-align: right">275MB&lt;/td>
&lt;td style="text-align: right">26&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qdrant (Python, 3.12 pin)&lt;/td>
&lt;td>1.29.0¹&lt;/td>
&lt;td style="text-align: right">1,881ms&lt;/td>
&lt;td style="text-align: right">422MB&lt;/td>
&lt;td style="text-align: right">2&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>¹ The four Python servers self-report the version string 1.29.0 via serverInfo, a
framework string rather than each package&amp;rsquo;s own release number.&lt;/p>
&lt;p>Controls matter here. A bare Node process idles at 52MB and bare Python at 15MB on the
same box, so the gap between those floors and the table is frameworks plus dependencies.
Your tool code is nearly free. Tool count barely predicts weight. The 26-tool GitHub
server is the lightest thing I measured, while the 1-tool sequential-thinking server
still costs 186MB. The framework is the payload.&lt;/p>
&lt;p>Two findings surprised me. Python servers land as heavy as Node ones, since uvx resolves
an environment and spawns its own interpreter chain; fetch holds 220MB for a single tool.
And the whole startup-cost worry is mostly noise for homelab use. Everything except
Desktop Commander and Qdrant is ready in under a second warm, and a persistent client
like Claude Code spawns servers once per session anyway.&lt;/p>
&lt;h2 id="the-tiers-with-the-criteria-stated">The tiers, with the criteria stated&lt;/h2>
&lt;p>I ranked on four things I can defend: measured cost, utility per megabyte, install
friction, and whether the server works standalone or needs a service running behind it.&lt;/p>
&lt;h3 id="tier-1-connect-these-first">Tier 1, connect these first&lt;/h3>
&lt;p>&lt;strong>Filesystem&lt;/strong> (188MB, 14 tools), &lt;strong>Fetch&lt;/strong> (220MB, 1 tool), and &lt;strong>Git&lt;/strong> (185MB,
12 tools). These are the hands and eyes of any local AI setup. They read and edit real
files, pull real web pages, and work actual repository history. Every workflow I run
daily leans on at least two of the three, so their megabytes never idle.&lt;/p>
&lt;h3 id="tier-2-worth-it-when-the-use-exists">Tier 2, worth it when the use exists&lt;/h3>
&lt;p>&lt;strong>GitHub&lt;/strong> (178MB, 26 tools) earns a slot if your work lives in issues and PRs. The npm
package I measured is the legacy implementation; GitHub&amp;rsquo;s current
&lt;a href="https://github.com/github/github-mcp-server" rel="noopener">first-party server&lt;/a> ships as a Go binary
and a hosted remote endpoint, so treat 178MB as the worst case.
&lt;strong>Playwright&lt;/strong> (227MB, 24 tools) puts an agent behind a real browser, and the 227MB is
just the idle server, so budget for the browser on top. &lt;strong>Memory&lt;/strong> (187MB, 9 tools)
gives an agent a persistent knowledge graph across sessions, which pays off once you
have sessions worth remembering. &lt;strong>Desktop Commander&lt;/strong> (275MB, 26 tools) is the heaviest
Node server, and at 1.7s only Qdrant starts slower. It earns that by being a full
terminal-and-editor surface. Run it where you would trust an agent with a shell, and
nowhere else.&lt;/p>
&lt;h3 id="tier-3-think-twice">Tier 3, think twice&lt;/h3>
&lt;p>Sequential-thinking is the worst utility-per-megabyte in the table. It holds 186MB for
one tool that restates a reasoning pattern current models handle natively. Context7
(214MB, 2 tools) pulls current library docs into context, which helps coding agents and
duplicates a client that already fetches the web. Qdrant is the heaviest measured at
422MB, and bare uvx failed to install it outright on this machine — the resolver picked
a pydantic-core it had to source-build, which dies without a Rust toolchain. Pin it with
&lt;code>uvx --python 3.12 mcp-server-qdrant&lt;/code> and it starts fine, then holds its FastEmbed
embedding model (all-MiniLM-L6-v2 by default) inside that 422MB. Run it if you already run Qdrant for something else.&lt;/p>
&lt;h2 id="the-service-bound-layer-i-did-not-measure">The service-bound layer I did not measure&lt;/h2>
&lt;p>The service-bound servers the homelab press centers on need their platform running to
mean anything. Proxmox MCP is the consensus pick, covered by three of the four
roundups I checked, with one author counting 200+ exposed tools. Kubernetes MCP and
Docker Desktop&amp;rsquo;s MCP Toolkit round out that set. This bench box runs
neither Docker nor Proxmox, so those numbers would have been theater, and I left them
out. The pattern from the measured set almost certainly transfers. Expect the runtime
floor plus dependencies, call it 200-400MB per server, and measure on your own box
before trusting anyone&amp;rsquo;s table, including mine.&lt;/p>
&lt;h2 id="configs-beyond-cursor">Configs beyond Cursor&lt;/h2>
&lt;p>Three of the four roundups I read assume Cursor, and the fourth stays client-agnostic.
Two clients they skip matter in a homelab. Claude Code
wires a server in one line.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>claude mcp add filesystem -- npx -y @modelcontextprotocol/server-filesystem C:/lab
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>LM Studio and Claude Desktop take the same JSON shape in &lt;code>mcp.json&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;mcpServers&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;filesystem&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;command&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;npx&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;args&amp;#34;&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;-y&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;@modelcontextprotocol/server-filesystem&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;C:/lab&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Swap &lt;code>npx -y &amp;lt;package&amp;gt;&lt;/code> for &lt;code>uvx &amp;lt;package&amp;gt;&lt;/code> on the Python servers, and remember the
Qdrant interpreter pin from the table above.&lt;/p>
&lt;h2 id="what-to-run-this-on">What to run this on&lt;/h2>
&lt;p>The RAM math is friendly. A five-server stack costs about 1GB resident, so any
&lt;a href="https://techfuelhq.com/homelab/best-mini-pcs-homelab-2026/">N100-class mini PC&lt;/a> with 16GB handles the tooling
layer without noticing. The real constraint is whatever model or services run beside it.
If the same box also hosts a local LLM, size memory for the model first. Our
&lt;a href="https://techfuelhq.com/data/rtx-5080-llm-throughput/">RTX 5080 throughput dataset&lt;/a> and the
&lt;a href="https://techfuelhq.com/tutorials/self-host-local-llm-rtx-5060-2026/">local LLM on an RTX 5060 guide&lt;/a> carry the
VRAM numbers. Mine are measured on this bench. The 5060 guide&amp;rsquo;s come from published
benchmarks for those cards. With &lt;a href="https://techfuelhq.com/articles/ddr5-ram-buying-guide-2025/">DDR5 prices where they are&lt;/a>,
over-provisioning system RAM is the cheapest insurance in the build.&lt;/p>
&lt;h2 id="method-including-the-traps">Method, including the traps&lt;/h2>
&lt;p>The bench script (&lt;code>ops/bench/mcp/mcp_bench.py&lt;/code> in our repo) spawns each server fresh,
speaks MCP JSON-RPC over stdio with an initialize handshake followed by a tools/list
call, and samples RSS across the full descendant process tree 0.4s after the listing
returns. Five iterations per server, three for the two late additions. One discarded
warmup spawn keeps npm and uv package caches warm, because the documented condition is a configured homelab, and never a first
install. Run-to-run ready-time spread stayed under 7% for eight of eleven servers; the Python
time and fetch servers carried first-iteration outliers up to 17%, visible in the
published arrays. RSS spread stayed within 8MB worst case.&lt;/p>
&lt;p>The instrument hit traps, so yours does not have to. Measuring only the spawned npx parent
reports 10.3MB while the full process tree holds 189.3MB — an 18x undercount, recorded
in the evidence set. Sum the tree.
My first Git-server runs timed out because I pointed the repository flag at a plain
directory, and the server waits silently. The Qdrant failure looked like a hang until
stderr showed the build dying: &amp;ldquo;Failed to build pydantic-core==2.33.2 &amp;hellip; Rust not
found, installing into a temporary directory&amp;rdquo;. Bare uvx had resolved a pinned
pydantic-core and fallen back to a source build; the 3.12 interpreter pin sidesteps it. For the five-stack figure the components were memory 189.8, filesystem 187.1, fetch
221.7, git 184.5, and GitHub 178.5, totaling 961.6MB by psutil; an independent
PowerShell WorkingSet64 walk over the same process trees returned 961.6MB, exact
agreement.&lt;/p>
&lt;p>Limitations, named. One Windows 11 machine. Warm caches. Stdio transport only. I
measured readiness and listing, and never per-tool-call latency under load. The GitHub
entry is the legacy npm package rather than the current Go binary. Linux numbers will
differ, likely lower on the Node floor, and that comparison is a natural v2 alongside
the service-bound servers once this lab runs Docker.&lt;/p></description></item><item><title>RTX 5080 LLM Power Efficiency: Measured Watts and Joules per Token</title><link>https://techfuelhq.com/data/rtx-5080-llm-power-efficiency/</link><pubDate>Wed, 19 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/data/rtx-5080-llm-power-efficiency/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · Published 2026-08-19 · ~5 min read · St. Louis County, MO&lt;/p>
&lt;img src="https://techfuelhq.com/images/data/rtx-5080-llm-power-efficiency.svg" alt="Measured RTX 5080 LLM power efficiency bar chart, tokens per joule from 1Hz board telemetry at the stock 448W limit: Llama 3.2 3B leads at 1.2 (318 tok/s at 265W), sparse gpt-oss 20B second at 0.665 (194 tok/s at 292W), Qwen 2.5 7B at 0.53 (182 tok/s at 344W), and Qwen 2.5 14B at 0.317 (99 tok/s at 312W)" width="1200" height="630" loading="eager" fetchpriority="high" style="display:block;margin:1.5rem auto;max-width:100%;height:auto;border:1px solid #1e1e3a;border-radius:8px;" />
&lt;h2 id="the-short-version">The short version&lt;/h2>
&lt;p>The &lt;a href="https://techfuelhq.com/data/rtx-5080-llm-throughput/">RTX 5080 throughput dataset&lt;/a> answers &amp;ldquo;how fast&amp;rdquo; — this companion answers &lt;strong>&amp;ldquo;at what electrical cost.&amp;rdquo;&lt;/strong> Same retail card, same ollama stack: I logged board power at 1Hz with nvidia-smi while driving fixed-length generations through four models from 3B to 20.9B parameters, then divided each run&amp;rsquo;s decode rate by the watts that produced it. The result is the number almost nobody publishes for consumer cards: &lt;strong>joules per token&lt;/strong>, and from it, real dollars per million tokens at the current &lt;a href="https://www.eia.gov/electricity/monthly/epm_table_grapher.php?t=epmt_5_6_a" rel="noopener">EIA US residential electricity average&lt;/a> of $0.184/kWh.&lt;/p>
&lt;p>Two findings up front. First, &lt;strong>the sparse-MoE gpt-oss 20B beats the dense 7B on tokens per joule (0.665 vs 0.53) and doubles the dense 14B (0.317)&lt;/strong> — active-parameter count and quantization set the electric bill, not total size. Second, the quiet budget-killer: &lt;strong>this card measures 52–71W at idle&lt;/strong> in my system — not the 8–15W reference figure reviews quote — which at 24/7 duty is $85–115/year before a single token is generated.&lt;/p>
&lt;h2 id="the-numbers-capture-2026-08-19-stock-448w-power-limit">The numbers (capture 2026-08-19, stock 448W power limit)&lt;/h2>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Model&lt;/th>
&lt;th scope="col">Quant&lt;/th>
&lt;th scope="col" style="text-align: right">Decode tok/s (med)&lt;/th>
&lt;th scope="col" style="text-align: right">Board W (med, loaded)&lt;/th>
&lt;th scope="col" style="text-align: right">Tokens/joule&lt;/th>
&lt;th scope="col" style="text-align: right">Wh per 1M tokens&lt;/th>
&lt;th scope="col" style="text-align: right">$ per 1M tokens&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Llama 3.2 3B&lt;/td>
&lt;td>Q4_K_M&lt;/td>
&lt;td style="text-align: right">318.3&lt;/td>
&lt;td style="text-align: right">265.2&lt;/td>
&lt;td style="text-align: right">1.20&lt;/td>
&lt;td style="text-align: right">231&lt;/td>
&lt;td style="text-align: right">$0.043&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qwen 2.5 7B&lt;/td>
&lt;td>Q4_K_M&lt;/td>
&lt;td style="text-align: right">182.2&lt;/td>
&lt;td style="text-align: right">343.6&lt;/td>
&lt;td style="text-align: right">0.53&lt;/td>
&lt;td style="text-align: right">524&lt;/td>
&lt;td style="text-align: right">$0.096&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qwen 2.5 14B&lt;/td>
&lt;td>Q4_K_M&lt;/td>
&lt;td style="text-align: right">98.8&lt;/td>
&lt;td style="text-align: right">311.6&lt;/td>
&lt;td style="text-align: right">0.32&lt;/td>
&lt;td style="text-align: right">876&lt;/td>
&lt;td style="text-align: right">$0.161&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>gpt-oss 20B&lt;/td>
&lt;td>MXFP4 (MoE)&lt;/td>
&lt;td style="text-align: right">194.4&lt;/td>
&lt;td style="text-align: right">292.4&lt;/td>
&lt;td style="text-align: right">0.67&lt;/td>
&lt;td style="text-align: right">418&lt;/td>
&lt;td style="text-align: right">$0.077&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>&lt;em>Loaded-basis medians: telemetry samples counted only at GPU utilization ≥ 50%. Decode rates are ollama&amp;rsquo;s own eval counters (fresh prompt every iteration — cached-prompt runs report prefill artifacts, not decode). Full column set including clocks, temperature, VRAM, and per-run min/max is in &lt;a href="https://techfuelhq.com/data/rtx-5080-llm-power-efficiency.csv">the CSV&lt;/a>.&lt;/em>&lt;/p>
&lt;h2 id="what-the-data-says">What the data says&lt;/h2>
&lt;p>&lt;strong>Sparsity beats size.&lt;/strong> gpt-oss 20B is the second-most efficient model on the card despite carrying the most total parameters — 0.67 tokens/joule against the dense 7B&amp;rsquo;s 0.53 and the dense 14B&amp;rsquo;s 0.32. It is a mixture-of-experts design that activates only a fraction of its weights per token, shipped in MXFP4, so it decodes at 194 tok/s while drawing &lt;em>less&lt;/em> power than the 7B. If your workload fits its quality profile, the 20B is both the smartest and the second-cheapest model per token in this ladder — the dense-model intuition that &amp;ldquo;bigger costs more electricity per token&amp;rdquo; fails here.&lt;/p>
&lt;p>&lt;strong>Board power barely moves; efficiency moves 4x.&lt;/strong> Across a 7x spread in total parameters, loaded board power stays inside a narrow 265–344W band — the card runs at 59–77% of its 448W limit no matter what I feed it, and never once touched the cap. The 7B is the thirstiest of the four (343.6W): it generates fast enough to keep the memory bus saturated while still lighting up plenty of compute. What actually separates the models is the numerator — tokens delivered per second — which is why tokens-per-joule spans 0.32 to 1.20 while watts span barely 30%.&lt;/p>
&lt;p>&lt;strong>The marginal token is nearly free; the idle hours are not.&lt;/strong> Even the least efficient row costs $0.161 of electricity per million tokens — a full novel&amp;rsquo;s worth of output for under two cents at the &lt;a href="https://www.eia.gov/electricity/monthly/epm_table_grapher.php?t=epmt_5_6_a" rel="noopener">May-2026 EIA residential average&lt;/a>. Set against the idle finding below (52–71W around the clock ≈ $85–115/year), the budget conclusion for a home inference node inverts the usual framing: model choice barely matters to the bill; what the box does during the other 23 hours dominates it. Temperatures never passed 52°C at a 30% fan median, and the 448W cap was never reached — which also means a power-limit sweep should cost little throughput, and that is exactly the queued v1.1.&lt;/p>
&lt;h2 id="the-idle-power-finding">The idle-power finding&lt;/h2>
&lt;p>Every 24/7 cost model I have seen for this card starts from single-digit idle watts. Mine doesn&amp;rsquo;t idle there: across repeated captures this week the card sat between &lt;strong>52W and 71W at the Windows desktop&lt;/strong>, pinned in P0 with graphics clocks near 2.9GHz — multi-monitor output holds the high P-state, an animated wallpaper added ~6W and 2% utilization on its own, and the cleanest state I could produce (wallpaper closed, no model resident) still read 53.7W. This is a known behavior class, not a defect, but it is the number an always-on node actually pays: at $0.184/kWh, 52–71W around the clock is &lt;strong>456–622 kWh ≈ $85–115/year of pure idle&lt;/strong>. If your 5080 box mostly waits for occasional inference, the idle line, not the inference line, dominates the bill — check your own card with &lt;code>nvidia-smi --query-gpu=power.draw --format=csv&lt;/code> before trusting any spec-sheet idle figure, mine included.&lt;/p>
&lt;h2 id="method-exactly">Method, exactly&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Card:&lt;/strong> ASUS ROG Astral RTX 5080 OC (the same physical card as the &lt;a href="https://techfuelhq.com/data/rtx-5080-llm-throughput/">throughput dataset&lt;/a> and the &lt;a href="https://techfuelhq.com/data/gpu/rog-astral-rtx-5080-oc-2026-06-09/">Astral bench dataset&lt;/a>), stock 448W power limit, driver-default clocks.&lt;/li>
&lt;li>&lt;strong>Host:&lt;/strong> Ryzen 7 7800X3D, 64GB DDR5-6000, Windows 11, ollama 0.32.1.&lt;/li>
&lt;li>&lt;strong>Workload:&lt;/strong> &lt;code>ollama run &amp;lt;model&amp;gt; --verbose&lt;/code> generating from a fixed ~60-word prompt with a unique per-iteration prefix (defeats ollama&amp;rsquo;s prompt cache, which otherwise reports cache-hit rates that measure nothing). Three iterations per model.&lt;/li>
&lt;li>&lt;strong>Telemetry:&lt;/strong> &lt;code>nvidia-smi --query-gpu=power.draw,clocks.gr,temperature.gpu,utilization.gpu,memory.used,...&lt;/code> polled at 1Hz for the whole profile window; the published watts are medians over samples with utilization ≥ 50% so idle seconds between iterations never dilute the load figure.&lt;/li>
&lt;li>&lt;strong>Pairing:&lt;/strong> each efficiency figure divides a profile&amp;rsquo;s median decode rate by that same profile&amp;rsquo;s median loaded watts — never a rate from one run by watts from another.&lt;/li>
&lt;li>&lt;strong>Decode, not prefill:&lt;/strong> the parser anchors on ollama&amp;rsquo;s &lt;code>eval rate:&lt;/code> line start; a substring match also catches &lt;code>prompt eval rate:&lt;/code> and silently records prefill — a bug these capture scripts had and fixed, documented in the scripts themselves.&lt;/li>
&lt;/ul>
&lt;h2 id="limitations-honestly">Limitations, honestly&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>One prompt shape.&lt;/strong> Single-stream interactive decode from a short prompt; batch serving, long-context prefill, and draft-model setups will land elsewhere. The &lt;a href="https://techfuelhq.com/data/rtx-5080-llm-throughput/">throughput dataset&lt;/a> covers context scaling; its decode rates are the canonical speed numbers for this card.&lt;/li>
&lt;li>&lt;strong>Board power only.&lt;/strong> nvidia-smi reports GPU board draw — CPU, RAM, fans, and PSU efficiency losses are excluded. Wall draw for the whole box runs higher; my measured whole-rig figures live in the &lt;a href="https://techfuelhq.com/articles/rtx-5080-perf-per-watt-ai-24-7-2026/">perf-per-watt article&lt;/a>.&lt;/li>
&lt;li>&lt;strong>Stock power limit only (for now).&lt;/strong> The obvious next axis — the same ladder at 400/350/300W caps — needs an elevated shell for &lt;code>nvidia-smi -pl&lt;/code>; that sweep is queued as v1.1.&lt;/li>
&lt;li>&lt;strong>Windows + this driver.&lt;/strong> P-state and idle behavior differ across OS/driver/monitor configurations; the 70W idle is my system&amp;rsquo;s truth, not a universal constant.&lt;/li>
&lt;/ul>
&lt;h2 id="use-the-data-cc-by-40">Use the data (CC BY 4.0)&lt;/h2>
&lt;p>Cite as &amp;ldquo;TechFuelHQ RTX 5080 LLM power-efficiency dataset, v1.0.0&amp;rdquo;. The table CSV is at &lt;a href="https://techfuelhq.com/data/rtx-5080-llm-power-efficiency.csv">/data/rtx-5080-llm-power-efficiency.csv&lt;/a>; the raw 1Hz telemetry CSVs (one per run) and the capture manifest are in &lt;a href="https://techfuelhq.com/data/rtx-5080-llm-power-efficiency-raw/MANIFEST.txt">/data/rtx-5080-llm-power-efficiency-raw/&lt;/a>. Attribution: TechFuelHQ / Lowell K. Wood IV, link to this page.&lt;/p>
&lt;h2 id="change-log">Change log&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>1.0.0 (2026-08-19)&lt;/strong> — initial publication: 4-model stock-power ladder (3B/7B/14B/20.9B), loaded-basis power medians, joules-per-token and $/Mtok at $0.184/kWh, raw telemetry CSVs, idle-power finding.&lt;/li>
&lt;/ul></description></item><item><title>Best Motherboards for Ryzen 7 9800X3D (2026)</title><link>https://techfuelhq.com/articles/best-motherboard-ryzen-7-9800x3d-2026/</link><pubDate>Tue, 18 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/articles/best-motherboard-ryzen-7-9800x3d-2026/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · Published 2026-08-18 · 14 min read · St. Louis County, MO&lt;/p>
&lt;h2 id="the-three-boards-at-a-glance">The three boards at a glance&lt;/h2>
&lt;p>The 9800X3D reaches full gaming speed on a well-built mainstream board. These picks buy three different layouts; CPU performance stays in the same class, so every dollar above the B850 default must purchase a port, lane, form factor, debug control, or expansion path the build will use.&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Pick&lt;/th>
&lt;th scope="col">Best for&lt;/th>
&lt;th scope="col">The features that justify it&lt;/th>
&lt;th scope="col" style="text-align: right">Aug. 17 reference&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>MSI MAG B850 Tomahawk Max WiFi&lt;/strong>&lt;/td>
&lt;td>Best ATX value for most builds&lt;/td>
&lt;td>PCIe 5.0 x16, Gen5 M.2, Wi-Fi 7, 5GbE, strong 80A-stage listing&lt;/td>
&lt;td style="text-align: right">&lt;strong>$209.99 standalone&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>ASUS ROG Strix B850-G Gaming WiFi&lt;/strong>&lt;/td>
&lt;td>White micro-ATX build&lt;/td>
&lt;td>Four M.2, Wi-Fi 7, 2.5GbE, 20Gbps USB-C, PCIe 5.0 x16&lt;/td>
&lt;td style="text-align: right">ASUS listed &lt;strong>$259.99&lt;/strong> standalone; bundle was $1,059.99&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>ASUS ROG Crosshair X870E Hero&lt;/strong>&lt;/td>
&lt;td>Storage, USB4, and expansion-heavy build&lt;/td>
&lt;td>Five M.2, SlimSAS, dual USB4, 5GbE + 2.5GbE, Wi-Fi 7&lt;/td>
&lt;td style="text-align: right">ASUS listed &lt;strong>$569.99&lt;/strong> standalone; bundle was $1,599.99&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>The standalone MSI price is a dated Newegg feed snapshot. The ASUS figures came from the official product-page offers captured on August 18. The bundle figures are current retailer snapshots described later. Check the live number before ordering.&lt;/p>
&lt;img src="https://techfuelhq.com/images/articles/best-motherboard-ryzen-7-9800x3d-2026.svg" alt="Ryzen 7 9800X3D motherboard decision map. A B850 board covers the gaming essentials and is marked the default. A white micro-ATX B850 branch serves compact aesthetic builds. An X870E branch adds five M.2 slots, USB4, dual wired networking, and extra lane flexibility for expansion-heavy systems." width="1200" height="630" loading="eager" fetchpriority="high" decoding="async" style="display:block;margin:1.5rem auto;max-width:100%;height:auto;border:1px solid #1e1e3a;border-radius:8px;" />
&lt;h2 id="the-rule-that-prevents-motherboard-overspending">The rule that prevents motherboard overspending&lt;/h2>
&lt;p>Buy the cheapest well-built board that has the ports you will use. Then verify its slot and lane map. Write those requirements down before opening retailer tabs; otherwise every extra feature looks useful in isolation.&lt;/p>
&lt;p>The Ryzen 7 9800X3D is an eight-core, 120W AM5 processor. A decent B850 board already supplies ample CPU power. Moving to X870 or X870E changes the connectivity floor and lane layout; it does not add gaming frames by itself.&lt;/p>
&lt;p>I would reject a board for:&lt;/p>
&lt;ul>
&lt;li>no BIOS Flashback on an expensive build&lt;/li>
&lt;li>weak rear I/O for the devices you own&lt;/li>
&lt;li>only gigabit Ethernet when faster networking matters&lt;/li>
&lt;li>a lane-sharing rule that disables a card or drive you plan to install&lt;/li>
&lt;li>too few M.2 slots for the build&amp;rsquo;s life&lt;/li>
&lt;li>a price that approaches premium X870E territory without premium I/O&lt;/li>
&lt;/ul>
&lt;p>A lower chipset rung does not disqualify a board. A missing port or broken lane plan does.&lt;/p>
&lt;h2 id="1-msi-b850-tomahawk-max-wifi-is-the-default">1. MSI B850 Tomahawk Max WiFi is the default&lt;/h2>
&lt;p>The B850 Tomahawk Max WiFi is the board I would put under a 9800X3D gaming system unless the build brief names a reason to move. That reason should be concrete: a smaller white case, five NVMe drives, USB4 peripherals, or an add-in-card layout this board cannot serve.&lt;/p>
&lt;p>The exact Newegg row lists:&lt;/p>
&lt;ul>
&lt;li>ATX form factor&lt;/li>
&lt;li>B850 chipset and AM5 socket&lt;/li>
&lt;li>PCIe 5.0 x16&lt;/li>
&lt;li>a Gen5 M.2 slot&lt;/li>
&lt;li>Wi-Fi 7&lt;/li>
&lt;li>5GbE&lt;/li>
&lt;li>four DDR5 slots&lt;/li>
&lt;li>four SATA ports&lt;/li>
&lt;li>an 80A smart-power-stage design&lt;/li>
&lt;/ul>
&lt;p>That is the useful part of a modern high-end platform without a flagship tax. The August 17 feed captured $209.99 against a $229.99 regular field. Even if the live price moves, the board belongs in the low-$200 class. A $500 board serves a different build.&lt;/p>
&lt;p>There is one layout caveat in the retailer specification: the lower PCIe 4.0 x4-length slot drops to x2 when M.2_3 is populated. If you plan to run a fast capture card, storage adapter, or 10GbE NIC there, read the manual before filling every M.2 slot. Gaming builds with one GPU will rarely care. Hybrid workstation and homelab builds can care immediately.&lt;/p>
&lt;p>For a gaming tower with one GPU, two or three NVMe drives, and onboard networking, this is the complete answer.&lt;/p>
&lt;h2 id="2-rog-strix-b850-g-is-the-white-micro-atx-pick">2. ROG Strix B850-G is the white micro-ATX pick&lt;/h2>
&lt;p>The B850-G exists for a different build. It compresses a premium-looking white AM5 platform into micro-ATX without stripping the storage and rear I/O that usually disappear first.&lt;/p>
&lt;p>ASUS specifies:&lt;/p>
&lt;ul>
&lt;li>micro-ATX&lt;/li>
&lt;li>14+2+1 power stages&lt;/li>
&lt;li>PCIe 5.0 x16&lt;/li>
&lt;li>four M.2 slots, including one Gen5 slot&lt;/li>
&lt;li>Wi-Fi 7&lt;/li>
&lt;li>Intel 2.5GbE&lt;/li>
&lt;li>ten rear USB ports, led by 20Gbps Type-C&lt;/li>
&lt;li>BIOS Flashback and Clear CMOS buttons&lt;/li>
&lt;/ul>
&lt;p>The fourth M.2 slot sits on the underside, which matters for access and cooling. Two SATA ports are also lean for anyone reusing several 2.5-inch drives. Those layout costs should be in the case plan. Install the underside SSD before the board goes into the chassis; discovering it later turns a two-minute upgrade into a teardown.&lt;/p>
&lt;p>ASUS&amp;rsquo;s page listed $259.99 at capture. That premium over the MSI buys a smaller white board and its particular I/O arrangement. It does not buy a faster 9800X3D.&lt;/p>
&lt;span class="buy-cell buy-cell--inline">&lt;a class="buy-cell__action buy-cell__action--primary"
href="https://click.linksynergy.com/deeplink?id=CW4UrCo/56I&amp;amp;mid=44583&amp;amp;murl=https%3A%2F%2Fwww.newegg.com%2Fp%2Fpl%3Fd%3DASUS%2BROG%2BStrix%2BB850-G%2BGaming%2BWiFi"
rel="nofollow sponsored noopener"
target="_blank"
data-affiliate-retailer="Newegg"
data-affiliate-slot="table-row"
data-link-kind="search">Search Newegg&lt;span class="buy-cell__checked">Link checked 2026-08-18&lt;/span>&lt;/a>&lt;/span>
&lt;h2 id="3-crosshair-x870e-hero-is-for-expansion">3. Crosshair X870E Hero is for expansion&lt;/h2>
&lt;p>The Crosshair X870E Hero is not the &amp;ldquo;best gaming&amp;rdquo; choice. It is the choice for a system that needs to behave like a workstation while keeping an X3D gaming CPU.&lt;/p>
&lt;p>Its reason to exist is the I/O map:&lt;/p>
&lt;ul>
&lt;li>five M.2 slots, three of them Gen5 with a Ryzen 9000 or 7000 processor&lt;/li>
&lt;li>SlimSAS plus four SATA ports&lt;/li>
&lt;li>two USB4 40Gbps rear ports&lt;/li>
&lt;li>eight additional 10Gbps rear USB ports&lt;/li>
&lt;li>5GbE and 2.5GbE&lt;/li>
&lt;li>Wi-Fi 7&lt;/li>
&lt;li>two full-length CPU-connected slots with configurable lane sharing&lt;/li>
&lt;li>onboard Q-Code, start controls, BIOS Flashback, and Clear CMOS&lt;/li>
&lt;/ul>
&lt;p>The lane-sharing rules deserve attention. Populate the second and third CPU-connected M.2 slots and the primary graphics slot can fall to x8 while the second full-length slot changes or disables. That is normal on a feature-dense desktop platform, but it means the installation order needs a plan. Sketch the final drive and card map first. Buying five slots is useless if populating the wrong two breaks the slot you bought the board to gain.&lt;/p>
&lt;p>ASUS listed $569.99 at capture. Spend that only when the five-drive layout, USB4, dual wired networking, or slot flexibility replaces hardware you would otherwise add. A single-GPU gaming PC with two drives does not need it.&lt;/p>
&lt;span class="buy-cell buy-cell--inline">&lt;a class="buy-cell__action buy-cell__action--primary"
href="https://click.linksynergy.com/deeplink?id=CW4UrCo/56I&amp;amp;mid=44583&amp;amp;murl=https%3A%2F%2Fwww.newegg.com%2Fp%2Fpl%3Fd%3DASUS%2BROG%2BCrosshair%2BX870E%2BHero"
rel="nofollow sponsored noopener"
target="_blank"
data-affiliate-retailer="Newegg"
data-affiliate-slot="table-row"
data-link-kind="search">Search Newegg&lt;span class="buy-cell__checked">Link checked 2026-08-18&lt;/span>&lt;/a>&lt;/span>
&lt;h2 id="b850-vs-x870-vs-x870e-for-the-9800x3d">B850 vs X870 vs X870E for the 9800X3D&lt;/h2>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Chipset class&lt;/th>
&lt;th scope="col">Buy it when&lt;/th>
&lt;th scope="col">Do not buy it for&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>B850&lt;/strong>&lt;/td>
&lt;td>One GPU, normal NVMe count, gaming-first value&lt;/td>
&lt;td>More FPS from the CPU&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>X870&lt;/strong>&lt;/td>
&lt;td>You want USB4 and a stronger modern-I/O baseline&lt;/td>
&lt;td>A belief that &amp;ldquo;X&amp;rdquo; means faster games&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>X870E&lt;/strong>&lt;/td>
&lt;td>You need more high-speed expansion and can map the lanes&lt;/td>
&lt;td>One GPU, two drives, and no add-in cards&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>AMD&amp;rsquo;s AM5 chipset table is the right starting point, but a model&amp;rsquo;s manual is the final authority. Two boards with the same chipset can expose different slots and controllers. Their sharing rules can differ too.&lt;/p>
&lt;p>That is why the shortlist crosses chipset tiers. It follows build requirements.&lt;/p>
&lt;h2 id="are-the-cpu-bundles-worth-it">Are the CPU bundles worth it?&lt;/h2>
&lt;p>The August feed contained several Ryzen 7 9800X3D motherboard bundles. Three illustrate why &amp;ldquo;bundle&amp;rdquo; is not a synonym for &amp;ldquo;deal.&amp;rdquo;&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Bundle&lt;/th>
&lt;th scope="col" style="text-align: right">Aug. 17 snapshot&lt;/th>
&lt;th scope="col">Rendered seller check, Aug. 18&lt;/th>
&lt;th scope="col">What to verify&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Sapphire NITRO+ B850M + 9800X3D&lt;/td>
&lt;td style="text-align: right">&lt;strong>$969.99&lt;/strong>&lt;/td>
&lt;td>TECH EDGE; new; ships from China; not fulfilled by Newegg&lt;/td>
&lt;td>Manufacturer warranty flag was false; returns were non-replaceable&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ASUS ROG Strix B850-G + 9800X3D&lt;/td>
&lt;td style="text-align: right">&lt;strong>$1,059.99&lt;/strong>&lt;/td>
&lt;td>TECH EDGE; new; ships from China; not fulfilled by Newegg&lt;/td>
&lt;td>Manufacturer warranty flag was true; still compare return freight and delivery&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ASUS Crosshair X870E Hero + 9800X3D&lt;/td>
&lt;td style="text-align: right">&lt;strong>$1,599.99&lt;/strong>&lt;/td>
&lt;td>TECH EDGE; new; ships from China; not fulfilled by Newegg&lt;/td>
&lt;td>Manufacturer warranty flag was true; the premium only works if you need the board&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>The seller was rated 4.6/5 over 39 reviews in the prior 12 months and marked Top Rated in the embedded listing data at capture. That is useful context. It is not the same purchase path as a direct Newegg item. A heavy motherboard-and-CPU return to China can consume the paper discount in freight and delay. It also adds transit risk.&lt;/p>
&lt;p>Price the CPU and board separately first. Newegg&amp;rsquo;s exact 9800X3D row was $479 in the same feed. Add the $209.99 MSI board and the parts total is $688.99 before tax. A $969.99 micro-ATX bundle therefore needs to justify roughly $281 through a different board, availability, or terms. The Crosshair bundle is a specialist purchase rather than a value shortcut.&lt;/p>
&lt;p>If you still want a bundle, use the current searches below and inspect the exact seller block before payment.&lt;/p>
&lt;span class="buy-cell buy-cell--inline">&lt;a class="buy-cell__action buy-cell__action--primary"
href="https://click.linksynergy.com/deeplink?id=CW4UrCo/56I&amp;amp;mid=44583&amp;amp;murl=https%3A%2F%2Fwww.newegg.com%2Fp%2Fpl%3Fd%3DRyzen%2B7%2B9800X3D%2Bmotherboard%2Bbundle"
rel="nofollow sponsored noopener"
target="_blank"
data-affiliate-retailer="Newegg"
data-affiliate-slot="table-row"
data-link-kind="search">Search Newegg&lt;span class="buy-cell__checked">Link checked 2026-08-18&lt;/span>&lt;/a>&lt;/span>
&lt;h2 id="what-about-b650-and-x670">What about B650 and X670?&lt;/h2>
&lt;p>You do not need to replace a good AM5 board merely because B850 and X870 exist.&lt;/p>
&lt;p>If you already own B650, B650E, X670, or X670E, check the manufacturer&amp;rsquo;s 9800X3D BIOS support and the ports you need. A supported existing board is usually the value winner. The &lt;a href="https://techfuelhq.com/reviews/rog-strix-b650a-review-2026/">ROG Strix B650-A review&lt;/a> covers one real example of a B650 board running an X3D system with ample power delivery.&lt;/p>
&lt;p>Before a BIOS update, back up important data and do not interrupt power during the flash. Use BIOS Flashback when the board supports it and the installed CPU cannot boot the current firmware.&lt;/p>
&lt;p>This page covers a new board purchase. A working compatible platform should stay in service.&lt;/p>
&lt;h2 id="ram-cooling-and-the-rest-of-the-build">RAM, cooling, and the rest of the build&lt;/h2>
&lt;p>Use two DDR5 modules. DDR5-6000 with an AMD EXPO profile is the low-drama target; the &lt;a href="https://techfuelhq.com/articles/ddr5-ram-buying-guide-2025/">DDR5 buying guide&lt;/a> explains why a larger advertised number is not automatically a better AM5 result. For the purchase itself, use the &lt;a href="https://techfuelhq.com/data/ram-price-index/">open RAM price index&lt;/a>: its August 18 capture reviewed 583 listings, still found only three of 12 tracked kits that cleared the direct-retailer rules, and put the cheapest qualifying 32GB observation at $459.99. The gate remains closed, so treat the table as dated offers rather than a broad market average.&lt;/p>
&lt;p>The 9800X3D does not include a cooler. Board selection should therefore leave room in the case and budget for the cooling hardware you want. The board does not need a giant VRM heatsink to survive this CPU, but the case still needs airflow across the socket, memory, SSD heatsinks, and graphics card. Header placement matters here: count pump and fan headers against the actual radiator and case layout, rather than assuming a premium board has one in the convenient corner.&lt;/p>
&lt;p>One build can overturn the entire default. Imagine a 9800X3D workstation with an RTX 5080, three Gen5 scratch drives, two more archive SSDs, a capture card, 10GbE today, and a USB4 RAID enclosure already on the desk. The Crosshair&amp;rsquo;s price is suddenly easier to defend because one board replaces an add-in network card, a storage adapter, and a Thunderbolt-style expansion plan. Remove those devices and the logic collapses back to B850. That is the standard: every premium interface should displace another cost or solve a named constraint. The workstation case can defend the X870E premium because its five-drive map, USB4 enclosure, faster wired links, debug controls, and second expansion slot replace a pile of adapters while keeping the build coherent; a one-GPU gaming tower with two SSDs receives none of that value, even though both machines use the same processor and can post the same frame rate. Run the same test in reverse before paying: remove USB4, the fifth drive, the second network link, and the extra card from the parts plan; if the system still works exactly as intended, the premium board has lost every job that made it rational and the B850 choice is stronger.&lt;/p>
&lt;p>Finally, map the whole build before checkout:&lt;/p>
&lt;ul>
&lt;li>exact case form factor&lt;/li>
&lt;li>GPU thickness and slot obstruction&lt;/li>
&lt;li>number of M.2 and SATA drives&lt;/li>
&lt;li>front USB-C header requirement&lt;/li>
&lt;li>wired network speed&lt;/li>
&lt;li>add-in cards now and later&lt;/li>
&lt;li>fan and pump-header count&lt;/li>
&lt;/ul>
&lt;p>The &lt;a href="https://techfuelhq.com/tools/pc-builder/">PC Builder&lt;/a> catches the basic socket and form-factor problems. Its &lt;a href="https://techfuelhq.com/data/pc-part-prices-2026/">open 126-part compatibility dataset&lt;/a> exposes the source and last-verified date behind each supported row. The board manual catches the lane-sharing rules that a category-level dataset cannot.&lt;/p>
&lt;h2 id="the-shortest-honest-recommendation">The shortest honest recommendation&lt;/h2>
&lt;p>Buy the &lt;strong>MSI B850 Tomahawk Max WiFi&lt;/strong> for a normal ATX 9800X3D gaming build.&lt;/p>
&lt;p>Buy the &lt;strong>ROG Strix B850-G&lt;/strong> when the machine must be white and micro-ATX.&lt;/p>
&lt;p>Buy the &lt;strong>Crosshair X870E Hero&lt;/strong> only when five M.2 slots, USB4, dual wired networking, or its expansion controls are already part of the plan.&lt;/p>
&lt;p>Anything beyond that is paying for a feature list you have not assigned a job.&lt;/p></description></item><item><title>Best RTX 5080 Prebuilt Gaming PCs (2026)</title><link>https://techfuelhq.com/articles/best-rtx-5080-prebuilt-gaming-pc-2026/</link><pubDate>Tue, 18 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/articles/best-rtx-5080-prebuilt-gaming-pc-2026/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · Published 2026-08-18 · 13 min read · St. Louis County, MO&lt;/p>
&lt;h2 id="the-three-picks-at-a-glance">The three picks at a glance&lt;/h2>
&lt;p>All three finalists use the same performance core: Ryzen 7 9800X3D, GeForce RTX 5080 16GB, 32GB DDR5, and a 2TB NVMe SSD. The table therefore ranks what usually stays hidden in a prebuilt listing.&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Pick&lt;/th>
&lt;th scope="col">Why it made the list&lt;/th>
&lt;th scope="col" style="text-align: right">Disclosed power supply&lt;/th>
&lt;th scope="col" style="text-align: right">Newegg feed snapshot, Aug. 17&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>ABS Kaze II Ruby&lt;/strong>&lt;/td>
&lt;td>Best disclosed parts list and power hardware&lt;/td>
&lt;td style="text-align: right">Gamdias HELIOS P2-1000G, 1000W Gold&lt;/td>
&lt;td style="text-align: right">&lt;strong>$2,939.99&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Andromeda Insights V3 Ultra 50&lt;/strong>&lt;/td>
&lt;td>Best value; explicitly lists DDR5-6000 and an 850W Gold supply&lt;/td>
&lt;td style="text-align: right">850W Gold, brand not stated&lt;/td>
&lt;td style="text-align: right">&lt;strong>$2,799.99&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Acer Nitro UD.P02AA.070&lt;/strong>&lt;/td>
&lt;td>Brand-name alternative with liquid cooling&lt;/td>
&lt;td style="text-align: right">850W, efficiency and model not stated&lt;/td>
&lt;td style="text-align: right">&lt;strong>$3,299.99&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>Those prices are dated retailer-feed snapshots. The exact Newegg pages still resolved to the matching item on August 18, and all three pages showed Newegg as both seller and shipper at capture. Inventory can move before this page does.&lt;/p>
&lt;img src="https://techfuelhq.com/images/articles/best-rtx-5080-prebuilt-gaming-pc-2026.svg" alt="RTX 5080 prebuilt buying diagram showing that the GPU and CPU are only the visible layer; the decision is made by four hidden checks: a named 850W-or-better power supply, two memory modules, a 2TB SSD, and a clear seller, warranty, and return path" width="1200" height="630" loading="eager" fetchpriority="high" decoding="async" style="display:block;margin:1.5rem auto;max-width:100%;height:auto;border:1px solid #1e1e3a;border-radius:8px;" />
&lt;h2 id="how-i-ranked-the-systems">How I ranked the systems&lt;/h2>
&lt;p>I started with a hard floor, then let disclosed component quality break the tie. A product page that names the PSU model, memory arrangement, storage generation, board, and seller path can justify a modest premium because each disclosed field removes a return-window investigation; a page that repeats only the CPU and GPU cannot.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>RTX 5080 16GB and Ryzen 7 9800X3D.&lt;/strong> A cheaper processor can still run a 5080, but it is less hardware at this price. Every finalist uses AMD&amp;rsquo;s eight-core X3D chip.&lt;/li>
&lt;li>&lt;strong>32GB DDR5 and 2TB NVMe.&lt;/strong> A $3,000 gaming PC should not arrive with 16GB or a cramped 1TB system drive.&lt;/li>
&lt;li>&lt;strong>At least 850W.&lt;/strong> NVIDIA lists 850W minimum system power for the 360W RTX 5080. The &lt;a href="https://techfuelhq.com/articles/what-psu-for-rtx-5080-2026/">full RTX 50-series PSU guide&lt;/a> explains when 1000W becomes the better buy.&lt;/li>
&lt;li>&lt;strong>A listing that names the weak links.&lt;/strong> PSU model, memory speed, motherboard, cooler, seller, and warranty matter. Silence is a risk, not a premium feature.&lt;/li>
&lt;li>&lt;strong>The title, item number, and destination had to agree.&lt;/strong> I discarded feed rows whose product name and Newegg URL described different hardware.&lt;/li>
&lt;/ol>
&lt;p>RGB earned zero points. A giant discount badge against a price the system may never have sold for earned zero too.&lt;/p>
&lt;h2 id="1-abs-kaze-ii-ruby-has-the-strongest-disclosed-parts-list">1. ABS Kaze II Ruby has the strongest disclosed parts list&lt;/h2>
&lt;p>The Kaze II Ruby wins because its parts list answers the most expensive hidden question. Newegg names the power supply as a &lt;strong>Gamdias HELIOS P2-1000G 1000W 80 Plus Gold&lt;/strong> unit. That changes the decision: the other two finalists list capacity, but they never identify the complete model.&lt;/p>
&lt;p>The rest is the right shape for a high-end gaming system:&lt;/p>
&lt;ul>
&lt;li>Ryzen 7 9800X3D&lt;/li>
&lt;li>RTX 5080 16GB&lt;/li>
&lt;li>32GB DDR5&lt;/li>
&lt;li>2TB PCIe NVMe SSD&lt;/li>
&lt;li>Wi-Fi 6&lt;/li>
&lt;li>Windows 11 Home&lt;/li>
&lt;/ul>
&lt;p>The August 17 feed showed $2,939.99, down from a listed $3,499.99 regular figure. I care more about the $2,939.99 checkout number than the size of that markdown. The flashy percentage badge can disappear tomorrow; the named power supply is still the hardware inside the case.&lt;/p>
&lt;p>There are still three checks to make. Confirm the 32GB arrives as two modules, identify the motherboard, and read the current warranty and return language. A named PSU does not make every undisclosed part disappear. It does make this the easiest system to approve. If the checkout configuration swaps any of those fields, stop and re-price the machine.&lt;/p>
&lt;h2 id="2-andromeda-v3-ultra-50-is-the-value-pick">2. Andromeda V3 Ultra 50 is the value pick&lt;/h2>
&lt;p>The Andromeda was the least expensive qualified system in the feed at $2,799.99. It also discloses more memory detail than the other listings: &lt;strong>32GB of DDR5-6000&lt;/strong>. The 2TB drive is described as Gen4, and the power supply is rated 850W Gold.&lt;/p>
&lt;p>That is a strong specification sheet for $140 less than the ABS. The trade is confidence around the power supply. &amp;ldquo;850W Gold&amp;rdquo; tells you the capacity and efficiency tier; it does not identify the platform, protections, cable, or warranty. NVIDIA&amp;rsquo;s 850W floor means the capacity is sufficient. The missing model is why this system finishes second. Ask for the exact unit before the return window closes; a photo of the side label settles it in seconds.&lt;/p>
&lt;p>The exact page showed the matching Andromeda title. Newegg handled both the sale and shipment from the United States when checked. That removes the marketplace ambiguity that sinks many cheaper-looking results.&lt;/p>
&lt;p>Buy this one when the price gap matters and the listing or support team can provide the exact PSU and memory configuration before the return window closes.&lt;/p>
&lt;span class="buy-cell buy-cell--inline">&lt;a class="buy-cell__action buy-cell__action--primary"
href="https://click.linksynergy.com/link?id=CW4UrCo/56I&amp;amp;offerid=1749755.445834222291073233416867&amp;amp;type=15&amp;amp;murl=https%3A%2F%2Fwww.newegg.com%2Fandromeda-insights-ultra-gaming-desktop-pcs-geforce-rtx-5080-amd-ryzen-7-9800x3d-32gb-ddr5-2tb-nvme-ssd-50-vector-black%2Fp%2F3D5-006J-00058%3Fitem%3D3D5-006J-00058"
rel="nofollow sponsored noopener"
target="_blank"
data-affiliate-retailer="Newegg"
data-affiliate-slot="table-row"
data-link-kind="product">Check Newegg&lt;span class="buy-cell__checked">Link checked 2026-08-18&lt;/span>&lt;/a>&lt;/span>
&lt;h2 id="3-acer-nitro-is-the-brand-name-alternative">3. Acer Nitro is the brand-name alternative&lt;/h2>
&lt;p>Acer&amp;rsquo;s Nitro UD.P02AA.070 keeps the same core specification and adds liquid CPU cooling. The listing names a Ryzen 7 9800X3D, RTX 5080 16GB, 32GB DDR5, 2TB PCIe NVMe SSD, and an 850W power supply.&lt;/p>
&lt;p>It also asks the most. The feed captured $3,299.99, which is $360 above the ABS and $500 above the Andromeda. The listing does not name the PSU model or efficiency certification, and it specifies gigabit Ethernet rather than a faster wired interface.&lt;/p>
&lt;p>That does not make the Acer a bad machine. It makes the premium hard to defend from the published parts list alone. Choose it if the exact Acer service package, local availability, or chassis design has value to you. On hardware disclosure per dollar, it ranks third. At this price, brand familiarity needs to arrive with a better support path, not merely a familiar badge.&lt;/p>
&lt;span class="buy-cell buy-cell--inline">&lt;a class="buy-cell__action buy-cell__action--primary"
href="https://click.linksynergy.com/link?id=CW4UrCo/56I&amp;amp;offerid=1749755.445836957457544655962378&amp;amp;type=15&amp;amp;murl=https%3A%2F%2Fwww.newegg.com%2Facer-america-nitro-acer-r7-9800x3d-rtx-5080-16g-32gb-ram-2tb-ssd-liquid-cooling-gaming-pc-win11-geforce-rtx-5080-amd-ryzen-7-9800x3d-32gb-ddr5-2tb-pcie-nvme-ssd-ud-p02aa-070%2Fp%2FN82E16883101948%3Fitem%3DN82E16883101948"
rel="nofollow sponsored noopener"
target="_blank"
data-affiliate-retailer="Newegg"
data-affiliate-slot="table-row"
data-link-kind="product">Check Newegg&lt;span class="buy-cell__checked">Link checked 2026-08-18&lt;/span>&lt;/a>&lt;/span>
&lt;h2 id="what-i-rejected">What I rejected&lt;/h2>
&lt;p>The live search results contain dozens of RTX 5080 systems. Most fail for one of five reasons.&lt;/p>
&lt;h3 id="a-lower-tier-cpu-at-the-same-system-price">A lower-tier CPU at the same system price&lt;/h3>
&lt;p>A Core i7-14700F or Ryzen 7 9700X can be a good processor. It does not belong in a system priced beside these 9800X3D builds unless the rest of the machine is materially better.&lt;/p>
&lt;h3 id="sixteen-gigabytes-of-system-memory">Sixteen gigabytes of system memory&lt;/h3>
&lt;p>That is an immediate upgrade on a new flagship PC. It also raises the chance of a single-module configuration. Thirty-two gigabytes is the floor here.&lt;/p>
&lt;h3 id="one-terabyte-of-storage">One terabyte of storage&lt;/h3>
&lt;p>Modern game libraries fill it quickly. A 2TB system drive is a modest requirement at this budget, and all three picks meet it.&lt;/p>
&lt;h3 id="a-vague-or-undersized-power-supply">A vague or undersized power supply&lt;/h3>
&lt;p>The RTX 5080&amp;rsquo;s official requirement is 850W system power. A listing below that floor is out. A listing that says only &amp;ldquo;1000W&amp;rdquo; without a model still needs investigation; wattage cannot tell you build quality.&lt;/p>
&lt;h3 id="marketplace-ambiguity">Marketplace ambiguity&lt;/h3>
&lt;p>The product page must identify seller and fulfillment. It must also state the condition and warranty. The return path needs to be clear. A low price from an unknown seller can erase its savings with one freight return, and on a 40-pound glass-sided tower the expensive failure is rarely the missing five percent of benchmark performance; it is discovering after delivery that the power supply, memory layout, or warranty differs from the product tile while the only remedy is packing the entire machine again.&lt;/p>
&lt;h2 id="the-price-ceiling-for-a-32gb-and-2tb-build">The price ceiling for a 32GB and 2TB build&lt;/h2>
&lt;p>My cutoff for this specification is roughly &lt;strong>$3,500 before tax&lt;/strong>. Cross it, and I want a visible reason:&lt;/p>
&lt;ul>
&lt;li>64GB instead of 32GB&lt;/li>
&lt;li>4TB instead of 2TB&lt;/li>
&lt;li>a premium factory-overclocked RTX 5080&lt;/li>
&lt;li>a clearly better motherboard, PSU, and cooling stack&lt;/li>
&lt;li>a service package worth buying&lt;/li>
&lt;/ul>
&lt;p>A basic 32GB/2TB system at $3,700 is too close to premium-custom pricing. It also gets uncomfortably close to the next GPU tier. If you are willing to assemble the machine, compare the full bill against the &lt;a href="https://techfuelhq.com/pc-builds/2500-dollar-7800x3d-rtx-5080-4k-build-2026/">$2,500-class RTX 5080 build&lt;/a> and load the same parts into the &lt;a href="https://techfuelhq.com/tools/pc-builder/">PC Builder&lt;/a>.&lt;/p>
&lt;h2 id="what-performance-should-you-expect">What performance should you expect?&lt;/h2>
&lt;p>NVIDIA specifies the RTX 5080 with 10,752 CUDA cores, 16GB of GDDR7, a 360W total graphics power rating, and an 850W minimum system requirement. The Ryzen 7 9800X3D supplies eight Zen 5 cores and 96MB of L3 cache on AM5.&lt;/p>
&lt;p>Those specifications put every finalist in the same broad performance class. Cooler design and the installed GPU model decide some of the small gaps, while power limits, BIOS behavior, and memory configuration decide the rest.&lt;/p>
&lt;p>For a measured reference, the &lt;a href="https://techfuelhq.com/gpu-reviews/rog-astral-rtx-5080-oc-review-2026/">ROG Astral RTX 5080 OC review&lt;/a> includes first-party 4K results and a 308-sample power log. The &lt;a href="https://techfuelhq.com/data/gpu/rog-astral-rtx-5080-oc-2026-06-09/">open bench dataset&lt;/a> carries the underlying game and clock rows, plus thermal and power measurements, under CC BY 4.0. Use it as a picture of what one well-cooled premium 5080 did; an OEM card may hold different clocks.&lt;/p>
&lt;p>The practical target is 4K gaming. At 1440p, a cheaper GPU can often deliver the experience without forcing the rest of the build into this price band. The &lt;a href="https://techfuelhq.com/articles/best-gpu-4k-gaming-2026/">2026 4K GPU guide&lt;/a> maps that break point. If your monitor is still 1440p/144Hz, spend against the display before paying for unused GPU headroom.&lt;/p>
&lt;p>Here is the edge case that changes my answer. A buyer who keeps a PC for six years, moves from 1440p to a 4K OLED next spring, runs local models on the 16GB card, and refuses to replace parts mid-cycle can justify buying the 5080 tower before the current monitor demands it. That is a planned multi-use purchase, not a vague future-proofing claim.&lt;/p>
&lt;p>There is measured evidence for the local-model half. On TechFuelHQ&amp;rsquo;s retail RTX 5080, the &lt;a href="https://techfuelhq.com/data/rtx-5080-llm-throughput/">open Ollama throughput dataset&lt;/a> recorded gpt-oss:20b fully GPU-resident at roughly 13.7–14.0 GiB and 187–190 decode tokens per second; the raw CSV is mirrored on Kaggle and Hugging Face. That does not benchmark image generation or prove every 16GB workload fits. It does show that a named local-AI role can be real rather than speculative.&lt;/p>
&lt;p>The six-year plan has named workloads and a named display upgrade, with enough time for the premium to spread across several roles. Remove the 4K display and local workload, and the logic collapses: a gaming-only 1440p buyer is left with expensive capability no current screen or workflow can turn into visible value.&lt;/p>
&lt;h2 id="the-60-second-checkout-audit">The 60-second checkout audit&lt;/h2>
&lt;p>Do this after clicking through and before payment.&lt;/p>
&lt;ol>
&lt;li>Match the item number to the exact row in this guide.&lt;/li>
&lt;li>Confirm Ryzen 7 9800X3D and RTX 5080 16GB in the selected configuration.&lt;/li>
&lt;li>Look for two memory modules. If the page stays silent, ask or check immediately after delivery.&lt;/li>
&lt;li>Confirm the PSU model and a native 12V-2x6 cable where possible.&lt;/li>
&lt;li>Count open M.2 slots and accessible DIMM slots for future upgrades.&lt;/li>
&lt;li>Read who sells it and who ships it.&lt;/li>
&lt;li>Open the warranty and return terms.&lt;/li>
&lt;li>Screenshot the final configuration and delivery promise.&lt;/li>
&lt;/ol>
&lt;p>If one of those fields changes, re-rank the system. The model name on the case matters less than the parts and terms attached to the exact SKU, because two towers wearing the same product-family badge can differ in the power supply and memory layout. They can also arrive with a different motherboard, SSD, cooler, seller, warranty, or delivery promise. Those details decide whether a prebuilt stays an easy purchase or becomes an expensive return. The exact-SKU check is the purchase: without it, a familiar family name can hide a lower-tier power supply, one memory module instead of two, a different motherboard, or a return path that turns a small discount into a freight bill after the tower is already in your house.&lt;/p></description></item><item><title>Best RTX 5090 Prebuilt Gaming PCs (2026)</title><link>https://techfuelhq.com/articles/best-rtx-5090-prebuilt-gaming-pc-2026/</link><pubDate>Tue, 18 Aug 2026 00:00:00 -0500</pubDate><author>LK Wood IV</author><guid>https://techfuelhq.com/articles/best-rtx-5090-prebuilt-gaming-pc-2026/</guid><description>&lt;p>By &lt;a href="https://techfuelhq.com/author/lk-wood-iv/">LK Wood IV&lt;/a> · Published 2026-08-18 · 14 min read · St. Louis County, MO&lt;/p>
&lt;h2 id="the-three-picks-at-a-glance">The three picks at a glance&lt;/h2>
&lt;p>These systems share the expensive core: Ryzen 7 9800X3D, GeForce RTX 5090 32GB, 32GB DDR5, and 2TB of solid-state storage. The ranking turns on the platform around those parts and the price attached to the exact SKU.&lt;/p>
&lt;p>Same GPU and CPU. Very different risk.&lt;/p>
&lt;div class="table-wrap">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th scope="col">Pick&lt;/th>
&lt;th scope="col">Why it made the list&lt;/th>
&lt;th scope="col">Disclosed power and cooling&lt;/th>
&lt;th scope="col" style="text-align: right">Live Newegg price, Aug. 18&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Stormcraft Valkyrie&lt;/strong>&lt;/td>
&lt;td>Best pick; most complete useful disclosure&lt;/td>
&lt;td>1300W 80 Plus Gold, 360mm AIO&lt;/td>
&lt;td style="text-align: right">&lt;strong>$5,599.99&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Acer Nitro N80-181-UR19&lt;/strong>&lt;/td>
&lt;td>Best value; same gaming core for $300 less&lt;/td>
&lt;td>1200W, liquid cooling; PSU model not stated&lt;/td>
&lt;td style="text-align: right">&lt;strong>$5,299.99&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Thermaltake View 9890S&lt;/strong>&lt;/td>
&lt;td>Premium white X870 alternative; not the value choice&lt;/td>
&lt;td>1200W Gold ATX 3.0, Thermaltake 360mm AIO&lt;/td>
&lt;td style="text-align: right">&lt;strong>$6,699.99&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p>All three pages showed &lt;strong>sold and shipped by Newegg&lt;/strong> when captured. These are live-page snapshots. Prices can move. Thermaltake is the important warning: its August 17 affiliate feed showed $6,090.99, but the rendered product page was $6,699.99 on August 18. The checkout page wins that disagreement.&lt;/p>
&lt;img src="https://techfuelhq.com/images/articles/best-rtx-5090-prebuilt-gaming-pc-2026.svg" alt="RTX 5090 prebuilt decision diagram showing that every finalist shares the RTX 5090 and Ryzen 7 9800X3D, while the purchase is decided by a native high-current power path, two memory modules, adequate cooling and airflow, and exact seller, warranty, and configuration terms" width="1200" height="630" loading="eager" fetchpriority="high" decoding="async" style="display:block;margin:1.5rem auto;max-width:100%;height:auto;border:1px solid #1e1e3a;border-radius:8px;" />
&lt;h2 id="how-i-ranked-the-systems">How I ranked the systems&lt;/h2>
&lt;p>The full August 17 feed held four direct-catalog RTX 5090 desktops. Two Stormcraft rows used the same chassis and price with different processor platforms, so I narrowed the final comparison to the three Ryzen 7 9800X3D systems; holding the gaming CPU, GPU, memory capacity, and storage capacity steady exposes the platform differences instead of burying them under a changing processor.&lt;/p>
&lt;p>I then scored the parts that can turn a $5,000-plus computer into a poor purchase:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Power path.&lt;/strong> NVIDIA rates the RTX 5090 at 575W and specifies 1000W required system power. A 1200W or 1300W supply is the right capacity class here, but capacity is only the start. The model, protections, and native GPU cable still need confirmation.&lt;/li>
&lt;li>&lt;strong>Memory configuration.&lt;/strong> Thirty-two gigabytes must be two modules. Acer and Stormcraft explicitly showed 16GB x 2 in the captured specifications.&lt;/li>
&lt;li>&lt;strong>Cooling and airflow.&lt;/strong> A 360mm AIO earns confidence only as a disclosed component, not as proof of low temperatures or noise. I have not tested these systems.&lt;/li>
&lt;li>&lt;strong>Storage and motherboard.&lt;/strong> A 2TB system drive is the floor. Gen4 detail and a named chipset make future expansion easier to judge.&lt;/li>
&lt;li>&lt;strong>Seller and price integrity.&lt;/strong> The item number, title, live price, seller, and shipper had to agree on the rendered page.&lt;/li>
&lt;/ol>
&lt;p>RGB, &amp;ldquo;AI powered,&amp;rdquo; and giant markdown badges earned nothing. Exact parts and a clean return path did.&lt;/p>
&lt;h2 id="1-stormcraft-valkyrie-is-the-best-pick">1. Stormcraft Valkyrie is the best pick&lt;/h2>
&lt;p>The Valkyrie asks $300 more than Acer and gives a visible reason for most of that difference. Its product page names:&lt;/p>
&lt;ul>
&lt;li>Ryzen 7 9800X3D&lt;/li>
&lt;li>RTX 5090 32GB&lt;/li>
&lt;li>32GB as &lt;strong>two 16GB DDR5-6000 modules&lt;/strong>&lt;/li>
&lt;li>2TB Gen4 NVMe SSD&lt;/li>
&lt;li>AMD B850 motherboard&lt;/li>
&lt;li>360mm AIO liquid cooler&lt;/li>
&lt;li>seven ARGB fans&lt;/li>
&lt;li>1300W 80 Plus Gold power supply&lt;/li>
&lt;/ul>
&lt;p>That is the strongest platform disclosure in the direct-retailer set. The 1300W capacity sits above the practical 1200W target in the &lt;a href="https://techfuelhq.com/articles/what-psu-for-rtx-5080-2026/">RTX 50-series PSU guide&lt;/a>, and the listing gives the memory speed, module count, storage generation, motherboard chipset, radiator size, and fan count. The page also showed Newegg as both seller and shipper.&lt;/p>
&lt;p>Several identities remain hidden: &amp;ldquo;1300W 80 Plus Gold&amp;rdquo; does not name the PSU manufacturer or model, and the listing says component brands may vary, which means the exact graphics card, memory kit, SSD, board model, and supply can change within the stated specification. I cannot call those parts premium. The page still tells the buyer more than the others.&lt;/p>
&lt;p>At $5,599.99, the Valkyrie is the best choice when you want the 5090 tier and would pay $300 to remove several expensive unknowns. Confirm those fields one final time before ordering.&lt;/p>
&lt;h2 id="2-acer-nitro-is-the-value-pick">2. Acer Nitro is the value pick&lt;/h2>
&lt;p>Acer&amp;rsquo;s N80-181-UR19 is the lowest-priced direct 9800X3D and RTX 5090 system in the captured feed and live pages. At $5,299.99, it is $300 below the Stormcraft and $1,400 below the Thermaltake.&lt;/p>
&lt;p>The useful disclosures are better than the short feed title suggests:&lt;/p>
&lt;ul>
&lt;li>Ryzen 7 9800X3D&lt;/li>
&lt;li>RTX 5090 32GB&lt;/li>
&lt;li>32GB DDR5 as &lt;strong>16GB x 2&lt;/strong>&lt;/li>
&lt;li>2TB PCIe SSD&lt;/li>
&lt;li>1200W power supply&lt;/li>
&lt;li>liquid CPU cooling&lt;/li>
&lt;li>Wi-Fi 6 and gigabit Ethernet&lt;/li>
&lt;/ul>
&lt;p>The 1200W capacity is appropriate. The weak point is identity. The page does not name the PSU model or efficiency certification, and its detailed table says only &amp;ldquo;Liquid Cooling&amp;rdquo; even though the title advertises a 240mm AIO. It also leaves the motherboard model and SSD generation unstated.&lt;/p>
&lt;p>That makes Acer the value pick, with a plain trade: save $300 and accept less component identity, or pay Stormcraft for DDR5-6000, a named B850 chipset, Gen4 storage detail, a larger listed radiator, and another 100W of supply capacity. Choose Acer when the support channel, chassis, and saving matter more. Photograph the PSU label and memory modules after delivery, before the return window gets short.&lt;/p>
&lt;span class="buy-cell buy-cell--inline">&lt;a class="buy-cell__action buy-cell__action--primary"
href="https://click.linksynergy.com/link?id=CW4UrCo/56I&amp;amp;offerid=1749755.4458315250198206734392933&amp;amp;type=15&amp;amp;murl=https%3A%2F%2Fwww.newegg.com%2Facer-america-nitro-acer-r7-9800x3d-rtx-5090-32g-32gb-ram-2tb-ssd-liquid-cooling-gaming-pc-win11-geforce-rtx-5090-amd-ryzen-7-9800x3d-32gb-ddr5-2tb-pcie-ssd-n80-181-ur19%2Fp%2FN82E16883101949%3Fitem%3DN82E16883101949"
rel="nofollow sponsored noopener"
target="_blank"
data-affiliate-retailer="Newegg"
data-affiliate-slot="table-row"
data-link-kind="product">Check Newegg&lt;span class="buy-cell__checked">Link checked 2026-08-18&lt;/span>&lt;/a>&lt;/span>
&lt;h2 id="3-thermaltake-view-9890s-is-the-premium-alternative">3. Thermaltake View 9890S is the premium alternative&lt;/h2>
&lt;p>The View 9890S has the clearest named cooling and platform combination:&lt;/p>
&lt;ul>
&lt;li>Ryzen 7 9800X3D&lt;/li>
&lt;li>RTX 5090 32GB&lt;/li>
&lt;li>32GB DDR5-6000&lt;/li>
&lt;li>2TB NVMe SSD&lt;/li>
&lt;li>AMD X870 chipset&lt;/li>
&lt;li>Thermaltake 360mm ARGB AIO&lt;/li>
&lt;li>1200W 80 Plus Gold ATX 3.0 power supply&lt;/li>
&lt;li>Wi-Fi 7&lt;/li>
&lt;li>white panoramic chassis&lt;/li>
&lt;/ul>
&lt;p>Those are real differences. X870, a named Thermaltake radiator, Wi-Fi 7, a white build, and a more explicit ATX 3.0 supply description can matter to a buyer who wants this exact design.&lt;/p>
&lt;p>The price breaks the general recommendation: the live page showed $6,699.99, or $1,100 above Stormcraft and $1,400 above Acer, while the prior feed showed $6,090.99. At the live number, the premium buys appearance and platform detail rather than more GPU, CPU, memory, or storage capacity.&lt;/p>
&lt;p>I would skip that premium for gaming performance. This system stays on the list as the distinct white X870 alternative. It does not compete for value at the captured price. If it falls near the Valkyrie, re-run the comparison.&lt;/p>
&lt;span class="buy-cell buy-cell--inline">&lt;a class="buy-cell__action buy-cell__action--primary"
href="https://click.linksynergy.com/link?id=CW4UrCo/56I&amp;amp;offerid=1749755.4458313632340155146618509&amp;amp;type=15&amp;amp;murl=https%3A%2F%2Fwww.newegg.com%2Fthermaltake-gaming-desktop-pc-geforce-rtx-5090-amd-ryzen-7-9800x3d-32gb-ddr5-2tb-ssd-lcgs-view-9890s-380xl-white%2Fp%2FN82E16883100115%3Fitem%3DN82E16883100115"
rel="nofollow sponsored noopener"
target="_blank"
data-affiliate-retailer="Newegg"
data-affiliate-slot="table-row"
data-link-kind="product">Check Newegg&lt;span class="buy-cell__checked">Link checked 2026-08-18&lt;/span>&lt;/a>&lt;/span>
&lt;h2 id="why-these-are-9800x3d-systems">Why these are 9800X3D systems&lt;/h2>
&lt;p>At this price, the processor should fit the job. The Ryzen 7 9800X3D is an eight-core, 16-thread, 120W AM5 processor with 96MB of L3 cache. It is the gaming-first choice in the captured direct-retailer set.&lt;/p>
&lt;p>The feed also held a $5,599.99 Stormcraft Valkyrie with an Intel Core Ultra 7 270K Plus, a system that can make sense for a different workload mix but would blur this gaming comparison by changing the processor platform while every other finalist stays on the 9800X3D.&lt;/p>
&lt;p>I kept the CPU constant on purpose. Once every row uses a 9800X3D and RTX 5090, the reader can compare the system rather than decoding two product categories at once.&lt;/p>
&lt;h2 id="what-a-5000-plus-prebuilt-must-disclose">What a $5,000-plus prebuilt must disclose&lt;/h2>
&lt;p>The expensive GPU cannot be permission for everything around it to become vague. A machine at this price should make its electrical and upgrade constraints easy to inspect before you pay, then easy to verify again when the box arrives. Two facts from this comparison show why the second check matters. Thermaltake&amp;rsquo;s live price had moved $609 above the prior feed snapshot. Stormcraft warns that component brands may vary inside the stated configuration. Save the checkout screenshot. When the box arrives, compare the delivered graphics card and power supply against the order. Check the memory module count and motherboard next. Finish with the SSD and cooler. Inspect the cabling before the return window gets short.&lt;/p>
&lt;h3 id="a-native-high-current-power-path">A native high-current power path&lt;/h3>
&lt;p>NVIDIA lists 575W total graphics power and 1000W required system power for the RTX 5090. A capacity label of 1200W or 1300W clears the first test. The exact PSU model and a native cable clear the second.&lt;/p>
&lt;p>Avoid treating four adapter leads as a harmless visual issue. This is a high-current connection behind a large card. Confirm the cable type, seat it fully, and avoid a tight bend at the connector.&lt;/p>
&lt;h3 id="two-memory-modules">Two memory modules&lt;/h3>
&lt;p>The captured Acer and Stormcraft pages showed 16GB x 2. Thermaltake disclosed 32GB DDR5-6000 but did not expose the module count in the same table. Confirm two modules before accepting the configuration.&lt;/p>
&lt;p>Thirty-two gigabytes is enough for gaming. The &lt;a href="https://techfuelhq.com/articles/ddr5-ram-buying-guide-2025/">DDR5 buying guide&lt;/a> covers capacity and timing tradeoffs if this tower will also be a 64GB creator or local-AI machine.&lt;/p>
&lt;h3 id="storage-that-fits-the-price">Storage that fits the price&lt;/h3>
&lt;p>Two terabytes is the floor at this tier. Stormcraft identifies its drive as Gen4. Acer says 2TB PCIe, while Thermaltake says 2TB NVMe. None of those capacity lines tells you controller, endurance, or sustained write behavior.&lt;/p>
&lt;p>Identify the installed SSD after delivery and count the open M.2 slots. A $5,500 tower should not require replacing its only system drive just to add working space.&lt;/p>
&lt;h3 id="a-motherboard-and-case-you-can-expand">A motherboard and case you can expand&lt;/h3>
&lt;p>Stormcraft discloses B850. Thermaltake discloses X870. Acer leaves the board unnamed in the saved specification. The chipset will not create gaming frames. It does help define storage lanes and USB. It also tells you more about networking and future cards.&lt;/p>
&lt;p>Case dimensions and slot clearance matter too. An RTX 5090 is not a small component. Confirm that the installed model has room to breathe and that adding another card or bottom-mounted fans will not choke it.&lt;/p>
&lt;h2 id="rtx-5090-or-rtx-5080-prebuilt">RTX 5090 or RTX 5080 prebuilt?&lt;/h2>
&lt;p>The RTX 5090 tier needs a named reason. Mine would be one of these:&lt;/p>
&lt;ul>
&lt;li>maximum native or lightly upscaled 4K performance&lt;/li>
&lt;li>a 4K high-refresh display that can expose the difference&lt;/li>
&lt;li>32GB of VRAM for local AI, rendering, or creation&lt;/li>
&lt;li>one machine serving both gaming and a GPU-heavy paid workload&lt;/li>
&lt;/ul>
&lt;p>If the computer is for ordinary 1440p gaming or 4K with DLSS, the &lt;a href="https://techfuelhq.com/articles/best-rtx-5080-prebuilt-gaming-pc-2026/">best RTX 5080 prebuilt guide&lt;/a> starts at $2,799.99 in the same dated retailer feed. The jump from that value pick to the least expensive 5090 system here was $2,500. That money can buy a serious display and a later GPU upgrade. It can also fund the memory and storage the system will use every day.&lt;/p>
&lt;p>The RTX 5090 is faster. It is not automatically the better purchase. NVIDIA&amp;rsquo;s official specifications put the difference in plain terms: 32GB versus 16GB of GDDR7 and a 575W versus 360W power rating. The &lt;a href="https://techfuelhq.com/articles/best-gpu-4k-gaming-2026/">2026 4K GPU guide&lt;/a> places both cards in the wider buying ladder.&lt;/p>
&lt;h2 id="the-price-ceiling">The price ceiling&lt;/h2>
&lt;p>My practical ceiling for this configuration is about &lt;strong>$6,000 before tax&lt;/strong>. That means a 9800X3D, 32GB, 2TB, and an RTX 5090. Cross the line only when the premium buys something you can name.&lt;/p>
&lt;p>Above that line, I want several of these:&lt;/p>
&lt;ul>
&lt;li>64GB of memory&lt;/li>
&lt;li>4TB or more of quality storage&lt;/li>
&lt;li>an explicitly named premium RTX 5090 model&lt;/li>
&lt;li>a named high-end power supply&lt;/li>
&lt;li>a motherboard and networking stack worth the difference&lt;/li>
&lt;li>a service package with measurable value&lt;/li>
&lt;li>a chassis and cooling configuration you were already willing to buy separately&lt;/li>
&lt;/ul>
&lt;p>Thermaltake&amp;rsquo;s live $6,699.99 can be defended only by the buyer who already values its white panoramic design, X870 platform, Wi-Fi 7, named 360mm cooler, and ATX 3.0 power description. Those features do not make it $1,100 faster than Stormcraft.&lt;/p>
&lt;h2 id="the-60-second-checkout-audit">The 60-second checkout audit&lt;/h2>
&lt;p>Do this after clicking through and before payment.&lt;/p>
&lt;ol>
&lt;li>Match the item number to the exact system in this guide.&lt;/li>
&lt;li>Confirm Ryzen 7 9800X3D, RTX 5090 32GB, 32GB DDR5, and 2TB storage.&lt;/li>
&lt;li>Look for two memory modules and record their speed.&lt;/li>
&lt;li>Identify the exact PSU model and native GPU cable.&lt;/li>
&lt;li>Identify the graphics-card, motherboard, SSD, and cooler models.&lt;/li>
&lt;li>Confirm who sells it and who ships it.&lt;/li>
&lt;li>Open the warranty and return terms, including freight.&lt;/li>
&lt;li>Check case clearance, open M.2 slots, and usable expansion slots.&lt;/li>
&lt;li>Screenshot the final configuration, price, delivery date, and seller block.&lt;/li>
&lt;/ol>
&lt;p>If the configuration changes, the ranking changes with it. At this price, a family name is not a substitute for the exact hardware and terms you are buying.&lt;/p></description></item></channel></rss>