Reference

What a node costs

Measured requirements for every role — cores per gigabit, CPU per gigabyte, RAM, disk and VRAM — with a calculator that turns a workload into a VPS size.

The answer

Measured on Linux, stated per one core at 2 GHz — deliberately the pessimistic end, because a shared vCPU is time-sliced and you do not get a whole core anyway. Real VPS cores today run 2.4 GHz (a shared AMD EPYC plan) to 3.0 GHz (Ampere, or a dedicated core), and the high-frequency tiers go above that. A faster core does proportionally more: divide by 2, multiply by your own clock.

What the node doesRAM: floor → buyCPUDisk
Relay for other peers 256 MB → 512 MB one 2 GHz core per 440 Mbit/s relayed 2 GB
Tunnel or VPN exit 256 MB → 512 MB
0.3 MB per simultaneous session on top
one 2 GHz core per 680 Mbit/s through it 2 GB
Storage, receiving copies 512 MB → 1 GB one 2 GHz core per 69 MB/s, or per 150 files/s — whichever runs out first 1× the data, +2 GB per million files, +10 GB the cycle keeps free, +the largest few files while they are in flight
Storage, ingesting and serving 512 MB → 1 GB one 2 GHz core per 25 MB/s, or per 250 files/s as above
On top of any of the above
Antivirus scanning +1 GB one 2 GHz core per 3.6 MB/s scanned +112 MB of signatures
Document conversion +256 MB per conversion at a time 2.2 seconds of a 2 GHz core per document +600 MB
A local model +1 GB, or the whole model if there is no card one core to feed the card 5–20 GB of weights
Version history (keep_history) 2× the data instead of 1×

Four notes, and then the tables below are just these numbers with their working shown. A relay costs more than an exit because it handles every byte twice, once arriving and once leaving. Small files, not bytes, size a storage node — the same gigabyte costs six times more CPU as 25 000 small files than as one large one. RAM does not grow with the size of the vault: one file and twenty-five thousand both land in the same band. And the RAM column is two numbers because there are two questions. The floor is what the node needs to not die — it clears the ~250 MB the daemon briefly wants while starting, which is why a relay says 256 MB and not the 70 MB it settles at. The second is what to buy: the sustained figure with 1.5× headroom, rounded to a size somebody sells. The calculator answers the second one, and will say the first if you set headroom to 1.2×.

The same numbers, per gigabyte and per gigabit

If you are sizing something the table above does not name, these are the raw costs it was built from — one core of the processor they were measured on, which held 4.49 GHz across all eight of them under load.

WorkCostPer 2 GHz core
Tunnel entry or exit0.65 core per Gbit/s680 Mbit/s
Relay hop1.02 core per Gbit/s440 Mbit/s
Receiving vault data6.4 CPU-s per GB69 MB/s
Ingesting and serving it18 CPU-s per GB25 MB/s
Each file received, on top2.9 ms150 files/s
Each file ingested, on top1.8 ms250 files/s
Antivirus122 CPU-s per GB3.6 MB/s
One document conversion1 CPU-s2.2 s
A node doing nothing0.7 % of a core
Each concurrent tunnel session0.3 MB of RAMno CPU per byte

Two warnings about that conversion, and they point opposite ways. Clock is not performance across architectures: these numbers came off a Skylake-generation core, and a current AMD Genoa core does appreciably more per cycle at the same clock while an Ampere core does somewhat less, so the same 2 GHz can be worth ±30 %. And a shared vCPU is not a core — it is a slice of one, so on a burstable plan the sustained figure is lower than any clock suggests. Size for the class of machine, not the decimal. Separately: a processor without SHA extensions (most Raspberry Pi class hardware) hashes far slower than clock predicts, and hashing is what caps a storage node there.

Local models: how much card do you need?

Only models worth pointing an agent at are listed — 8B and up, with a context window big enough to hold a real session. A Code-mode agent arrives with about 33 000 tokens of system prompt, tools and skill listings before it has read a word of your question, so a 32k window is not a small window: it is a window that refuses the job.

The window we set is not the window the weights allow, and the difference is deliberate: the cache is allocated for the whole window at load, so asking for everything a model can address turns the card it was bought for into the next one up. Qwen3.8 27B addresses 262 144 tokens and we ask for 65 536. Each cell is the largest context that model holds entirely on that card, leaving 1 GB for the desktop and the compute buffers; a dash means the weights alone do not fit, and llama.cpp would spill to system memory, which works and is slow.

