Themes & Appearance
DeepSeek-Harness-yizi-themes
laoduu/DeepSeek-Harness-yizi-themes · ★ 5
为 DeepSeek Harness(dsh)Web UI 提供的 19 个精品风格主题,完整移植自 YiziMarkdown 的设计语言。
An English summary is not available; the Chinese summary is shown.
安装
dsh plugin --profile web add github:laoduu/DeepSeek-Harness-yizi-themesGitHub 源码安装:首次需按提示配置 allowBuilds 构建授权后重试
For install and environment setup, plus plugin development tutorials, see DSH community docs ↗
README
Table of contents
- ✨ Highlights
- 🖼️ Theme Preview
- 📦 Installation
- Option 1: Download the tgz from GitHub Releases (recommended)
- Option 2: Build from source
- ⚠️ Updating an existing install (same-version trap)
- Usage
- 🌈 Theme Studio (custom themes)
- 🖌️ Custom Branding
- ⚙️ Configuration (cordis.patch.yml)
- 🗑️ Uninstall
- ❓ FAQ
- 🤝 Contributing
- 📄 Docs
- ⚖️ License
19 premium style themes + custom branding for the DeepSeek Harness Web UI
A faithful port of the YiziMarkdown design language,
tailored for Harness's --dsw-alias-* semantic token system.
Academic · Aurora · Cyberpunk · Facebook · Liquid Glass · Lychee · Magazine · Matrix · Minimal · Mint · Morandi · Nature · Palace · Sunset · Tech · Typewriter · Vaporwave · Vibrant · Violet
Every theme ships both light / dark palettes and follows your "Light / Dark / System" setting.
A standard Cordis plugin: install with dsh plugin — no Harness source changes.
中文 · Installation · Custom branding · Changelog · Dev log · Agent install guide
✨ Highlights
- 🎭 19 themes: from flowing auroras to cyberpunk neon, from Morandi greys to Forbidden-City vermilion
- 🌈 Theme Studio · custom themes (0.5.6): pick one accent colour and complete light/dark palettes are derived automatically — five voices (brand, ink, background tint strength, border voice, type scale) each follow the grammar the presets were tuned by — previewed live on a card and available immediately in the theme grid, the pickers and
/theme(Settings → Appearance → Custom theme) - 🎚️ Advanced palette (0.5.6): take the wheel when you want to — override the ink, background tint strength, border voice (brand / neutral ink) and either base colour; leave any field empty to stay automatic
- 🌗 Dual mode: every theme has hand-tuned light/dark token pairs, auto-switching with your system
- 🧩 Standard plugin: a Cordis plugin installed via
dsh plugin— zero changes to the Harness source tree - ✅ Works on stock Harness out of the box: style themes are implemented by the plugin itself (persistence +
body.theme-<id>application) — no core patch needed - 🧩 Upgrade-proof (official slots): branding (top-left logo / wordmark / badge / new-session headline) renders through Harness's official brand slots (
sidebar.brand.mark/sidebar.brand.name/conversation.hero.brand.mark), registered at a lowerpriorityso it coexists with — and wins over — the stock official brand plugin; cores without the slots fall back to the old viewBox injection path automatically - 🧱 Current-generation support (0.5.2): targets the
dsh-client-store/configFormsgeneration (Harness ≥v0.1.2-alpha.1, including the0.2.0-rc.2/0.2.1-rc.2/0.2.1-rc.3desktop apps); custom branding persists in browser-local storage (localStorage) and needs no Harness settings transport - 🎚️ Orthogonal dimensions: color mode (light/dark/system) and style theme are fully independent
- 🖌️ Custom branding: top-left logo / wordmark / badge / new-session headline, all following the theme color and light/dark mode automatically
- 📐 Adjustable brand size (0.5.4): one overall scale (75%–200%) for the top-left logo, wordmark and badge (Settings → Appearance → Custom → Brand size), applied live — no restart needed
- 🔤 Prompt mapping (experimental, off by default): replace "DeepSeek / 深度求索 / Harness" in the UI/output with your brand words (never rewrites what you are typing)
- ⌨️
/themecommand and Doctor (0.5.6): type/themeto switch themes or list them, and/theme doctorfor a live installation self-check (module hits, slots, token coverage) - 📍 Controls everywhere: theme picker + mode toggle in the session header, and floating controls on blank new sessions
🖼️ Theme Preview

