Skip to main content

Quick Start

Get Open WebUI running on your machine. Pick your preferred method below.

Open WebUI works on macOS, Linux (x86_64 and ARM64, including Raspberry Pi and NVIDIA DGX Spark), and Windows.

  • Docker: Officially supported and recommended for most users. Requires Docker installed.
  • Python: Suitable for low-resource environments or manual setups
  • Kubernetes: Ideal for enterprise deployments requiring scaling and orchestration

Requires Docker. Replace your-secret-key with the output of openssl rand -hex 32, then run the command below; it pulls the image and starts it:

docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data -e WEBUI_SECRET_KEY=your-secret-key --name open-webui --restart always ghcr.io/open-webui/open-webui:main
FlagWhat it does
-p 3000:8080The UI is on port 3000 of your machine. Change the left number if 3000 is taken.
-v open-webui:/app/backend/dataYour chats, users and settings live in this volume. It survives updates; never run without it.
--add-host=host.docker.internal:host-gatewayLets the container reach Ollama, or anything else, running on your machine.
--restart alwaysComes back after a reboot.
-e WEBUI_SECRET_KEY=your-secret-keySet it once and keep it. Without a fixed key, every recreated container logs everyone out. Generate one with openssl rand -hex 32.

Image Variants​

TagUse case
:mainStandard image (recommended). Everything included: the app plus the bundled speech-to-text and embedding models.
:devPre-release (nightly) build from the dev branch. Fixes and features arrive here first. See Using the Dev Branch.
:slim, :main-slimAbout 176 MB instead of 1.66 GB to download—89% smaller on Linux/amd64. Same chat experience with your model provider. See Why choose slim?
:cudaNvidia GPU support, CUDA 12.8 (add --gpus all to docker run)
:cuda126Same as :cuda, built against CUDA 12.6
:ollamaBundles Ollama inside the container for an all-in-one setup

Each variant also has a development build: :dev-slim, :dev-cuda, :dev-cuda126 and :dev-ollama. The short tags :slim, :cuda, :cuda126 and :ollama follow main. Choose one variant; slim does not combine with CUDA or bundled Ollama.

Why choose slim?​

176 MB instead of 1.66 GB. Same chat experience. The :slim image is 89% smaller than :main, saving about 1.48 GB on a fresh pull. That means less time downloading Open WebUI when you set up a machine or deploy a new instance. Use it with a hosted API, your own model server, or a separate Ollama instance—even one on the same machine.

These are compressed download sizes for Linux/amd64, checked on September 28, 2026. Sizes vary by build and architecture. :slim and :main-slim are two tags for the same image.

The saving comes from leaving out the bundled machine-learning stack, including PyTorch, local embedding and speech runtimes, plus document-processing tools and optional database and storage clients. If you use Open WebUI to chat with models through an API, those dependencies would otherwise sit unused in your container.

To get started, change :main to :slim in the Docker command above. The default SQLite database and local file storage work as usual. Connect your model provider and start chatting; no extra services are needed for a basic chat setup.

For knowledge search, document extraction or voice, slim connects to services that do that work. It is a good fit if you already use those services or only need chat. Choose the standard image if you want Open WebUI to handle embeddings, speech recognition and document extraction inside its own container. The table below covers the setup for each feature.

Moving an existing deployment to slim​

Check your database and file storage before switching:

  • Database: SQLite and PostgreSQL are supported. MySQL, MariaDB, Oracle and AWS RDS IAM authentication require the standard image.
  • File storage: Local files are supported. S3, Azure Blob and Google Cloud Storage require the standard image.

Slim checks these settings at startup and reports an error for unsupported configurations. Default installs already use SQLite and local files.

What each feature needs​

