Lightweight rebrand to make Open WebUI look like a Swept product (slate palette, Red Hat Text/Display, Swept brandmark/wordmark) — designed to keep the diff against open-webui/open-webui upstream as small as possible so we can keep pulling in git merge upstream/main cleanly.
Total tracked text diff: 1 line in src/app.html + 1 new CSS file + replaced binary assets. src/tailwind.css, src/lib/components/chat/Settings/General.svelte, backend/open_webui/env.py, and tailwind.config.js are deliberately untouched.
What changed
static/static/custom.css — was empty; now the override layer. Loaded by src/app.html:35 (a built-in extension point in upstream). Contains:
Google Fonts @import for Red Hat Text (body) + Red Hat Display (headings).
:root overrides remapping --color-gray-50…950 to Tailwind slate hex values, with !important to win cascade against the bundled Tailwind v4 @theme block from src/tailwind.css.
--font-sans / --font-display overrides + an html, body, pre font-family rule.
A CSS rule hiding <option value=\"oled-dark\"> and <option value=\"her\"> so the Settings → General theme picker only shows System / Dark / Light without forking General.svelte.
src/app.html:118 — <title>Open WebUI</title> → <title>Swept Workbench</title>. Eliminates the pre-hydration title flash. Only tracked text-source edit.
Replaced brand assets in static/static/ — logo.png, splash.png, splash-dark.png, favicon.{svg,png,ico}, favicon-96x96.png, apple-touch-icon.png. Favicons rendered from swept-workbench/app/assets/images/swept-logo.svg via rsvg-convert (ImageMagick's MSVG renderer was dropping the gradient fill).
Run product name comes from the WEBUI_NAME env var. Set WEBUI_NAME=\"Swept Workbench\" in your deploy env (Docker compose, etc.).
Why this approach
The upstream is moving and we want to keep tracking it. Most components in Open WebUI use raw bg-gray-* dark:bg-gray-* Tailwind utilities (90%+ of components), so a true semantic-token refactor would touch hundreds of .svelte files and conflict on every upstream merge. By overriding the values that those utilities resolve to in a single CSS file, every existing class inherits the new palette with zero component-level edits.
Trade-offs (acceptable for now):
!important on the CSS variables is fragile if upstream changes how @theme emits tokens. Caught immediately on next merge.
Dead-code paths for oled-dark and her remain in General.svelte and app.html — unreachable via the picker, harmless, much easier to merge.
The SvelteKit app appends "(Open WebUI)" to the dynamic page title on certain routes — that suffix is hardcoded in a Svelte component, separate from app.html's <title>. Not addressed in this PR; would be a follow-up if we want it gone.
Test plan
Container test against the published ghcr.io/open-webui/open-webui:main image with this branch's static/static/ and a patched index.html bind-mounted on top, plus WEBUI_NAME=\"Swept Workbench\". Verified in a real browser:
Tab title is "Swept Workbench" (with "(Open WebUI)" appended on dynamic routes).
Body computed font-family leads with \"Red Hat Text\"; 16 Red Hat font-face variants loaded.
--color-gray-50 resolves to #f8fafc, --color-gray-900 to #0f172a, --color-gray-950 to #020617 (slate).
Sidebar + model-header brandmark, suggested-prompt typography, and chat surface all pick up the new palette + fonts.
Settings → General → Theme dropdown shows only System / Dark / Light; OLED Dark and Her are display: none.
Switching to Dark flips the document to slate-900/950; switching back to Light flips to slate-50/100. No FOUC.
All replaced static assets serve HTTP 200.
Reviewer to verify in their local environment with npm run dev + backend, or via the same prebuilt-image bind-mount approach.
Future upstream merge: expect at most a 1-line conflict on src/app.html:118 (title); no other text conflicts.
🔄 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/24359
**Author:** [@l3aconator](https://github.com/l3aconator)
**Created:** 5/4/2026
**Status:** ❌ Closed
**Base:** `main` ← **Head:** `feat/swept-rebrand`
---
### 📝 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
**18 files changed** (+223 additions, -1020 deletions)
<details>
<summary>View changed files</summary>
➖ `.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` (+0 -1)
➕ `CLAUDE.md` (+71 -0)
📝 `Dockerfile` (+1 -1)
📝 `src/app.html` (+1 -1)
📝 `static/static/apple-touch-icon.png` (+0 -0)
📝 `static/static/custom.css` (+36 -0)
📝 `static/static/favicon-96x96.png` (+0 -0)
📝 `static/static/favicon.ico` (+0 -0)
📝 `static/static/favicon.png` (+0 -0)
📝 `static/static/favicon.svg` (+36 -3)
📝 `static/static/logo.png` (+0 -0)
📝 `static/static/splash-dark.png` (+0 -0)
📝 `static/static/splash.png` (+0 -0)
</details>
### 📄 Description
## Summary
Lightweight rebrand to make Open WebUI look like a Swept product (slate palette, Red Hat Text/Display, Swept brandmark/wordmark) — designed to keep the diff against `open-webui/open-webui` upstream as small as possible so we can keep pulling in `git merge upstream/main` cleanly.
**Total tracked text diff: 1 line in `src/app.html`** + 1 new CSS file + replaced binary assets. `src/tailwind.css`, `src/lib/components/chat/Settings/General.svelte`, `backend/open_webui/env.py`, and `tailwind.config.js` are deliberately untouched.
### What changed
- **`static/static/custom.css`** — was empty; now the override layer. Loaded by `src/app.html:35` (a built-in extension point in upstream). Contains:
- Google Fonts `@import` for **Red Hat Text** (body) + **Red Hat Display** (headings).
- `:root` overrides remapping `--color-gray-50…950` to Tailwind **slate** hex values, with `!important` to win cascade against the bundled Tailwind v4 `@theme` block from `src/tailwind.css`.
- `--font-sans` / `--font-display` overrides + an `html, body, pre` font-family rule.
- A CSS rule hiding `<option value=\"oled-dark\">` and `<option value=\"her\">` so the Settings → General theme picker only shows **System / Dark / Light** without forking `General.svelte`.
- **`src/app.html:118`** — `<title>Open WebUI</title>` → `<title>Swept Workbench</title>`. Eliminates the pre-hydration title flash. Only tracked text-source edit.
- **Replaced brand assets in `static/static/`** — `logo.png`, `splash.png`, `splash-dark.png`, `favicon.{svg,png,ico}`, `favicon-96x96.png`, `apple-touch-icon.png`. Favicons rendered from `swept-workbench/app/assets/images/swept-logo.svg` via `rsvg-convert` (ImageMagick's MSVG renderer was dropping the gradient fill).
- **Run product name** comes from the `WEBUI_NAME` env var. Set `WEBUI_NAME=\"Swept Workbench\"` in your deploy env (Docker compose, etc.).
### Why this approach
The upstream is moving and we want to keep tracking it. Most components in Open WebUI use raw `bg-gray-* dark:bg-gray-*` Tailwind utilities (90%+ of components), so a true semantic-token refactor would touch hundreds of `.svelte` files and conflict on every upstream merge. By overriding the **values** that those utilities resolve to in a single CSS file, every existing class inherits the new palette with zero component-level edits.
Trade-offs (acceptable for now):
- `!important` on the CSS variables is fragile if upstream changes how `@theme` emits tokens. Caught immediately on next merge.
- Dead-code paths for `oled-dark` and `her` remain in `General.svelte` and `app.html` — unreachable via the picker, harmless, much easier to merge.
- The SvelteKit app appends \"(Open WebUI)\" to the dynamic page title on certain routes — that suffix is hardcoded in a Svelte component, separate from `app.html`'s `<title>`. Not addressed in this PR; would be a follow-up if we want it gone.
## Test plan
- [x] Container test against the published `ghcr.io/open-webui/open-webui:main` image with this branch's `static/static/` and a patched `index.html` bind-mounted on top, plus `WEBUI_NAME=\"Swept Workbench\"`. Verified in a real browser:
- Tab title is \"Swept Workbench\" (with \"(Open WebUI)\" appended on dynamic routes).
- Body computed `font-family` leads with `\"Red Hat Text\"`; 16 Red Hat font-face variants loaded.
- `--color-gray-50` resolves to `#f8fafc`, `--color-gray-900` to `#0f172a`, `--color-gray-950` to `#020617` (slate).
- Sidebar + model-header brandmark, suggested-prompt typography, and chat surface all pick up the new palette + fonts.
- Settings → General → Theme dropdown shows only **System / Dark / Light**; OLED Dark and Her are `display: none`.
- Switching to **Dark** flips the document to slate-900/950; switching back to **Light** flips to slate-50/100. No FOUC.
- All replaced static assets serve HTTP 200.
- [ ] Reviewer to verify in their local environment with `npm run dev` + backend, or via the same prebuilt-image bind-mount approach.
- [ ] Future upstream merge: expect at most a 1-line conflict on `src/app.html:118` (title); no other text conflicts.
🤖 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/24359
Author: @l3aconator
Created: 5/4/2026
Status: ❌ Closed
Base:
main← Head:feat/swept-rebrand📝 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
18 files changed (+223 additions, -1020 deletions)
View changed files
➖
.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(+0 -1)➕
CLAUDE.md(+71 -0)📝
Dockerfile(+1 -1)📝
src/app.html(+1 -1)📝
static/static/apple-touch-icon.png(+0 -0)📝
static/static/custom.css(+36 -0)📝
static/static/favicon-96x96.png(+0 -0)📝
static/static/favicon.ico(+0 -0)📝
static/static/favicon.png(+0 -0)📝
static/static/favicon.svg(+36 -3)📝
static/static/logo.png(+0 -0)📝
static/static/splash-dark.png(+0 -0)📝
static/static/splash.png(+0 -0)📄 Description
Summary
Lightweight rebrand to make Open WebUI look like a Swept product (slate palette, Red Hat Text/Display, Swept brandmark/wordmark) — designed to keep the diff against
open-webui/open-webuiupstream as small as possible so we can keep pulling ingit merge upstream/maincleanly.Total tracked text diff: 1 line in
src/app.html+ 1 new CSS file + replaced binary assets.src/tailwind.css,src/lib/components/chat/Settings/General.svelte,backend/open_webui/env.py, andtailwind.config.jsare deliberately untouched.What changed
static/static/custom.css— was empty; now the override layer. Loaded bysrc/app.html:35(a built-in extension point in upstream). Contains:@importfor Red Hat Text (body) + Red Hat Display (headings).:rootoverrides remapping--color-gray-50…950to Tailwind slate hex values, with!importantto win cascade against the bundled Tailwind v4@themeblock fromsrc/tailwind.css.--font-sans/--font-displayoverrides + anhtml, body, prefont-family rule.<option value=\"oled-dark\">and<option value=\"her\">so the Settings → General theme picker only shows System / Dark / Light without forkingGeneral.svelte.src/app.html:118—<title>Open WebUI</title>→<title>Swept Workbench</title>. Eliminates the pre-hydration title flash. Only tracked text-source edit.static/static/—logo.png,splash.png,splash-dark.png,favicon.{svg,png,ico},favicon-96x96.png,apple-touch-icon.png. Favicons rendered fromswept-workbench/app/assets/images/swept-logo.svgviarsvg-convert(ImageMagick's MSVG renderer was dropping the gradient fill).WEBUI_NAMEenv var. SetWEBUI_NAME=\"Swept Workbench\"in your deploy env (Docker compose, etc.).Why this approach
The upstream is moving and we want to keep tracking it. Most components in Open WebUI use raw
bg-gray-* dark:bg-gray-*Tailwind utilities (90%+ of components), so a true semantic-token refactor would touch hundreds of.sveltefiles and conflict on every upstream merge. By overriding the values that those utilities resolve to in a single CSS file, every existing class inherits the new palette with zero component-level edits.Trade-offs (acceptable for now):
!importanton the CSS variables is fragile if upstream changes how@themeemits tokens. Caught immediately on next merge.oled-darkandherremain inGeneral.svelteandapp.html— unreachable via the picker, harmless, much easier to merge.app.html's<title>. Not addressed in this PR; would be a follow-up if we want it gone.Test plan
ghcr.io/open-webui/open-webui:mainimage with this branch'sstatic/static/and a patchedindex.htmlbind-mounted on top, plusWEBUI_NAME=\"Swept Workbench\". Verified in a real browser:font-familyleads with\"Red Hat Text\"; 16 Red Hat font-face variants loaded.--color-gray-50resolves to#f8fafc,--color-gray-900to#0f172a,--color-gray-950to#020617(slate).display: none.npm run dev+ backend, or via the same prebuilt-image bind-mount approach.src/app.html:118(title); no other text conflicts.🤖 Generated with Claude Code
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.