dsh-neu-theme
A Neumorphism (soft-UI) theme plugin for DeepSeek Harness Web and the embedded Desktop workspace — gentle raised-and-recessed surfaces in a cream light palette and an ink-dark palette, complete with ambient lighting, material gloss, grain texture, glassmorphism and micro-interactions.
中文说明见 README.zh.md。
Features
- Two themes registered into the built-in ThemeRuntime:
neu-light— cream warm-white canvas, soft slate-blue accentneu-dark— ink-blue night canvas, luminous indigo accent
- Lighting — ambient top glow + corner fill painted on the visible surfaces (conversation canvas, sidebar, details column), not just body.
- Material — three-layer shadows (contact + cast + top-edge highlight), 145° gloss gradients aligned to the light direction, code blocks with a backlit inner wall.
- Texture — fine grayscale grain (inline SVG feTurbulence) over the canvas, sidebar, details column and code blocks.
- Glassmorphism — the composer capsule and its popovers (permission
menu, model menu, context panel) share one frosted-glass language: the
card's blur lives on a
::beforepseudo-layer so the nested popovers keep their own realbackdrop-filterblur (the card is not their backdrop root). - Micro-interactions — conversation nodes fade in on mount, bubbles
lift on hover, the composer recess deepens on hover/focus, tool rows and
reasoning rows strengthen on hover; all gated under
@media (prefers-reduced-motion: no-preference). - Settings row — Settings → General gains a Neumorphism picker (Default / Neu Light / Neu Dark), saved through the active profile's volatile plugin Config. DSH 0.2 only persists the built-in light/dark/system preference, so the plugin applies the chosen palette as a token-override layer over the matching built-in base palette.
- Default is pristine — selecting Default (or having no saved skin) leaves the document exactly as dsh ships it: no injected stylesheet, no body attribute, native colors and shadows.
Preview
Neu Light
Neu Dark
Install
Install the published package into the profile you use (web for DSH Web or
desktop for DSH Desktop):
# DSH Web
dsh plugin --profile web add dsh-neu-theme
# DSH Desktop
dsh plugin --profile desktop add dsh-neu-theme
# Or install manually in the Web profile:
cd ~/.dsh/profiles/web
pnpm add dsh-neu-theme
The package is also available on npm.
Then add "dsh-neu-theme" to dsh.profile.bundles in the selected profile's
package.json, and restart that profile (dsh web or DSH Desktop).
Once running: Settings → General → Neumorphism theme → pick
Default / Neu Light / Neu Dark. The selected value is a volatile plugin
Config field. DSH saves it in the active profile's Cordis patch; the Web and
Desktop profiles keep independent choices.
Choose Default to return to the built-in appearance. Choosing a built-in
Appearance mode (Light, Dark, or System) in the same panel also clears the saved
skin and keeps that built-in mode. DSH 0.2 imports legacy
settings.yaml sections into a profile entry with the same id, so the
dsh-neu-theme entry id also preserves the former settings key during import.
Platform compatibility
dsh-neu-theme is a Web client plugin (dsh.client.platform: "web"). DSH Desktop embeds the complete DSH Web application in its main window, so the theme applies to that UI through the Web client plugin loader. Desktop has a separate desktop profile; install the plugin there when using Desktop. This package styles the embedded workspace and does not add native menu, tray, or window-shell UI. This release requires DSH ^0.2.0-rc.2. DSH 0.2 replaced the old
settings.register() / settingsScope APIs with plugin Config and
configForms; DSH 0.1 runtimes are not supported by this release.
Develop
npm run build # regenerates lib/client.js from src/client.tpl.js + themes/*.json
npm run check # syntax and DSH 0.2 compatibility-contract checks
While dsh web runs with the HMR chain mounted, rebuilding
lib/client.js is picked up by the polling watcher and hot-reloads only
this plugin's fiber.
Repository layout
dsh-neu-theme/
├── package.json # dsh.bundle.patch + dsh.client manifest
├── cordis.patch.yml # loader entry insert (id: dsh-neu-theme)
├── themes/ # neu-light.json / neu-dark.json — the palettes
├── src/
│ ├── index.js # Host Config schema and profile settings policy
│ └── client.tpl.js # browser half template (build injects themes)
├── scripts/build.mjs # zero-dependency build
└── lib/ # generated artifacts (gitignored)
License
MIT
No comments yet. Be the first to write one.