How To Setup A Local LLM Homelab

Windows 11 Pro + Docker + Ollama + Open WebUI + SearXNG + ComfyUI + OpenCode + Hermes + Remote Access

Last Updated: 2026-07-28 · Feedback: setupllmserver@gmail.com


This is an all-text guide to setup a LLM homelab with local & remote access. It assumes some leve of technical expertise. It was created as a "LLM Install Notes" file on how to install everytihng since I didn't know what I was doing, and thinks kept breaking. These instructions are the end result of Google searches, Reddit posts, ChatGPT/Claude, official documentation, my own LLM server, and head banging…against a wall. :)

Disclaimer: I am using an nVidia GPU. I used a mix of Claude/my LLM server to clean/format this guide, and I'm using Google Analytics to measure traffic.

This guide was made with the following software:


Table of Contents


Prep Work

  1. Download Windows 11 ISO
  2. Download Rufus and flash a thumb drive with the Windows 11 ISO
  3. [ALT] Use the Windows Installation Media Tool if Rufus causes problems flashing the thumb drive
  4. Install Windows 11
  5. Open a web browser and navigate to github.com/raphire/win11debloat
  6. Open PowerShell and run the Raphire/Win11Debloat quick method tool
  7. Download and install the latest nVidia drivers
  8. Change Windows Power Plan to "High performance"
  9. Change "User_Name" to the appropriate user name or some commands will fail
  10. Always open Powershell as Administrator or some commands will fail

1. Install Windows Subsystem for Linux (WSL)

Open PowerShell then run:

# Install WSL
wsl --install

# Reboot, then ensure WSL is up to date
wsl --update

2. Install Docker Desktop (DD)

  1. Open Microsoft Store and search for Docker Desktop and install
  2. Run Docker Desktop and close the "Windows Subsystem for Linux" dialogue box
  3. [Optional] Create or log in to your account
  4. Go to Settings -> General -> Tick Start Docker Desktop when you sign in to your computer
  5. Go to Settings → General and confirm WSL 2 based engine is enabled
  6. Uncheck Send usage statistics then click Apply

3. Install Ollama & Download Models

  1. Visit ollama.com and download/run the installer
  2. Open Ollama and create/log in to your account
  3. Open a browser and go to localhost:11434 to verify the app is running
  4. Close the desktop app as it will continue to run in the background
  5. Open PowerShell and pull the desired models:
# Find available models at: https://ollama.com/search
# Larger models require more VRAM and might impact CUI performance.
# This is an example list. The "abliterated" model is uncensored.
# ollama pull <model_name>

ollama pull qwen3.5:9b
ollama pull qwen3.6:27b
ollama pull qwen3.6:35b
ollama pull qwen3-coder-next
ollama pull llama4:latest
ollama pull qwen3.5:122b
ollama pull richardyoung/qwen3.6-27b-abliterated:Q8_0

4. Install Open WebUI (OWUI)

DD must be running. Open PowerShell, and make sure to copy/paste the entire line for which GPU version is needed:

# Pull the OWUI image
docker pull ghcr.io/open-webui/open-webui:main

# AMD GPU
docker run -d -p 3000:8080 -v open-webui:/app/backend/data --name open-webui ghcr.io/open-webui/open-webui:main

# nVidia GPU
docker run -d -p 3000:8080 --gpus all -v open-webui:/app/backend/data --name open-webui ghcr.io/open-webui/open-webui:cuda
If the command hangs while pulling a layer press Ctrl+C then run:
docker system prune -f
docker pull ghcr.io/open-webui/open-webui:cuda

Click Allow on the Windows Firewall dialogue box.

Security Warning: Docker's -p flag binds to all network interfaces by default, so OWUI becomes reachable by any device on your local network at <host_ip>:3000 as soon as this container starts — independent of whether Cloudflare Tunnel (section 12) is ever set up. This is fine if you want LAN access for multiple users, but it means the Cloudflare Zero Trust policy in section 12 only protects the tunnel hostname — it does nothing to stop someone on your LAN from hitting this port directly. Even if LAN-wide access is exactly what you want, it's worth scoping the Windows Firewall rule to the Private network profile rather than clicking Allow broadly. This does not restrict access to just this machine — devices on your LAN can still reach it. What it does is stop the port from being exposed if this machine ever joins a network Windows doesn't consider trusted (a public Wi-Fi profile, for example), which the broad "Allow" click otherwise permits by default:

