Skip to main content

Start here

Hardware & System Requirements

Bodega One runs entirely on your hardware - no cloud required. This section covers what Bodega detects at startup, how it uses that data to recommend models and cap context, and what hardware gets you which results.

Minimum - the app runs, CPU-only inference with small models:

OS Windows 10+, macOS 12+, Ubuntu 22.04+
RAM 8 GB
Storage 10 GB free
GPU None required (CPU-only mode works with 1–4B models)
Internet Not required

Recommended - comfortable agentic use with mid-size models:

RAM 16–32 GB
GPU NVIDIA with 8+ GB VRAM (RTX 3060 or better; RTX 5070+ ideal)
Storage 50 GB free

If you have no discrete GPU, Bodega detects CPU-only mode and caps context based on system RAM. You'll see CPU mode - context capped for sustainable inference in the AI panels. 1–4B models are usable; anything larger will be slow.

What Bodega detects at startup

On every launch, Bodega probes your GPU VRAM using the systeminformation library. The result feeds three things:

  • Model recommendations - the Discover tab's Fits My GPU filter and first-run model cards
  • Context window ceiling - the max tokens Bodega will send to a local model (written to hardware.local_context_ceiling)
  • Cloud Boost escalation - whether your hardware tier triggers automatic escalation on reasoning-heavy tasks

The detection runs once at startup. VRAM capacity is cached for the session. Free VRAM is re-read on demand rather than on a clock: the backend caches it for 3 seconds, so any consumer asking more often than that gets the cached figure. The VRAM timeline strip in the UI asks every 5 seconds, so that is the cadence you actually see. Either way a model already loaded is accounted for.

If the probe hangs (beta.38): the underlying GPU query (WMI on Windows) can occasionally wedge. Each probe now has a hard 10-second deadline - a hung query fails that one reading instead of pinning hardware info, fit checks, and model launches behind it forever. A failed or timed-out probe is never cached as an answer: after a timeout Bodega serves the last good reading (if it has one) for a short backoff window and then retries, so a one-off failure is not remembered as "0 GB VRAM" for the rest of the session.

If a model quietly loads on the CPU: when another program is holding video memory, llama.cpp can fall back to the CPU, answer normally, and report itself ready - many times slower. Bodega reads llama.cpp's own layer-offload report after each load; if the model asked for the GPU and got none of it, the chat status line says so, with the likely cause and what to do (close the other program and reload the model). A deliberate CPU-only run, and the normal partial split for a model slightly larger than the card, stay silent.

Apple Silicon: memory is unified, and Metal grants a fraction of it rather than all of it. Bodega budgets min(sysctl iogpu.wired_limit_mb, total RAM x 0.75) at 64 GB or more, x 0.70 below that. The onboarding badge shows your chip name and memory figure.

Other unified-memory machines (NVIDIA DGX Spark / GB10, AMD Strix Halo): these report 0 VRAM on every controller while having a real, large addressable GPU. Bodega recognises them by model string and budgets total RAM minus an OS reserve (16 GB on Spark-class, 10 GB otherwise). A shared-memory GPU Bodega cannot name (an Intel iGPU, an ordinary APU) deliberately gets no budget rather than a guessed one: over-promising there hands you a model that cannot load.

No GPU: this needs positive evidence - zero controllers, or every controller a known software adapter (Microsoft Basic Display Adapter, llvmpipe, a VM display part). A VRAM reading of 0 on its own is NOT treated as no GPU, because that is exactly what a unified-memory machine reports.

Multi-GPU: llama.cpp splits a model across every visible same-vendor device (--split-mode layer), so Bodega sums the VRAM of the largest same-vendor group for the llama.cpp budget, and pools free VRAM across those same devices when every one of them reports a reading. Cross-vendor sums are never produced - a CUDA build cannot address an AMD card. Ollama is different: it loads a model onto ONE GPU, so its budget stays the largest single card.

Your System card

