Let me paint you a picture. You’re sitting there, paying OpenAI $20 a month, watching your API bill climb like it’s training for Everest, and a little voice in the back of your head whispers: “What if I just… ran this myself?”
Congratulations. You’ve caught the self-hosting bug. There’s no cure, only more Docker containers.
The good news is that self-hosting your own ChatGPT-style interface has never been easier. The bad news is that there are now enough options to give you decision paralysis. But two projects have risen to the top of the pile: Open WebUI and LibreChat. Both give you a slick, ChatGPT-like chat interface. Both support local models via Ollama. Both support cloud APIs. And both are open source.
But they’re built on different philosophies, target slightly different use cases, and make very different trade-offs. So let’s break them down, set them both up, and figure out which one deserves a spot on your server.
What is Open WebUI?
Open WebUI (formerly known as Ollama WebUI) is exactly what it sounds like — a web-based user interface for interacting with large language models. It started life as a frontend for Ollama but has since grown into a full-featured AI platform that can talk to basically anything.
Think of Open WebUI as the “batteries included” option. It wants to be your entire AI workstation. Chat, documents, image generation, voice, model management — it’s all in there. The project has absolutely exploded in popularity, sitting at over 60,000 GitHub stars, and it moves fast. Sometimes too fast (more on that later).
Key Open WebUI Features
- Native Ollama integration — first-class support for Ollama with model pulling, management, and configuration right from the UI.
- OpenAI API compatibility — connect to OpenAI, or any OpenAI-compatible API endpoint (LiteLLM, vLLM, LocalAI, etc.).
- RAG (Retrieval-Augmented Generation) — upload documents and chat with them. Supports PDF, DOCX, TXT, and more. Built-in vector store using ChromaDB.
- Web search integration — let the model search the web for current information using SearXNG, Google, Brave, or other search providers.
- Image generation — connect to AUTOMATIC1111, ComfyUI, or OpenAI’s DALL-E for inline image generation.
- Voice input/output — speech-to-text and text-to-speech support with multiple backends including OpenAI TTS, ElevenLabs, and local Whisper.
- Multi-user support — user accounts with role-based access (admin, user, pending). Supports OAuth/OIDC for SSO.
- Model management — pull, delete, and create custom Ollama models. Create modelfiles with custom system prompts and parameters.
- Chat features — markdown rendering, code highlighting, LaTeX support, conversation branching, message editing, regeneration.
- Pipelines and Functions — a plugin system that lets you write Python functions to extend the platform. Think middleware for your AI chat.
- Workspace tools — create and share custom tools, functions, and model presets across your team.
- Responsive design — works surprisingly well on mobile. Installable as a PWA.
That’s a hefty feature list. And it keeps growing with every release, which is both exciting and occasionally terrifying when an update breaks something you relied on.
What is LibreChat?
LibreChat takes a different approach. Instead of building deep integrations with one ecosystem, LibreChat focuses on being a universal frontend for every AI provider you can think of. It’s like a universal remote for LLMs.
Where Open WebUI grew out of the Ollama community and gradually added cloud API support, LibreChat started with multi-provider support as its core identity. It wants to be the one interface to rule them all — OpenAI, Anthropic, Google, Azure, local models, custom endpoints, whatever you’ve got.
Key LibreChat Features
- Multi-provider support — native integration with OpenAI, Anthropic (Claude), Google (Gemini), Azure OpenAI, AWS Bedrock, Mistral, Groq, and custom OpenAI-compatible endpoints.
- Ollama integration — works with Ollama via the OpenAI-compatible endpoint. Not as deeply integrated as Open WebUI, but it works.
- Assistants API support — full support for OpenAI’s Assistants API, including Code Interpreter and file retrieval.
- Plugins system — built-in plugin architecture including web browsing, DALL-E image generation, calculator, Wolfram Alpha, and more.
- RAG support — file uploads and retrieval-augmented generation, though setup requires additional configuration with a vector database.
- Multi-user support — user registration, authentication, and access control. Supports LDAP, OAuth, and OpenID Connect.
- Conversation management — search, archive, share, fork conversations. Import/export chat history.
- Presets and endpoints — save custom endpoint configurations and model presets for quick switching between providers.
- Token counting and cost tracking — know exactly how many tokens you’re burning and what it’s costing you. Actually useful when you’re paying per token.
- Message bookmarking — save and organize individual messages for reference.
- Artifacts support — render interactive artifacts from AI responses (similar to Claude’s artifacts feature).
- Customizable UI — theming, custom footers, and configuration via a central YAML file.
LibreChat feels like it was built by someone who uses a lot of different AI models and got tired of switching between ChatGPT, Claude, and Gemini tabs. Which… is probably exactly what happened.
Setting Up Open WebUI with Docker Compose
Let’s get Open WebUI running. The simplest setup assumes you already have Ollama installed on your host machine. If you don’t, we’ll include it in the compose file.
Open WebUI with External Ollama
If Ollama is already running on your host:
services:
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: unless-stopped
ports:
- "3000:8080"
volumes:
- open-webui-data:/app/backend/data
environment:
- OLLAMA_BASE_URL=http://host.docker.internal:11434
extra_hosts:
- "host.docker.internal:host-gateway"
volumes:
open-webui-data:
Open WebUI with Bundled Ollama
If you want everything in Docker:
services:
ollama:
image: ollama/ollama:latest
container_name: ollama
restart: unless-stopped
ports:
- "11434:11434"
volumes:
- ollama-data:/root/.ollama
# Uncomment the following for GPU support:
# deploy:
# resources:
# reservations:
# devices:
# - driver: nvidia
# count: all
# capabilities: [gpu]
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: unless-stopped
depends_on:
- ollama
ports:
- "3000:8080"
volumes:
- open-webui-data:/app/backend/data
environment:
- OLLAMA_BASE_URL=http://ollama:11434
volumes:
ollama-data:
open-webui-data:
Fire it up:
docker compose up -d
Navigate to http://your-server:3000, create your admin account (first user becomes admin), and you’re in business. Pull a model from the admin panel — something like llama3.1:8b if you’re on consumer hardware — and start chatting.
Want to add OpenAI or other cloud providers? Head to Admin Panel > Settings > Connections and add your API keys. Done. No restart needed.
Setting Up LibreChat with Docker Compose
LibreChat’s setup is a bit more involved because it has more moving parts. It uses MongoDB for data storage and Meilisearch for conversation search. Don’t worry — it’s all in the compose file.
First, clone the repo (LibreChat recommends this approach for the configuration files):
git clone https://github.com/danny-avila/LibreChat.git
cd LibreChat
cp .env.example .env
Edit the .env file with your API keys. The important bits:
# OpenAI
OPENAI_API_KEY=sk-your-key-here
# Anthropic
ANTHROPIC_API_KEY=sk-ant-your-key-here
# Google
GOOGLE_KEY=your-google-key-here
The docker-compose.yml that ships with the project looks something like this (simplified):
services:
librechat:
image: ghcr.io/danny-avila/librechat:latest
container_name: librechat
restart: unless-stopped
ports:
- "3080:3080"
env_file:
- .env
volumes:
- ./librechat.yaml:/app/librechat.yaml
- librechat-images:/app/client/public/images
- librechat-logs:/app/api/logs
depends_on:
- mongodb
- meilisearch
mongodb:
image: mongo:latest
container_name: librechat-mongodb
restart: unless-stopped
volumes:
- mongodb-data:/data/db
meilisearch:
image: getmeili/meilisearch:latest
container_name: librechat-meilisearch
restart: unless-stopped
volumes:
- meilisearch-data:/meili_data
environment:
- MEILI_NO_ANALYTICS=true
volumes:
librechat-images:
librechat-logs:
mongodb-data:
meilisearch-data:
For Ollama integration, you’ll configure it in librechat.yaml:
endpoints:
custom:
- name: "Ollama"
apiKey: "ollama"
baseURL: "http://host.docker.internal:11434/v1/"
models:
default: ["llama3.1:8b", "mistral:latest", "codellama:latest"]
titleConversation: true
titleModel: "llama3.1:8b"
dropParams: ["stop", "user", "frequency_penalty", "presence_penalty"]
Fire it up:
docker compose up -d
Navigate to http://your-server:3080, register an account, and start chatting. You’ll see a dropdown at the top to switch between providers — OpenAI, Claude, Gemini, and your Ollama models all live side by side.
Ollama Integration: The Deep Dive
This is where the philosophical difference really shows.
Open WebUI treats Ollama as a first-class citizen. You can:
- Pull models directly from the UI (type a model name, click pull, watch the progress bar)
- Create custom modelfiles with system prompts and parameter tweaks
- See model details (parameter count, quantization, size)
- Delete models from the UI
- Set default models per user
- Configure model-specific parameters (temperature, top_p, context length) right in the chat
It feels like Ollama’s official GUI, because that’s basically what it started as.
LibreChat treats Ollama as another OpenAI-compatible endpoint. You configure it in a YAML file, list the models you want available, and that’s it. There’s no model pulling, no model management, no modelfile creation. You manage Ollama separately (via CLI or another tool), and LibreChat just talks to it.
This isn’t necessarily a bad thing. If you’re already managing Ollama with CLI commands or through another interface, having LibreChat try to manage it too would just create confusion. But if you want a single UI that handles everything? Open WebUI wins this round.
Multi-User Support and Access Control
Both platforms support multiple users, but they approach it differently.
Open WebUI has a straightforward user system:
- First user to sign up becomes admin
- Admins can set sign-up to open, invite-only, or closed
- Role-based access: admin, user, pending
- Admins control which models are visible to users
- OAuth/OIDC support for SSO (Google, GitHub, etc.)
- Per-user chat history and settings
LibreChat goes a bit deeper:
- Email/password registration with optional email verification
- LDAP authentication for enterprise environments
- OAuth support (Google, GitHub, Discord, OpenID)
- Token-based rate limiting per user — set daily/monthly token budgets
- User-level endpoint access control — restrict which providers each user can access
- Admin panel for user management
The killer feature here for LibreChat is the token-based rate limiting. If you’re hosting this for your family, your team, or your small company, you can set per-user token budgets so that one enthusiastic user doesn’t blow through your entire OpenAI budget on a Tuesday afternoon writing fan fiction. Open WebUI doesn’t have this built in — you’d need to manage rate limiting at the API proxy level.
RAG: Chatting with Your Documents
Both platforms support RAG (Retrieval-Augmented Generation), but the implementations differ quite a bit.
Open WebUI’s RAG:
- Built directly into the platform — no extra services needed
- Upload files (PDF, DOCX, TXT, CSV, etc.) directly in the chat or through the document manager
- Uses ChromaDB as the built-in vector store
- Supports multiple embedding models (local or cloud-based)
- Knowledge bases — create collections of documents and attach them to models or chats
- Web page importing — paste a URL and chat with the content
- Configurable chunk size and overlap
- YouTube transcript importing for the “I don’t want to watch a 45-minute video” crowd
Open WebUI’s RAG works out of the box. Upload a file, it gets chunked, embedded, and stored. Ask questions about it. Done. For most self-hosters, this is exactly the right level of complexity (which is to say: minimal).
LibreChat’s RAG:
- Requires additional setup with a vector database (PGVector, Qdrant, or Weaviate)
- File uploads supported with an additional RAG API service
- Leverages OpenAI’s Assistants API for file retrieval when using OpenAI
- More configurable but more complex to set up
- Supports Code Interpreter through the Assistants API — the model can actually run Python code on your files
LibreChat’s RAG is more powerful if you’re willing to put in the setup work, especially if you’re using OpenAI’s Assistants API. But for “I just want to upload a PDF and ask questions,” Open WebUI’s approach is simpler and more self-contained.
Plugin and Extension Systems
This is where things get interesting.
Open WebUI: Pipelines and Functions
Open WebUI has a system called Pipelines (and the newer Functions/Tools) that lets you extend the platform with Python code. You can write:
- Filter functions — intercept and modify messages before they hit the model or after they come back. Want to add a system prompt to every message? Filter. Want to log all conversations? Filter. Want to automatically translate responses? Filter.
- Pipe functions — create entirely custom model endpoints. Connect to any API, run local processing, build custom chains.
- Tool functions — give models the ability to call external tools (web search, calculator, API calls, etc.).
The code runs inside Open WebUI’s Python environment, and there’s a growing community library of shared functions. It’s flexible but requires Python knowledge.
LibreChat: Plugins
LibreChat has a more traditional plugin system with several built-in plugins:
- Web Browser — search the web and retrieve content
- DALL-E — generate images inline
- Calculator — for when the model’s math isn’t mathing
- Wolfram Alpha — computational knowledge
- Stable Diffusion — local image generation
- Azure AI Search — enterprise search integration
You enable plugins through configuration, and they appear as toggles in the chat interface. It’s less flexible than Open WebUI’s approach but requires less technical effort to use.
LibreChat also supports OpenAI’s Assistants API features, including Code Interpreter and custom functions, which gives it powerful extension capabilities if you’re in the OpenAI ecosystem.
Model Management
Open WebUI is strong here. From the admin panel, you can:
- Pull new Ollama models with a progress bar
- Delete models you no longer need
- Create custom model profiles with specific system prompts and parameters
- Set which models are visible to which users
- Configure default models
- View model information (size, parameters, quantization)
LibreChat handles model management through configuration files. You define available models in librechat.yaml and .env. There’s no model pulling or management through the UI — you handle that at the Ollama/provider level. However, LibreChat makes it easy to switch between dozens of models across multiple providers, which is its own kind of management.
Performance and Resource Usage
Let’s talk about how much server you need.
Open WebUI runs as a single container with a SQLite database by default. It’s written in Python (backend) with a Svelte frontend. Resource usage:
- Idle: ~200-400 MB RAM
- Active use: 500 MB - 1 GB+ depending on RAG usage and number of concurrent users
- Disk: Relatively light unless you’re storing lots of documents in the vector DB
- Startup time: A few seconds — it’s quick
LibreChat requires three containers (app, MongoDB, Meilisearch). It’s written in Node.js with a React frontend. Resource usage:
- Idle: ~500-800 MB RAM (across all three containers)
- Active use: 1-2 GB+ depending on usage
- Disk: MongoDB and Meilisearch will grow with conversation history
- Startup time: A bit longer due to MongoDB and Meilisearch initialization
For a small home lab setup with 1-3 users, both run fine on modest hardware. A Raspberry Pi 5 can handle either (though running actual LLMs on a Pi is a different discussion entirely). For larger deployments, LibreChat’s MongoDB backend may actually scale better than Open WebUI’s SQLite default, though Open WebUI can be configured to use PostgreSQL.
Customization and Theming
Open WebUI offers:
- Light and dark themes with customizable accent colors
- Custom banners and system messages
- Configurable default models and parameters
- Admin-controlled UI features (show/hide specific features per role)
- Community-shared model presets
- Custom CSS injection for the truly adventurous
LibreChat offers:
- Theme customization via configuration
- Custom footer and welcome messages
- Configurable endpoint ordering and visibility
- Custom logo support
- Localization (multiple languages supported out of the box)
- YAML-based configuration for nearly everything
Both are reasonably customizable. Open WebUI gives you more UI-level customization options, while LibreChat’s YAML-based approach appeals to the “infrastructure as code” crowd.
Head-to-Head Comparison
| Feature | Open WebUI | LibreChat |
|---|---|---|
| Primary Focus | Ollama-first, all-in-one AI workstation | Multi-provider universal frontend |
| Ollama Integration | Native, deep (pull, manage, configure) | Via OpenAI-compatible endpoint |
| Cloud API Support | OpenAI + compatible endpoints | OpenAI, Anthropic, Google, Azure, Bedrock, Mistral, Groq |
| Docker Complexity | 1 container (+ Ollama optional) | 3 containers (app + MongoDB + Meilisearch) |
| RAG | Built-in, works out of the box | Requires additional setup |
| Web Search | Built-in with multiple providers | Via plugins |
| Plugin System | Python Pipelines/Functions | Built-in plugins + Assistants API |
| Multi-User | Yes, with RBAC | Yes, with RBAC + token rate limiting |
| Token Cost Tracking | Basic | Detailed per-user tracking |
| Image Generation | AUTOMATIC1111, ComfyUI, DALL-E | DALL-E, Stable Diffusion |
| Voice I/O | Yes (Whisper, TTS) | Limited |
| Model Management | Full UI management | Configuration file based |
| Database | SQLite (default) / PostgreSQL | MongoDB (required) |
| Search | Built-in | Meilisearch (required) |
| Mobile Experience | PWA, responsive | Responsive |
| SSO/OAuth | Yes | Yes + LDAP |
| Assistants API | No | Yes |
| Update Frequency | Very frequent (sometimes too frequent) | Regular, stable |
| GitHub Stars | 60,000+ | 20,000+ |
| Language | Python + Svelte | Node.js + React |
The Verdict: Which One Should You Pick?
Here’s the thing — there’s no universal winner here. These tools serve different primary use cases, and the right choice depends on what you’re actually trying to do.
Choose Open WebUI if:
- You’re all-in on Ollama and local models. Open WebUI’s native Ollama integration is unmatched. Pulling models, creating custom configurations, managing everything from one UI — it’s the best Ollama frontend available, full stop.
- You want the simplest possible setup. One container. That’s it. Docker compose up, create an account, start chatting. No MongoDB, no Meilisearch, no YAML configuration files.
- RAG is important to you. Upload a PDF and start asking questions in under a minute. No additional services or configuration needed.
- You want voice and image generation built in. Open WebUI’s multimedia capabilities are more mature and more deeply integrated.
- You’re a single user or small household. The simpler architecture and easier setup make it ideal for personal use.
Choose LibreChat if:
- You use multiple AI providers regularly. If your workflow involves switching between GPT-4, Claude, Gemini, and local models, LibreChat’s multi-provider support is genuinely best-in-class. Each provider has native integration, not just “OpenAI-compatible” bolted on.
- You need per-user token budgets. Running this for a team or family and want to control API costs? LibreChat’s rate limiting is a killer feature that Open WebUI simply doesn’t have.
- You want OpenAI Assistants API support. Code Interpreter, custom functions, file retrieval — if you’re deep in the OpenAI ecosystem, LibreChat gives you access to these features.
- You value stability over bleeding-edge features. LibreChat tends to have a more stable release cadence. Open WebUI sometimes pushes changes that break things between updates.
- You need LDAP authentication. Enterprise environments rejoice.
The Plot Twist: Run Both
Here’s a secret the comparison articles won’t tell you — you can run both. They’re Docker containers. They use different ports. They’re not mutually exclusive. Use Open WebUI as your Ollama management station and local model playground. Use LibreChat when you need to switch between Claude and GPT-4 with proper cost tracking.
Is it overkill? Probably. But you’re self-hosting AI chatbots on your own hardware. “Overkill” left the building a long time ago.
Final Thoughts
The self-hosted AI frontend space is moving at a frankly ridiculous pace. Both Open WebUI and LibreChat are under heavy active development, and features that are missing today might show up next month. What I’ve described here is accurate as of early 2026, but check the changelogs before you commit.
Both projects are free, open source, and run entirely on your hardware. Your conversations stay yours. Your data stays yours. You’re not training anyone else’s model. And that, regardless of which UI you pick, is the real win.
Now go spin up some containers. Your GPU isn’t going to warm your office by itself.