Open Powershell and paste the following command. This opens opens port 3000 for inbound requests on a private network.

New-NetFirewallRule -DisplayName "OpenWebUI" -Direction Inbound -Protocol TCP -LocalPort 3000 -Action Allow -Profile Private

5. Install SearXNG (SXNG)

Open PowerShell and paste the following code:

# Note that $HOME refers to C:\Users\User_Name
$base = "$HOME\searxng"

# Create base, config, and data folders
New-Item -ItemType Directory -Force -Path "$base\config","$base\data"

cd $base

# Pull latest SXNG image
docker pull docker.io/searxng/searxng:latest

# Start the service — This supposedly creates the settings.yml config file, but that has never happened for me
# Setting up the .yml file is covered next
docker run --name searxng -p 8080:8080 docker.io/searxng/searxng
Note: I kept getting errors when installing SearXNG regarding the "wikidata: engine init was not successful". It's not a deal-breaker as SearXNG still works so I'm ignoring it for now. Hit Control + C to stop the command then start SearXNG in Docker manually. There are a few different reasons this error could happen, and I haven't narrowed it down yet.

Configure/Create settings.yml

  1. Open File Explorer and navigate to C:\Users\User_Name\searxng and look for settings.yml
  2. If it's not there, right click/Save As this settings.yml file and put it in that folder
  3. If the file is there then modify these two parts:
    1. Add use_default_settings: true as the very first line, above the general: section
    2. Scroll down to formats: and add - json above the - html entry
  4. Open the settings.yml in Notepad
  5. Search for ultrasecretkey and replace it with a randomly generated 64 character key
  6. Save and close the file

Configure/Create docker-compose.yml

  1. Open File Explorer and navigate to C:\Users\User_Name
  2. Right-click → New Text Document → name it docker-compose.yml
  3. Open the file in Notepad and paste the contents below
services:
  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    depends_on:
      - searxng
    environment:
      - OLLAMA_BASE_URL=http://host.docker.internal:11434
    volumes:
      - open_webui_data:/app/backend/data
    ports:
      - "3000:8080"
    restart: unless-stopped

  searxng:
    image: searxng/searxng:latest
    container_name: searxng
    volumes:
      - ./searxng:/etc/searxng
    ports:
      - "8080:8080"
    restart: unless-stopped

volumes:
  open_webui_data:

Restart both services in the same container

  1. In File Explorer navigate up one level to C:\Users\User_Name to where the docker-compose.yml resides
  2. Right-click in the folder → Open Terminal
  3. # Stops all containers, applies docker-compose.yml
    # Restarts services in one container
    docker compose down
    docker compose up -d
    
    # Both services should appear in the same container
    # If there are name conflict errors or the services are not nested in the same container
    # Remove/reload the services
    docker rm -f searxng
    docker rm -f open-webui
    docker compose up -d
    OWUI/SXNG will show up as their own containers in DD and thus won't communicate. This removes the individual service containers from DD, then brings them back up nested into one container so they can communicate. In theory OWUI/SXNG can be made to communicate while in different containers, but I was never able to get that to work.

  4. Open Powershell and paste the following command. This opens port 8080 for inbound requests on a private network.
New-NetFirewallRule -DisplayName "SearXNG" -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow -Profile Private
Security note: Same as OWUI above — SearXNG's 8080:8080 mapping is reachable from any device on the network by default, with no authentication in front of it. If you only need it to serve OWUI's web search feature (not for standalone browsing by other users), scope it the same way.