A live hardware readout appears at the top of the Hardware section in the Help panel.

  1. Open the Help panel: gear icon (top right) → Help
  2. Select Hardware in the left rail
  3. The Your System card at the top shows: CPU model, total RAM, GPU model, VRAM, and a one-line capability summary

The summary uses these thresholds:

VRAM Summary
40 GB+ Can run 70B models comfortably
20–40 GB Can run 32B models comfortably
14–20 GB Can run 14B models comfortably
7–14 GB Can run 7–8B models comfortably
Under 7 GB Limited VRAM - 7B models with short context
No GPU CPU inference only (7–8B)

The card fetches from the backend on mount. If the backend isn't running when you open it, the card won't appear - no error is shown.

Two tier systems (and why they differ)

Bodega uses two separate hardware classification systems. They serve different purposes and have different thresholds - do not confuse them.

Discover tab tiers (used for model recommendations and the Fits My GPU filter):

Tier VRAM
tiny ≤ 4 GB
small 4–8 GB
medium 8–16 GB
large 16–24 GB
xl 24+ GB

Routing tiers (used by the agentic loop for model selection and Cloud Boost escalation decisions):

Tier VRAM Largest model at Q4_K_M
minimal < 6 GB up to 3B
budget 6–10 GB up to 7B
mid 10–18 GB up to 13B
high 18–32 GB up to 30B
prosumer 32+ GB 70B+

The routing tiers also expose two capability flags: canRunSmartTier (13B+ accessible, requires 10 GB) and canRunCodeTier (code-specialized 7B models, requires 6 GB).

VRAM sizing: the Q4_K_M rule of thumb

For Q4_K_M quantization - the default in Bodega's managed llama.cpp mode - model weight size in VRAM is roughly:

VRAM (GB) ≈ parameters (B) × 0.55 + KV cache + ~1 GB overhead

Actual sizes from Bodega's catalog (Q4_K_M):

Model size VRAM (weights only)
1.5B 1.1 GB
3B 1.9 GB
4B 2.5 GB
7B 4.7 GB
8B 5.2 GB
14B 9.0 GB
24B (MoE) 14.3 GB
30B MoE 18.6 GB
32B 19.9 GB
70B 42.5 GB

KV cache is the hidden cost. An 8B model's KV cache grows from about 1.2 GB at 8K tokens to ~20 GB at 128K tokens. Context length is where VRAM gets consumed faster than the model weights table suggests. Bodega's context ceilings are set conservatively to prevent thrashing during agentic runs.

Context window ceilings

After VRAM detection, Bodega computes a context ceiling and writes it to hardware.local_context_ceiling. This caps how many tokens the agentic loop sends to local models.

GPU path (VRAM-based):

Effective VRAM Context ceiling
≤ 4 GB 8,192 tokens
4–8 GB 16,384 tokens
8–24 GB 32,768 tokens
24+ GB 65,536 tokens

CPU-only path (RAM-based, no discrete GPU):

System RAM Context ceiling
≤ 8 GB 4,096 tokens
8–16 GB 8,192 tokens
16–32 GB 16,384 tokens
32+ GB 32,768 tokens

The ceiling calculation uses max(free VRAM, total VRAM − 4 GB) rather than free VRAM alone. This prevents a model that's already loaded from causing the probe to misclassify your card. For example: a 32 GB GPU with a 26B model resident still probes as a 28 GB card for ceiling purposes, not a 4 GB card.

To raise the ceiling manually: Settings → (search) context_window_cap → set llm.context_window_cap to a positive integer. Set it to 0 to return to automatic. The budget bar in each AI panel reflects the active ceiling.

Reducing KV cache memory with Ollama

If you're using Ollama as your local provider and running into VRAM pressure at longer contexts, you can cut KV cache size by roughly 50% by setting an environment variable before launching Ollama:

export OLLAMA_KV_CACHE_TYPE=q8_0

On Windows, set this in System Properties → Environment Variables before starting Ollama.

This is an Ollama setting, not a Bodega setting - Bodega has no UI control for it. It also has no effect in llama.cpp managed mode (where Bodega controls the server directly).

