My Setup for LLMs

As of 9/12/2026

Cloud LLMs

To get the cloud side of things out of the way, I primarily use ChatGPT from OpenAI for cloud-based LLMs. This gives me frontier intelligence with reasonable rate limits, along with Codex (CLI/Extension). With this, I get more usage than I would with Claude, and it doesn’t refuse every little benign thing I ask it to do.

On top of that, I have the free tiers of the other labs, plus a Pro Google subscription (free for students) that I rarely use. Having used Gemini’s paid tier, I do not understand why anyone would pay money for this. At least Anthropic models are smart for the comparatively limited amount you can use them.

Local AI: Running Models

To run models locally, I use Ollama in Docker. It allows me to have the models I want with little maintenance overhead, and integrates nicely with my maintenance scripts. In Docker Compose, it looks something like this:

services:
  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    ports:
      - "11434:11434"
    volumes:
      - ./ollama:/root/.ollama
    environment:
      - OLLAMA_CONTEXT_LENGTH=131072
      - OLLAMA_NUM_PARALLEL=4
      - OLLAMA_MAX_LOADED_MODELS=1
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    restart: unless-stopped

As I tend to run smaller models, I use the default f16 KV Cache type. This is because my experience with quantizing the KV Cache of small models tends to ruin their performance. However, for running larger models, I will sometimes bump that down to q8_0 to be able to use longer context windows.

Local AI: Chats

For my local AI chats, I use Open WebUI hosted in Docker. This is combined with Apache Tika (content extraction), Calibre (textbooks), and ForgeJo (notes) for my local RAG setup. To sync Calibre and the Open WebUI knowledge base, I run a Python script on a cron job to export content updates, which is then picked up by oikb to import into the knowledge base. On top of that, for internet searching, I run a SearXNG instance. Additionally, my local LLMs are given a tool which unifies Playwright and FlareSolverr for fetching the websites found by SearXNG and converting them into a readable format. I have found that Playwright often breaks in my setup, so the redundancy helps things “just work” for me. This is sort of a union of my configurations, as it comes from multiple machines:

services:
  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    depends_on:
      - ollama
    ports:
      - "3000:8080"
    volumes:
      - ./open-webui:/app/backend/data
    environment:
      - OLLAMA_BASE_URL=http://ollama:11434
      - USER_AGENT="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 Chrome/148.0 Safari/537.36"
      - WEB_LOADER_ENGINE=playwright
      - PLAYWRIGHT_WS_URL=ws://192.168.1.46:3002  # remote machine
      - ENABLE_PYODIDE_FILE_PERSISTENCE=true  # Fix for my proxy setup
    extra_hosts:
      - "host.docker.internal:host-gateway"
    restart: unless-stopped

  tika:
    image: apache/tika:latest
    container_name: tika
    restart: unless-stopped

  oikb:
    image: ghcr.io/open-webui/oikb:latest
    container_name: oikb
    depends_on:
      - open-webui
    command: ["daemon", "--port", "8080"]
    env_file: ".env"
    volumes:
      - ./books:/sources/books:ro
      - ./notes:/sources/notes:ro
      - ./oikb.yaml:/app/.oikb.yaml:ro
    environment:
      - OPEN_WEBUI_URL=http://open-webui:8080
      - OPEN_WEBUI_API_KEY=${OPEN_WEBUI_API_KEY}
    restart: unless-stopped

  playwright:  # Remote
    image: mcr.microsoft.com/playwright:v1.60.0-noble
    container_name: playwright

    command:
      - /bin/sh
      - -c
      - >
        npx -y playwright@1.60.0
        run-server
        --port 3000
        --host 0.0.0.0
    ports:
      - "3002:3000"

  searxng-core:  # Remote
    container_name: searxng-core
    image: docker.io/searxng/searxng:latest
    restart: unless-stopped
    ports:
      - 8006:8080
    volumes:
      - ./searxng/core-config/:/etc/searxng/:Z
      - ./searxng/core-data:/var/cache/searxng/
      - ./searxng/useragents.json:/usr/local/searxng/searx/data/useragents.json:ro

  searxng-valkey:  # Remote
    container_name: searxng-valkey
    image: docker.io/valkey/valkey:9-alpine
    command: valkey-server --save 30 1 --loglevel warning
    restart: unless-stopped
    volumes:
      - ./searxng/valkey-data:/data/

  flaresolverr:  # Remote
    image: ghcr.io/flaresolverr/flaresolverr:latest
    container_name: flaresolverr
    environment:
      - LOG_LEVEL=info
      - LOG_FILE=none
      - LOG_HTML=false
      - CAPTCHA_SOLVER=none
      - TZ=America/New_York
      - LANGUAGE=en_US:en
    ports:
      - "8191:8191"
    volumes:
      - ./flaresolver:/config
    restart: unless-stopped

Local AI: Code

As I’m already running Ollama and have Codex CLI installed, I simply point my Codex CLI at my Ollama server for local AI agents. Thus far, I’ve yet to find a model that works particularly well for this setup and my needs. My profile is set up like this, with the context window following whatever I have configured in Ollama.

model = "qwen3.8:27b-mtp-q4_K_M"
model_provider = "sleepy_ollama"
model_reasoning_effort = "max"
model_context_window = 131072

# approval_policy = "on-request"
approval_policy = "never"  # Currently this for benchmarking

sandbox_mode = "workspace-write"
web_search = "live"
experimental_multi_agent = true

[sandbox_workspace_write]
network_access = true

[model_providers.sleepy_ollama]
name = "Sleepy Ollama"
base_url = "http://10.8.0.4:11434/v1"
wire_api = "responses"

So far, qwen3.6:35b-a3b-q4_K_M has been the closest to usable model for me. It’s fast enough to not be waiting forever for a response, but too dumb to not closely watch what it’s doing.