Preface¶
DeepSeek open-sourced the agent runtime DeepSeek Harness (dsh) in August 2026. The official repository has a clear positioning: everything is a plugin. Model adapters, tools, sessions, sandboxes, and even the web interface itself are all assembled as plugins. It is currently in developer preview, with the default Web UI running at http://127.0.0.1:3080.
After getting it up and running, many users will encounter the same issue: the sidebar, input box, and conversation list work normally, but the interface uses the fixed native color scheme. To switch to a familiar style, users have to look for theme extensions in the community. The deepseek-harness-skin introduced in this article is one such skin system: it includes 21 built-in skins, plus a custom channel that “generates a complete color scheme from an image”.
First, the source. This plugin is maintained by HeiGeAi, and its repository address is HeiGeAi/deepseek-harness-skin. The community directory page is at deepseek-harness-plugin.com, categorized under “Themes & Appearance”, and was added on 2026-08-15. This directory is an independently operated community site and has no affiliation or endorsement relationship with DeepSeek / Fangyuan, and should not be treated as an official app store. As of 2026-08-17, the GitHub repository has 42 stars (the directory page listed 32 at the time, please refer to the repository page for the accurate count).
What is this¶
deepseek-harness-skin is a skin system integrated into the source tree of DeepSeek Harness, not a plugin that injects CSS into the runtime process. The repository README states it directly: it overwrites the packages/client/ui-theme directory, applies 8 host patch files, then re-runs pnpm run build. The sidebar, input box, and conversation list are still native DSH controls, their functions remain unchanged, only the color scheme, border styles, and background layers are modified.
The code uses the MIT license, with the copyright statement Copyright (c) 2026 HeiGeAi (Blake Xu). The primary language is TypeScript. The baseline host version is DeepSeek Harness 0.1.0-rc.5. The repository explicitly states: this project has no affiliation with DeepSeek official.
The problem it solves is also specific. The native DSH color palette has 73 absolute color levels and 89 semantic aliases. If only a few CSS variables are replaced, the hierarchy of buttons, borders, and disabled states can easily collapse. This system derives the complete color scale from four color seeds and checks the contrast during the build phase, with the goal of ensuring text remains readable after skin changes.
Core Features¶
The repository README and CHANGELOG (v1.0.0, 2026-08-14) describe the capabilities consistently. Below is a breakdown of verified features:
21 Built-in Skins¶
You can select them directly in the settings panel. QQ 2007 and QQ 2008 · Pink are pure color scheme skins without bitmap assets, with the entire interface derived from four color seeds during the build phase. The remaining 19 skins each come with a background image. There are three border styles: flat (solid stroke), glass (frosted glass), and neon (glowing stroke).
| # | Skin Name | Appearance | Border Style |
|---|---|---|---|
| 1 | QQ 2007 | Light | flat |
| 2 | QQ 2008 · Pink | Light | glass |
| 3 | Hatsune Miku | Light | neon |
| 4 | Genshin Impact · Mondstadt | Light | glass |
| 5 | Genshin Impact · Liyue Night | Dark | neon |
| 6 | Love and Deep Space · Star Sea | Light | glass |
| 7 | Love and Deep Space · Starcraft | Dark | neon |
| 8 | Naruto · Naruto Uzumaki | Dark | glass |
| 9 | Naruto · Sasuke Uchiha | Dark | neon |
| 10 | Wuthering Waves · Black青 | Dark | neon |
| 11 | Wuthering Waves · Deep Purple | Dark | glass |
| 12 | Dragon Ball · Flying Nimbus | Light | glass |
| 13 | Dragon Ball · Super Saiyan | Light | neon |
| 14 | Elite · Ash Gray | Dark | glass |
| 15 | DeepSeek-chan · Deep Sea | Dark | neon |
| 16 | DeepSeek-chan · Chibi | Light | glass |
| 17 | DeepSeek Youth Edition | Light | glass |
| 18 | Beta Tester Elite | Dark | neon |
| 19 | Don’t Disturb AGI | Light | glass |
| 20 | Fengge Riding Whale | Light | flat |
| 21 | Master Liang · Silent Mode | Light | glass |
Characters, games, and trademarks mentioned in the skin names belong to their respective owners. The repository’s NOTICE.md clarifies that these names are only used to describe existing presets and do not imply permission has been obtained. This point will be emphasized again at the end of the article.
One Skin Equals One JSON File¶
The following example from the repository README is the complete definition for QQ 2008:
{
"id": "qq-2008",
"name": { "zh": "QQ 2008·粉", "en": "QQ 2008 Pink" },
"order": 20,
"appearance": "light",
"chrome": "glass",
"seeds": {
"accent": "#c8447e",
"secondary": "#d98bb0",
"surface": "#f6e2ec",
"text": "#2b1020"
},
"glyph": "🐧",
"showBadge": true
}
The four color seeds are accent, secondary, surface, and text. The CSS is generated during the build phase, and only one data-dsh-skin attribute is switched during runtime. To add your own skin, place a JSON file in src/styles/skins/themes/, then run:
pnpm --filter @deepseek-ai/dsh-client-ui-theme run build:skins
Contrast-Preserving Derivation and Build-Time Readability Check¶
Derivation is not just simple color replacement. The program maintains the same contrast relationship as the native color palette for each level, performs calculations in OKLab space, and pulls colors outside the sRGB gamut back into range using chromatic dichotomy. All rules are attached under body[data-dsh-skin="…"] and body[data-skin-chrome="<flat|glass|neon>"], without modifying global CSS variables. Switching back to “Default” removes the attribute, and the interface returns to its native appearance.
The readability check is deterministic: 21 skins × 8 contrast contracts, all run during the build phase, and the build will fail if any check does not pass. You can reproduce the check after modifying the JSON with this command:
pnpm --filter @deepseek-ai/dsh-client-ui-theme run check:skins
The background image is attached to an independent fixed layer and does not scale with the conversation container. When opening a conversation, scrolling through a long dialogue, or opening/closing the sidebar, the background stays in place. The CHANGELOG specifically notes that early versions of the background would be forcibly enlarged when a conversation was opened, which was fixed by moving the background layer out of the content container.
Generate Custom Skin from One Image¶
The first item in the skin selector is “Custom (Select Image)”, which supports PNG, JPG, or WebP files. The process described in the repository is:
- Decode once locally in the browser, sample colors at 96px resolution, and re-encode to WebP with a long side of 1920px.
- Extract the main color, secondary color, background color, and text color from the image, and determine whether it is light or dark mode.
- Automatically adjust the mask opacity based on the image brightness to ensure text readability.
- Store the image in
~/.dsh/skins/using its content hash, and the Host provides a read-only static route for the frontend to access it. Re-selecting the same image will only store one copy.
The README emphasizes: The original image never leaves the local machine. The upload uses the DSH Host running on the same machine. The upload route only recognizes the WebP magic number, and requests larger than 4MB will be directly rejected. The uninstall script will not delete custom images in ~/.dsh/skins/, you can delete them manually if needed.
Version Badge and Check for Updates¶
The bottom of the settings panel displays “Skin System v1.0.0 · DSH 0.1.0-rc.5”, with a “Check for Updates” button next to it. The request is proxied by the DSH Host to GitHub Releases, and the browser does not connect directly to third parties; it has a 3-second timeout, 64KB response size limit, and 60-second cache. If the network is unavailable, it will display “Unable to check for now”, and the button remains clickable.
Installation and Activation¶
The installation command given on the community directory page is:
dsh plugin add github:HeiGeAi/deepseek-harness-skin
For reproducible installations, the directory page recommends pinning the commit hash:
dsh plugin add github:HeiGeAi/deepseek-harness-skin#<commit>
This command is from the original directory page, and according to community directory conventions, it will parse the plugin from GitHub and install it into the current dsh configuration. However, the repository README clearly states: this skin system needs to be built alongside the frontend, and cannot be installed using npx @deepseek-ai/dsh directly. The actual installation requires source code-level changes, and you need a checked-out copy of the DeepSeek Harness source code. Please read the repository and license before installing; the plugin runs with the permissions of the current dsh process, and may execute code during installation.
Prerequisites (from the README):
- A checked-out copy of the deepseek-ai/deepseek-harness source code, version 0.1.0-rc.5
- Node.js 22.19 or higher
- pnpm
The official way to start Harness from source is:
git clone https://github.com/deepseek-ai/deepseek-harness.git
cd deepseek-harness
pnpm install
pnpm run build
pnpm dsh web
The skin package’s installation script will check if the target directory’s package.json contains "@deepseek-ai/dsh-root" and if the packages/client/ui-theme directory exists. It will throw an error if there is a mismatch, rather than performing a partial installation.
git clone https://github.com/HeiGeAi/deepseek-harness-skin.git
cd deepseek-harness-skin
bash scripts/install.sh /path/to/deepseek-harness
The install.sh script will first back up all files to be overwritten to ~/.dsh-skin-backups/<timestamp>/, then write the skin package and apply the host integration patches. Then follow the prompts to rebuild:
cd /path/to/deepseek-harness && pnpm install && pnpm run build && pnpm dsh web
Open your browser to http://127.0.0.1:3080, go to Settings → General Settings → Skins in the bottom left corner, and click to switch skins.
To revert to the original state:
bash scripts/uninstall.sh /path/to/deepseek-harness
The uninstall script restores the ui-theme package and the 8 patched files from the most recent backup for that target, then runs pnpm install && pnpm run build again. If the specified backup already includes the skin (for example, if you backed up the “post-installation” state after repeated installations), the script will refuse to restore to avoid an incomplete rollback.
Typical Usage¶
After installation and rebuilding, all operations are done in the settings panel.
- Open the Web UI:
http://127.0.0.1:3080 - Go to Settings → General Settings → Skins in the bottom left corner
- Click the color swatch to switch built-in skins; the first item is always “Custom (Select Image)”
- To use your own color scheme, select a PNG/JPG/WebP file, and the remaining steps will be completed by the local workflow
- Switch back to “Default”, the
data-dsh-skinattribute will be removed, and the interface will return to its native appearance
To add a custom preset beyond the 21 included skins, place a JSON file according to the repository instructions and run build:skins. Specify the four color seeds clearly, set appearance to light or dark, and chrome to one of flat, glass, or neon. Be sure to run check:skins after modification; the build-time contrast check is mandatory and cannot be bypassed.
The repository README also includes a set of post-installation test metrics: 811 test files, 13,548 passing test cases, 100% statement, branch, function, and line coverage, with per-file thresholds included. This is the maintainer’s self-reported data in the README, and this article did not run the tests independently.
Applicable Scenarios and Notes¶
This is suitable for users who are already using the DSH Web UI, willing to build from source, and want to switch the interface to their preferred color scheme or background. It is not suitable for users who just want to run npx @deepseek-ai/dsh web to switch skins immediately without modifying the source tree. There are other community theme projects that use runtime plugin approaches with different installation methods, do not mix them with this one and expect them to work without conflicts.
We recommend treating the following points as hard constraints before use:
This is a source-level modification. The installation script overwrites packages/client/ui-theme and applies 8 host patch files, requiring a re-run of pnpm run build. It does not inject code at runtime or hijack the process. The baseline is 0.1.0-rc.5. DSH is still in developer preview, and patches may fail when the upstream modifies the interface structure; the script will throw a clear error rather than performing a partial installation.
The plugin runs with the permissions of the current dsh process. The directory page also states the same sentence: code may be executed during installation. You should inspect the source repository and license before installing; for reproducible installations, pin the commit hash.
The MIT license only covers the software code. It does not authorize the use of characters, trademarks, or third-party visual assets. The source of each file can be found in ASSET_PROVENANCE.md, the distribution boundaries are specified in NOTICE.md, and the licenses of upstream code can be found in THIRD_PARTY_NOTICES.md. NOTICE clarifies that disclaimers and non-commercial use statements cannot replace permissions for reposting, redistribution, or trademark use; assets whose source or authorization cannot be verified are marked as unverified in the provenance table. You should independently evaluate rights before publicly packaging and redistributing.
Custom images only exist locally. The compressed WebP files are stored in ~/.dsh/skins/, and the uninstall script will not touch them.
Summary¶
deepseek-harness-skin simplifies skin customization into two parts: 21 selectable presets, and a one-click color scheme generation from an image. Technically, it uses data source-driven color scale derivation and build-time contrast checks, with its scope confined to the body attribute, leaving no residual changes when switching back to the native interface. The tradeoff is clear: you must install it against the checked-out source code of 0.1.0-rc.5 and rebuild, and you cannot expect to complete the process with a single npx command.
Community Directory: https://deepseek-harness-plugin.com/zh-CN/plugins/deepseek-harness-skin/
GitHub Repository: https://github.com/HeiGeAi/deepseek-harness-skin
DeepSeek Harness Official Repository: https://github.com/deepseek-ai/deepseek-harness