用 dsh-skin 給 DeepSeek Harness 網頁界面換膚並自定義壁紙

前言

DeepSeek Harness(命令是 dsh)把模型、工具、會話和界面都做成插件。網頁端自帶一套基於 --dsw-* 設計令牌的主題運行時,內置外觀大致是跟隨系統、淺色、深色。日常用下來,很多人還是希望再往前一步:像 Codex 那樣點一下換一套配色,或者給主畫布墊一張自己的壁紙,而不是去改 Harness 源碼。

社區裏已經出現多款主題類插件。本文只寫其中一款:dsh-skin。它由 KinGao294 維護,社區目錄歸在「主題與外觀」。覈對過社區目錄頁、GitHub 倉庫 README、package.jsonLICENSE 和客戶端源碼 lib/client.js 之後,可以把它理解成:在官方主題運行時上註冊一套精選配色,並在設置頁加一行壁紙控制,主畫布和側欄半透明,消息氣泡保持不透明。

需要先說清邊界:DeepSeek Harness 官方倉庫的口號是「Everything is a Plugin」。社區插件目錄 deepseek-harness-plugin.com 是獨立站點,用來檢索帶 dsh-plugin 話題的倉庫,和 DeepSeek / 幻方沒有官方從屬關係,也不是官方應用商店。

這是什麼

dsh-skin 是面向 DeepSeek Harness 網頁界面 的換膚插件。GitHub 倉庫是 KinGao294/dsh-skin,許可證 MIT,作者欄寫的是 KinGao294。package.json 裏當前版本是 0.3.1,主語言是 JavaScript。截至 2026-08-17,GitHub API 顯示該倉庫有 18 顆星;社區目錄頁同一天仍顯示 11 顆星,星標以倉庫本身爲準。

它要解決的問題很具體:

  • 不想只在系統淺色 / 深色之間切換,希望有幾套現成的語義配色
  • 想給網頁墊一張本地圖片或遠程圖 / 視頻,並調節界面遮罩和模糊
  • 換膚和壁紙刷新後還在,但不走 Host 設置裏尚未對第三方開放的命名空間

倉庫 README 把它寫成雙面插件,結構和官方自帶的 ui-* 包類似:

  • Host 半邊lib/index.js + cordis.patch.yml):聲明 dsh.bundle,往 profile 的 loader 裏插入一條 id: skinname: 'dsh-skin' 的條目;apply 是空操作
  • 瀏覽器半邊lib/client.js):聲明 dsh.client,由網頁在 /plugins/dsh-skin/client.js 加載,負責註冊皮膚、恢復上次選擇、畫壁紙層、往設置頁掛兩行控件

package.jsondsh.client.platform"web",並聲明對 @deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-theme 等包 ^0.1.0-rc.6 的 peer 依賴。它走的是官方主題服務的第三方擴展點(ctx.theme.register / setTheme / overrideTokens),不是給 headless 或終端 TUI 換皮膚。

核心功能

裝好並重啓網頁之後,設置頁 Settings → General(通用)裏、內置「外觀」那一行下面,會多出兩行:

  • 皮膚 / Skins
  • 背景圖片 / Wallpaper

七套精選配色

皮膚不是另寫一套 CSS,而是向 DSH 自帶的 ThemeRuntime 註冊主題。每個皮膚帶一個 colorSchemelightdark),用來驅動 body[data-ds-dark-theme],再覆蓋一層 --dsw-alias-*(以及少量 --dsw-specific-*)令牌。ThemePresenter 把這些值寫成 body 上的內聯自定義屬性,卡片、輸入框、氣泡仍然走原來的令牌體系。

倉庫 README 和 lib/client.js 裏的目錄一致,共 7 套,外加「默認」:

id 中文名 明暗 README 裏的氣質
skin-ocean 深海藍 暗色 DeepSeek 藍的深海
skin-graphite 石墨灰 暗色 中性單色
skin-forest 森林綠 暗色 綠色偏靜
skin-sunset 落日紫 暗色 暖紫
skin-midnight 午夜黑 暗色 純黑,偏 OLED
skin-paper 紙感暖 淺色 暖紙
skin-sakura 櫻花粉 淺色 粉色點綴

id 帶 skin- 前綴,避免和官方 @deepseek-ai/dsh-client-ui-console 裏已有的 sakuragraphite 撞名。源碼在讀取時會把舊的無前綴 id 遷到 skin-*

