Song-dynasty-inspired theme for the DSH web UI: a light "rice paper" and a dark "night ink" variant, Ru celadon carrying interactive states while kiln copper is reserved for blockquotes, plus a 4pt spacing scale and a 46-glyph mask icon set.
Install
# from npm (prebuilt)
dsh plugin --profile web add dsh-theme-songgrid
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:yefengliu1/dsh-theme-songgrid
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
Song-dynasty aesthetics × Swiss International Style — a theme for the DeepSeek Harness Web UI.
中文 | English
| Xuanzhi · light | Yemo · dark |
|---|---|
![]() |
![]() |
The two variants, captured live (the sidebar is the Eight Standing Seats board). Card areas are redacted.
Why "Songgrid"
The warm white of rice paper, the celadon of Ru ware, the warning red of cinnabar — disciplined by Swiss International Style: a 4pt spacing scale, 2/4px radii, and type sizes locked to line heights.
This is not ancient styling pasted onto a UI. Every traditional colour is placed on the functional role it can actually hold.
Two accents, two jobs
The one decision in this theme that looks like a duplicate but must not be collapsed:
| Role | Colour | Contrast (on paper) | Where it lands |
|---|---|---|---|
| Functional · Ru celadon | #3A7284 |
4.91 : 1 ✓ AA | buttons · focus ring · selection · links |
| Editorial · kiln copper | #9A6B50 |
4.19 : 1 | blockquotes · markers |
Celadon passes WCAG AA, so it can carry "can I click this / is this selected". Kiln copper does not pass AA for body text, so it only carries "is this worth a second look". Their hues sit 174° apart — they were never two candidates for one role.
Two variants
| Variant | id | Character |
|---|---|---|
| Xuanzhi (rice paper) | song-grid-xuanzhi |
warm paper white × Ru celadon × cinnabar |
| Yemo (night ink) | song-grid-yemo |
cool blue-black × brightened celadon |
| Follow system | system |
switches with the host |
Palette
Xuanzhi · light
| Role | Value | |
|---|---|---|
| Paper | #F7F5EF |
|
| Surface +1 | #FBFAF6 |
|
| Surface +2 | #F0EDE4 |
|
| Overlay | #E7E3D8 |
|
| Hairline | #DDD8CB |
|
| Ink (primary text) | #26221C |
|
| Secondary text | #5C554A |
|
| Tertiary text | #8B8478 |
|
| Brand / functional | #3A7284 |
|
| Editorial accent | #9A6B50 |
|
| Success | #4E7A5A |
|
| Warn | #B0823A |
|
| Cinnabar (error) | #B5453C |
Yemo · dark
| Role | Value | |
|---|---|---|
| Night ink | #10151A |
|
| Surface +1 | #191F26 |
|
| Surface +2 | #1D242B |
|
| Primary text | #E8E3D6 |
|
| Secondary text | #A8A193 |
|
| Tertiary text | #7A7468 |
|
| Brand / functional | #7FB4C4 |
|
| Error | #D07A70 |
The dark ground is a cool blue-black, tuned together with the celadon. Swapping it for a warm black means re-tuning the entire dark variant.
Typography
- Chinese runs on a Song serif (
Noto Serif SC); Latin stays sans-serif — each script gets its own face, never mixed - Sizes are defined in pairs with their line heights (body / secondary / caption)
- Emphasis comes from colour roles (celadon vs. kiln copper), not from stacking bolds
Structure layers
Three layers; two of them are orthogonal to colour — future palette work never touches them:
| Layer | Contents | Colour |
|---|---|---|
STRUCTURE_CSS |
spacing scale (4pt grid + semantic aliases) · 2/4px radii · 4 line-height steps · 5 motion durations + 3 curves · focus ring · icon sizes | no |
ICON_CSS |
46 Lucide mask icons, following currentColor |
no |
SEMANTIC_CSS |
accent role split (--sg-accent-functional / --sg-accent-editorial) |
yes |
Install
dsh plugin --profile web add dsh-theme-songgrid
Then refresh the page and pick 「宋律 · 宣纸」/「宋律 · 夜墨」/ follow-system under Settings → General → Theme. The choice persists in the song-grid-theme settings namespace (the host plugin entry id).
The entry URL decides whether the choice survives across browsers. The DSH client only writes settings back to the host when the page hostname is
localhost/::1/127.x(isLoopbackHostnameindsh-client-connection). Opened throughdsh.localhost, a LAN name or a reverse-proxy domain, the whole settings surface degrades to in-pagememory— which looks like "I picked the theme, refreshed, and it was gone", and it affects the official theme preference, locale and notification settings just the same. To have the choice remembered across browsers/machines, openhttp://localhost:8080/(orhttp://127.0.0.1:3080/?token=…). Per-browser remembering works on any entry (the plugin keeps its own localStorage mirror).
Compatibility
- Requires DSH ≥ 0.2.0-rc.2 (
@deepseek-ai/dsh); verified on 0.2.0-rc.2 — on 0.1.5-rc.2 installdsh-theme-songgrid@0.1.0 - Implemented purely by overriding host design tokens — no host source is patched, no raw values
- Not affiliated with DeepSeek
Porting notes (0.1.5-rc.2 → 0.2.0-rc.2)
settingsScopewas removed: the theme preference scope is nowctx.configForms.get("songgrid")(the snapshot is still{ status, value })- The built
lib/client.jsmust register under the package name in__ModuleLoader__.load({ id })— rebuild the bundle after any rename, or the boot aborts withduplicate factory registration
Development
lib/index.js host half: registers the songgrid settings namespace
lib/client.js browser half: theme tokens + three CSS layers + theme picker
assets/ landscape backgrounds (ink / ink-night / celadon)
- Structure layer: tokens live in
:root; add a step there. New styles takevar(--sg-gap-*)/var(--sg-radius-*)— never raw values - Icons:
<span class="sg-icon sg-icon-check"></span>, 46 glyphs inICON_CSS; sizes via.sm/.lg/.xlor--sg-icon-size - More editorial emphasis:
--sg-accent-editorialalready exists inSEMANTIC_CSS; add selectors — the only rule is never on an interactive control, that slot belongs to the functional accent
License
MIT
Links
More in this category
elysia395/dsh-wallpaper-engine★ 5809
Requires DeepSeek Harness 0.1.5-rc.1+ (DSH Desktop >= 2.0.7) and dsh-better-sidebar >= 0.19.0 - update both before installing or updating this plugin. Plays local Wallpaper Engine Video/Web wallpapers behind the chat, renders Scene wallpapers as extracted static frames, and adds content-rating/type filters, custom uploads and an iOS-style liquid-glass settings window.
Small-tailqwq/dsh-deep-whale#maid-atelier★ 3063
Whale-girl skin series for the DSH Web UI (maid-atelier).
Nwflower/dsh-claude-style★ 519
Claude Code Desktop look-and-feel for the DSH Web GUI — ivory/warm-black dual canvas, clay accent, three-font typography, permission segmented control and brand switcher, via CSS overrides and client DOM overrides.
d-dev0101/open-sea-skin★ 388
Realtime WebGPU ocean skin with quick controls for waves, daylight, glass opacity, and an automatic day cycle.
kingOfSoySauce/dsh-liang-skin★ 370
Adaptive reasoning slider skin that maps each model's available reasoning efforts onto a 0–30 visual intensity scale, with synchronized portraits, background, and interface colors.
RevolutionLA/dsh-dream-skin★ 301
One-command skin plugin: 8 original themes, translucent wallpaper with opacity/blur, per-user accent, and shareable theme-pack import/export, favorites and surprise-me — purely native on DSH's token system.


Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.