If you wantPoint slim atOtherwise
Documents, knowledge or RAGAn embedding provider: RAG_EMBEDDING_ENGINE set to ollama, openai or azure_openaiEmbedding calls fail with 503, and the admin panel refuses to save the local engine
PostgreSQL with pgvector: VECTOR_DB=pgvector and PGVECTOR_DB_URL. It is the only vector store slim carries a client for503 the first time retrieval runs. Nothing else is affected, the store is only opened when it is used
PDFs and Office filesTika, Docling, an external extractor or a cloud engineUploading one returns 503. Plain text formats are still read by slim itself
Voice inputAny external speech-to-text engine: OpenAI, Deepgram, Azure, Mistral and so onLocal Whisper is not offered, and the admin panel refuses to select it
Spoken repliesAny external text-to-speech engineThe local Transformers voice is not offered, and requesting speech returns 503
Web searchAny provider other than DDGSDDGS is greyed out in the admin panel and refused on save
RerankingAn external rerankerSelecting a local reranking model is refused
Code interpreterNothing, but the browser fetches the Python packages from cdn.jsdelivr.net rather than from your instanceRunning code fails where the browser cannot reach that CDN

Also unavailable: the Playwright web loader, so pages are fetched over plain HTTP or by an external web loader, and the Transformers text splitter, so use the character or the tiktoken token splitter. Slim carries no git either, so a tool or function whose requirements install straight from a repository needs the standard image.

If you use Open WebUI as a chat front end for hosted models, none of the above applies and slim is simply the smaller image.

What still works without a service​

  • Plain text extraction. csv, html, txt, md, markdown, rst, xml and anything else detected as text are read by slim itself.
  • Reranking, in a fashion. Leave the reranking model empty and results are scored by cosine similarity against the embeddings you already have, which needs no model runtime.
  • Audio passthrough. Speech from an external provider is served in the format that provider returned, since slim cannot transcode. A provider that answers with something a browser cannot play is rejected rather than stored.

Building it yourself​

USE_SLIM=true cannot be combined with USE_CUDA=true or USE_OLLAMA=true. The build stops with an error rather than producing an image whose GPU support or bundled model server has nothing to run.

Offline and air-gapped​

Slim never downloads a model, because it cannot run one, and an air-gapped deployment otherwise only has to reach whichever services it uses on your own network. OFFLINE_MODE=true still blocks the Hugging Face traffic and the version check.

The one exception is the code interpreter. The standard image bundles the Python packages it runs; slim ships only the Pyodide runtime and points the package list at cdn.jsdelivr.net, so the browser pulls them from the internet on first use. Air-gapped instances should leave the code interpreter off, or use the standard image.

How the tags update​

:main and :latest are the same rolling image: both point to the newest build from the main branch and are rebuilt every time a change lands there, so their digest moves forward as development continues. Note that :latest follows main; it does not point to the newest stable release.

:dev is the same idea for the dev branch, also rolling. That is the pre-release, effectively a nightly build, and it carries fixes and features weeks before they appear under :main.

Version tags, such as :vX.Y.Z and the shorter :X.Y.Z, are pinned to one stable release and never change. :X.Y follows the newest patch release of that minor line. :git-<short-sha> pins one exact commit.

This is why :main and a specific release tag can show different image digests at the same time: :main already includes everything merged since that release, while the version tag stays frozen at it.

TagPoints toImmutable?
:main, :latestNewest build of the main branchNo (rolling)
:devNewest build of the dev branch, the pre-releaseNo (rolling)
:vX.Y.Z, :X.Y.ZA specific stable releaseYes
:X.YThe newest patch release of that minor lineNo (rolling within the minor)
:git-<sha>One exact commitYes

For reproducible or production deployments, pin a version tag. For the newest build, use :main (or the identical :latest). For the next release before it is released, use :dev.

Specific release versions​

For production environments, pin a specific version instead of using floating tags. Replace X.Y.Z with a version from the releases page:

docker pull ghcr.io/open-webui/open-webui:vX.Y.Z
docker pull ghcr.io/open-webui/open-webui:vX.Y.Z-cuda
docker pull ghcr.io/open-webui/open-webui:vX.Y.Z-ollama
Docker Hub

The same images are mirrored to Docker Hub as openwebui/open-webui, but only a subset: latest, latest-<variant> and the bare <variant> tags (for example slim, cuda, ollama) follow main, and X.Y.Z / X.Y, with or without a variant suffix, follow releases. :main, :dev, :vX.Y.Z and :git-<sha> exist on ghcr.io only, which is why every command in these docs uses ghcr.io/open-webui/open-webui.


Common Configurations​

GPU support (Nvidia)​