默認 / Default 會回到內置外觀(跟隨系統),並清掉已保存的皮膚 id。

自定義壁紙:半透明畫布 + 遮罩 / 模糊

壁紙不是鋪滿整個窗口的一張圖。實現上是一層 z-index: -1 的固定背景;同時用 ctx.theme.overrideTokens 把主畫布(--dsw-alias-bg-base)和側欄(--dsw-specific-sidebar-fill)做成半透明,圖從這兩塊透出來。消息氣泡、卡片、輸入框仍是實底,源碼和界面提示都寫了這一點:保證字還能讀。

Settings → General → 背景圖片 裏可以做這些事(以 README 和客戶端文案爲準):

  • 選擇圖片:選本地圖片,轉成 data URL 存在當前瀏覽器。README 寫軟上限約 2MB;源碼裏 data URL 長度上限是 1800000 字符,超出會先壓縮再存,仍超則提示存不下。本地視頻文件不會被上傳,界面會提示改用網址。
  • 網址:粘貼 http(s)data: 的圖片 / 視頻地址。視頻擴展名按源碼識別 mp4 / webm / ogv / movblob: 會被拒絕,因爲刷新後失效。沒有額外的媒體服務器。
  • 顯示方式:鋪滿(cover)、完整顯示(contain)、拉伸(stretch)、平鋪(tile),默認鋪滿。
  • 界面遮罩模糊:兩個滑塊。遮罩越高,界面越實、壁紙越弱。滑塊改動用 requestAnimationFrame 合併,避免拖動時把頁面拖崩。默認遮罩 0.8,默認模糊 0
  • 移除:清掉壁紙。

換皮膚或切換淺色 / 深色時,半透明表面會按當前皮膚重新着色,壁紙仍在下面。

只存在當前瀏覽器裏

選擇存在 localStorage,鍵名是:

  • dsh-skin:skin
  • dsh-skin:wallpaper
  • dsh-skin:wallpaper-opacity
  • dsh-skin:wallpaper-blur
  • dsh-skin:wallpaper-fit

README 解釋了原因:Host 設置通道只向瀏覽器暴露白名單裏的命名空間(WEB_SETTINGS_NAMESPACES)。第三方命名空間會得到 settings-not-exposed。視覺偏好用 localStorage 能跨刷新保留,範圍是同一個瀏覽器、同一來源,不會同步到另一臺機器或另一個瀏覽器配置。第三方皮膚在啓動時會再應用一次,因爲 DSH 本身只持久化系統 / 淺色 / 深色。

安裝與啓用

社區目錄頁給出的安裝命令如下,在 DeepSeek Harness 終端裏運行:

dsh plugin add github:KinGao294/dsh-skin

需要可復現安裝時,目錄頁要求固定 commit 哈希:

dsh plugin add github:KinGao294/dsh-skin#<commit>

<commit> 換成倉庫裏某個具體提交。不要長期跟蹤浮動的默認分支。

官方 CLI 的插件命令形態是 dsh plugin --profile <profile> add <規格>,會在對應 profile 目錄裏轉發給 pnpm。這個插件只聲明瞭 web 平臺。倉庫 README 用本地 checkout 舉例,並且強調必須加 -w:每個 profile 都帶 pnpm-workspace.yaml,pnpm 9 把 profile 目錄當成 workspace 根,裸 add 會報 ERR_PNPM_ADDING_TO_ROOT

dsh plugin --profile web add -w /path/to/dsh-skin

官方 CLI 文檔裏從 GitHub 安裝的形態是 dsh plugin --profile <profile> add github:owner/repo。把目錄頁的規格裝進 web profile,可以寫成:

dsh plugin --profile web add github:KinGao294/dsh-skin

如果 pnpm 報 ERR_PNPM_ADDING_TO_ROOT,再按 README 的說明補上 -w。安裝會把包裝進 ~/.dsh/profiles/web,並追加到 dsh.profile.bundles。新的 bundle 層要重啓正在跑的網頁服務才生效:

# 先停掉當前實例,再啓動:
dsh web

打開網頁後進入 Settings → General,就能看到皮膚和背景圖片兩行。

