Chronicler
Performance & models

GPU acceleration

Use the graphics card you already have - the difference between a minute and a few seconds.

Answer speed is dominated by where the model runs. On a CPU, the first answer after a pause takes one to three minutes. On a mid-range NVIDIA card, seconds.

How it's selected

One setting in your .env:

.env
COMPOSE_PROFILES=cpu     # or nvidia, or amd

The compose file ships three variants of the model container and starts exactly one of them. They share the same name, address and downloaded models, so switching between them keeps everything and re-downloads nothing.

If COMPOSE_PROFILES is unset, none of them start. The rest of the stack comes up, and every question fails. This is the most common self-host mistake.

The desktop app's guided setup detects this for you on first install. Everyone else picks it below.

Automatic detection

PowerShell
$vram = nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits 2>$null
$profile = if ($vram) { "nvidia" } else { "cpu" }
(Get-Content .env) -replace '^COMPOSE_PROFILES=.*$', "COMPOSE_PROFILES=$profile" |
  Set-Content -Encoding ascii .env
if ($vram) {
  Add-Content -Encoding ascii .env "CHRONICLER_GPU_VRAM_GB=$([math]::Floor($vram / 1024))"
}

AMD acceleration is Linux-only. This selects NVIDIA when the driver is visible; otherwise it selects CPU. The second key tells the admin console how big your card is - see below.

It checks the platform, whether containers can actually reach a GPU, and how much memory Docker has, then writes COMPOSE_PROFILES into the .env beside it - plus CHRONICLER_GPU_VRAM_GB on an NVIDIA host. It never touches your database password, and never picks a model: that stays with Admin → Model.

If it finds a card your containers can't reach, or Docker Desktop on the Hyper-V backend, it warns and settles for cpu rather than stopping. Read the warnings - they're the difference between a fast box and a slow one.

Useful flag: --env-file PATH (target a different .env).

The script needs bash - it runs on Linux, and on Windows from Git Bash or a WSL shell. If you can't run it, set the value by hand as below.

NVIDIA

Confirm the host sees the card

PowerShell
nvidia-smi

No output means a driver problem - fix that first, nothing below will help.

Confirm containers can see it

The driver being installed on the host is not enough; Docker needs the NVIDIA Container Toolkit to pass the card through.

PowerShell
docker run --rm --gpus all ollama/ollama:0.32.4 nvidia-smi

If that prints your card, you're ready. If it errors:

Update the NVIDIA driver (the WSL2 driver includes container support), make sure Docker Desktop is on the WSL 2 based engine, and restart Docker Desktop. There is nothing extra to install.

Switch the profile

.env
COMPOSE_PROFILES=nvidia
PowerShell
docker compose up -d

AMD

Linux only, and best-effort. ROCm reaches the card through /dev/kfd and /dev/dri, which Docker Desktop on Windows cannot pass through.

Docker Desktop cannot pass AMD GPU devices through. Use the CPU profile on Windows, or run the stack on Linux for AMD acceleration.

If both exist:

.env
COMPOSE_PROFILES=amd
The AMD profile is unavailable on Windows.

This variant pulls a different, larger image (the ROCm runtime), so the first start after switching takes a while.

Verify it's actually being used

PowerShell
docker compose ps

The running container should be ollama-nvidia or ollama-amd, not ollama-cpu. Then ask a question and watch:

PowerShell
nvidia-smi
docker compose logs chronicler-ollama | Select-Object -Last 30

The Ollama log says which backend it loaded the model onto. The honest test is the clock: if a warm answer still takes a minute, it's on the CPU.

Switching later

Edit COMPOSE_PROFILES, then docker compose up -d. Compose replaces the model container in place. Downloaded models live in a shared volume, so nothing is re-downloaded and no data is lost.

How the console learns about your GPU

Admin → Model probes hardware from inside the backend container, and that container is deliberately given no access to the graphics card - only the Ollama container gets it. Left alone, the console would report no GPU and grey out the GPU-class models on every machine, including yours.

CHRONICLER_GPU_VRAM_GB in your .env is what closes that gap. The detection script writes it, the desktop app's guided setup writes it, and the PowerShell snippet above writes it. The backend reads it and sizes the model list to the card you actually have.

If Admin → Model greys out the GPU tiers on a machine with a card, check that key first:
PowerShell
Select-String "CHRONICLER_GPU_VRAM_GB" .env
Missing or 0? Rerun the detection script, then docker compose up -d. It is written only on the nvidia profile - on cpu or amd the console correctly offers the CPU-capable tiers only.