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
| Preset | Description | Paper texture |
|---|---|---|
| Warm paper (default) | Cream #FAF4E3 background + beige layers + warm-brown text + terracotta accents | โ subtle paper fiber grain |
| Sage | Pale green paper background + sage accents | โ |
| Ocean | Pale blue background + deep ocean-blue accents | โ |
| Lavender | Pale purple background + lavender accents | โ |
| No theme | Removes every override, restoring DSH's original blue theme | โ |
- Zero core changes: uses the official
ctx.theme.overrideTokensseam โ the token override layer is written as inline CSS variables onbodyand follows the active light/dark scheme automatically; No theme just disposes the override layer. - Browser-local persistence: the choice is stored in
localStorage(keydsh-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_NAMESPACESin@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 itsopacityto0insrc/client/row-style.tsto 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
- Open Settings โ General; the Theme color row appears below Appearance.
- Click a chip to switch: Warm paper / Sage / Ocean / Lavender / No theme.
- 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
opacityofbody[data-ds-paper]::beforeinsrc/client/row-style.tsto0and 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/darkrole colors insrc/client/presets.ts. - Add a preset: append an entry to
PRESETS(id / labelKey / swatch / texture / both palettes), then add copy to thezh/endicts insrc/client/index.tsand toThemeRowKeyinThemeRow.tsx. - Token mapping: the
TOKEN_ROLEStable inpresets.tsmaps 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-themeonly switches light/dark/system โ this plugin adds pure accent/theme-color replacement through the officialctx.theme.overrideTokensseam. - Approach: dual-contract client plugin (
dsh.client+ bundle patch), scaffolding modeled ondsh-soundscape; token overrides go throughThemeRuntime.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.