Preface

DeepSeek Harness (dsh for short) treats models, tools, conversations and interfaces as plugins. If you want to change the appearance of the web interface, there are already many “full skin packages” in the community: replace a set of resources, and the interface will switch to another style. If you don’t want to use pre-made skins and just want to customize the primary color, secondary color and background to apply to the entire interface, there is another category of plugins in the directory - the theme designer.

freestyle-dsh-theme belongs to this category. It hooks into DeepSeek Harness’s Web GUI, uses the OKLCH color model for “theme proposals” and “theme designer”, allows you to change skins by clicking cards or dragging sliders, and can restore the last used color scheme after restarting. This article is organized after cross-checking with the community plugin directory page, GitHub repository README / package.json / source code, and the official DeepSeek Harness repository: what it is, what can be adjusted, how to install it and how to use it.

First, it needs to be clarified: DeepSeek Harness is open-sourced by DeepSeek AI, and its architecture slogan is “Everything is a plugin”. The plugin directory site deepseek-harness-plugin.com is a community collection and has no official affiliation with DeepSeek / Fangtian, so it should not be treated as an official app store.

What is it

freestyle-dsh-theme is a Theme & Appearance plugin maintained by GitHub user suzike, with the repository at suzike/freestyle-dsh-theme. The npm package name is @linxin666/freestyle-dsh-theme (the naming does not match the GitHub username), the current package.json version is 0.1.0, the license is BSD-3-Clause, and the main language is TypeScript. The directory page categorizes it under “Theme & Appearance”; as of the writing of this article (2026-08-17), the GitHub API shows 12 stars, while the directory page showed 10 stars at that time.

The problem it solves is very specific: the colors of the DSH web interface come from a complete set of CSS design tokens (--dsw-alias-* / --dsw-specific-*). Directly modifying the tokens has a high barrier to entry; installing a full skin package often means replacing the entire package. This plugin aggregates these tokens into three OKLCH channels - primary color, secondary color and panel color, then maps them to two complete sets of light and dark tokens, and uses the cards and sliders in the settings page to make changes.

Structurally, it is a “two-sided” Web plugin:
- Host side: Runs in the dsh process, registers POST /api/freestyle-dsh-theme/name, and uses the current default model to generate Chinese names for color schemes.
- Client side: Loaded into the browser, hooks the “theme proposals” and “theme designer” into Settings → General → Theme.

The dsh.client.platform field in package.json is web, which is for the web interface, not headless sessions.

Core Features

OKLCH Three Channels, Not Just Picking One Accent Color

The README and client-side source code split a theme into several channels and map them to interface roles:

Channel Token Fields Mapped To
Primary Color th / c1 / l1 Brand accent color, buttons, interactive states
Secondary Color th2 / c2 / l2 Sidebar selected state
Panel ths / sc / bg Backgrounds at all levels
Text tx Body text color (such as label-primary)
Sidebar sb Left sidebar background color (integrated with main area by default)

OKLCH splits colors into three axes: hue, chroma, and lightness, and the sliders can be dragged separately. The source code will also derive secondary and panel colors from the primary color according to color relationships: analogous, complementary, split complementary, triadic, and random.

The generated results will be written into DSH’s --dsw-alias-* / --dsw-specific-* tokens. The README states that there are about 85 sets, one for light and one for dark mode, covering background levels, text levels, borders, buttons, interactive states, status colors, sidebars, etc. The application method follows the official approach: theme.overrideTokens, instead of modifying the vendor’s static resources.

Theme Proposals: 6 Presets + Smart Card Batch

After opening the settings page, the first tab is “Theme Proposals”. The source code hardcodes 6 style presets with the following names:
- Aurora Cyan
- Warm Gold Sand
- Twilight Purple
- Cherry Pink
- Deep Sea Blue
- Lava Orange

There is also a “Smart Proposals” section below: it randomly generates 8 cards according to the currently selected color relationship. Clicking a card will apply the theme; click “Refresh Batch” to regenerate 8 new cards; click “Restore Default” to clear the overrides. Each card has a scaled-down interface preview, and you can switch the preview mode between light and dark. The README description matches this section of the source code.

Theme Designer: Sliders, Locking, Variants, JSON

The second tab is “Theme Designer”. You can switch between primary, secondary and panel colors, drag the hue, chroma and lightness sliders, or click hue color blocks. The source code also allows separate adjustment of text lightness and sidebar lightness.

The designer also includes several auxiliary operations (all from the README and client-side implementation):
- Channel Locking: After locking a channel, random generation and color relationships will skip it.
- Quick Variants: Soften, Vivid, Brighten, Darken, Swap Primary and Secondary.
- Real-time Preview: When checked, dragging the sliders will immediately call overrideTokens.
- AI Naming: POST the current OKLCH tokens to the Host route, and use the default model to generate Chinese theme names, tags and descriptions. If there is no LLM in the environment, or the default model has not been configured, the interface will return a clear error instead of pretending to succeed.
- JSON Import/Export: Theme tokens can be copied, pasted and migrated. The export function will try to write to the clipboard.

The settings dialog will be widened to 1120px (height limit approximately 840px) to facilitate viewing the proposal cards and designer side by side.

Cross-restart Persistence

There are actually two things here, which are clearly separated in the source code:
1. The plugin itself is installed as a persistent Web plugin into the profile, and will still be loaded after restarting dsh.
2. The current color scheme is written to the browser’s localStorage with the key name freestyle-dsh-theme:last. The next time you open the webpage, the client will read it and call overrideTokens.

That is to say: the color scheme follows this browser on this machine, and is not written into the global configuration on the server. If you switch browsers or clear the site data, the last theme will not be automatically synced; you can use the JSON export and import functions in the designer at this time.