The table is drawn from the same constants the calculator below uses, so the two cannot drift apart: 2 × layers × kv_heads × head_dim of cache per token from each model's config.json, quantised, plus the weights. Pick a card and a model down there for the memory figure that goes with a window.

* Qwen3 8B is measured on an RTX 2080 Ti, not computed: 7 932 MiB at its full 40 960 window. The other rows are arithmetic from each model's published architecture, and the same arithmetic came within one per cent of that card, so they can be trusted. The quantised cache is what makes a full window fit at all — the same model with a plain f16 cache wanted 2.3 GiB more.

No card at all is also an answer. Every model here runs on a CPU given enough RAM — the same weights and the same cache, in system memory instead: about 9 GB for the 8B, about 26 GB for the 32B, at single-digit tokens per second. Unusable for chat, and perfectly fine for an overnight batch job.

Where a self-hosted model actually lands

One yardstick across every row, because mixing vendors' own benchmark tables compares marketing departments rather than models: the Artificial Analysis Intelligence Index, an aggregate of nine evaluations including GPQA Diamond, AIME and Terminal-Bench. Read on 30 August 2026 — these move monthly.

ModelWhere it runsContextIntelligence Index
Hosted, someone else's machine
Claude Opus 5API63
GPT-5.6 SolAPI1M61
Gemini 3.7 FlashAPI1M56
Open weights, but not on one card
Kimi K32.8T weights, 104B active — a rack1M60
GLM-5.3753B weights, 40B active — a rack1M60
GLM-5.3-Flash320B weights, 18B active — several cards1M57
DeepSeek V4 Pro1.6T weights, 49B active — a rack1M53
Nemotron 3 Ultra550B weights — a rack262k38
Mistral Medium 3.5128B weights — several cards256k30
gpt-oss-120bOne 80 GB card131k24
On one card you can buy — and in the catalog
Qwen3.8 27BOne 24 GB card256k52
Gemma 4 31BOne 32 GB card — not in the catalog262k30
Gemma 4 26B A4BOne 24 GB card, 4B active262k26
Nemotron 3.5 Lightning31.6B weights, 3.6B active — not in the catalog1M24
gpt-oss 20BOne 16 GB card131k15
Qwen3 32BOne 32 GB card40 96011

Three things worth reading off that table. Open weights and runnable are different words: the highest-scoring open models — Kimi, GLM, DeepSeek — are hundreds of billions of parameters and want a rack, so they are competitors to the hosted APIs rather than to your machine. One consumer card gets within about ten points of the frontier, which it did not a year ago. And which model you run matters far more than how much card you buy: the gap between Qwen3.8 27B and the 2025-vintage Qwen3 32B is larger than the gap between that 27B and Claude, on cards of the same size.

The catalog is what a node can download and run without you finding weights yourself, so it holds the single-card, permissively-licensed, GGUF-published end of that list. Gemma 4 is Apache-2.0 and Google publishes its own quantization-aware GGUFs — trained knowing they would end up at 4 bits — which is why those two are here rather than a third-party conversion. Anything else with a GGUF still runs; point llama.cpp at it yourself.

Size your node

Every coefficient below is a number from the tables above. Open the breakdown at the bottom of the result to see which one, and how it was applied.

Network

Storage

Extras

The machine

vCPU 2
RAM 2 GB
Disk 1 GB
VRAM
Where these came from

Where these came from

Measured on 30 August 2026, MeshHold 0.7.411 on Linux, on an Intel i7-9700K — nominally 3.6 GHz, and measured holding 4.49 GHz across all eight cores under load, which is the figure everything here is normalised against. Each role ran on its own two cores in its own container, so a relay's CPU is the relay's and not its neighbour's, and the traffic generator sat outside all of them.

These are single runs on a container bridge. Two runs of the same binary moved the same gigabyte at 56 and 78 MB/s, so read the figures as ±30 % — the right size of machine, not a specification. A VPN exit is not measured separately: it shares the transport and crypto with the tunnel exit and adds a TUN device on top, so that row is a floor. The model figures are measured for Qwen3 8B and computed from published architecture for the rest, and the arithmetic agreed with the card to within one per cent.

The harness and the raw results are in bench/reqs/ in the source tree. If your numbers disagree with these, yours are the ones that size your machine.