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 and recommended specs
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.
- Open the Help panel: gear icon (top right) → Help
- Select Hardware in the left rail
- 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:
- Go to Settings → Cloud Boost
- Enable the toggle
- Choose a cloud provider
- Enter your API key
- 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) orbudget(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
| Keys | Action |
|---|---|
| Gear icon → Help → Hardware | Open 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.