6. Configure Models in OWUI Admin Panel

  1. Open http://localhost:3000/ and create an Admin account
  2. Click the letter icon in the lower-left corner → Admin Panel
  3. Under Users → Overview, click + to add new users. Repeat as needed.
  4. [Optional] Under Users → Groups, create a group called Users. In the Permissions tab, toggle all Workspace Permissions on → Save. Then click Edit → Users to add members.
  5. Go to Admin → Settings → Authentication and toggle Enable New Sign Ups off. Since users are added manually via the Users panel above, this prevents anyone who reaches the OWUI URL (ex. over the LAN, per the security note in section 4) from self-registering an account.

Go to Settings → Models. For each model you want available to users:

  1. Click Access → change from Private to Public → close the window
  2. Scroll to Advanced Params → click Show
  3. Find Function Calling — change from Default to Native
  4. Scroll to Default Features → tick Web Search and Image Generation → click Save & Update. Ticking these boxes will enable RAG retrieval and local image generation once SearXNG and ComfyUI have been properly integrated with OWUI.

7. Configure Documents in OWUI Admin Panel

  1. Go to Settings → Documents → scroll to the Retrieval section → toggle Hybrid Search on
  2. Set Top K to 50
  3. Set Top K Reranker to 20
  4. Scroll to RAG Template → at the end of the Guidelines section add: - Do not apologize for not finding information
  5. Scroll to the bottom → click Save

8. Point OWUI to the SearXNG Instance

  1. Go to Settings → Web Search → toggle Web Search on
  2. Set Web Search Engine to searxng
  3. Enter the SearXNG Query URL:
http://searxng:8080/search?q=<query>&format=json

# Alternatively, use the server's direct IP address:
# http://host_ip:8080/search?q=<query>&format=json
Higher numbers for Search Result Count and Concurrent Requests don't guarantee better results. Recommended: 5–7 results, 2–3 concurrent requests.
  1. Set Search Result Count to 10 and Concurrent Requests to 5. Because who needs rules? :)
  2. Click Save

Notes About ComfyUI