GPU value picks

LLM inference is memory-bandwidth-limited, not compute-limited. VRAM capacity and bandwidth matter more than GPU core count.

Pick GPU VRAM Notes
Budget entry Intel Arc B580 12 GB $249; solid for 7–8B models
Best value used RTX 3090 24 GB $800–950; handles 32B at ~112 tok/s
Best value new RTX 5070 12 GB GDDR7 $550–750; fast bandwidth
No compromises RTX 5090 32 GB GDDR7 $2,000+; 70B models comfortably

AMD: The RX 7900 XTX has 24 GB VRAM but ROCm software support on Windows is inconsistent. On Linux, AMD gets the ROCm llama.cpp binary. On Windows, AMD gets the Vulkan build (HIP Radeon support is experimental).

NVIDIA on Linux: Bodega ships a Vulkan llama.cpp binary for Linux NVIDIA - not CUDA. CUDA binaries for Linux are not included in Bodega's managed installation.

Apple Silicon

On M-series Macs, the GPU and CPU share the same memory pool. Bodega detects Apple Silicon via process.platform === 'darwin' && process.arch === 'arm64'. The effective figure is min(sysctl iogpu.wired_limit_mb, total RAM x 0.75) at 64 GB or more and x 0.70 below that - Metal's recommendedMaxWorkingSetSize grants roughly 70-75% of RAM, not all of it.