| Theme | Light base | Dark base | Design language |
|---|---|---|---|
Academic academic |
pale blue #f5f8ff |
deep navy #0d1117 |
#002FA7 deep blue, professional |
Aurora aurora |
ice blue #f0f5fa |
deep ink #0a0e1a |
flowing northern lights |
Cyberpunk cyberpunk |
cold white #f0f4f8 |
deep black #050508 |
neon cyan/pink, futuristic |
Facebook facebook |
grey-white #f0f2f5 |
dark grey #18191a |
#1877F2 brand blue, social card |
Liquid Glass liquidglass |
crystal white #f6f9fe |
deep indigo #0c1222 |
translucent glass |
Lychee lychee |
pale pink-white #fff5f5 |
dark red #171212 |
#E63946 warm red |
Magazine magazine |
warm paper #faf8f5 |
deep brown #1a1612 |
coffee-brown serif reading |
Matrix matrix |
white #f5faf5 |
pure black #000000 |
matrix-green terminal |
Minimal minimal |
pure white #ffffff |
dark grey #1a1a1a |
clean and raw |
Mint mint |
creamy #f5fbf8 |
deep green #0a1a14 |
#10B981 refreshing mint |
Morandi morandi |
beige #f7f3ef |
dark brown #2c2926 |
low-saturation premium grey |
Nature nature |
rice paper #f5f2eb |
deep green #1a1f1a |
paper forest green |
Palace palace |
rice paper #faf6f0 |
deep ink #201812 |
vermilion + gold |
Sunset sunset |
warm white #fef8f0 |
deep purple #0d0812 |
amber twilight |
Tech tech |
cool blue-white #f0f4f8 |
GitHub dark #0d1117 |
classic dev-tools |
Typewriter typewriter |
aged paper #f5f0e8 |
dark grey #1a1a18 |
sepia study |
Vaporwave vaporwave |
pale pink-purple #f8f0f6 |
deep purple #140a1e |
pink-purple neon retro-future |
Vibrant vibrant |
warm orange-white #fff8f2 |
dark brown #1a1410 |
#F3641E vivid |
Violet violet |
pale purple-white #faf5fe |
deep purple #16101f |
#7209B7 elegant |
📦 Installation
Prerequisite: Harness ≥ v0.1.2-alpha.1 (the
dsh-client-storegeneration, including the 0.2.0-rc.2 / 0.2.1-rc.2 / 0.2.1-rc.3 desktop apps). For older rc.5 / rc.8 cores (client runtime still@deepseek-ai/dsh-client-runtime), use the 0.3.x line.
Option 1: Download the tgz from GitHub Releases (recommended)
- Download
dsh-yizi-themes-0.5.6.tgz— from the Releases page, or straight from the CLI:
curl -L -o dsh-yizi-themes-0.5.6.tgz https://github.com/laoduu/DeepSeek-Harness-yizi-themes/releases/download/v0.5.6/dsh-yizi-themes-0.5.6.tgz
- Stop the running
dsh web(Ctrl+C); - Install:
cd <your deepseek-harness path>
pnpm dsh plugin --profile web add /path/to/dsh-yizi-themes-0.5.6.tgz
💡 DSH Desktop App users: use
--profile desktopinstead — the desktop app and the web profile are separate profiles ($DSH_HOME/profiles/<desktop|web>), plugin installs do not cross over.
- Restart:
pnpm dsh web
Option 2: Build from source
git clone https://github.com/laoduu/DeepSeek-Harness-yizi-themes.git
cd DeepSeek-Harness-yizi-themes
node prepare.mjs # prepare.mjs resolves tsdown from the Harness checkout
npm pack # produces dsh-yizi-themes-<version>.tgz
Then follow Option 1 steps 2–4.
⚠️ Updating an existing install (same-version trap)
Re-add of a tarball with the same version does nothing (pnpm says Already up to date).
- Version changed: a plain
addworks. - Version unchanged: remove first, then add:
pnpm dsh plugin --profile web remove dsh-yizi-themes
pnpm dsh plugin --profile web add /path/to/dsh-yizi-themes-<version>.tgz
Usage
- Switch theme / mode: the palette button + light/dark toggle at the top right of the session header; on a blank new session they appear as floating controls in the same spot. Typing
/themeworks too. - Make your own theme: Settings → Appearance → Custom theme — name it, pick an accent, preview it live, then press "Add theme". Saved themes have Apply / Edit / Delete, all applied instantly with no restart (see below).
- Custom branding: Settings → Appearance → Custom (below).
🌈 Theme Studio (custom themes)
Settings → Appearance → Custom theme:
| Step | What it does |
|---|---|
| 1. Name it | e.g. "Ocean Blue" — adding the same name + colour again overwrites that theme instead of stacking duplicates |
| 2. Pick an accent | One colour is enough — complete light and dark palettes are derived from it |
| 3. Preview | The card renders that palette live |
| 4. Add theme | It appears immediately in the theme grid, the top-right pickers and /theme |
Advanced palette (optional, collapsible): take control of
| Voice | Effect |
|---|---|
| Ink | The second hue: text, toasts and the dark page follow it (a blue brand drifts its ink +43° toward violet by default, matching the presets) |
| Tint strength | How strongly backgrounds are tinted |
| Border voice | Brand (coloured chrome) or Neutral ink (neutral grey chrome) |
| Light / dark base | Pin either page background colour directly |
Leave any field empty to stay automatic. Saved themes can be edited again, and deletion is instant.
🖌️ Custom Branding
Settings → Appearance → Custom:
| Field | Description |
|---|---|
| Logo SVG | Paste SVG markup or a data URI. Used for the top-left brand, the collapsed sidebar icon, and the new-session page icon. Leave empty for the built-in whale mark |
| Wordmark | Top-left brand text (default DEEPSEEK, 18px base, scales with Brand size) |
| Badge | Small badge next to the wordmark (default HARNESS) |
| Headline | New-session page headline (default 探索未至之境) |
| Brand size | One slider scaling the top-left logo, wordmark and badge together (75%–200%, default 100%); applied live, no restart — the sidebar brand row grows to fit, so nothing gets clipped |
| Brand mappings | Toggle (off by default, experimental) + mapping table replacing "DeepSeek Harness / DeepSeek / 深度求索 / Harness" in the UI/output; never rewrites input fields |
Colors follow the theme automatically: wordmark, badge background, and the logo container all use
--dsw-alias-brand-primary, so they change with any style theme and light/dark mode.
Want your own SVG to follow the theme too? Replace hardcoded colors in the SVG with:
fill="var(--dsw-alias-brand-primary)"— follows theme and light/dark automatically;fill="currentColor"— inherits the container color (already set to the theme color).Other tokens: primary text
--dsw-alias-label-primary, secondary--dsw-alias-label-secondary/--dsw-alias-label-caption, inverted text--dsw-alias-label-primary-inverted, background--dsw-alias-bg-layer-1, border--dsw-alias-border-l1, etc.
Persistence: all branding settings (including the brand scale) live in browser-local storage
(localStorage key dsh-yizi-themes:brand) — desktop and web, and each browser, store their own copy;
survives restarts.
⚙️ Configuration (cordis.patch.yml)
Default plugin-row config (overridable in the profile's cordis.patch.yml):
| Field | Default | Description |
|---|---|---|
wordmark |
DEEPSEEK |
Brand wordmark |
wordmarkBadge |
HARNESS |
Badge text |
headline |
探索未至之境 |
New-session headline |
mappingEnabled |
false |
Enable brand-string replacement |
mappingDeepSeek / mappingDeepSeekChinese / mappingHarness / mappingDeepSeekHarness |
original | Replacement targets |
Settings-page edits take precedence over this config (config seeds the base layer; the user layer overrides it).
🗑️ Uninstall
cd <your deepseek-harness path>
pnpm dsh plugin --profile web remove dsh-yizi-themes
Restart dsh web to restore the default appearance. ui-theme.customBrand belongs to the core
namespace and remains after uninstall (harmless; remove manually if you like).
❓ FAQ
Q: Nothing changed after updating?
If the version did not change you must remove → add (see above), fully restart dsh web (Ctrl+C), and hard-refresh the browser (Ctrl+Shift+R).
Q: Settings accept input but are lost after refresh?
Since 0.5.0 custom branding and style themes persist in browser-local storage (localStorage: dsh-yizi-themes:brand / dsh-yizi-themes:themeId) and no longer touch $DSH_HOME/settings.yaml. If values are lost after refresh: make sure you are not in private/incognito mode (localStorage may be disabled); desktop and web store data independently (not synced).
Q: Top-left brand color does not follow the theme?
Make sure the logo/wordmark is set and uses currentColor or var(--dsw-alias-brand-primary); hardcoded colors never adapt.
Q: Blank sidebar after collapse/expand? Old bug — upgrade to 0.2.2+.
Q: DeepSeek Harness Desktop won't start after installing the plugin?
Versions ≤ 0.4.0 still required @deepseek-ai/dsh-client-runtime/client, and that package was deleted in the dsh-client-store generation. The desktop web bootstrap is all-or-nothing — one entry failing to activate aborts the whole client boot — so the app blank-screens. 0.5.0 moves to the current platform module (@deepseek-ai/dsh-client-store) and adapts to the narrowed ui-theme schema.
If it is already broken and the UI won't open: run dsh plugin --profile desktop remove dsh-yizi-themes from a terminal (no GUI needed), fully quit and restart the desktop app, then install the latest release (0.5.6).
Since 0.5.6 the plugin can no longer fail the boot at all: every apply stage is isolated and every slot registration is idempotent, so a second load (hot reload, composition reload) is harmless. A web boot: 1 entry did not activate / dsh-yizi-themes: failed line therefore means a build older than 0.5.6 — remove and reinstall.
Q: It starts but the whole UI is unstyled / controls are deformed / themes do nothing?
Fixed in 0.5.6: an undeclared variable in the dark palette derivation made the entire stylesheet fail to emit (preset themes, row layout and brand rules all vanished). Make sure you are on 0.5.6+; if it still happens, check dsh-yizi-themes:bootlog in localStorage (F12 → Application → Local Storage) — the FAIL: line names the stage.
Q: Does it work on stock Harness (official source / npm-published rc.5)?
0.5.x targets the dsh-client-store generation (Harness ≥ v0.1.2-alpha.1, including the 0.2.0-rc.2 / 0.2.1-rc.2 desktop apps); older rc.5 / rc.8 cores should use 0.3.x. Style themes have always been implemented by the plugin itself (localStorage + body.theme-<id>), so no core patch is needed; light/dark still goes through the core ctx.theme.
Q: Console reports single slot "sidebar.brand.mark" already has a registration at priority 0?
Older builds registered the brand slots at the default priority 0, colliding with the stock official brand plugin (dsh-client-ui-brand-official) — a single slot rejects a second occupant at the same priority (the "registered by X" in the message names the existing occupant). Since 0.5.0 the plugin registers at priority: -100; a single slot renders its lowest-priority occupant, so both coexist and the plugin's branding wins.
Q: Custom branding stopped working after upgrading Harness to v0.1.0-rc.8?
Adapted since 0.3.x (starting 0.3.0). rc.8 replaced the sidebar's single BrandWordmark (viewBox="0 0 182 24") with official brand slots (sidebar.brand.mark / sidebar.brand.name / conversation.hero.brand.mark). The plugin registers those slots to render the custom logo / wordmark / badge / new-session headline — the slots are the official extension surface, so future Harness upgrades keep working as long as the slot contract survives; cores without the slots fall back to the old viewBox injection path automatically. If a same-version reinstall is ignored ("Already up to date"), remove then add.
Q: After upgrading Harness to v0.1.2-alpha.1 the plugin fails with dsh-client-runtime missed the module table?
New Harness builds removed the @deepseek-ai/dsh-client-runtime package, which the old plugin (0.3.x) still references — hence the load failure. Upgrade to 0.4.0 or later (latest is 0.5.6) (migrated to @deepseek-ai/dsh-client-store / @deepseek-ai/cordis). If you have 0.3.x installed, remove first, then add the latest release, fully restart dsh web (Ctrl+C) and hard-refresh the browser (Ctrl+Shift+R).
Q: Want an agent to install it for you? Hand the Agent install guide to the agent.
🤝 Contributing
Pull requests welcome:
- New themes: see the dev log and
scripts/gen-themes.mjs(CSS → TS generator); - Bug fixes: adaptations for newer Harness versions;
- Docs: installation guide and FAQ improvements.
📄 Docs
⚖️ License
This project is a third-party dsh-plugin that brings 19 YiziMarkdown themes to DeepSeek Harness;
the theme design language is ported from YiziMarkdown.
The legacy
install.sh/install.ps1/MANIFEST.json/patch/files belong to the earlier "overwrite Harness source" approach — deprecated, kept for reference only. Do not use them.