Installation and Activation

The installation command given on the community directory page is as follows, run it in the DeepSeek Harness terminal:

dsh plugin add github:suzike/freestyle-dsh-theme

For reproducible installations, the directory page recommends pinning the commit hash:

dsh plugin add github:suzike/freestyle-dsh-theme#<commit>

Replace <commit> with a specific commit from the repository. The common写法 in the official CLI documentation includes --profile (such as web); the version included in the directory page is the command without the profile parameter above, as per the original text on the page.

The directory page also reminds users that the plugin runs with the permissions of the current dsh process, and may execute code during installation. You should check the source code repository and license before installing.

The repository README additionally describes a path for “clone locally, build, then link to the profile”. The current repository does not commit lib/ (the directory is ignored in .gitignore), and there is no prepare script in package.json. The official DeepSeek Harness documentation states that installing from GitHub will get the source code instead of the built artifacts, and TypeScript packages without a prepare script may not have a lib/ entry point. If the dsh plugin add command from the directory page does not generate a loadable build result, you can build it locally according to the README:

git clone https://github.com/suzike/freestyle-dsh-theme.git
cd freestyle-dsh-theme
pnpm install
pnpm build

The build artifacts are lib/index.js (Host side) and lib/client.js (browser side). Then add the following to the dependencies field of ~/.dsh/profiles/<profile>/package.json:

{
  "dependencies": {
    "@linxin666/freestyle-dsh-theme": "link:../path/to/freestyle-dsh-theme"
  }
}

Replace ../path/to/freestyle-dsh-theme with the repository path on your local machine. Then append the following to the end of the profile’s cordis.patch.yml:

- insert:
    - id: theme
      name: '@linxin666/freestyle-dsh-theme'

Then run:

cd ~/.dsh/profiles/<profile>
pnpm install

Finally, restart DeepSeek Harness (or the dsh web process) and refresh the browser. The package.json declares the Node engine as ^22.19.0 || >=24.0.0, and declares peer dependencies such as @deepseek-ai/dsh-client-* with the version range ^0.1.0-rc.6. dsh is currently in developer preview, and the interface may still have incompatible changes.

Typical Usage

According to the “Usage” section of the README, after installing and refreshing the webpage:
1. Open Settings → General → Theme and click “Customize…”.
2. On the Theme Proposals tab: click a preset or a smart proposal card to apply the theme with one click; click “Refresh Batch” to regenerate; click “Restore Default” to revert.
3. On the Theme Designer tab: switch between primary, secondary and panel colors, drag the hue/chroma/lightness sliders (or click hue color blocks), you can enable real-time preview; use channel locking, color relationships, quick variants, AI naming, JSON import/export as needed.
4. Click “Apply Theme” to submit; clicking “Restore Default” will clear the tokens saved in localStorage and undo the overrides.

If you want to use AI naming, first make sure that the current profile has been configured with a default model. The Host route will return “No available LLM service in the current runtime environment” and “Default model not configured” respectively when it cannot find llm / agentDefaultModel, or when the default model has no selected provider/model. Naming itself is not a prerequisite for changing the skin, it just gives a name to the current color scheme.

When sharing a theme, click “Export JSON” in the designer and send the text to the other party; the other party can paste it and click “Import and Apply”. The JSON fields include th, th2, ths, c1, c2, sc, l1, l2, bg, tx, sb, mode, etc., with the version field version: 4. The import side will clamp the values, and an incorrect format will prompt “Not a valid theme JSON”.

Applicable Scenarios and Notes

It is more suitable for:
- Users who are already using dsh web and want to customize their own color scheme instead of replacing the entire skin package.
- Users who need to generate both light and dark token sets at the same time, avoiding only modifying the light or dark mode while keeping the default for the other.
- Users who want to back up their color schemes as JSON and migrate them between multiple machines.

It is not suitable for:
- Users running headless / non-web profiles: this plugin declares itself as a web client.
- Users wanting QQ-style skins, desktop pets, full-pack illustration skins: those are the capabilities of other “Theme & Appearance” plugins in the directory, such as dsh-deep-whale, whale-girl and other related entries in the directory, which are not the same type of functionality as this plugin.

It is recommended to remember these boundaries before use:
- The plugin runs with the permissions of the current dsh process, and the Host side will register an HTTP route on the local machine and call the default model. You should read the repository source code and the BSD-3-Clause license before installing.
- Theme persistence depends on the browser’s localStorage, not account-level cloud synchronization.
- AI naming will send the current tokens to the default model in the local dsh process; if no usable model is available, this function will be unavailable, but other color adjustment functions can still be used manually.
- When installing from git, if the build fails, first refer to the official documentation to check prepare / allowBuilds, or follow the README’s local pnpm build + link method.
- dsh is still in developer preview, and the peer dependencies are pinned around 0.1.0-rc.6. If the “Theme” item does not appear in the settings page after upgrading dsh, first check whether the profile has loaded @linxin666/freestyle-dsh-theme, and whether the line with id: theme still exists in cordis.patch.yml.

Summary

freestyle-dsh-theme simplifies the skin changing process of the DSH web interface into two steps: first use the proposal cards to select a starting point, then use the OKLCH three channels to adjust the primary, secondary and panel colors to a satisfactory state. The tokens use theme.overrideTokens, the color scheme is saved locally in the browser, and the plugin itself is a persistent Web plugin that restarts with the profile. It is not an “official theme” in the official skin store, but a community open-source plugin maintained by suzike.

Directory page: https://deepseek-harness-plugin.com/zh-CN/plugins/freestyle-dsh-theme/

GitHub: https://github.com/suzike/freestyle-dsh-theme