Approximate memory bandwidth by chip (from Apple's published specs):

Chip Bandwidth
M4 (base, 16–32 GB) ~120 GB/s
M4 Pro (24–48 GB) ~273 GB/s
M4 Max (64–128 GB) ~546 GB/s

Higher bandwidth means faster token generation - bandwidth scales matter more than raw VRAM here.

When you install llama.cpp through Bodega on macOS, it installs the macos-arm64 binary, which uses Metal acceleration. No configuration required.

If you're using Ollama on Apple Silicon, Ollama handles MLX acceleration automatically. MLX runs roughly 20–30% faster than llama.cpp for inference on Apple Silicon.

Free memory note: macOS manages unified memory dynamically (compression, paging). The free memory reading Bodega sees can fluctuate. The probe uses os.freemem() with a 1 GB kernel reserve as a proxy.

llama.cpp binary selection

When you install llama.cpp through Bodega (first-run onboarding or Settings → Models → My Models → llama.cpp engine → Install), Bodega picks the right binary for your system automatically:

Platform Condition Binary
Windows NVIDIA Driver reports CUDA ≥ 13.3 CUDA 13
Windows NVIDIA Driver reports CUDA ≥ 12.4 CUDA 12
Windows NVIDIA No parseable CUDA version Vulkan
Windows AMD Any Vulkan
Linux NVIDIA Any Vulkan
Linux AMD ROCm installed ROCm
Linux AMD ROCm absent CPU fallback
macOS arm64 Any Metal (macos-arm64)
CPU-only fallback Any CPU

Bodega reads the CUDA version directly from nvidia-smi output (not inferred from driver version numbers). If nvidia-smi times out or is absent, it falls back to driver major version, then to Vulkan or CPU. The install is never blocked by a missing nvidia-smi.

Choosing it yourself: the automatic pick is a default, not a lock. Settings -> Models -> My Models -> llama.cpp engine has a Build type dropdown listing the builds available for your platform. Your choice is saved to llamacpp.gpu_vendor and is what every later install and update uses. The panel also shows which build is actually on disk (llamacpp.binary_flavor), so you can tell whether your choice has taken effect: if it has not, the button reads Install <build> instead of Up to date. An install that predates that record says so rather than guessing.

Air-gap mode: the binary install endpoint returns 403. Use llamacpp.binary_path_override in Settings to point to a manually downloaded binary.

Updating the llama.cpp binary

Each Bodega release pins a specific llama.cpp build. Installing the app does not move an existing installation to that build - updating the engine is a separate, explicit action.

Where: Settings → Models → My Models → llama.cpp engine. It shows two numbers side by side: the build you have installed, and the build this app version bundles. When they differ, an Update button appears.

Some models need a minimum llama.cpp build to load at all. When one does and your build is older, Bodega blocks the download and names the build you need - this panel is where you get it.

Bodega never updates the binary on its own. llama-server is the process your conversations run on; it is not swapped out in the background or at launch. Nothing changes until you click Update.

If the server is running: the update refuses and asks first. A running executable cannot be safely replaced - on Windows the file is locked, and on macOS/Linux the replace appears to succeed while the running process keeps the old binary. Choosing Stop and update stops llama-server (confirmed actually gone, not just asked to stop), then downloads. Your next model load starts the new build. If the stop cannot be confirmed, the update aborts and your binary is left untouched.

Air-gap mode: the update is a network download, so it is unavailable. Install the binary yourself and point llamacpp.binary_path_override at it.

Cloud Boost as a no-GPU path

Cloud Boost lets you configure a cloud provider (OpenAI, Anthropic, and others) as a secondary fallback. On low-end hardware, it activates automatically for tasks that need it.

To configure:

  1. Go to Settings → Cloud Boost
  2. Enable the toggle
  3. Choose a cloud provider
  4. Enter your API key
  5. Set optional daily and monthly budget limits

Auto-escalation triggers - both conditions must be true for trigger B:

  • (A) The local model's QEL verification score falls below 50 for two consecutive iterations in the same session, OR
  • (B) Hardware tier is minimal (< 6 GB VRAM) or budget (6–10 GB VRAM) AND the current task is classified as reasoning-heavy

Simple conversational messages on minimal hardware do not trigger auto-escalation. The task has to be a planning or reasoning task.

You can also toggle Cloud Boost manually in the chat input area.

Cost tracking: gear icon → Usage Dashboard

Air-gap mode: Cloud Boost is fully blocked when air-gap is enabled (Settings → Privacy & Safety → Air-Gap).

Free VRAM detection limits

Bodega primarily reads free VRAM from the GPU driver's memoryFree field via systeminformation. This works on most Windows NVIDIA and Linux AMD (ROCm) systems. Driver readings are pooled across the largest same-vendor group - the same set of devices the total VRAM budget is built from - and only when every device in that group reports a reading. If any of them reports nothing, Bodega uses the largest single card rather than publishing a partial sum.

On some Windows/driver combos the field comes back null even on an NVIDIA GPU. Bodega then falls back to querying nvidia-smi, which prints one line per GPU and is summed across all of them. Because that sum covers whatever GPUs nvidia-smi can see, it is only used when it describes the same devices: the GPU count and the total VRAM must both match what the driver reported. If they don't, the reading is discarded and free VRAM is treated as unavailable rather than mixed with a total measured over a different set of cards. Total VRAM is never taken from this fallback either way.

On Apple Silicon and some Windows AMD configurations, free VRAM still isn't reported by either source - Bodega uses total VRAM as the effective figure.

When free VRAM isn't available from any source, model fit scoring uses total VRAM. This means the Discover tab may show models as fitting even when another model is already resident. The requiresEviction indicator on a model card means it fits in your total VRAM but would require the current model to be unloaded first.

Minimum-RAM floors are checked with a tolerance. Catalog entries carry a minimum system-RAM figure, and no machine reports the number printed on its box - firmware reserves some, so a 32 GB machine reports about 31. An exact comparison therefore excluded every machine the figure was written for; a 5% tolerance is applied so it does not. Models genuinely beyond your RAM are still filtered out, and the Discover tab's only show models that fit filter is on by default - turn it off to see everything in the catalog regardless of fit.

Keyboard shortcuts

KeysAction
Gear icon → Help → HardwareOpen Hardware section with Your System card

This page mirrors the in-app docs hub for app version 1.0.0-beta.41. Found something unclear or out of date? Tell us on Discord. New here? Download the free beta and follow along.