All projects
BuildingPersonal AI · the cost of running models on hardware you own

What a local box really costs per million tokens

A machine you own is bought in calendar time and produces tokens in running time, so the fraction of the day it is actually generating decides what a million tokens cost — more than the price, the wattage or the lifespan. Pick a box, set the duty cycle, and the page splits the answer into amortised hardware and electricity, sets it against a hosted price you type in yourself, and names the duty cycle at which local stops losing. Often there is not one, and saying so is the point.

Where it runs

In-labRuns entirely in your browser. Arithmetic over numbers you type; no price feed, no request, nothing stored.

Live demo

Start with the slider, not the hardware. The variable that decides whether a machine you own is cheap or ruinous is not its price, its wattage or its lifespan — it is the fraction of the day it is actually generating. Buy the box in calendar time, produce the tokens in running time, and every idle hour still spends the machine's life. That is the whole argument, and no calculator published anywhere exposes it.

Duty cycle — hours a day it is generating24 h/day

Not hours switched on — hours under load. A machine answering you for twenty minutes between meetings is at about 1.5 h/day, not 24.

$1.95
Cost per million tokens
at 24 h/day
$1.60
Hardware, amortised
$3,449 over 3 calendar years
$0.35
Electricity
17.8% of the total · $749 over the life

The box

docs/context/ideas-pool.md row 1 (the 2026-08-25 research pack): $3,449, 80 W measured, 3-year life, Ofgem cap 26.11p/kWh × 1.3643. The only box in the pack whose draw and throughput were measured rather than listed.

Some of these were not measured on this box. The research pack behind this page priced three machines and measured one. Where a field is marked, the value is carried from the measured box — or, if you adopted it, a roofline ceiling — so the page has somewhere to start. It is a starting point, not a reading. Type over it and the mark clears.

Against your hosted price

7.8×
Local ÷ hosted
Crossover duty cycle

There is no duty cycle at which this box beats that price. Running it more does not close the gap, because the electricity to generate a million tokens already costs more than renting them — which is exactly what the 2026-08-25 re-run found at August prices.

No measured throughput? Estimate a ceiling

This is a ceiling, not a measurement. Decoding one token re-reads every weight, so the fastest a box can go is its memory bandwidth divided by the bytes it must move. A real stack pays attention overheads, scheduler time and a sampling loop, and lands below this — often well below. This estimate also charges the weights only and ignores the KV cache, which pushes it higher still. Treat it as the number the machine cannot beat.

16.5 tok/s

Where the numbers come from. Every price here comes from a 2026-08-25 research pack run on a box whose web access was blocked, so the external figures are search summaries rather than vendor pages anyone opened. The arithmetic is reproducible from the inputs; the inputs are one confirmation pass short of publishable. Type your own over them. The pack is Connor's own re-run of 2026-08-25, deposited at docs/context/ideas-pool.md rows 1 and 4 and summarised in docs/context/studio-handoff-2026-08-25.md. Its two published figures — $1.95 per million at 24/7 and $9.96 at four hours a day, on the same box — are reproduced by this page's own arithmetic, and a test asserts it.

Stack

TypeScriptReactNo network

The problem

A 355-point argument and its 302-comment rebuttal talked past each other for weeks because both sides were right about their own assumptions and neither ever named the one variable that separated them. Someone about to spend $3,000–$5,000 on a box has no instrument that will tell them what it costs per token at the hours they will actually run it — and the calculators that exist quietly assume 24/7, which almost nobody does.

The approach

A pure-TypeScript core reproducing the 2026-08-25 research pack's own arithmetic from its own input table, with a test asserting BOTH of its published figures. The crossover — the duty cycle where local meets a hosted price — is solved in closed form and round-trip tested against the model, so the two cannot disagree at the boundary. Throughput for a box nobody measured comes from the shared inference roofline in src/lib/inference, labelled a ceiling on the page.

Decisions & trade-offs

  1. 01Duty cycle is the first control, above the hardware and above the price. It is the dominant term, and putting it below the box would reproduce the framing that lost the original argument.
  2. 02The hosted side is a field the reader fills in, labelled "your hosted price". There is no feed behind it and there will not be one — the Token Price Index was retired on 2026-08-19, and a stale number printed with authority is worse than a blank.
  3. 03Every preset carries a source line naming a path in this repo, and a per-field list of what is BORROWED. The pack priced three boxes and measured one; filling the other two silently would print a carried wattage in the same type as a measured one. The mark clears when the reader types over the field.
  4. 04The roofline estimate is called a ceiling in those words, in the page copy, because it is one: decode at batch size 1 is bandwidth-bound, and a real stack lands below it. Only the Framework Desktop's throughput on this page is measured.
  5. 05The arithmetic is not copied from the sizer. It delegates to src/lib/inference/roofline, which exists because the KV-cache formula was written twice in this repo and one copy was wrong for months.

What it has found

  • Duty cycle is the dominant term in local inference economics: $1.95 per million tokens at 24/7 against $9.96 at four hours a day, on identical hardware and software — a 5x swing, against 2x for the best measured software gain.
  • Electricity, which is what most published comparisons argue about, never exceeds 18% of the total in any case the pack modelled, and its share is highest at 24/7 — the term that moves is the hardware.
  • At the pack's hosted price for the same model there is no crossover at all. Running the box more does not close the gap, because the electricity to generate a million tokens already costs more than renting them.
  • The consequence for our own offer is stated rather than buried: the Local AI Deployment package cannot be sold on payback at August 2026 prices. It stands on privacy, control, offline capability and not being repriced.

Where it stands

The instrument is live and its arithmetic reproduces both figures the research pack published. What it does not yet do: verify its own inputs. The pack was produced on a box whose web access was blocked, so every external price in it is a search summary rather than a vendor page anyone opened — the page says so, and one confirmation pass from a machine with real egress is what stands between this and a publishable report.

Shipped when

The Lab's barMethodology
  • You can run it here — metA live demo on the page itself, in your own browser — not a screenshot of one, and not a promise that one is coming.
  • Its core is pinned by tests — metThe arithmetic underneath is a plain module with its own test suite, so every number the interface prints is a number something checks.
  • The code is public — not yetA link to the source, so a reader who disagrees with a figure can go and read the line that produced it.
  • It has found something — metAt least one stated finding — a thing the instrument taught that the build could not have written down before it existed.

Not shipped yet: one criterion is still open — the code is public.

Build log

Running diaryNotebook
  • 2026-09-05Built the cost-per-million instrument with duty cycle as the first slider
What a local box really costs per million tokens · Lab | MenFem