Run WaxFrame hive sessions against AI models on your own machine — no cloud API keys, no per-token cost, your data never leaves your network. This guide covers choosing a model server, assessing your hardware, installing and configuring Ollama, Open WebUI, and LM Studio on Windows, and the results of real-world model testing on consumer hardware.
Ollama is a lightweight model server that runs on your machine and serves AI models over a local API. Open WebUI is a free, self-hosted web interface that sits in front of Ollama via Docker, handles cross-origin requests, and gives you a full model management UI.
Use this when: you want fine-grained control over model configuration (custom Modelfiles, context-size tuning, environment variables), need the Docker container to handle CORS for waxframe.com access, or want to run headless on a server. This is the setup used for all the model testing documented below.
LM Studio(opens in a new tab) is a standalone desktop application that downloads, manages, and serves local AI models — similar to the Ollama + Open WebUI combination but packaged as a single install with a GUI. No Docker, no terminal commands. It has its own built-in model browser, a chat interface, and an OpenAI-compatible API server you can point WaxFrame at.
Use this when: you want the simplest possible path to a working local hive. Good for getting started quickly or for users who prefer a GUI.
LM Studio and Ollama use different default ports (LM Studio: 1234, Ollama: 11434). They can coexist on the same machine and serve different models. WaxFrame's Import from Model Server has Quick Add presets for both.
Local AI models run on your graphics card (GPU), not your CPU. The critical resource is VRAM — the memory available to your GPU. The more you have, the larger and smarter the models you can run, and the more models you can load simultaneously for a WaxFrame hive session.
Windows (NVIDIA GPU):
Ctrl+Shift+Esc → Performance tab → GPU. Look for Dedicated GPU memory — that is your VRAM.nvidia-smiThis shows your GPU name, total VRAM, and current usage.
Mac (Apple Silicon):
sysctl hw.memsizeThis shows total system memory in bytes. Divide by 1,073,741,824 to get GB.
Either platform (Ollama installed):
ollama ps
This shows which models are currently loaded, how much memory each uses, and whether they are running on GPU or CPU.
NVIDIA GPUs have their own dedicated VRAM, separate from system RAM. Apple Silicon (M1, M2, M3, M4) uses unified memory — the CPU and GPU share the same pool of RAM. There is no separate "VRAM" number.
This is actually an advantage for local AI: models do not need to be copied from system RAM into GPU memory. They load once and both the CPU and GPU can access them directly. The tradeoff is that your AI models, your operating system, your browser, and everything else are all drawing from the same pool.
Rule of thumb: reserve at least 8 GB for macOS and your apps. Whatever is left is your effective model budget. On a 16 GB Mac, that means ~8 GB for models. On a 24 GB Mac, ~16 GB. On a 36 GB or higher machine, you have serious headroom.
Think of VRAM like seats on a bus. Each AI model you load takes up a certain number of seats. Once the bus is full, the next model either waits for a seat to open up or spills onto your system RAM (CPU), which is dramatically slower — sometimes 10-50x slower.
The number you see on a model's download page (e.g. "1.9 GB") is the file size on disk, not the VRAM it uses when loaded. A model's actual VRAM footprint depends on two things:
The practical effect: a model that shows as 1.9 GB on disk might use 3.4 GB of VRAM when loaded with a 32K context window, or 6.0 GB with a larger parameter count at the same context size.
WaxFrame's hive needs multiple AIs running at the same time — at minimum two (one worker and one Builder), ideally three or more. Each loaded model occupies memory until it is unloaded. Here is a rough guide:
NVIDIA GPUs (Windows/Linux):
| VRAM | Example GPUs | What fits |
|---|---|---|
| 8 GB | RTX 4060, RTX 3070 | One 3B model at a time. Not enough for a multi-model hive — models will swap in and out of VRAM between turns, adding 10-30 seconds of cold-load time per response. |
| 12 GB | RTX 4070, RTX 3060 12GB | Two 3B models simultaneously, or one 7B model alone. Tight but workable for a 2-model hive with small models. |
| 16 GB | RTX 4080 SUPER, RTX 5070 Ti | Two to three 3B models simultaneously, or one 7B + one 3B. The sweet spot for consumer hardware — enough for a functional hive, though model quality is the limiting factor (see Model Testing Results below). |
| 24 GB | RTX 4090, RTX 5080 | Three 7B models, or two 7B + one 3B, or one 14B + one 3B. Enough headroom for models that can genuinely handle WaxFrame's Builder protocol. |
| 48+ GB | RTX A6000, dual-GPU setups | Multiple 14B-70B models. Enterprise/work-server territory — models at this size start approaching cloud-AI quality for document refinement. |
Apple Silicon Macs (unified memory):
| Total RAM | Example Macs | Effective model budget | What fits |
|---|---|---|---|
| 8 GB | MacBook Air M1/M2 (base) | ~4 GB after macOS | One 3B model — barely. Expect swapping. Not practical for a hive. |
| 16 GB | MacBook Air/Pro M2/M3/M4 | ~8 GB for models | One or two 3B models. Comparable to an 8 GB NVIDIA GPU. Workable for a minimal 2-model hive. |
| 24 GB | MacBook Pro M3/M4 Pro | ~16 GB for models | Two to three 3B models, or one 7B + one 3B. Comparable to a 16 GB NVIDIA card — the consumer sweet spot. |
| 36-48 GB | MacBook Pro M3/M4 Max | ~28-40 GB for models | Multiple 7B models or one 14B+ model with room to spare. This is where Apple Silicon starts to shine — unified memory means zero copy overhead. |
| 64+ GB | Mac Studio M4 Ultra, Mac Pro | ~56+ GB for models | Multiple 14B-70B models. Genuine alternative to a multi-GPU workstation for local AI work. |
By default, Ollama loads one model at a time and unloads the previous one. For a WaxFrame hive you need multiple models loaded simultaneously. Set this environment variable to tell Ollama how many to keep in memory:
Windows (PowerShell):
[Environment]::SetEnvironmentVariable("OLLAMA_MAX_LOADED_MODELS", "3", "User")
Verify with:
[Environment]::GetEnvironmentVariable("OLLAMA_MAX_LOADED_MODELS", "User")
Mac/Linux (Terminal):
launchctl setenv OLLAMA_MAX_LOADED_MODELS 3
To make it persist across reboots on Mac, add this line to your ~/.zshrc (or ~/.bashrc on Linux):
export OLLAMA_MAX_LOADED_MODELS=3
After setting the variable on either platform, restart Ollama (quit from the system tray / menu bar and reopen it).
Set this to however many models you want loaded at once. For 16 GB of available model memory, 3 is a reasonable starting point with 3B-class models. If you set it higher than your memory can handle, Ollama will spill models to swap and performance will drop dramatically.
Open PowerShell and check that Ollama is installed and has models available:
ollama --version
Then list your installed models:
ollama list
You should see the models you already installed. Test the API:
Invoke-RestMethod http://localhost:11434/api/tags
If that returns model information, Ollama is good.
Run:
docker --version
If you get something like Docker version 28.x.x, skip ahead to Install and Start Open WebUI.
If PowerShell says docker isn't recognized, install Docker Desktop next.
Using Winget:
winget install -e --id Docker.DockerDesktop
After installation:
Then open a fresh PowerShell window and run:
docker version
You should see both a Client and Server section.
Run this as one PowerShell command:
docker run -d ` -p 3000:8080 ` --add-host=host.docker.internal:host-gateway ` -v open-webui:/app/backend/data ` -e CORS_ALLOW_ORIGIN=https://waxframe.com ` --name open-webui ` --restart always ` ghcr.io/open-webui/open-webui:main
The CORS_ALLOW_ORIGIN line is what lets waxframe.com talk to your local Open WebUI. Without it, your browser blocks the cross-origin request.
The first launch will download the Open WebUI Docker image, so you'll see some image layers being pulled.
Run:
docker ps
You should see something similar to:
CONTAINER ID IMAGE PORTS xxxxxxxxxxxx ghcr.io/open-webui/open-webui:main 0.0.0.0:3000->8080/tcp
In your browser, open:
http://localhost:3000
You should get the Open WebUI setup screen.
The first account you create becomes the administrator for that Open WebUI installation.
This account exists locally inside Open WebUI. You are not signing up for some external Open WebUI cloud account.
Your data is stored in the Docker volume open-webui. That is why removing/recreating the container won't normally wipe your chats or settings.
Once logged in, look at the model selector near the top. Your existing Ollama models should appear.
Open WebUI talks to Ollama through:
http://host.docker.internal:11434
Docker's host.docker.internal hostname represents your Windows host from inside the container. This is the important part because localhost inside the Open WebUI container refers to the container itself, not Windows.
Go into: Admin Panel → Settings → Connections
Find Ollama. Set the Ollama URL to:
http://host.docker.internal:11434
Save it, then refresh Open WebUI.
Do not use http://localhost:11434 from inside the Docker container — localhost inside Docker points to the container, not your Windows machine.
Pick one of your Ollama models from the model dropdown and enter a normal prompt.
Ollama does the model inference; Open WebUI is the interface, conversation manager, knowledge/document system, tool layer, and provider manager sitting in front of it.
Open WebUI also provides an image containing both Open WebUI and Ollama. Do not use it if you already have Ollama installed on Windows.
You already have Windows Ollama configured, downloaded models, GPU support working, and you've been tuning its context size and models. Running another Ollama inside Docker would give you two separate Ollama instances with separate model stores and potentially separate GPU configuration. That's pointless duplication.
Your architecture should simply be:
waxframe.com (your browser) | v http://localhost:3000 | v Open WebUI (Docker container) | v host.docker.internal:11434 | v Ollama for Windows | v Your GPU
Everything runs on your machine. WaxFrame sends requests to localhost, Open WebUI forwards them to Ollama, Ollama runs inference on your GPU. No data leaves your network.
Open WebUI requires authentication for API access. You need to generate a persistent API key from your Open WebUI instance.
http://localhost:3000 in your browser and make sure you're logged in.fetch('/api/v1/auths/api_key', {method:'POST', headers:{'Authorization':'Bearer '+localStorage.getItem('token'),'Content-Type':'application/json'}}).then(r=>r.json()).then(d=>console.log(d))
sk-. Copy it. If you see an object with an api_key field, copy the value of that field.This key does not expire. You only need to do this once.
Go back to waxframe.com. On the Worker Bees screen, switch to Server Based AI mode if you haven't already — the Import from Model Server modal will open automatically.
http://localhost:3000/api/chat/completionshttp://localhost:3000/api/modelsWaxFrame will pull the full model list from your local Open WebUI (which includes every model Ollama has). Select the ones you want and click Add to Hive.
This works because the CORS_ALLOW_ORIGIN flag you set during installation tells Open WebUI to accept requests from waxframe.com, and modern browsers treat localhost as a secure context — so the http://localhost request from an https:// page goes through without being blocked.
After adding models, you should see them in your Worker Bees grid. Click Test All Keys — each imported model should show a green connectivity pill.
If a model shows red, check:
docker ps).ollama list.http://localhost:3000 (not https, not 8080).CORS_ALLOW_ORIGIN flag. Recreate it using the install command above.Once your models are green, you're running hive sessions from waxframe.com against your local AI stack — no cloud API keys, no per-token costs, your data never leaves your machine.
You normally don't have to manually start it. We used --restart always, so Docker will restart the Open WebUI container automatically.
If needed:
docker start open-webui
To stop it:
docker stop open-webui
To restart it:
docker restart open-webui
To check its status:
docker ps -a
If something breaks:
docker logs open-webui
Or watch them live:
docker logs -f open-webui
Press Ctrl+C to stop watching.
Open WebUI's documented Docker update procedure: remove the old container, pull the current image, and recreate it while retaining the persistent volume.
docker rm -f open-webui
Then:
docker pull ghcr.io/open-webui/open-webui:main
Then recreate it with the same flags as your original install:
docker run -d ` -p 3000:8080 ` --add-host=host.docker.internal:host-gateway ` -v open-webui:/app/backend/data ` -e CORS_ALLOW_ORIGIN=https://waxframe.com ` --name open-webui ` --restart always ` ghcr.io/open-webui/open-webui:main
Your persistent Open WebUI data remains in the open-webui volume because that Docker volume wasn't deleted.
http://localhost:1234.http://localhost:1234/v1/chat/completionshttp://localhost:1234/v1/modelsOllama's default context window (2048 tokens) is too small for most WaxFrame sessions. You can create a custom model variant with a larger context window using a Modelfile.
Create a text file (e.g. Modelfile.mymodel) with this content:
FROM qwen2.5:3b PARAMETER num_ctx 16384
Then build it:
ollama create my-qwen25-16k -f Modelfile.mymodel
This creates a new model variant called my-qwen25-16k that uses qwen2.5:3b as its base but with a 16K context window. The variant is a thin wrapper — it does not re-download the model weights.
Context size vs. VRAM tradeoff: A larger context window means the model can see more of your document and the worker feedback at once, which is important for Builder quality. But it also uses more VRAM. 16384 (16K) is a good balance for consumer GPUs. Going to 32768 (32K) uses noticeably more VRAM — check with ollama ps after loading to see the actual impact.
When Ollama loads a model from disk into VRAM, there is a one-time delay (5-30 seconds depending on model size and your disk speed). During a hive session, WaxFrame sends requests to each AI in sequence — if a model is not already loaded, the first request triggers a cold load and the user waits.
To avoid this, warm-start your models before launching a hive session. Open PowerShell and send a trivial prompt to each model:
ollama run cogito:3b "hi" ollama run qwen2.5:3b "hi" ollama run smollm3-slim "hi"
Each command loads the model into VRAM (if not already loaded), generates a short response, and returns. After running all three, verify they are loaded:
ollama ps
You should see all your models listed with their VRAM usage and 100% GPU (meaning none of the model has spilled to CPU). If any model shows a CPU/GPU split (e.g. 7%/93%), it does not fully fit in your remaining VRAM.
To replace a loaded model with a different one, just run the new model — Ollama will unload the least-recently-used model if VRAM is full:
ollama run qwen2.5:7b "hi"
Then update WaxFrame: go to Setup → Import from Model Server → Fetch Models and add the new model to your hive. Remove the old one from your Worker Bees list if you no longer want it.
To check what is currently loaded at any time:
ollama ps
We spent three days testing every viable open-source model combination on an NVIDIA RTX 4080 SUPER (16 GB VRAM) to find out which models can actually handle WaxFrame's hive protocol — specifically, the Builder role. The Builder has strict requirements: it must wrap the updated document in %%DOCUMENT_START%% / %%DOCUMENT_END%% delimiters, it must include a %%CONFLICTS_START%% section (or report NO CONFLICTS), it must not echo back prompt metadata or instructions, and it must synthesize worker feedback into a coherent revision rather than just concatenating suggestions.
Cloud AIs (ChatGPT, Claude, Gemini) handle all of this easily — they have enough intelligence and instruction-following ability to understand the protocol and produce clean output. Local models at the 3B-7B parameter range struggle significantly. The table below shows every model and combination we tested, what went right, and what went wrong.
Test document: a chocolate chip cookie recipe (~400 words). All tests run on an RTX 4080 SUPER (16 GB VRAM), Windows 11, Ollama, with OLLAMA_MAX_LOADED_MODELS=3.
| Model | Role tested | VRAM (loaded) | Speed | Builder quality | Key issue |
|---|---|---|---|---|---|
| qwen3:4b | Worker + Builder | ~10 GB (w/ 32K ctx) | 52-144s | Best tested — only model to achieve convergence and report real conflicts | Hidden "thinking" burns 4,000-14,000 invisible tokens per response, making it extremely slow and expensive on token budget |
| qwen2.5:7b | Worker + Builder | 4.7 GB | 1.1-6.3s | 5/10 — protocol compliant (correct delimiters) but rubber-stamps everything | No critical evaluation: applied every worker suggestion including bad ones (e.g. adding water to cookies, dropping butter measurement). Fast but no synthesis ability. |
| qwen2.5:3b | Worker + Builder | 3.4 GB | 0.8-12.6s | 1/10 — metadata echo, word explosion | As Builder: exploded to 868 words in Round 2, mixed raw edit instructions ("Line 28: Replace...") into the document body. As worker: inserted [INSERT DATE] placeholders. |
| qwen2.5:14b | Builder (solo test) | 15 GB (7% CPU / 93% GPU) | Not tested in hive | N/A — too large | Fills nearly all 16 GB VRAM by itself. No room for a second model. Dead end for 2-model setup on 16 GB hardware. |
| cogito:3b | Worker + Builder | 6.0 GB | 1.4-11s | 2/10 — echoes entire prompt structure into document | As Builder: output included "WAXFRAME — RECIPE", "Round 1 · Phase 1 · Draft", "SEND TO ALL AIs" from the prompt. As worker: sometimes fast (1.4s), sometimes hallucinated (suggested adding water to cookies). |
| cogito-3b-slim | Worker + Builder | 4.1 GB | 1.6-12.3s | 2/10 — same issues as cogito:3b | Dropped the %%DOCUMENT_START%% delimiter entirely on first Builder attempt. Echoed metadata on second attempt. Slim variant saves VRAM but does not fix the underlying model limitations. |
| SmolLM3 (Q4_K_M) | Worker + Builder | 4.6 GB | 7.1-12.7s | 6/10 — cleanest 3B-class Builder, no metadata echo | A "thinking" model — includes a hidden chain-of-thought that scales with prompt complexity. In later rounds, thinking overhead grew to 55:1 ratio (1,483 tokens for 27 words of visible output). As worker: slow (23-58s). |
| llama3.2:3b | Builder | ~2 GB | 7.2-39.7s | 3/10 — included %%CONFLICTS_START%% but concatenated instead of synthesizing | Word count explosion: 771 → 2,739 words over rounds. Document degraded badly. Concatenated worker suggestions verbatim rather than synthesizing them. |
| qwen3.5:4b | Worker + Builder | ~2.5 GB | 92-125s | Failed — ALL CAPS output, metadata echo | Hidden thinking burned 8,310-13,043 completion tokens. Output was ALL CAPS with prompt metadata echoed into the document. |
| gemma3:4b | Previously eliminated | — | — | — | Tested before the documented session; eliminated for poor instruction following. |
| phi4-mini | Previously eliminated | — | — | — | Tested before the documented session; eliminated for poor Builder output. |
| granite | Previously eliminated | — | — | — | Tested before the documented session; eliminated early. |
Out of every combination tested, two configurations loaded and ran successfully on 16 GB VRAM with 100% GPU (no CPU spill) and sub-15-second response times:
| Combo | Models | Total VRAM | Speed | Notes |
|---|---|---|---|---|
| 2-model | cogito:3b (worker) + qwen2.5:7b (Builder) | 10.7 GB | 1-6 seconds per response | Fastest combo. Protocol compliant — correct delimiters, correct structure. But the Builder rubber-stamps all worker suggestions without critical evaluation. No convergence achieved. |
| 3-model | cogito:3b (worker) + qwen2.5:3b (worker) + SmolLM3 (Builder) | 14.0 GB | 7-13 seconds per response | All three at 100% GPU, zero CPU spill. SmolLM3 was the cleanest Builder of any 3B model — no metadata echo, correct delimiters. But thinking overhead grew over rounds and no convergence achieved. |
Both combinations functioned correctly — WaxFrame ran hive sessions against them, rounds completed, documents were updated. The limiting factor was not speed or protocol compliance but model intelligence: 3B-7B models do not have enough reasoning capacity to synthesize worker feedback critically, evaluate conflicting suggestions, or achieve convergence (workers saying "no changes needed").
Cloud AIs like ChatGPT, Claude, and Gemini have hundreds of billions of parameters and run on datacenter-grade hardware with hundreds of gigabytes of VRAM. The models you can run on a consumer GPU are 10-100x smaller. That size difference is not just about speed — it directly affects intelligence:
Some models (qwen3, qwen3.5, SmolLM3) include a hidden chain-of-thought step before generating their visible response. The model "thinks" internally — you do not see this text, but it consumes tokens and time. In our testing:
If you see a model responding slowly despite showing 100% GPU, check whether it is a thinking model. You cannot disable the thinking in most cases — it is baked into the model architecture.
Local models work for the mechanics — WaxFrame connects, rounds execute, documents update, responses come back fast. On a 16 GB GPU, you can run 2-3 models simultaneously with sub-15-second response times and zero API cost.
Local models struggle with the intelligence — at 3B-7B parameters, no model we tested could match what a cloud AI does as Builder. No convergence, no meaningful conflict detection, no critical evaluation of worker suggestions. The hive runs but the output quality does not match what you get from a ChatGPT/Claude/Gemini hive.
Where local hives shine today:
Where cloud hives are still the right choice: anything where convergence, critical evaluation, or document quality matters. Cloud AI costs pennies per round — a full 10-round hive session with five cloud AIs typically costs $0.10-$0.50 depending on document length and provider.
As local model quality improves (and it is improving fast), this gap will narrow. The infrastructure you set up today — Ollama, your model server, your WaxFrame configuration — will run better models tomorrow without changing anything.