Adds a 256px Swept workbench-style left rail to open-webui that mounts when WORKBENCH_URL is set, links nav items out to ${WORKBENCH_URL}/<route>, and stays out of the way when unset (vanilla open-webui).
Implemented as static-asset overlay only — no Svelte source edits. Backend change is one field passthrough on /api/config.
Wires WORKBENCH_URL through docker-compose.yaml and fixes a related compose footgun where image: ghcr.io/... was making docker compose up pull upstream instead of building from ./Dockerfile, so local backend/static changes silently never landed.
Changes
backend/open_webui/env.py — read WORKBENCH_URL env var (default empty).
backend/open_webui/main.py — include workbench_url in the /api/config payload.
static/static/loader.js + backend/open_webui/static/loader.js — fetch /api/config; if workbench_url is set, preload Red Hat Text/Display, inject the shell DOM (Swept wordmark + nav + Settings), and add html.swept-shell-active. Inline Lucide v-current icon paths so icon sizing matches workbench.
static/static/custom.css + backend/open_webui/static/custom.css — .swept-shell rules (fixed-left, slate-200 border, dark variants), padding-left:16rem on body, and a [data-state] nudge so the existing chat sidebar's math is untouched.
docker-compose.yaml — rename image: to swept/open-webui:dev (local-only tag forces build) and add WORKBENCH_URL=${WORKBENCH_URL:-} to the service environment.
Why two copies of loader.js / custom.css
FastAPI's /static/* mount serves STATIC_DIR (backend/open_webui/static/); static/static/* ends up under FRONTEND_BUILD_DIR and isn't reachable on its own. Both copies must match.
Test plan
WORKBENCH_URL=http://localhost:3004 docker compose up -d --build open-webui
curl http://localhost:8080/api/config | jq .workbench_url → returns the URL
curl http://localhost:8080/static/loader.js | grep swept-shell → non-zero match count
Open http://localhost:8080 in a browser — Swept rail appears on the left at ≥lg breakpoint, with the existing chat sidebar shifted right
Click a nav item (Governance / Evaluations / etc.) — navigates to ${WORKBENCH_URL}/<route>
Unset WORKBENCH_URL, docker compose up -d again — rail does not mount, vanilla open-webui
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.
## 📋 Pull Request Information
**Original PR:** https://github.com/open-webui/open-webui/pull/24419
**Author:** [@l3aconator](https://github.com/l3aconator)
**Created:** 5/6/2026
**Status:** ❌ Closed
**Base:** `main` ← **Head:** `feat/workbench-shell`
---
### 📝 Commits (10+)
- [`a818db3`](https://github.com/open-webui/open-webui/commit/a818db3deef5bc6fbb442d662d5c0b8c30c44c0c) Enable 4GB Node heap for frontend build
- [`82e8b5a`](https://github.com/open-webui/open-webui/commit/82e8b5adf7a73deffbe1e497432164b988d34888) Add /approve PR bot workflow
- [`653eb9f`](https://github.com/open-webui/open-webui/commit/653eb9fdde51429331dd7e5d7cb4d5eca3fa9c3c) Merge pull request #1 from swept-ai/fix/dockerfile-node-heap-size
- [`1af5ad9`](https://github.com/open-webui/open-webui/commit/1af5ad9ab1d4f125e31666c4815a0719fc8c36c8) Merge pull request #2 from swept-ai/chore/pr-approve-bot
- [`ed9d688`](https://github.com/open-webui/open-webui/commit/ed9d68834e1d657583f0bf028a38244b7b6ad992) Add CLAUDE.md to orient agents in this repo
- [`c568e61`](https://github.com/open-webui/open-webui/commit/c568e6197e95bcb9006d320a60a94a2711e86c66) Merge branch 'open-webui:main' into main
- [`878fad1`](https://github.com/open-webui/open-webui/commit/878fad132b5f9b94a0c3f52d6a595662cafde53e) Merge pull request #3 from swept-ai/docs/claude-md
- [`78a83e3`](https://github.com/open-webui/open-webui/commit/78a83e3cf475e212275b6553685e150dad39dcdf) Fix frontend build CI heap and remove unused release workflows
- [`cbbd2e5`](https://github.com/open-webui/open-webui/commit/cbbd2e57ca3b875471edda2dc8605297df377685) Apply prettier formatting to CLAUDE.md
- [`0a7ddab`](https://github.com/open-webui/open-webui/commit/0a7ddabab795014e164cbd51221cb993878c12bf) Merge pull request #4 from swept-ai/ci/fix-frontend-build-and-prune-workflows
### 📊 Changes
**60 files changed** (+2022 additions, -1092 deletions)
<details>
<summary>View changed files</summary>
📝 `.env.example` (+22 -1)
➖ `.github/workflows/build-release.yml` (+0 -61)
➖ `.github/workflows/docker-build.yaml` (+0 -917)
📝 `.github/workflows/format-build-frontend.yaml` (+2 -0)
➕ `.github/workflows/pr-approve-bot.yml` (+76 -0)
➖ `.github/workflows/release-pypi.yml` (+0 -36)
📝 `.gitignore` (+6 -1)
➕ `CLAUDE.md` (+71 -0)
📝 `Dockerfile` (+1 -1)
📝 `backend/open_webui/env.py` (+2 -0)
📝 `backend/open_webui/main.py` (+2 -0)
📝 `backend/open_webui/static/custom.css` (+333 -0)
➕ `backend/open_webui/static/fonts/8vIQ7wUr0m80wwYf0QCXZzYzUoTg8z6hR4jNCH5Z.woff2` (+0 -0)
➕ `backend/open_webui/static/fonts/8vIQ7wUr0m80wwYf0QCXZzYzUoTg_T6hR4jNCA.woff2` (+0 -0)
➕ `backend/open_webui/static/fonts/RrQXbohi_ic6B3yVSzGBrMxQZqctMc-JPWCN.woff2` (+0 -0)
➕ `backend/open_webui/static/fonts/RrQXbohi_ic6B3yVSzGBrMxQaKctMc-JPQ.woff2` (+0 -0)
📝 `backend/open_webui/static/loader.js` (+220 -0)
📝 `docker-compose.yaml` (+17 -1)
➕ `docs/integrations/vertex-ai.md` (+220 -0)
➕ `plugins/functions/README.md` (+78 -0)
_...and 40 more files_
</details>
### 📄 Description
## Summary
- Adds a 256px Swept workbench-style left rail to open-webui that mounts when `WORKBENCH_URL` is set, links nav items out to `${WORKBENCH_URL}/<route>`, and stays out of the way when unset (vanilla open-webui).
- Implemented as static-asset overlay only — no Svelte source edits. Backend change is one field passthrough on `/api/config`.
- Wires `WORKBENCH_URL` through `docker-compose.yaml` and fixes a related compose footgun where `image: ghcr.io/...` was making `docker compose up` pull upstream instead of building from `./Dockerfile`, so local backend/static changes silently never landed.
## Changes
- `backend/open_webui/env.py` — read `WORKBENCH_URL` env var (default empty).
- `backend/open_webui/main.py` — include `workbench_url` in the `/api/config` payload.
- `static/static/loader.js` + `backend/open_webui/static/loader.js` — fetch `/api/config`; if `workbench_url` is set, preload Red Hat Text/Display, inject the shell DOM (Swept wordmark + nav + Settings), and add `html.swept-shell-active`. Inline Lucide v-current icon paths so icon sizing matches workbench.
- `static/static/custom.css` + `backend/open_webui/static/custom.css` — `.swept-shell` rules (fixed-left, slate-200 border, dark variants), `padding-left:16rem` on body, and a `[data-state]` nudge so the existing chat sidebar's math is untouched.
- `docker-compose.yaml` — rename `image:` to `swept/open-webui:dev` (local-only tag forces build) and add `WORKBENCH_URL=${WORKBENCH_URL:-}` to the service environment.
## Why two copies of `loader.js` / `custom.css`
FastAPI's `/static/*` mount serves `STATIC_DIR` (`backend/open_webui/static/`); `static/static/*` ends up under `FRONTEND_BUILD_DIR` and isn't reachable on its own. Both copies must match.
## Test plan
- [ ] `WORKBENCH_URL=http://localhost:3004 docker compose up -d --build open-webui`
- [ ] `curl http://localhost:8080/api/config | jq .workbench_url` → returns the URL
- [ ] `curl http://localhost:8080/static/loader.js | grep swept-shell` → non-zero match count
- [ ] Open `http://localhost:8080` in a browser — Swept rail appears on the left at ≥`lg` breakpoint, with the existing chat sidebar shifted right
- [ ] Click a nav item (Governance / Evaluations / etc.) — navigates to `${WORKBENCH_URL}/<route>`
- [ ] Unset `WORKBENCH_URL`, `docker compose up -d` again — rail does not mount, vanilla open-webui
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---
<sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
📋 Pull Request Information
Original PR: https://github.com/open-webui/open-webui/pull/24419
Author: @l3aconator
Created: 5/6/2026
Status: ❌ Closed
Base:
main← Head:feat/workbench-shell📝 Commits (10+)
a818db3Enable 4GB Node heap for frontend build82e8b5aAdd /approve PR bot workflow653eb9fMerge pull request #1 from swept-ai/fix/dockerfile-node-heap-size1af5ad9Merge pull request #2 from swept-ai/chore/pr-approve-boted9d688Add CLAUDE.md to orient agents in this repoc568e61Merge branch 'open-webui:main' into main878fad1Merge pull request #3 from swept-ai/docs/claude-md78a83e3Fix frontend build CI heap and remove unused release workflowscbbd2e5Apply prettier formatting to CLAUDE.md0a7ddabMerge pull request #4 from swept-ai/ci/fix-frontend-build-and-prune-workflows📊 Changes
60 files changed (+2022 additions, -1092 deletions)
View changed files
📝
.env.example(+22 -1)➖
.github/workflows/build-release.yml(+0 -61)➖
.github/workflows/docker-build.yaml(+0 -917)📝
.github/workflows/format-build-frontend.yaml(+2 -0)➕
.github/workflows/pr-approve-bot.yml(+76 -0)➖
.github/workflows/release-pypi.yml(+0 -36)📝
.gitignore(+6 -1)➕
CLAUDE.md(+71 -0)📝
Dockerfile(+1 -1)📝
backend/open_webui/env.py(+2 -0)📝
backend/open_webui/main.py(+2 -0)📝
backend/open_webui/static/custom.css(+333 -0)➕
backend/open_webui/static/fonts/8vIQ7wUr0m80wwYf0QCXZzYzUoTg8z6hR4jNCH5Z.woff2(+0 -0)➕
backend/open_webui/static/fonts/8vIQ7wUr0m80wwYf0QCXZzYzUoTg_T6hR4jNCA.woff2(+0 -0)➕
backend/open_webui/static/fonts/RrQXbohi_ic6B3yVSzGBrMxQZqctMc-JPWCN.woff2(+0 -0)➕
backend/open_webui/static/fonts/RrQXbohi_ic6B3yVSzGBrMxQaKctMc-JPQ.woff2(+0 -0)📝
backend/open_webui/static/loader.js(+220 -0)📝
docker-compose.yaml(+17 -1)➕
docs/integrations/vertex-ai.md(+220 -0)➕
plugins/functions/README.md(+78 -0)...and 40 more files
📄 Description
Summary
WORKBENCH_URLis set, links nav items out to${WORKBENCH_URL}/<route>, and stays out of the way when unset (vanilla open-webui)./api/config.WORKBENCH_URLthroughdocker-compose.yamland fixes a related compose footgun whereimage: ghcr.io/...was makingdocker compose uppull upstream instead of building from./Dockerfile, so local backend/static changes silently never landed.Changes
backend/open_webui/env.py— readWORKBENCH_URLenv var (default empty).backend/open_webui/main.py— includeworkbench_urlin the/api/configpayload.static/static/loader.js+backend/open_webui/static/loader.js— fetch/api/config; ifworkbench_urlis set, preload Red Hat Text/Display, inject the shell DOM (Swept wordmark + nav + Settings), and addhtml.swept-shell-active. Inline Lucide v-current icon paths so icon sizing matches workbench.static/static/custom.css+backend/open_webui/static/custom.css—.swept-shellrules (fixed-left, slate-200 border, dark variants),padding-left:16remon body, and a[data-state]nudge so the existing chat sidebar's math is untouched.docker-compose.yaml— renameimage:toswept/open-webui:dev(local-only tag forces build) and addWORKBENCH_URL=${WORKBENCH_URL:-}to the service environment.Why two copies of
loader.js/custom.cssFastAPI's
/static/*mount servesSTATIC_DIR(backend/open_webui/static/);static/static/*ends up underFRONTEND_BUILD_DIRand isn't reachable on its own. Both copies must match.Test plan
WORKBENCH_URL=http://localhost:3004 docker compose up -d --build open-webuicurl http://localhost:8080/api/config | jq .workbench_url→ returns the URLcurl http://localhost:8080/static/loader.js | grep swept-shell→ non-zero match counthttp://localhost:8080in a browser — Swept rail appears on the left at ≥lgbreakpoint, with the existing chat sidebar shifted right${WORKBENCH_URL}/<route>WORKBENCH_URL,docker compose up -dagain — rail does not mount, vanilla open-webui🤖 Generated with Claude Code
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.