dsh-paper-theme ๐Ÿงป

August 14, 2026 ยท View on GitHub

DeepSeek Harness Web UI theme-color plugin: a warm cream paper (#FAF4E3) eye-friendly palette with a few calm preset colors and an optional paper-grain texture. One settings row, zero core changes.

English | ็ฎ€ไฝ“ไธญๆ–‡

DeepSeek Harness (DSH) Web GUI plugin that does exactly one thing: change the theme color. The default preset turns the UI into a warm cream paper eye-friendly theme (background #FAF4E3, matching beige layers, warm-brown text, terracotta accents) with a subtle paper-grain texture; three calm color presets (Sage / Ocean / Lavender) are available too. No settings page, no complex features โ€” just one row of color chips under Settings โ†’ General โ†’ Theme color.

โœจ Features

PresetDescriptionPaper texture
Warm paper (default)Cream #FAF4E3 background + beige layers + warm-brown text + terracotta accentsโœ… subtle paper fiber grain
SagePale green paper background + sage accentsโ›”
OceanPale blue background + deep ocean-blue accentsโ›”
LavenderPale purple background + lavender accentsโ›”
No themeRemoves every override, restoring DSH's original blue themeโ›”
  • Zero core changes: uses the official ctx.theme.overrideTokens seam โ€” the token override layer is written as inline CSS variables on body and follows the active light/dark scheme automatically; No theme just disposes the override layer.
  • Browser-local persistence: the choice is stored in localStorage (key dsh-paper-theme.preset), surviving refreshes and restarts. Host settings persistence is intentionally not used: the Host API proxy only exposes allowlisted settings namespaces to the Web client (WEB_SETTINGS_NAMESPACES in @deepseek-ai/dsh-host-apiproxy), and writes to a third-party namespace are silently refused โ€” pure client state keeps the plugin zero-core-change and works for both loopback and remote browsers.
  • Paper grain: inline SVG feTurbulence noise + mix-blend-mode (multiply in light, screen in dark), soft and non-intrusive; set its opacity to 0 in src/client/row-style.ts to disable.
  • HMR friendly: every registration lives in ctx.effect, cleaned up on hot reload.

๐Ÿ“ฆ Install

Prereqs: DeepSeek Harness installed (dsh web runs), Node โ‰ฅ 22.19, pnpm.

# Option 1: local directory install (development)
cd dsh-paper-theme && npm install --legacy-peer-deps && npm run build
dsh plugin --profile web add ./dsh-paper-theme

# Option 2: local link install
dsh plugin --profile web add link:./dsh-paper-theme

# Option 3: zero-install quick check (no profile changes)
dsh web --patch ./cordis.patch.yml

Restart dsh web after adding the plugin line (later source changes go through HMR).

๐ŸŽ›๏ธ Usage

  1. Open Settings โ†’ General; the Theme color row appears below Appearance.
  2. Click a chip to switch: Warm paper / Sage / Ocean / Lavender / No theme.
  3. Takes effect immediately, with a matching palette in both light and dark mode; Warm paper enables the paper grain, No theme restores the original blue theme.

To fully disable the grain: set the opacity of body[data-ds-paper]::before in src/client/row-style.ts to 0 and rebuild.

๐Ÿ› ๏ธ Local development

npm install --legacy-peer-deps          # install build deps
$env:DSH_NODE_MODULES = "$env:USERPROFILE\.dsh\profiles\node_modules"
npm run setup:dsh-workspace             # symlink the runtime @deepseek-ai/* packages
npm run verify                          # โ˜… one-shot gate (clean + typecheck + build)
npm run typecheck                       # type check
npm run build                           # tsc + tsdown โ†’ lib/
dsh web --patch ./cordis.patch.yml      # zero-install quick check

Directory layout

dsh-paper-theme/
โ”œโ”€โ”€ package.json            # dsh.bundle.patch + dsh.client dual contract
โ”œโ”€โ”€ cordis.patch.yml        # bundle patch layer (inserts this package)
โ”œโ”€โ”€ tsdown.config.ts        # client bundle (__ModuleLoader__.load + purity gate)
โ”œโ”€โ”€ scripts/                # build / clean / setup-dsh-workspace / verify
โ””โ”€โ”€ src/
    โ”œโ”€โ”€ index.ts            # host half: no-op (persistence is browser localStorage)
    โ””โ”€โ”€ client/             # browser half
        โ”œโ”€โ”€ index.ts        # apply: overrideTokens + grain toggle + settings row
        โ”œโ”€โ”€ presets.ts      # 4 preset palettes (light/dark) + token builder + no-theme constants
        โ”œโ”€โ”€ row-style.ts    # settings-row styles + paper-grain CSS
        โ””โ”€โ”€ ThemeRow.tsx    # preset-row component (incl. the No theme chip)

Tweaking colors / adding presets

  • Tweak a preset: edit the preset's light / dark role colors in src/client/presets.ts.
  • Add a preset: append an entry to PRESETS (id / labelKey / swatch / texture / both palettes), then add copy to the zh / en dicts in src/client/index.ts and to ThemeRowKey in ThemeRow.tsx.
  • Token mapping: the TOKEN_ROLES table in presets.ts maps role colors to --dsw-static-deepseek-*, --dsw-alias-*, --dsw-specific-* tokens; add a row to cover more tokens.

๐Ÿงฉ Ecosystem position

  • Fills a gap: DSH's built-in dsh-client-ui-theme only switches light/dark/system โ€” this plugin adds pure accent/theme-color replacement through the official ctx.theme.overrideTokens seam.
  • Approach: dual-contract client plugin (dsh.client + bundle patch), scaffolding modeled on dsh-soundscape; token overrides go through ThemeRuntime.overrideTokens ({ light, dark } pairs) and follow the active scheme automatically.
  • Zero core changes: all registrations live in ctx.effect / ctx.slots.inject, cleaned up on HMR unload.

โš–๏ธ License

MIT ยฉ 2026 Blaczz. Not affiliated with DeepSeek Harness โ€” a community plugin.