docker run -d -p 3000:8080 --gpus all --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data -e WEBUI_SECRET_KEY=your-secret-key --name open-webui --restart always ghcr.io/open-webui/open-webui:cuda

Bundled with Ollama​

A single container with Open WebUI and Ollama together:

With GPU:

docker run -d -p 3000:8080 --gpus=all -v ollama:/root/.ollama -v open-webui:/app/backend/data -e WEBUI_SECRET_KEY=your-secret-key --name open-webui --restart always ghcr.io/open-webui/open-webui:ollama

CPU only:

docker run -d -p 3000:8080 -v ollama:/root/.ollama -v open-webui:/app/backend/data -e WEBUI_SECRET_KEY=your-secret-key --name open-webui --restart always ghcr.io/open-webui/open-webui:ollama

Connecting to Ollama on a different server​

docker run -d -p 3000:8080 -e OLLAMA_BASE_URL=https://example.com -v open-webui:/app/backend/data -e WEBUI_SECRET_KEY=your-secret-key --name open-webui --restart always ghcr.io/open-webui/open-webui:main

Single-user mode (no login)​

docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -e WEBUI_AUTH=False -v open-webui:/app/backend/data -e WEBUI_SECRET_KEY=your-secret-key --name open-webui --restart always ghcr.io/open-webui/open-webui:main
warning

You cannot switch between single-user mode and multi-account mode after this change.


Using the Dev Branch​

:dev is Open WebUI's pre-release channel, and in practice a nightly build: the image is rebuilt from the dev branch as changes land, and every change lands there before it lands anywhere else. There is no separate beta programme, because dev fills that role. Changes that reach it are not reverted, so the next release is dev as it stands on release day.

That has two consequences worth knowing:

  • If you are waiting on a fix, it is probably already available. Check the changelog on dev, then run :dev rather than waiting for the release.
  • If you run Open WebUI for other people, testing the pre-release is how you avoid surprises. A second instance on :dev shows you the next release before your users meet it, and tells you whether your plugins, your models and your configuration still behave.

Whether to run it is entirely your decision, and running it is what makes releases good. A pre-release is only as well tested as the number of people who choose to install it, and that number is currently small.

Setup is the same as any other image, with the tag changed:

docker run -d -p 3001:8080 --add-host=host.docker.internal:host-gateway -v open-webui-dev:/app/backend/data -e WEBUI_SECRET_KEY=your-secret-key --name open-webui-dev --restart always ghcr.io/open-webui/open-webui:dev
Use a separate volume

Never share a data volume between dev and production. Dev builds may include database migrations that a release image cannot read back, so a shared volume can leave you unable to go back to :main. The -v open-webui-dev:/app/backend/data above is a different volume from the open-webui one used on the Quick Start, and that is deliberate. The container name differs too, so both can run at once.

Anything that looks wrong on :dev is worth reporting on GitHub. Reports at that stage get fixed before the release instead of after it, which is the whole point of a pre-release existing.

If Docker is not your preference, follow the Developing Open WebUI.


Uninstall​

With docker run​

  1. Stop and remove the container:

    docker rm -f open-webui
  2. Remove the image (optional):

    docker rmi ghcr.io/open-webui/open-webui:main
  3. Remove the volume (optional, deletes all data):

    docker volume rm open-webui

Updating​

To update your local Docker installation to the latest version, you can either use Watchtower or manually update the container.

Option 1: Using Watchtower​

With Watchtower, you can automate the update process:

docker run --rm --volume /var/run/docker.sock:/var/run/docker.sock nickfedor/watchtower --run-once open-webui

(Replace open-webui with your container's name if it's different.)

Option 2: Manual Update​

  1. Stop and remove the current container:

    docker rm -f open-webui
  2. Pull the latest version:

    docker pull ghcr.io/open-webui/open-webui:main
  3. Start the container again:

    docker run -d -p 3000:8080 -v open-webui:/app/backend/data \
      -e WEBUI_SECRET_KEY="your-secret-key" \
      --name open-webui --restart always \
      ghcr.io/open-webui/open-webui:main
Set WEBUI_SECRET_KEY

Without a persistent WEBUI_SECRET_KEY, you'll be logged out every time the container is recreated. Generate one with openssl rand -hex 32.