目錄頁和官方文檔都提醒:插件以當前 dsh 進程的權限運行,安裝時可能執行代碼。裝之前應閱讀倉庫源碼和 MIT 許可證。Git 依賴若帶 prepare 腳本,pnpm 10 及以上可能先拒絕構建,需要按 CLI 提示把包名寫進該 profile 的 pnpm-workspace.yamlallowBuilds 後再裝一次。

典型用法

下面步驟都來自 README 和設置頁文案,不涉及未公開的配置項。

  1. 確認本機已經能打開 DSH 網頁(官方文檔裏常見入口是 npx @deepseek-ai/dsh web,默認 http://127.0.0.1:3080)。
  2. 按上一節把 dsh-skin 裝進 web profile,重啓 dsh web
  3. 打開 設置 → 通用。在「外觀」下方找到 皮膚
  4. 點一套配色,例如「深海藍」或「紙感暖」。頁面應立刻切到對應明暗和令牌色;刷新後應仍是這一套。
  5. 若要恢復內置外觀,選 默認
  6. 背景圖片 一行點 選擇圖片,挑一張不太大的本地圖;或在輸入框粘貼 https://... 的圖片 / 視頻地址後點應用。
  7. 界面遮罩模糊,看主畫布和側欄的透出程度。消息氣泡應保持實底。
  8. 顯示方式按桌面壁紙習慣選:鋪滿適合照片,完整顯示適合不想裁切的圖,平鋪適合紋理。
  9. 不要用 blob: 地址;刷新後會失效,插件會直接拒絕。

開發者如果在改 lib/client.js:這份客戶端是按 __ModuleLoader__ 的 bundle 格式手寫的,沒有單獨構建步驟。require 只能點到模塊表裏已有的實體(例如 react@deepseek-ai/dsh-client-ui-theme/client)。改完同樣需要重啓 web 服務,loader 會按新的內容哈希重新提供文件。

適用場景與注意事項

適合這些情況:

  • 已經在用 DSH 網頁,只想換配色、加壁紙,不想碰 Harness 源碼
  • 希望皮膚走官方 ThemeService 的 alias 令牌,而不是整頁覆蓋一張大 CSS
  • 壁紙可以只存在當前瀏覽器,不需要多設備同步

使用前注意下面幾條,均能在目錄頁、README 或源碼裏對上:

  1. 只覆蓋網頁。 dsh.client.platformweb。headless、自己做的 TUI profile 裝了也不會出現這兩行設置。
  2. 偏好不跨瀏覽器。 清站點數據、換瀏覽器或換設備,皮膚和壁紙都要重設。這是當前 Host 設置白名單的限制,不是漏做的雲同步。
  3. 本地圖片有體積上限。 過大存不進 localStorage。本地視頻請改用網址,插件不會把視頻文件上傳到本機服務。
  4. 可讀性優先於「全透明」。 半透明只作用在主畫布和側欄;把遮罩拖到很低,字仍應落在實底氣泡上。若和其他改全局 CSS 的外觀插件疊用,後掛載的令牌覆蓋可能互相打架,需要自己看效果。
  5. 和官方主題 id 刻意錯開。 本插件用 skin-sakuraskin-graphite 這類帶前綴的 id。社區裏還有 dsh-deep-whaledsh-xiaoyao-skins 等其它主題插件,職責不同,不要按名字混裝、混改同一套 token。
  6. 權限模型。 插件與當前 dsh 進程同權。即使許可證是 MIT、源碼公開,安裝前仍應自己看 lib/index.jslib/client.jscordis.patch.yml
  7. API 仍在預覽期。 Harness 官方說明核心插件和 API 還會變。本包 peer 依賴寫的是 0.1.0-rc.6 一帶的客戶端包,升級 DSH 後若設置行消失或換膚不生效,應對照當時的 theme / client 插件接口再查倉庫。

小結

dsh-skin 把「換一套配色」和「墊一張壁紙」接到 DeepSeek Harness 已有的令牌主題運行時上:七套 skin-* 精選色板,加上半透明主畫布、可調遮罩和模糊的壁紙層,選擇存在當前瀏覽器的 localStorage。它不改 Harness 源碼,安裝後重啓 dsh web,在設置頁通用一欄就能用。

目錄頁與源碼:

  • 社區目錄:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-skin/
  • GitHub:https://github.com/KinGao294/dsh-skin
  • DeepSeek Harness 官方倉庫:https://github.com/deepseek-ai/deepseek-harness
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