Theme studio for the DSH Web GUI: five built-in presets plus fully customizable light/dark palettes (accent, background, foreground, UI and code fonts, translucent sidebar, contrast), hot-swapped instantly and persisted in localStorage.
Install
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:BeiZi6/dsh-theme-plugin
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
Theme studio for the DeepSeek Harness (DSH) Web GUI: five built-in presets plus fully customizable light/dark palettes — accent, background, foreground, UI and code fonts, translucent sidebar and contrast — applied instantly, with no page refresh.
Features
- 🎨 5 built-in presets —
codex-warm,nord,solarized,graphite, plus the stock DeepSeek theme - 🖌️ Full customization — per-mode (
light.*/dark.*) accent, background, foreground, UI font, code font, translucent sidebar and contrast;custommode starts from scratch - ⚡ Instant hot-swap — a Settings GUI ("Theme Studio") applies changes immediately through the official
ctx.theme.overrideTokensAPI; light/dark follow the system preference - 💾 Persistent — the selection is saved in browser
localStorageand survives reloads - 🧮 70+ derived tokens — three colors plus a contrast value expand into the whole semantic token set (borders, layers, scrollbar, tooltip, code blocks, bubbles, sidebar states…)
- 🪟 Translucent sidebar — real frosted sidebar via the
--dsw-specific-sidebar-fillvariable - 🔌 Official seams only — host-side injection through
webServer.tapIndex, no patched vendor files
Installation
Requires DeepSeek Harness with the web profile enabled. Install from the official registry:
dsh plugin --profile web add github:BeiZi6/dsh-theme-plugin
Restart dsh web for the plugin to take effect.
To remove:
dsh plugin --profile web remove dsh-theme-plugin
Usage
Settings GUI (recommended)
After a restart, open Settings → Theme Studio:
- Preset — one-click chips: DeepSeek default / Codex warm / Nord / Solarized / Graphite / Custom
- Colors — color pickers for accent, background and foreground, with a "follow preset" reset
- Fonts — dropdowns for the UI font and the code font (common stacks included)
- Translucent sidebar — follow preset / on / off
- Contrast — slider 0–100 with preset restore
Every change applies instantly and persists locally; GUI selections take priority over host config.
The
stockpreset derives no palette: color controls are disabled and only fonts can be overridden.
Config reference
| Field | Type | Description |
|---|---|---|
preset |
enum | stock · codex-warm · nord · solarized · graphite · custom (default codex-warm) |
light.accent |
color | accent for light mode (primary buttons, links, …) |
light.background |
color | light-mode background |
light.foreground |
color | light-mode primary text |
light.uiFont |
CSS font-family |
UI font stack |
light.codeFont |
CSS font-family |
code font stack |
light.translucentSidebar |
enum | preset · on · off |
light.contrast |
number | 0–100; -1 = keep preset value |
dark.* |
— | same fields for dark mode |
Empty strings mean "keep the preset value"; unset fields are not overridden at all.
Example — merge into the web profile patch ($DSH_HOME/profiles/web/cordis.patch.yml):
- id: theme-plugin
config:
preset: codex-warm
light:
accent: '#FF6B35'
background: '#FFFAF0'
foreground: '#1A1A1A'
uiFont: '"Inter", "PingFang SC", sans-serif'
codeFont: '"JetBrains Mono", Consolas, monospace'
translucentSidebar: off
contrast: 70
dark:
accent: '#FFB07A'
background: '#1A1A1A'
foreground: '#F5F5F5'
uiFont: '"Inter", "PingFang SC", sans-serif'
codeFont: '"JetBrains Mono", Consolas, monospace'
translucentSidebar: on
contrast: 70
Only set the fields you want to change; leave the rest blank ('' / preset / -1).
Presets
| Preset | Style | Light bg / fg / accent | Dark bg / fg / accent |
|---|---|---|---|
stock |
DeepSeek default | — (no override) | — (no override) |
codex-warm |
Codex warm | #F5F3EE / #1D1B16 / #DA7756 |
#2D2D2B / #F9F9F7 / #CC7D5E |
nord |
Nord cool | #ECEFF4 / #2E3440 / #5E81AC |
#2E3440 / #ECEFF4 / #88C0D0 |
solarized |
Solarized | #FDF6E3 / #657B83 / #B58900 |
#002B36 / #839496 / #268BD2 |
graphite |
Grayscale minimal | #FAFAFA / #171717 / #525252 |
#171717 / #FAFAFA / #A3A3A3 |
custom starts from the codex-warm palette and takes every value from light.* / dark.*.
How it works
- Host half (
index.js) — registers awebServer.tapIndexhook so every servedindex.htmlgets a<style>block injected before</head>, after the stylesheet links, letting the overrides win by cascade order. This is the same official seam the built-in UI theme uses. - Specificity — selectors are written as
html body/html body[data-ds-dark-theme]to outrank the theme's static CSS variables. - Token derivation — from background / foreground / accent plus a contrast factor, a small functional engine derives 70+ semantic tokens (border levels, layers, scrollbar, tooltip, markdown code blocks, bubbles, sidebar states…). Status colors (success / error / warn) keep their stock meaning.
- Translucent sidebar —
--dsw-specific-sidebar-fillis emitted asrgba(mix(bg, fg, 3%), 0.65)when enabled; AppFrame / SidebarRoot / WorkspaceBrowser / TrajectoryTable consume that variable directly. - Client half (
client.js) — a web-shell module that registers a "Theme Studio" section under Settings and writes every change viactx.theme.overrideTokens; the theme presenter emits the tokens inline on<body>, so the effect is instant and survives until the next selection. Selections persist inlocalStorage.
Compatibility
- DeepSeek Harness Web GUI (
dsh web) - Node.js >= 22.19
- Peer dependencies:
@deepseek-ai/cordis(^4),@deepseek-ai/dsh-host-webserver(^0.1.0-rc.6)
License
MIT © Xu Yuanshan
Links
- Repository: https://github.com/BeiZi6/dsh-theme-plugin
- Issues: https://github.com/BeiZi6/dsh-theme-plugin/issues
中文简介
为 DeepSeek Harness (DSH) Web GUI 打造的主题工作室插件:5 套内置预设(Codex 暖色 / Nord / Solarized / Graphite / 默认)+ 完全自定义;设置页内热切换、立即生效并持久化;通过官方 webServer.tapIndex 接缝向 index.html 注入主题 CSS,由背景/前景/强调三色与对比度函数式推导 70+ 语义令牌,并支持半透明侧边栏。
Links
More in this category
Small-tailqwq/dsh-deep-whale#maid-atelier★ 2252
Whale-girl skin series for the DSH Web UI (maid-atelier).
elysia395/dsh-wallpaper-engine★ 384
Requires DeepSeek Harness 0.1.5-rc.1+ (DSH Desktop >= 2.0.7) and dsh-better-sidebar >= 0.19.0 - update both before installing or updating this plugin. Plays local Wallpaper Engine Video/Web wallpapers behind the chat, renders Scene wallpapers as extracted static frames, and adds content-rating/type filters, custom uploads and an iOS-style liquid-glass settings window.
d-dev0101/open-sea-skin★ 380
Realtime WebGPU ocean skin with quick controls for waves, daylight, glass opacity, and an automatic day cycle.
kingOfSoySauce/dsh-liang-skin★ 222
Adaptive reasoning slider skin that maps each model's available reasoning efforts onto a 0–30 visual intensity scale, with synchronized portraits, background, and interface colors.
RevolutionLA/dsh-dream-skin★ 192
One-command skin plugin: 8 original themes, translucent wallpaper with opacity/blur, per-user accent, and shareable theme-pack import/export, favorites and surprise-me — purely native on DSH's token system.
GGBond2424648901/deep-whale-day-night-theme★ 117
Non-commercial day/night whale-girl skin for official Harness rc.7: current no-viewport-frame layout, paired crystal-workshop and moon-tide scenes, chibi companions, translucent ornaments, and lightweight ambience.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.