Preface¶
DeepSeek Harness (command: dsh) treats models, tools, sessions, and interfaces as plugins. Its web frontend has a built-in theme runtime based on --dsw-* design tokens, with three default appearance modes: follow system, light, and dark. In daily use, many users want to take this a step further: one-click switching to a different color scheme like Codex, or setting a custom wallpaper for the main canvas without modifying the Harness source code.
Several theme plugins have emerged in the community. This article focuses on one of them: dsh-skin, maintained by KinGao294 and categorized under “Themes & Appearance” in the community directory. After reviewing the community directory page, GitHub repository README, package.json, LICENSE, and client source code lib/client.js, this plugin can be understood as: registering a curated set of color schemes on top of the official theme runtime, adding a wallpaper control section in the settings page, making the main canvas and sidebar semi-transparent while keeping message bubbles opaque.
First, it is necessary to clarify the boundaries: The official DeepSeek Harness repository uses the slogan “Everything is a Plugin”. The community plugin directory deepseek-harness-plugin.com is an independent site for retrieving repositories tagged with the dsh-plugin topic. It has no official affiliation with DeepSeek / HyperGryph and is not an official app store.
What is this¶
dsh-skin is a skin-changing plugin for the web interface of DeepSeek Harness. Its GitHub repository is KinGao294/dsh-skin, licensed under MIT, with KinGao294 listed as the author. The current version in package.json is 0.3.1, and the primary language is JavaScript. As of 2026-08-17, the GitHub API shows 18 stars for this repository; the community directory page still showed 11 stars on the same day, so star counts should be referenced from the repository itself.
The problems it solves are specific:
- Tired of only switching between system light/dark modes, wanting several pre-made semantic color schemes
- Wanting to set a local or remote image/video as the page background, and adjust interface masks and blur effects
- Preserving skin and wallpaper settings after refresh, without using the namespaces in Host settings that are not yet open to third parties
The repository README describes it as a two-part plugin with a structure similar to the official built-in ui-* packages:
- Host side (lib/index.js + cordis.patch.yml): Declares dsh.bundle, inserts an entry with id: skin and name: 'dsh-skin' into the profile’s loader; apply is a no-op
- Browser side (lib/client.js): Declares dsh.client, loaded by the webpage at /plugins/dsh-skin/client.js, responsible for registering themes, restoring the last selected option, rendering the wallpaper layer, and adding two control sections to the settings page
In package.json, dsh.client.platform is set to "web", and it declares peer dependencies on packages such as @deepseek-ai/dsh-client-runtime and @deepseek-ai/dsh-client-ui-theme with version range ^0.1.0-rc.6. It uses the third-party extension points of the official theme service (ctx.theme.register / setTheme / overrideTokens), and does not support skinning for headless or terminal TUI environments.
Core Features¶
After installing and restarting the webpage, two additional sections will appear under the built-in “Appearance” row in Settings → General:
- Skins
- Wallpaper
Seven Curated Color Schemes¶
Instead of writing a separate CSS set, the plugin registers themes with DSH’s built-in ThemeRuntime. Each theme includes a colorScheme (light or dark) to drive body[data-ds-dark-theme], and overrides a set of --dsw-alias-* (and a small number of --dsw-specific-*) tokens. The ThemePresenter writes these values as inline custom properties on the body element, while cards, input boxes, and bubbles still use the original token system.
The directory in the repository README matches that in lib/client.js, with a total of 7 themes plus “Default”:
| id | Chinese Name | Brightness | Vibe in README |
|---|---|---|---|
skin-ocean |
Deep Sea Blue | Dark | Deep color of DeepSeek blue |
skin-graphite |
Graphite Gray | Dark | Neutral monochrome |
skin-forest |
Forest Green | Dark | Calm green tone |
skin-sunset |
Sunset Purple | Dark | Warm purple |
skin-midnight |
Midnight Black | Dark | Pure black, optimized for OLED |
skin-paper |
Paper Warm | Light | Warm paper tone |
skin-sakura |
Sakura Pink | Light | Pink accent |
All ids use the skin- prefix to avoid naming conflicts with existing sakura and graphite themes in the official @deepseek-ai/dsh-client-ui-console. The source code will migrate old non-prefixed ids to the skin-* format during reading.
Selecting Default / Default will revert to the built-in appearance (follow system) and clear the saved skin id.
Custom Wallpaper: Semi-transparent Canvas + Mask / Blur¶
The wallpaper is not a single image stretched across the entire window. Technically, it is a fixed background layer with z-index: -1. At the same time, ctx.theme.overrideTokens is used to make the main canvas (--dsw-alias-bg-base) and sidebar (--dsw-specific-sidebar-fill) semi-transparent, allowing the wallpaper to show through. Message bubbles, cards, and input boxes remain solid-colored, which is explicitly stated in the source code and interface prompts to ensure text readability.
The following operations can be performed in Settings → General → Wallpaper (based on the README and client copy):
- Select Image: Choose a local image, convert it to a data URL, and store it in the current browser. The README mentions a soft limit of ~2MB; the source code sets a hard limit of 1800000 characters for the data URL length. If exceeded, the image will be compressed before storage, and if still too large, a prompt will appear saying it cannot be saved. Local video files will not be uploaded, and the interface will prompt to use a URL instead.
- URL: Paste the HTTP(s) or data: URL of an image or video. The source code recognizes video extensions mp4 / webm / ogv / mov. blob: URLs will be rejected because they expire after refresh. No additional media server is provided.
- Display Mode: Cover, Contain, Stretch, Tile. The default is Cover.
- Interface Mask and Blur: Two sliders. A higher mask value makes the interface more opaque and the wallpaper less visible. Slider adjustments are merged with requestAnimationFrame to prevent page lag during dragging. The default mask is 0.8 and default blur is 0.
- Remove: Clear the wallpaper.
When switching skins or light/dark modes, the semi-transparent surfaces will be re-colored according to the current skin, while the wallpaper remains in place.
Only Exists in the Current Browser¶
Selections are stored in localStorage with the following keys:
- dsh-skin:skin
- dsh-skin:wallpaper
- dsh-skin:wallpaper-opacity
- dsh-skin:wallpaper-blur
- dsh-skin:wallpaper-fit
The README explains the reason: The Host settings channel only exposes whitelisted namespaces (WEB_SETTINGS_NAMESPACES) to the browser. Third-party namespaces will return settings-not-exposed. Using localStorage for visual preferences preserves settings across refreshes, and the scope is the same browser and origin, and will not sync to another machine or browser profile. Third-party skins are re-applied on startup because DSH itself only persists system/light/dark modes.
Installation and Activation¶
The installation command provided on the community directory page should be run in the DeepSeek Harness terminal:
dsh plugin add github:KinGao294/dsh-skin
For reproducible installations, the directory page requires pinning a commit hash:
dsh plugin add github:KinGao294/dsh-skin#<commit>
Replace <commit> with a specific commit from the repository. Do not long-track the floating default branch.
The official CLI plugin command format is dsh plugin --profile <profile> add <spec>, which forwards to pnpm in the corresponding profile directory. This plugin only declares support for the web platform. The repository README uses a local checkout example and emphasizes that the -w flag must be added: Each profile has a pnpm-workspace.yaml, and pnpm 9 treats the profile directory as the workspace root, so a bare add command will throw ERR_PNPM_ADDING_TO_ROOT:
dsh plugin --profile web add -w /path/to/dsh-skin
The official CLI documentation’s format for installing from GitHub is dsh plugin --profile <profile> add github:owner/repo. To install the spec from the directory page into the web profile, the command can be written as:
dsh plugin --profile web add github:KinGao294/dsh-skin
If pnpm throws ERR_PNPM_ADDING_TO_ROOT, add the -w flag as instructed in the README. The installation will package the plugin into ~/.dsh/profiles/web and append it to dsh.profile.bundles. The new bundle layer will take effect only after restarting the running webpage service:
# Stop the current instance first, then start it:
dsh web
After opening the webpage and navigating to Settings → General, you will see the two new sections for skins and wallpaper.
Both the directory page and official documentation remind users: Plugins run with the permissions of the current dsh process and may execute code during installation. You should review the repository source code and MIT license before installing. If a Git dependency has a prepare script, pnpm 10 and above may reject the build by default. You need to add the package name to the allowBuilds field of the profile’s pnpm-workspace.yaml before reinstalling.
Typical Usage¶
The steps below are sourced from the README and setting page copy, and do not involve undisclosed configuration options.
- Confirm that you can open the DSH webpage locally (the common entry in official documentation is
npx @deepseek-ai/dsh web, default addresshttp://127.0.0.1:3080). - Install
dsh-skininto the web profile according to the previous section, and restartdsh web. - Open Settings → General. Find Skins below the “Appearance” section.
- Click a color scheme, such as “Deep Sea Blue” or “Paper Warm”. The page should immediately switch to the corresponding brightness and token colors; it should remain the same after refresh.
- To revert to the built-in appearance, select Default.
- In the Wallpaper section, click Select Image to pick a reasonably sized local image, or paste the
https://...URL of an image or video into the input box and click Apply. - Drag the Interface Mask and Blur sliders to adjust the transparency of the main canvas and sidebar. Message bubbles should remain solid-colored.
- Choose a display mode according to desktop wallpaper habits: Cover is suitable for photos, Contain for images you do not want cropped, and Tile for textures.
- Do not use
blob:URLs; they will expire after refresh, and the plugin will reject them directly.
For developers modifying lib/client.js: This client code is written in the __ModuleLoader__ bundle format without a separate build step. require can only reference entities already present in the module table (such as react, @deepseek-ai/dsh-client-ui-theme/client). After modifying the code, you need to restart the web service again, and the loader will serve the file with a new content hash.
Applicable Scenarios and Notes¶
It is suitable for the following situations:
- You are already using the DSH webpage and only want to change colors or add a wallpaper without modifying the Harness source code
- You want skins to use the official ThemeService alias tokens instead of overwriting the entire page with a large CSS file
- You are okay with wallpapers only existing in the current browser and not needing multi-device syncing
Please note the following points, all of which can be verified in the directory page, README, or source code:
1. Only covers the web interface. dsh.client.platform is set to web. Headless or custom TUI profiles will not show the two setting sections even after installation.
2. Preferences do not sync across browsers. Clearing site data, switching browsers, or changing devices will require resetting skins and wallpapers. This is a limitation of the current Host settings whitelist, not an overlooked cloud sync feature.
3. Local images have a size limit. Too large files cannot be stored in localStorage. For local videos, please use a URL instead; the plugin will not upload video files to the local service.
4. Readability takes priority over “full transparency”. Semi-transparency only applies to the main canvas and sidebar; even if you drag the mask to a very low value, text should still appear on solid-colored bubbles. If used together with other appearance plugins that modify global CSS, token overrides from later-mounted plugins may conflict, and you will need to test the effect yourself.
5. Deliberately错开官方主题id: This plugin uses prefixed ids like skin-sakura and skin-graphite. There are other theme plugins in the community such as dsh-deep-whale and dsh-xiaoyao-skins with different responsibilities, so do not install or modify the same set of tokens across multiple plugins by name.
6. Permission model: The plugin runs with the same permissions as the current dsh process. Even though the license is MIT and the source code is public, you should review lib/index.js, lib/client.js, and cordis.patch.yml before installing.
7. API is still in preview: The official Harness documentation states that core plugins and APIs are subject to change. The peer dependencies of this package specify client packages in the 0.1.0-rc.6 range. If the setting sections disappear or skinning stops working after upgrading DSH, please check the current theme/client plugin interfaces and the repository status.
Summary¶
dsh-skin connects “changing color schemes” and “setting a custom wallpaper” to DeepSeek Harness’s existing token-based theme runtime: seven curated skin-* color palettes, plus a semi-transparent main canvas and wallpaper layer with adjustable mask and blur effects. Selections are stored in the current browser’s localStorage. It does not modify the Harness source code. After installation and restarting dsh web, you can use it from the General section in the settings page.
Directory and source links:
- Community directory: https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-skin/
- GitHub: https://github.com/KinGao294/dsh-skin
- DeepSeek Harness official repository: https://github.com/deepseek-ai/deepseek-harness