为 DeepSeek Harness 提供 8 套原创皮肤、壁纸与主题包分享的标准双面换肤插件,跨重启不丢设置。
- 语言
- JavaScript
- License
- MIT
- 分支
- main
安装
$ dsh plugin --profile web add github:RevolutionLA/dsh-dream-skin在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程
一句话定位
为 DeepSeek Harness 换上 8 套 iOS / Linear 风格的清透冷调皮肤、壁纸与强调色,并把「换肤」做成可分享、可导入、可回滚的标准主题包生态。
核心能力
- 提供 8 套内置皮肤(沉静蓝、极光青、星云紫、余烬橙、午夜黑、iOS 扁平、液态玻璃、Material 粉),覆盖浅色与深色
- 支持本地图、图片 URL、CSS 渐变三种壁纸来源,并可独立调节透明度、模糊、侧边栏透明度与自动弱化
- 提供每用户强调色 Accent,可在当前皮肤上叠加任意品牌色,不破坏皮肤本身
- 通过
*.dsh-theme.json主题包实现导入、导出、分享链接与本地主题库,附带格式校验与回滚 - 在「设置 → 外观 / Theme」下注册独立分节,包含皮肤、壁纸、高级壁纸、强调色、主题包五个功能行
- 持久化跨 DSH 重启:localStorage + 宿主
~/.dsh/dream-skin.json双写,状态文件丢失也能从浏览器侧恢复
技术实现
- 语言: JavaScript(Node 端 ESM + 浏览器端 CJS via
__ModuleLoader__) - 关键依赖:
@deepseek-ai/cordis(插件宿主框架)、@deepseek-ai/dsh-client-runtime/dsh-client-locale/dsh-client-ui-theme(DSH 官方客户端包)、react^18.2 - 架构模式: 标准 DSH 双面插件——Host 端通过
cordis.patch.yml插入dream-skin加载器条目,挂载/dream-skin/api受信任 JSON 持久化接口;Browser 端通过dsh.client声明被dsh-client-modules拉起,注册主题、slots、locale 字典 - 入口文件:
lib/index.js(Host apply)、lib/client.js(Browser apply,含 8 套皮肤 token 与 8 语言字典)
适用场景
希望把 DeepSeek Harness 调成符合自己审美的清透冷调视觉风格、又不想装桌面端注入型换肤工具的普通用户。适合每天长时间盯 DSH Web 写作 / 编码,需要更柔和的对比、更克制的强调色、更耐看的浅深组合,并能随时切换或分享给同事一套自配色方案。
前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DeepSeek Harness (DSH) | ^0.1.0-rc.6 | 由 peerDependencies 锁定,宿主扩展点 ctx.theme / ctx.slots / ctx.locale 必需 |
| Node.js | >=18 | 由 engines.node 声明,仅用于本地开发与测试运行时 |
| 浏览器 | 现代 Chromium / WebKit | 设置面板依赖原生 CSS 变量、backdrop-filter、matchMedia(README 声明) |
| 操作系统 | macOS / Windows / Linux | 跨平台;Host 文件路径使用 process.env.DSH_HOME 或回退到 ~/.dsh/,无平台限制字段 |
安装方式
dsh plugin --profile web add github:RevolutionLA/dsh-dream-skin
配置项
本插件无需额外配置。所有可调项都在 设置 → 外观(Theme) 面板下,以图形化方式呈现,常用项包括:
| 配置 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| 皮肤(Skin) | 单选 | 在 8 套内置皮肤与已导入主题包之间切换 | 跟随系统外观 |
| 壁纸(Wallpaper) | 单选 / 文件 / 滑块 | 选择本地图(自动压缩到 data URL)、粘贴图片 URL 或挑内置渐变 | 无 |
| 壁纸透明度 | 0–100 滑块 | 主内容区与侧边栏的半透明底的可视强度 | 80% |
| 壁纸模糊 | 0–60 滑块 | 给壁纸叠 backdrop-filter 模糊 | 0 px |
| 侧边栏透明度 | 0–100 滑块 | 侧边栏自己的半透明底;可独立于主画布 | 与主画布联动 |
| 强调色(Accent) | 选色盘 / 随机 | 在当前皮肤上叠加一个品牌色,不改皮肤本身 | 跟随主题 |
| 自动弱化 | 开关 | 聚焦任务时让壁纸淡出、不抢注意力 | 关闭 |
| 最近使用壁纸 | 历史 | 最多保留 5 张,点一下换回 | — |
持久化键全部带
dsh-dream-skin:前缀,存在浏览器localStorage;并在每次变更后防抖 200ms 推送到宿主文件~/.dsh/dream-skin.json,固定 origin 的官方 Web 与随机端口的 DSH Desktop 都能跨重启保留。
常见问题
Q: 安装完打开 DSH 看不到「外观 / Theme」分节怎么办?
A: 一定要重启 DSH Web(运行 dsh web),新插件才会被插件管理器发现并加载。重启后进 设置 → 外观(Theme) 即可看到皮肤、壁纸、强调色、主题包五个功能行。
Q: 换好的皮肤 / 壁纸,重启 DSH 后为什么看起来回到默认了?
A: 0.4.0 起插件默认走三层持久化:内存缓存 → localStorage → 宿主文件 ~/.dsh/dream-skin.json。重启时浏览器侧会从宿主文件把保存的皮肤 / 壁纸 / 强调色 / 主题包重新拉回并应用。如果仍丢,请确认 DSH_HOME 是否指向预期目录、或 Web 进程确实被重启过。
Q: 这个插件跟 Codex-Dream-Skin 一样吗?
A: 致敬但实现路径不同。Codex-Dream-Skin 通过 CDP 注入桌面客户端 CSS,本插件走 DSH 官方的 ctx.theme.register / ctx.slots.inject 扩展点,不注入、不改二进制,因此不因 DSH 更新而失效。
Q: 怎么把自配色方案分享给同事?
A: 在设置里点「主题包 → 导入」加载一个 *.dsh-theme.json,或者自己写一个(参考 docs/examples/sample-theme-pack.json),再点「复制分享链接」即可把整包编码进 URL hash 发出去;也可导出文件后用任意渠道分发。导入时会校验格式与必要字段,失败时安全回退,不破坏现有设置。
Q: 卸载后会不会留下残留?
A: 卸载只是停止加载。localStorage 里 dsh-dream-skin:* 的键与 ~/.dsh/dream-skin.json 都还在;重新安装会自动接管,或手动删除即可彻底清理。
Q: 为什么切换皮肤后背景没跟着换?
A: 默认逻辑是「皮肤没自带背景时自动套用该皮肤的 iOS 弥散光渐变」。一旦你手动选过图片 / URL / 渐变,插件会标记为「自定义壁纸」,以后切皮肤就不再覆盖它了——切回「跟随皮肤」需要清掉自定义壁纸。
Q: 能不能完全删掉壁纸回到官方外观?
A: 在「高级壁纸」或主壁纸行点「清除壁纸 / 移除图片」即可,主画布与侧边栏会恢复为该皮肤的不透明色。
上手难度
入门 — 装好之后只在设置面板里点几下,没有命令、没有配置文件、没有需要重启的额外步骤;想自己写主题包再深入看 docs/themes-spec.md。
已知问题与限制
- 首帧可能闪烁(FOUC):插件首次挂载前的瞬间,主题尚未应用,仍是默认外观;现状是「以同源 localStorage 为兜底先渲染再覆盖」,完全消除 FOUC 仍是 Roadmap 项目(README.md:321)。
- 请求体上限 32 MB:
/dream-skin/api单次set超过 32 MB 时返回 413。壁纸以 base64 data URL 存 localStorage,已自动压缩到 ≤2 MB,因此基本不会触达,但单次批量导入大量主题包时需注意。 - Host 通道在随机端口的部署下才有意义:官方 Web 的 origin 固定,理论上 localStorage 够用;
$DSH_HOME/dream-skin.json主要为「每次启动端口都变」的 DSH Desktop 服务,两端行为略有差异。 - 不暴露用户级配置 schema:所有设置都在 UI 上,没有
ctx.config.*形式的可注入配置项;想换 token 需新增内置皮肤或写主题包。
中文 · English · 日本語 · 한국어 · Español · Français · Deutsch · Русский
dsh-dream-skin 🔮
为 DeepSeek Harness 换上一张克制、清透、有质感的「脸」。
原生换肤 · 背景壁纸 · 主题包分享 —— 一条 --dsw-* token 生态内的优雅实现。装一次,用很久。
写代码的地方,可以很安静。
| 🎨 8 套原创主题 | 🖼️ 壁纸 + 弥散光 | 🎯 克制的强调色 | 📦 主题包可分享 |
|---|
1 行安装 · 纯原生(无注入/不改安装包)· 不因 DSH 更新失效
✨ Design Philosophy — 一份关于「什么算高级」的设计声明 · 以 iOS / Linear 的审美为基准,把「高级感」建立在材质的准确与配色的克制上。
⚡ 一句话安装
复制下面这句话给你的 DSH,它自己会装好一切:
请帮我安装 dsh-dream-skin 换肤插件(https://github.com/RevolutionLA/dsh-dream-skin 或 npm 的 dsh-dream-skin),装完告诉我如何重启 DSH Web。
不想麻烦 Agent?命令行一条:
dsh plugin --profile web add dsh-dream-skin && dsh web
🚀 现已发布到 npm! 装好 DSH 后,一条命令即可安装,无需 clone。
致敬 Codex-Dream-Skin。 但实现路径不同:Codex 是往桌面客户端渲染进程 注入 CSS(CDP),而 DSH 本身是 token 驱动的 Web GUI,官方就提供了「第三方插件注册主题」的能力——所以本插件是 纯原生接入,无注入、不改二进制、不因客户端更新失效。
不是官方产品。 仅供美化你的 DeepSeek Harness 工作区。
📸 实机截图
真机效果,非概念图。左:应用某套皮肤后的 DSH 界面;右:设置里的「外观 / Theme」分节。
🏆 为什么值得用(vs 同类)
换个赛道看:全家桶把换肤做成一堆二次元题材的「贴图墙」;我们把换肤做成材质与配色的精细化工艺—— 追求的不是「更花」,而是「更准、更克制、更耐看」,像一块反复推敲的玻璃。审美是我们的护城河。
| 能力 | 本插件 | 全家桶换肤方案 | Codex-Dream-Skin (桌面) |
|---|---|---|---|
| 原生 token 主题,不注入、不改安装包 | ✅ | ✅ | ❌ (CDP 注入) |
| iOS/Linear 式清透冷调材质与配色 | ✅ | ❌ (偏二次元题材) | ❌ |
| 每皮肤克制的高级感弥散光背景 | ✅ | 部分 | ❌ |
| 自定义壁纸 + 透明度/模糊 | ✅ | 部分 | ✅ |
| 主题包导入/导出 + 分享链接 | ✅ | ❌ | ✅ (zip 主题) |
| 每用户强调色 Accent | ✅ | ❌ | 部分 |
| 壁纸 2.0(URL / 渐变 / 每皮肤建议 / 自动弱化) | ✅ | ❌ | ✅ |
| 本地主题包库 + 收藏 + 随机 | ✅ | ❌ | 部分 |
| 校验 + 回滚 | ✅ | 部分 | ✅ |
| 浏览器 Web GUI,天然跨平台 | ✅ | ✅ | ❌ (需桌面 App) |
✨ 功能一览
| 能力 | 说明 |
|---|---|
| 🎨 8 套主题预设(Mirage 幻梦) | 在 设置 → 外观(Theme) 一键切换,浅色 / 深色兼顾 |
| 🖼️ 自定义壁纸 | 上传本地图(自动压缩 ≤2MB),调节透明度 / 模糊 |
| 🔤 内层不透明 | 卡片、输入框、消息气泡不被壁纸盖住,可读性优先 |
| ↩️ 默认还原 | 一键回到 DSH 内置外观(跟随系统) |
| 💾 本地持久化 | 皮肤与壁纸存 localStorage,刷新 / 重开浏览器不丢 |
🚀 进阶能力(P0)
吸取了同类先行项目之短,融入 Codex 换肤的 UX,做了一套差异化能力:
| 能力 | 说明 |
|---|---|
| 📦 主题包格式 + 导入/导出 | 一个 *.dsh-theme.json 主题包 = 格式标记 + 版本 + manifest(id/name/作者/色系/accent/tokens)。可导入文件、一键应用、复制分享链接(编码进 URL hash) |
| 🌈 每用户强调色 Accent | 为当前皮肤叠加一个自定义品牌强调色(overrideTokens 层,不动皮肤本身),12 个典型色块一键选色 + 选色盘 + 随机 + 恢复主题色 |
| 🖼️ 壁纸 2.0 | 本地图 / 图片 URL / 渐变预设,每套皮肤自动建议一张渐变,可自动弱化(聚焦任务时降低干扰);最近使用(最多 5 张)一键换回 |
| 🪟 弹窗不透明度 | 设置 → 外观 →「弹窗不透明度」滑块(0–100%),控制选项弹窗 / 选项卡卡片的底填充透明度——调高文字更清晰,调低可透出背后内容,跟随持久化保存 |
| 🧩 本地主题包库 | 你导入的自定义主题包集中展示,应用 / 收藏 / 移除 一键完成(内置 8 套皮肤在「皮肤」行选择) |
| ✅ 清晰选中反馈 | 切换皮肤时选中态(✓ + 边框)即时跟随,不再残留模糊的白色高亮框 |
| 🎲 换一个试试(surprise me) | 随机挑一个和你当前不同的主题 |
| ⭐ 收藏 | 收藏喜欢的皮肤,快速切换 |
| ✅ 校验 + 回滚 | 导入时会校验格式/必填 token/颜色合法性;失败或移除时安全回退,不做破坏性更改 |
🧩 它是什么形式的插件
它是 DeepSeek Harness 的标准「双面插件」(dsh-plugin)——加载和用法与官方 ui-theme 完全一致。
DeepSeek Harness 的口号是「一切皆插件」:模型、工具、沙箱、会话、UI,乃至 Agent Loop 本身都是插件。
dsh-dream-skin 的本质就是把「换肤」做成一个和官方 UI 包同构的 npm 包:
┌────────────── dsh-dream-skin(标准 dsh-plugin / 双面插件)──────────────┐
│ dsh.bundle → cordis.patch.yml 插入 dream-skin 入口 (host 半边) │
│ dsh.client → lib/client.js(浏览器 bundle) (浏览器半边) │
└─────────────────────────────────────────────────────────────────────────┘
- 安装命令 = 官方唯一安装命令:
dsh plugin --profile web add dsh-dream-skin - 调用的是官方扩展点:
ctx.theme(注册主题)、ctx.theme.overrideTokens(叠加层)、ctx.slots(把 UI 挂进独立的 设置 → 外观 / Theme 分节)。 - manifest 契约与官方一致:
dsh.bundle+dsh.client+exports["./client"]。
也就是说:你装的不是一个旁门左道的脚本,而是 DSH 官方插件体系里的标准皮肤插件。
🖼️ 预览 — Mirage 幻梦系列
以下色卡由各皮肤的真实 token 生成,所见即所得。点开可放大。
abyss · 沉静蓝 | aurora · 极光青 | nebula · 星云紫 | ember · 余烬橙 |
midnight · 午夜黑 | ivory · iOS 扁平 | mist · 液态玻璃 | rose · Material 粉 |
预设一览
| id | 风格 | 特质 |
|---|---|---|
abyss | 🕶️ 沉静蓝 | 冷静深沉的靛蓝,克制不喧哗 |
aurora | 🌌 极光青 | 清冽通透的冷青,自然冷调 |
nebula | 🪐 星云紫 | 深邃漫射的紫青,朦胧神秘 |
ember | 🔥 余烬橙 | 温暖克制的琥珀橙 |
midnight | 🌚 午夜黑 | 极简纯黑,OLED 沉浸 |
ivory | 📐 iOS 扁平 | 极简平白,iOS 系统灰 + 克制的蓝 |
mist | 🧊 液态玻璃 | 清透毛玻璃,半透明 + 模糊 |
rose | 🌸 Material 粉 | 明快彩粉,谷歌 Material 扁平彩色 |
⚡ 快速开始(3 步)
# 1. 安装
dsh plugin --profile web add dsh-dream-skin
# 2. 重启
dsh web
# 3. 打开 设置 → 外观(Theme)→ 皮肤,挑一套 → 完。
装的是 npm 已完成发布的正式包,无需 clone。若
dsh plugin add报 workspace 相关错误,补一个-w即可。
📦 安装
四种方式任选其一,装完重启 DSH Web 即生效(当前会话会中断,但 DSH 会话有磁盘持久化,重启后可以恢复)。
方式一:npm 正式包(推荐,最简单)
dsh plugin --profile web add dsh-dream-skin
方式二:从 GitHub 安装(固定到已验证的提交)
dsh plugin --profile web add 'github:RevolutionLA/dsh-dream-skin#<40位commit>'
固定到 release 对应的 commit,之后
main的新改动不会静默改变已安装代码。
方式三:从 Release tarball 安装(离线 / 不便走 git 的环境)
从本仓库 Releases 下载 dsh-dream-skin-<版本>.tgz(内含构建好的 lib/client.js,安装时无需执行任何 prepare 脚本),然后:
dsh plugin --profile web add ./dsh-dream-skin-<版本>.tgz
方式四:克隆后从本地路径安装(开发迭代)
git clone https://github.com/RevolutionLA/dsh-dream-skin.git
cd dsh-dream-skin
dsh plugin --profile web add .
dsh plugin会把相对路径锚定到你运行命令的目录,装的是指向克隆目录的 link 依赖:改完源码保存,重启 DSH 即生效,无需重新安装。
重启并验证:
dsh web
dsh --profile web --dump-config | grep -A2 dream-skin # 应出现 dream-skin loader 条目
打开 设置 → 外观(Theme),即可看到「皮肤」「强调色」「背景图片 / 高级壁纸」与「主题包」等行。
-w标志在裸add时必需:每个 profile 自带pnpm-workspace.yaml,pnpm 会把它当作 workspace 根,裸加报错ERR_PNPM_ADDING_TO_ROOT。若已加过-w,后续用现有 workspace 即无需重复。
🔄 更新 / 卸载
更新到最新版(装的是 npm 正式包时):
dsh plugin --profile web update dsh-dream-skin
dsh web # 重启生效
若更新后仍显示旧版本,可能是 pnpm 的最小发布年龄(supply-chain)策略挡住了刚发布的新版本: 在 profile 目录执行
pnpm add dsh-dream-skin@latest --config.minimumReleaseAge=0即可绕过。
卸载:
dsh plugin --profile web remove dsh-dream-skin
dsh web # 重启后恢复官方外观
🧩 兼容性
| 项 | 值 |
|---|---|
DeepSeek Harness (dsh) | 0.1.0-rc.6(peerDependencies 以 ^0.1.0-rc.6 对齐) |
| Node.js | >=18 |
| 浏览器 | 现代 Chromium / WebKit(依赖原生 CSS 变量与 matchMedia) |
升级 DSH 到新版本时,请同步更新
package.json里的 peerDependencies。
⚙️ 工作原理
DSH 的主题系统是 token 化的:web 外壳内置 --dsw-* 设计令牌,ThemeRuntime 允许第三方插件注册主题去
覆盖别名层(--dsw-alias-*)。本插件是标准的「双面」插件:
┌─────────────────────────────────────────────┐
│ dsh-dream-skin (双面插件) │
├────────────────────────────┬────────────────┤
Host 半边 │ lib/index.js │ 浏览器半边 │
│ cordis.patch.yml 插入 │ lib/client.js │
│ dream-skin loader 入口 │ __ModuleLoader__│
└────────────────────────────┴────────────────┘
│ │
profile 树加载 /plugins/dsh-dream-skin/client.js
│
┌────────────────────────────────┬────────────────┐
│ │ │
ctx.theme.register(8套皮肤) ctx.theme.overrideTokens(壁纸半透明) ctx.slots.inject('settings.section' + 'settings.dreamSkin.item')
- Host 半边(
lib/index.js):dsh.bundlepatch 层,插入dream-skinloader 入口;apply为空操作, 与官方ui-*包同构。 - 浏览器半边(
lib/client.js):ctx.theme.register(...)注册 8 套皮肤;- 恢复上次保存的皮肤并
ctx.theme.setTheme(...)应用; - 壁纸渲染为
z-index:-1固定背景层,叠加ctx.theme.overrideTokens(...)让主画布 (--dsw-alias-bg-base)与侧边栏(--dsw-specific-sidebar-fill)半透明; - 监听
theme/change,切皮肤 / 深浅色时自动重新着色壁纸洗色层; - 注册独立的 设置 → 外观 / Theme 分节(
settings.section),5 个功能行挂在settings.dreamSkin.item插槽下。
每套皮肤携带自己的 colorScheme(light/dark),驱动 body[data-ds-dark-theme];别名 token 覆盖作为
<body> 内联自定义属性由 ui-layout 的 ThemePresenter 应用。
💼 持久化说明
- 皮肤与壁纸存于
localStorage(键前缀dsh-dream-skin:),只在当前浏览器生效。 - 为何不用 Host settings?DSH 的 Host settings 线路只向浏览器暴露一份白名单命名空间
(
dsh-host-apiproxy的WEB_SETTINGS_NAMESPACES),第三方命名空间会返回settings-not-exposed; 产品本身也把远程浏览器偏好进程化。localStorage恰好匹配这一边界,且跨刷新存活。
🛠️ 开发 / 扩展主题
客户端 bundle 直接以 __ModuleLoader__ 格式编写(即 tsdown 为官方 ui-* 包输出的形态),免构建。
lib/client.js 只能 require 模块表实体:平台种子词(react、react/jsx-runtime、…)与已注册客户端
bundle(@deepseek-ai/dsh-client-runtime/client、…)。
- 新增一套内置皮肤:在
lib/client.js的SKINS数组加一个对象(id+colorScheme+tokens), 它即自动出现在设置里;记得在全部 8 种语言词典(zh/en/ja/ko/es/fr/de/ru)补skin.<id>文案。 - 做一个主题包(推荐分发方式):参考
docs/examples/sample-theme-pack.json, 一个*.dsh-theme.json即可在设置里导入或通过分享链接分发给别人,无需改代码。 - 放你自己的壁纸:把图片丢进
wallpapers/(注意只在你有权限的前提下分发),再在 DSH 的「背景图片」里导入即可。 - 跑校验:
npm test(VM 冒烟测试,覆盖 factory 求值、apply挂载、主题包导入/持久化)。 - 换配色:参考
--dsw-alias-*令牌(完整契约见docs/themes-spec.md)。
📌 Roadmap
- 首版:8 套主题 + 自定义壁纸(透明度 / 模糊)+ 本地持久化
- 主题包格式 + 导入 / 导出 / 分享链接(JSON + manifest + 校验)
- 每用户强调色 Accent + 随机
- 壁纸 2.0(URL / 渐变 / 每皮肤建议 / 自动弱化)
- 本地主题包库 + 一键应用 / 收藏 /「换一个试试」
- 多语言文案与文档(中 / 英 / 日 / 韩 / 西 / 法 / 德 / 俄)
- 在线色板 / 主题预览 Studio(纯前端,浏览器内校验 + 对比度检查)
- 社区主题库(把主题包投稿到仓库 / 在线 Gallery)
- 首帧无闪烁(FOUC)改进
🤝 贡献
欢迎提交 Issue 与 PR!请先阅读 贡献指南,并遵循 Code of Conduct。
⭐ 支持这个项目
喜欢的话,给仓库点个 Star ⭐、在 npm 上点个 👍,或把它转发给你的 DSH 朋友——这会让更多人发现它, 也能激励持续维护。想一起做主题库 / 在线 Studio / 更多主题?欢迎来贡献。
🔒 安全
发现安全问题?请勿直接开公开 Issue——参见 安全策略。
📄 开源协议
🙏 致谢
- 架构与 API 参考:DeepSeek Harness 官方 ui-theme 客户端包。
- 概念致敬:Codex-Dream-Skin。