For version pinning, rollback, automated update tools, and backup procedures, see the full update guide.


Open it​

Docker: http://localhost:3000. Python and the desktop app: http://localhost:8080. The first start takes a minute.

Nothing loads? Run docker logs -f open-webui (docker compose logs -f with Compose) and wait for Application startup complete. If it never appears, see Startup & Docker Failures. Port already taken: change the left number in -p 3000:8080, or run open-webui serve --port 9999 with Python.

Create the admin account​

The first screen says Get started with Open WebUI and offers Create Admin Account. That first account is the administrator: it manages users and every instance-wide setting. Everything, including this login, stays in your own volume.

Sign-up switches itself off once the admin account exists. To let other people join, turn on New Sign Ups under your avatar > Settings > Admin > Authentication; new accounts then wait as Pending until you approve them in the Admin Panel. Note the admin password: losing it locks you out of instance settings, see Reset Admin Password.

Two settings areas

Your avatar > Settings is yours alone (theme, language). The Admin section inside it applies to the whole instance. Understanding Settings explains the split.

Connect a model provider​

Open WebUI has no models of its own. Go to your avatar > Settings > Admin > Connections.

Ollama on this machine? It is picked up automatically at http://host.docker.internal:11434 from Docker (that is what --add-host in step 1 is for) or http://localhost:11434 from Python, and shows under Manage Ollama API Connections. As the admin, download a model by typing its name into the model selector of a new chat and confirming the pull. Ollama on another machine: -e OLLAMA_BASE_URL=http://server:11434, or set the URL on the connection.

An API key from OpenAI, Anthropic or any OpenAI-compatible provider? Click the + next to Manage OpenAI API Connections, enter the provider URL (OpenAI: https://api.openai.com/v1) and your key, then Save. Models are listed automatically.

Guides: Ollama · OpenAI · Anthropic · OpenAI-compatible APIs and local servers · all providers

Model list empty?

Ollama on the host has to listen on 0.0.0.0 when Open WebUI runs in Docker: Connection to Ollama Server. For API providers, check the URL and key; some do not publish a model list and need the model IDs entered under Model IDs on the connection: OpenAI-compatible providers.

Send your first message​

Click New Chat, pick a model in the selector inside the message box, type, press Enter. Drop a file into the chat to ask questions about it.

A new chat with the model selector and prompt suggestions

No models in the selector: back to step 4. The reply stays empty or the chat hangs behind a reverse proxy: WebSocket troubleshooting.

That is the whole install. Everything below is optional.

Where to go next​

Essentials for Open WebUI continues from here. It covers what most people set up in their first week:

PluginsTools and Functions from the community catalog; the feature you are missing usually exists as one.
Tool callingNative mode lets the model decide when to search, read files or save memory.
Task modelsTitles, tags and autocomplete run on a model of their own; point them at a small one.
Context managementWhy long chats hit a wall and how Context Compaction handles it.
Basic RAGChat with your own documents, in a chat or as a knowledge base.
Web searchPick a search provider and the model searches when a question needs it.
Open TerminalA sandboxed shell the model can build and run things in.

Keep it running

  • Update: pull the new image and recreate the container with the step 1 command, same WEBUI_SECRET_KEY; your data is in the volume. Updating
  • Back up the volume before every update: Backup & Restore
  • Share it with others on your network or team: Sharing Open WebUI. Read the hardening guide before exposing it beyond your machine.
  • Install it as an app on your phone or desktop: Open WebUI as an App
  • Outbound calls: a stock install makes these on its own. A version check to GitHub, off with ENABLE_VERSION_UPDATE_CHECK=false. A model-list request to the default OpenAI connection, gone once you delete that connection or set ENABLE_OPENAI_API=false. An update check for the local embedding model on Hugging Face at every start, off with RAG_EMBEDDING_MODEL_AUTO_UPDATE=false.

Want an autonomous agent with terminal, file and web access? Connect an Agent. Questions: Discord. Bugs: GitHub Issues.

This content is for informational purposes only and does not constitute a warranty, guarantee, or contractual commitment. Open WebUI is provided "as is." See your license for applicable terms.