Before continuing, a word about ComfyUI. It comes in two versions:
• Desktop App: Works like a standard program and supports network access. It can be configured to auto-start on boot, but it still requires the user to load a workflow before remote access works properly. It's also easier to manage missing dependencies or model components.
• Portable Version: Fully self-contained with identical network capabilities. It can be configured to auto-start on boot and not require user input before remote access works. This is ideal for headless/remote use though initial setup and dependency management require more manual steps.
There are sections for both variants so pick the one that suits your use case best.
Note: LLMs and CUI share the same VRAM pool so running them together increases demand on it. Exceeding available VRAM either offloads to system RAM (slower) or causes an out-of-memory error (I've had this happen and crash CUI). Size the LLM model(s) and CUI workflow(s) appropriately.

9A. Using ComfyUI (CUI) Portable With nVidia GPU To Generate Images

  1. Visit docs.comfy.org/installation/comfyui_portable_windows, and download the Portable version that matches the server's hardware configuration. This particular page has some valuable technical info on CUI's file/folder structure so keep it handy for future reference.
  2. Create a folder (ex: C:\Users\User_Name\Documents\CUI_Portable) and unzip the downloaded file to it
  3. Read the README_VERY_IMPORTANT.txt file
  4. Drag the appropriate .bat file to the desktop (ex: run_nvidia_gpu.bat) and create a shortcut to it
  5. Open run_nvidia_gpu.bat in Notepad and add --listen 0.0.0.0 to the end of the first line then save and close
  6. Open Powershell and paste the following command. This opens port 8188 for inbound requests on a private network.
  7. New-NetFirewallRule -DisplayName "ComfyUI_Portable" -Direction Inbound -Protocol TCP -LocalPort 8188 -Action Allow -Profile Public
    CUI Portable can be accessed over a network via http://host_ip:8188 or locally via http://localhost:8188.
  8. Press Win+R → type shell:startup — add a shortcut to run_nvidia_gpu.bat from the CUI folder or copy/paste the Desktop shortcut
  9. Run the batch file. A dialogue box will appear warning "The published could not be verified…". Untick the Always ask before opening this file option.
    A terminal window will appear and any startup errors will show here. Minimize this if all goes well.
  10. Select a template to get started (ex: Z-Image-Turbo)
  11. If the selected model (or future model(s)) are missing an error box will appear in the upper right. Click on Show missing models. Click on the Download all button. If one component does not get downloaded then click on that component's corresponding Download button. All DL'd files will be in the user's browser's default download folder
  12. The "Model Link" in CUI Portable's workflow browser will show the folders where each component needs to be moved to in order for that model to function. Move the components to the correct locations (ex: C:\Users\User_Name\Documents\CUI_Portable\ComfyUI\models\Folder_Name)
  13. Refresh the CUI Portable browser tab, and the errors will disappear
  14. Note: that this file moving process will have to be done manually with any missing model components

9B. Using ComfyUI (CUI) Desktop With nVidia GPU To Generate Images

Disclaimer: Node pack installation issues may require manual config.ini edits (see "If Installing Node Packs Fail" at the end of this section).
  1. Download CUI Desktop from comfy.org
  2. Launch the installer and follow the setup wizard
  3. Select an image generator from "Choose a starter workflow" (ex: Z-Image-Turbo)
  4. Close CUI Desktop after it downloads the selected workflow's data
  5. Open PowerShell and run this command:
$path = "C:\Users\User_Name\AppData\Roaming\Comfy Desktop\installations.json"
$json = Get-Content $path -Raw | ConvertFrom-Json
$json[0].launchArgs = "--enable-manager --listen 0.0.0.0"
$json | ConvertTo-Json -Depth 10 | Set-Content $path
CUI Desktop can be accessed over a network via http://host_ip:8188 or locally via http://localhost:8188.
  1. [Alternative] If the above command does not work, navigate manually to C:\Users\User_Name\AppData\Roaming\Comfy Desktop, locate installations.json, and edit this line:
"launchArgs": "--enable-manager",

So it looks like this:

"launchArgs": "--enable-manager --listen 0.0.0.0",
Save and close the file
  1. Open Powershell and paste the following command. This opens port 8188 for inbound requests on a private network.
New-NetFirewallRule -DisplayName "ComfyUI_Desktop" -Direction Inbound -Protocol TCP -LocalPort 8188 -Action Allow -Profile Public
  1. Click the Windows button, type "run", then select Run
  2. Enter shell:startup
  3. Copy and paste the ComfyUI Desktop icon from the desktop into this folder
  4. Note: Opening CUI Desktop alone will not enable remote image generation. Click on "ComfyUI" after starting CUI Desktop then minimize.

Opening The CUI Port For Local Network Access (Manual Method)

  1. Open Windows Defender Firewall → Advanced Settings
  2. Navigate to Inbound Rules → New Rule
  3. Select Port → TCP 8188 → Allow the connection
  4. When prompted for the profile, check only Private and uncheck Domain and Public

Optional: If Python Won't Choose The Correct GPU

I had issues with Python defaulting to the integrated GPU instead of the discrete GPU. Disabling the integrated GPU in Device Manager and rebooting (probably not necessary, but done anyway) fixed this issue.

[Alternative] In theory the below instructions would fix the GPU selection issue. However, it did not work for me which is why I recommend the disabling of the integrated GPU in Device Manager.

  1. Right-click on Desktop → Settings → System → Display
  2. Navigate to Graphics (or Graphics Settings)
  3. Add a Desktop App and navigate to this folder to select python.exe:
C:\Users\User_Name\AppData\Local\Comfy-Desktop\ComfyUI-Installs\ComfyUI\ComfyUI\.venv\Scripts\python.exe
  1. Click "Add"
  2. Locate the newly created "Python" entry, find "GPU preference" (should be the first line)
  3. Click on "Let Windows decide" dropdown then select "High Performance/Desired GPU" from the list
  4. Repeat the above steps for ComfyUI Desktop.exe
  5. Close the window to save the settings
  6. Close out of CUI (if not already done) then reopen

Optional: If Installing Node Packs Fail

Node packs add custom features, tools, etc. in a workflow that expands what CUI can do. However, when loading another person's workflow there might be node packs that were not installed by default. The integrated manager is a good tool. But it might fail to attempting to install missing packs (without notification of installation failure) and require manually tweaking the config.ini file.

  1. Navigate to: C:\Users\User_Name\AppData\Local\Comfy-Desktop\ComfyUI-Installs\ComfyUI\ComfyUI\user\__manager
  2. Edit config.ini and set:
security_level = weak
network_mode = personal_cloud

10. Configure OWUI for CUI

This section will enable OWUI to pass image generation and editing requests onto CUI. The instructions are the same for the Desktop app and Portable version.

Create Image Configuration

  1. Inside ComfyUI, click the C icon in the upper-left → FileExport (API) → name/download the workflow
  2. Open OWUI → Admin Panel → Settings → Images
  3. Toggle Image Generation on
  4. Open the downloaded JSON file in a browser, and search for the "unet_name" field. That contains the model name (ex: z_image_turbo_bf16.safetensors). Copy/paste the model name without the file extension into the Model field
  5. Set image size
  6. Toggle Image Prompt Engine on
  7. Click on the Image Generation Engine drop down and select ComfyUI
  8. Enter http://localhost:port (http://host_ip:port for access over a network)
  9. In the ComfyUI Workflow line, click on "Upload" and select the earlier downloaded JSON file

Node IDs from the JSON file

Open the JSON file in a web browser to look for the Node IDs. Each Node ID has two numbers: the Node ID and sub-node number. These IDs are examples:

Text:         67  — search for "CLIPTextEncode"
# Look for the section with a "text" field containing a scene description
Model:        66  — search for "unet_name", don't include the file extension
Width/Height: 68  — search for "width" or "height"
Steps:        70  — search for "steps"
Seed:         70  — search for "seed"

Edit Image Configuration

  1. Toggle Image Edit on
  2. Enter the model name used in the "Create Image" section
  3. Set image size
  4. Click on the Image Edit Engine drop down and select ComfyUI
  5. Enter the ComfyUI Base URL: http://localhost:port (http://host_ip:port for access over a network)
  6. Upload the JSON file used in the Create Image section
  7. Use the Node IDs from the Create Image section to fill out these Node ID fields. However, take note of these two fields:
  8. Image:         search for "images"
    Prompt:         same as the "Text" Node ID from above
    
  9. Click Save

11. Setup OpenCode For AI-Assisted Coding (OC)

OpenCode is a terminal/browser-based coding agent that can be pointed at local models served by Ollama, letting it use the same models already running on the server for AI-assisted coding.

Step 1 - Install Node.js & OC

  1. Navigate to nodejs.org/en/download
  2. Click on the "Windows Installer (.msi) button
  3. Run the downloaded file, don't modify the defaults, and tick "Automatically install the necessary tools..."
  4. Follow the on-screen instructions to allow the installation script to run. If it seems to hang, just wait
  5. Open a Command Prompt (Win → cmd) and type: npm config get prefix
  6. Make a note of the folder path

Add Environment Variables

  1. Press Win, type "Environment Variables", open "Edit the system environment variables"
  2. Click "Environment Variables..." button
  3. Under "User variables" (top box), find and select the row named Path, click Edit
  4. Click New, paste the exact path from step 1 (ex. C:\Users\User_Name\AppData\Roaming\npm) and name the path NPM. Note: this entry might already exist. If it does then no changes are needed so close the window and move on.
  5. Click OK on all the dialogue boxes to save
  6. In the open PowerShell session run this command: dir "$env:APPDATA\npm"
  7. If an error appears saying "Cannot find path..." then open a Command Prompt (Win → cmd) and type:
npm i -g opencode-ai@latest

Link to the Ollama Backend & Adding Firewall Rule

  1. In the open PowerShell session run ollama list
  2. Note the names of whichever model(s) OpenCode will use
  3. Open File Explorer and navigate to C:\Users\User_Name\.config\opencode\
  4. Rename opencode.json to backup_opencode.json (if it exists)
  5. Create a new text file, rename it opencode.json and copy in the following code. Replace the "actual_name_of_model_01" from the ollama list command earlier and replace "how_the_model_name_will_be_displayed_01" with the model's display name
  6. {
      "$schema": "https://opencode.ai/config.json",
      "provider": {
        "ollama": {
          "npm": "@ai-sdk/openai-compatible",
          "name": "Ollama (local)",
          "options": {
            "baseURL": "http://localhost:11434/v1",
            "apiKey": "ollama"
          },
          "models": {
            "actual_name_of_model_01": { "name": "how_the_model_name_will_be_displayed_01", "tools": true },
            "actual_name_of_model_02": { "name": "how_the_model_name_will_be_displayed_02", "tools": true }
          }
        }
      }
    }
  7. Open Powershell and paste the following command. This opens port 4096 for inbound requests on a private network.
    New-NetFirewallRule -DisplayName "OpenCode" -Direction Inbound -Protocol TCP -LocalPort 4096 -Action Allow -Profile Private 
  8. Save and close the file

Step 2 - Create Batch File To Run OC

  1. Navigate to the desktop, create a text file, and rename it OpenCode.bat
  2. Paste in the following code and change the default user name and password:
  3. @echo off
      if not "%1"=="min" (
          start "" /min cmd /c "%~f0" min
          exit /b
      )
      set OPENCODE_SERVER_USERNAME=CHANGE_USER_NAME
      set OPENCODE_SERVER_PASSWORD=CHANGE_PASSWORD
      opencode.cmd web --port 4096 --hostname 0.0.0.0
    
  4. Save and close the file.
This batch file will run OpenCode in a terminal window, minimize it, change to the "Documents\Default Project" folder to save projects, then open OC in a browser window at http://localhost:4096 — which will also make it accessible over a network via http://host_ip:4096.
Security Warning: Because OC is a coding agent with file and shell access, exposing it with --hostname 0.0.0.0 and no authentication would let anyone on the network run commands on this machine.

SettingOPENCODE_SERVER_USERNAMEandOPENCODE_SERVER_PASSWORDenables HTTP Basic Auth — so a login prompt gates access before anyone reaches a session. Don't skip this line. The command also minimizes the OC terminal after running. Hardcoding the UN/PW is a bad security practice, but OC currently does not support multiple users/PWs/roles/sessions/accounts. ACT ACCORDINGLY.

Step 3 - Setting Default Project Folder

  1. Run the batch file
  2. Initially the OC browser window will not list any projects. Click "Add Project" then search for "Default Project". This is the "Default Project" folder in "Documents".
  3. If the "Default Project" is not found, close out of the browser and OC terminal. Navigate to the "Documents" folder and create a "Default Project" folder.
  4. [Optional] If OC still cannot find the "Default Project" folder then Create a default.txt file with no data in it in the folder. I had to do that at one point to make the "Default Project" folder findable by OC.
  5. Reopen OC → Browser → Add Project → "Default Project" folder. Then click "New session" and begin coding.
  6. Security Warning: When searching for a project folder, the entire folder path is exposed to the user.

Step 4 - Add To Startup

  1. Click Win button, type "run" then enter shell:startup
  2. Create a shortcut to the OpenCode.bat file in the startup folder and close the window
If you need multiple projects open at once, run a separate OC web instance from each project folder on a different port:
# Project 1
cd C:\Users\User_Name\Documents\Project_Folder
opencode web --port 4096

# Project 2
cd C:\Users\User_Name\Documents\Project_Folder
opencode web --port 4097

12. Setup Hermes For Agentic AI Functionality

To quote Hermes directly: "I'm Hermes Agent, built by Nous Research — and yes, I'm agentic in a real sense: I don't just chat, I can actually take actions. I have tools to browse the web, run terminal commands, read/write files, manage cron jobs, delegate subtasks, send emails, work with documents/spreadsheets, control smart home devices, and more, depending on what's set up in this environment."

It can be used via a terminal, web interface, or plugged into OWUI, and it can use almost any public or local LLM model.

Security Warning: Hermes can do a lot, but if something goes wrong it can do a lot of damage. Given that risk this guide does not connect it to OWUI. That keeps a clear division of labor — a chatbot with lots of capabilities on one side, and preventing "Oops, what happened?" on the other.
  1. Visit hermes-agent.nousresearch.com, look for the Windows 10/11 download button, and install
  2. Launch the program
  3. On the "Connect a model provider" step, click I'll choose a provider later. Once the app opens, close it
  4. Open a Command Prompt and type hermes model
  5. Select 33 - Custom endpoint (enter URL manually)
  6. Enter API base URL: http://localhost:11434/v1
  7. Leave API key empty and press Enter
  8. API Compatibility Mode: Auto-detect is selected by default. Press Enter, leaving that alone
  9. The list of local models will appear. Enter the number for the desired model and press Enter
  10. For Context Length open the Ollama desktop app → Settings → scroll down to Context Length. Note that number and enter it into the terminal window so Hermes' context length matches Ollama's
  11. Enter the display name for the model
  12. Rerun the hermes model command anytime to change the model being used
    Using a local LLM here is fine, but it will not have RAG abilities the way a cloud model would. NOTE - THIS IS NOT ACCURATE, FIX FIX FIX
  13. Click on the model name in the lower right → Edit ModelsAdd Model to add a non-local model(s) and change which model is being used later. Nous Portal with its free subscription tier is one option for extra capability if needed — this is redundant given the OWUI/ComfyUI/OpenCode setup already covered in this guide, but it never hurts to have a few more options
  14. Open Powershell and paste the following command. This creates a firewall rule so Hermes Dashboard can be reached on a private network.
    New-NetFirewallRule -DisplayName "Hermes_Dashboard" -Direction Inbound -Protocol TCP -LocalPort 9119 -Action Allow -Profile Private
  15. If access to the Hermes Dashboard via Nous Portal is desired then open a Command Prompt and run this command. Once registered select "Sign in with Nous Research" on the login screen instead of entering local credentials. If method is not revelvant then skip this step.
    hermes dashboard register
  16. Navigate to the desktop and create a batch file named Hermes_Dashboard.bat. Paste this code in:
    @echo off
    if not "%1"=="min" (
        start "" /min cmd /c "%~f0" min
        exit /b
    )
    hermes dashboard --host 0.0.0.0 --port 9119
  17. Press Win+R → type shell:startup — create a shortcut to the batch file. This starts the Dashboard listening for network requests on boot. There are a couple other ways to accomplish this, but for the sake of consistency this method is recommended
  18. Use section 14B Setting Up Multiple Services To Use The Cloudflare Tunnel For Remote Access to make Hermes remotely accessible. There are a couple other ways to accomplish this, but for the sake of consistency this method is recommended

13. Tie SearXNG into Hermes

  1. Open File Explorer and navigate to C:\Users\User_Name\AppData\Local\hermes
  2. Open config.yaml in Notepad
  3. Search for "web" and modify the entry to match below.
    web:
      search_backend: "searxng"
      extract_backend: "firecrawl"
  4. Save and close the file
  5. Open the .env file in Notepad. It has no prefix
  6. Add this line to the top of the file before the "LLM Provider" section. Technically it can go anywhere, but this works fine.
    SEARXNG_URL=http://localhost:8080
  7. Save and close the file
  8. Restart Hermes and ask a question that requires a web search (ex: "What was the weather like over the past week in London?")

14. Setup Cloudflare Tunnel For Remote Access

This is a much longer section as it has more components that need to be pieced together. This first part creates an access control policy.
  1. Go to cloudflare.com → DomainsBuy Domain (ex. exampledomain.com)
  2. From the main account page, click Zero Trust → create an account → select the Free Plan
  3. Go to Access Control → Policies → Add a policy
  4. In the Include section, select Emails and enter the email addresses of the user(s) who will access the server
  5. Under Policy Details, give the policy a name (ex. Open WebUI), set Action to Allow, and set a session duration (ex. 2 weeks)
  6. Under Connections settings click on the Text controls drop down and select "Both Directions Allowed"
  7. Click Save Policy
  8. This next part creates a tunnel which allows a service to be accessed remotely. This tunnel can be used be multiple services.
  9. Go to Networks → Tunnels & Mesh → Create a tunnel
  10. Select Cloudflared, give the tunnel a name → Save Tunnel
  11. Select your OS (Windows 11 in this case) and follow steps 1–3. For step 4, use the copy icon — the command is very long.
  12. Scroll down — Next
  13. Add a subdomain (ex. openwebui) and select exampledomain.com from the dropdown
  14. Under Service, set Type to HTTP and enter localhost:3000 (ex: OWUI port)
  15. Click Complete Setup
  16. Go to Access Controls → Applications → Create new application → Continue with Self-hosted and private
  17. In the Destinations section click Add public hostname to create that entry and remove the Private IPs entry by clicking on thes trash can.
  18. Enter a subdomain (ex: openwebui) and select the purchased domain (ex: exampledomain.com)
  19. Under Access Policies, select the Open WebUI policy from the dropdown → save
  20. Under the Authentication section disable Accept all available identity providers
  21. In the Choose available identity providers for this application click on the drop down and select onetimepin
  22. Disable Apply instant authentication
  23. In the Details under Session Duration click on the drop down and select the duration that matches the access policy duration from earlier in this section
  24. Click Create
  25. Open a browser and go to openwebui.exampledomain.com — enter your email to receive an OTP and gain access
Security Warning: The Cloudflare Access login page shows the same "check your email" confirmation regardless of whether the entered address is actually authorized. This is intentional — it prevents attackers from using the response to determine which email addresses are valid.

14B. Setting Up Multiple Services To Use The Cloudflare Tunnel For Remote Access

Multiple services can run off of one tunnel, and creating them uses almost all the steps from earlier with a slight variation.
  1. Go to Zero Trust → Networks → Tunnels & Mesh and click on the existing tunnel
  2. Click on Published application routes
  3. Click on Add a published application route
  4. Add a subdomain (ex. comfyui) and select exampledomain.com from the dropdown
  5. Under Service, set Type to HTTP and enter localhost:8188 (ex: ComfyUI port)
  6. Click Save
  7. Note: From this point go back to Section 12 and repeat the instructions. This creates a new service access policy, an application destination, link the two together, put up the Cloudflare login page with one time pin, and give remote access to the service. Technically only one access policy can be used for all services, but that is a poor security practice.
    Remote access has been verified to work with these browsers/versions
    Firefox v152.0.6 (64-bit)
    Chrome v150.0.7871.128 (Official Build) (64-bit)
    Safari v26.5.2 (21624.2.5.11.8)

    Archived Instructions

    The following sections are archived instructions that are part of my early efforts, but are no longer part of the official guide. They may/may not be relevant depending on your use case, but they will not be updated.

    Using Google Gemini for Image Generation

    1. Go to Admin Panel → Settings → Images
    2. Toggle Image Generation on
    3. Enter gemini-3-pro-image-preview in the Model field
    4. Set the desired image width and height
    5. Toggle Image Prompt Generation on
    6. Set Image Generation Engine to Gemini
    7. Enter the Gemini Base URL: https://generativelanguage.googleapis.com/v1beta
    8. Generate an API key at aistudio.google.com/app/api-keys — Create API Key
    9. Payment is required to use this API. Once set up, paste the key into the Gemini API Key field
    10. Set Gemini Endpoint Method to generateContent
    11. For image editing, toggle Image Edit on — fields will populate automatically. Adjust image size if needed.

    SearXNG Search Priorities

    SXNG allows the admin to prioritize or block certain domains via settings.yml. Scroll to the # Configuration of the "Hostnames plugin": section.

    A good starting reference for blocked / low-priority / high-priority sites: kagi.com/stats?stat=insights


    Adjust Model Reasoning Effort in OWUI

    1. Go to Admin Panel → Settings → Models — click the desired model
    2. Go to Advanced Params → Show
    3. Scroll to Reasoning Effort — click Default — change the value from medium to high (or low)
    4. Scroll to the bottom — click Save & Update
    After saving advanced parameters, refresh the Admin Panel page. Going back into the same model without refreshing may still show the old values. Medium reasoning is fine for most use cases.

    Other Search Engine Options in OWUI

    It's possible to use other search engines with OWUI. Here are a few options which can be found under Admin Panel → Settings → Web Search. Most require an API key.


    Miscellaneous Notes