dsh-private-background
给 DeepSeek Harness 的界面换一张底图。
本地图片、动图(GIF / 动态 WebP / APNG)、视频、渐变、纯色五种来源。模糊、压暗、取景位置、面板浓度都能调,对话区和输入框各自独立一档,字体颜色可以按背景明暗自动反色。
所有素材只存在你自己的电脑上,不上传、不进会话记录、不经过模型。
非官方插件,由第三方开发,DSH 官方不提供支持。它通过官方插件接口注册面板与样式,不修改客户端文件、不注入脚本、不触碰账号与凭据 —— 但装任何插件前都建议先看一眼代码。
版本 1.3.1 · 在 Windows + DSH 桌面版 0.2.1-rc.2 上开发和测试。
安装
前置条件:Node.js ≥ 20、DSH 自带 dsh 命令、pnpm 在 PATH 上(DSH 用 pnpm 装插件,缺了会直接报 pnpm was not found)。
# 桌面版
dsh plugin --profile desktop add github:lubanaishuxue/dsh-private-background
机器上没有 git 时用源码包地址:
dsh plugin --profile desktop add https://github.com/lubanaishuxue/dsh-private-background/archive/refs/heads/main.tar.gz
从本地目录装(自己改代码时用这个):
dsh plugin --profile desktop add D:/path/to/dsh-private-background
装完重启 DSH(插件行和客户端 bundle 都是启动时扫描的)。重新打开窗口不算。
装好后有两处入口,是同一个表单:
- 左栏底部的壁纸图标 —— 点一下主区域直接变成设置页
- 设置 → 插件 → 界面背景
一分钟上手
- 点左栏底部的壁纸图标
- 背景类型选「图片」
- 点「添加图片」,选一张 —— JPG、PNG、GIF、WebP、MP4 都行
- 拖压暗和面板不透明度,直到字看得清
- 人没在画面中间,就在预览图上拖着挪
- 想让壁纸铺满整个窗口(含左侧对话栏),打开「同时应用到左侧对话栏」
改完即时生效、自动保存,没有「应用」按钮,也不用重启。
设置页
左栏图标打开的这个页面是透的 —— 调滑杆的时候壁纸就在它后面,改一个数立刻能看见,不用来回切。切回对话就点原来的对话图标,设置页会自己退出去。
从上到下六块:
| 区块 | 内容 |
|---|---|
| 背景类型 | 关闭 / 图片 / 渐变 / 纯色 |
| 来源 | 图库、6 个渐变预设、或色板 + 自选颜色 |
| 取景位置 | 在预览图上拖,或拖「左右」「上下」两条滑杆(只对图片有) |
| 作用范围 | 「同时应用到左侧对话栏」开关 |
| 字体颜色 | 跟随主题 / 自动 / 浅色 / 深色 / 自定义 |
| 观感 | 5 条滑杆 + 质感开关 |
最底下两个东西:左边「恢复默认」,右边一行诊断读数 样式 / 激活 / 框架 / 三栏(见排错)。
背景类型
| 选项 | 效果 |
|---|---|
| 关闭 | 恢复 DSH 原样,什么都没变 |
| 图片 | 用图库里的图 —— 静图、动图、视频都可以 |
| 渐变 | 6 个内置预设:极光、夜幕、落日、深海、青柠、纸感 |
| 纯色 | 6 个色板,或点「自选颜色」调任意色 |
图库:点一张立即切换,不用确认。每张图上有「删除」;动图和视频的缩略图左下角带一个角标。
动图与视频
选文件时可以直接选 GIF、动态 WebP、APNG、MP4、WebM。三者的像素存在方式不一样,处理方式也不一样:
| 类型 | 怎么存 | 怎么放 |
|---|---|---|
| 静图(JPG / PNG / 静态 WebP 等) | 缩到 2560px 再压成 JPEG | background-image |
| 动图(GIF / 动态 WebP / APNG) | 原始字节,一个字节都不动 | background-image 指向原始字节 |
| 视频(MP4 / WebM) | 原始字节 | 壁纸层里放一个静音循环的 <video> |
动图和视频不能过 canvas —— 一张 GIF 画进 canvas 再读出来就只剩第一帧了。所以它们按原样存进 IndexedDB,代价是不再受「缩到 2560px」的保护,因此单独设了 96 MB 的单文件上限。
视频会抽第一帧做封面,这一帧同时用于图库缩略图、设置页预览、以及判断壁纸该配黑字还是白字 —— 亮度测量从来不读视频本体。
系统开了「减少动态效果」时,动图和视频都只显示那一帧。
同一个文件不会加两次
再选一张图库里已经有的图,不会再出现第二格。插件会认出这是同一份内容,直接切到那一张,并提示「这个文件已经在图库里了」。图片、动图、视频都管。
认的是内容,不是文件名 —— 同一张图改个名字再选照样拦得住;两张不同的图碰巧同名也不会被误判。
做法是给每一份存下来的内容算一个 SHA-256 指纹,比的是这串值。按「存下来的那份」而不是「你选的那个文件」算,是因为照片在存之前会被重新压成 JPEG,原文件的字节根本没留下来。
老图库不用管:之前加进去的图会在插件启动后自动补上指纹(一次就够,补完写回)。
一次加一整个文件夹
图库下方有一个**「浏览文件夹」**。选一个文件夹,插件把里面所有图片和视频列出来 —— 已经加过的直接不出现,剩下的点一张加一张,加完就从列表里消失。底部会告诉你「3 张已经在图库里,没有列出来」。
判断「这个文件我是不是已经有了」靠的是上传时记下的文件名 + 大小 + 修改时间,不解码不哈希,所以扫描是秒出的。
为什么不能只记路径、不存图片? 浏览器不给。网页拿到的文件对象里只有文件名、大小、类型,没有路径;就算有,刷新一次之后也没权限再读那个位置 —— 否则任何网页都能扫你的硬盘。所以图片必须复制一份进本机数据库,这也是 96 MB 上限和 2560px 缩图的由来。
为什么每次都要重新选一次文件夹? 同一个原因:插件没法「记住这个文件夹,下次自动打开」。换来的是不用在文件对话框里一个个挑。
⚠️ 已知缺口:在这个功能之前加进去的图没有记这三样,所以它们会照常出现在列表里。点下去不会重复添加(指纹会拦住并提示),只是多一步。
取景位置
图比窗口宽(或高)的时候,cover 会把两边裁掉。裁掉哪边由你决定 —— 在设置页的预览图上直接拖,人物就跟着回来了。
- 也可以拖「左右」「上下」两条滑杆,或点「居中」回到正中。
- 每张图各记各的位置,竖构图照片和横构图视频本来就该裁在不同地方。
- 新传一张图从居中开始,不继承上一张的偏移 —— 偏移是这张图的构图,不是界面风格。
- 某个方向没有多余部分可裁(比如竖图放进横窗口的上下方向),那个方向拖不动。这不是坏了。
作用范围
同时应用到左侧对话栏 —— 默认关。
- 关:只有右边工作区换背景,左侧对话列表保持 DSH 原样。
- 开:整窗铺满,左侧栏也变成半透明玻璃,标题栏跟着通栏。
字体颜色
| 模式 | 行为 |
|---|---|
| 跟随主题 | 什么都不改,用 DSH 自己的配色(默认) |
| 自动 | 看背景实际明暗,暗背景配浅字、亮背景配深字 |
| 浅色 / 深色 | 固定,不看背景 |
| 自定义 | 你指定主色,其余几级文字由它自动推导 |
「自动」是推荐选项,尤其你会在亮图和暗图之间切换时 —— 它每次都重算,不会停在上一张图的判断上。
五条滑杆
前四条永远在,第五条会跟着「质感」换 —— 这是唯一一个容易找不到的控件。
| 滑杆 | 范围 | 管什么 | 什么时候动它 |
|---|---|---|---|
| 模糊 | 0–40px | 壁纸本身糊多少 | 只在你不想看清图片细节时加 |
| 压暗 | 0–80% | 全场压一层黑 | 字看不清主要调这个,不是模糊 |
| 面板不透明度 | 0–100% | 三栏的底色浓度 | 想多露壁纸就降,字发虚就升 |
| 对话区不透明度 | 0–100% | 中间聊天区单独一档 | 同上,只管对话区 |
| 输入框不透明度(实心时) | 0–100% | 发消息那个框单独一档 | 框里的字发虚就升 |
| 玻璃模糊(液态玻璃时) | 0–40px | 所有磨砂面板的模糊量 | 想要更「磨砂」就加 |
默认值:模糊 20 · 压暗 15 · 面板 50 · 对话区 0 · 输入框 50。
质感:实心 / 液态玻璃
- 实心(默认):各块按上面的不透明度铺底色,没有模糊、没有高光。
- 液态玻璃:输入框、底部状态栏、头部胶囊、代码块、文件卡片、消息气泡一起变成磨砂半透明,边缘带一道高光。字压在图上更容易读,因为背景被磨平了。
切到液态玻璃后,第五条滑杆从「输入框不透明度」变成「玻璃模糊」。
设置弹窗(Ctrl+, 打开的那一个,含「费用」「桌宠配置」等分区)走同一套材料:面板半透明 + 磨砂,里面的卡片是一层薄白纱浮在面板上,分区之间没有分界。
每张背景各记一套参数
换一张图,滑杆会跳回那张图自己上次调好的值,不会互相污染。
| 跟着背景走 | 全局共用 |
|---|---|
| 模糊、压暗、取景位置、面板不透明度、对话区不透明度、输入框不透明度、质感 | 玻璃模糊、作用范围、字体颜色 |
分界线是**「这张图长什么样」还是「界面长什么样」**。玻璃模糊是材质 —— 一个对话框随背后的图换磨砂强度,读起来像 bug 而不像功能。字体和作用范围同理。
- 新传一张图,继承你当前这套 —— 传图是换画,不是换风格。唯一例外是取景位置(新图从居中开始)。
- 删掉一张图,它那套参数一起删。
- 删掉正在用的那张,壁纸滑到顶替它位置的那一格;图库空了才回到「关闭」。
- 「恢复默认」只重置当前这张背景的滑杆,不动你选的那张图。
切换壁纸时的过渡
换壁纸不是硬切。新图在 0.6 秒里淡入,旧图原样留在下面,中间不会黑一下。
- 图片之间、渐变之间、色值之间,以及三者互相切换,都走同一套。
- 拖滑杆不过渡 —— 那是调参,不是换画。
- 关闭壁纸仍然是立刻消失,没有东西可淡。
- 系统开了「减少动态效果」时自动关掉过渡。
- 连点图库不会叠出鬼影:每次点击都把新点的那张另起一层叠在最上面淡入,下面的一动不动,最后一次点击之后 0.6 秒落定。
调参顺序(省事的顺序)
大多数人第一次会直接拖模糊,然后发现字还是看不清。建议这个顺序:
- 先选图,别急着拖滑杆
- 压暗调到字能读 —— 绝大多数「看不清」是压暗不够,不是模糊不够
- 面板不透明度微调:想多露壁纸就降,字发虚就升
- 模糊最后加,只在不想看清图片细节时用
- 想要磨砂质感再开液态玻璃,然后调玻璃模糊
原因:模糊是把壁纸磨平,代价是图没了;压暗只是把它压黑,图还在。先压暗,后模糊。
出问题了
设置页最底下那行读数
样式 / 激活 / 框架 / 三栏 后面跟四个符号,一眼定位四类故障:
| 读数 | 显示 ✗ 意味着 |
|---|---|
| 样式 | 样式表没注入 —— 插件根本没跑起来 |
| 激活 | <html> 没被标记上 |
| 框架 | 没定位到 DSH 的外壳结构 |
| 三栏 | 栏数不对,宿主布局变了 |
「框架」或「三栏」有 ✗ 时页面还会多出一行错误提示。提 issue 时把那一行贴上来,它比截图有用。
常见现象
| 现象 | 原因 / 办法 |
|---|---|
| 左边栏还是实色 | 「同时应用到左侧对话栏」没开。默认行为,不是 bug |
| 标题栏是一条侧栏色的实心横带 | 同上。只改工作区时,标题栏不属于工作区 |
| 右上角三个按钮是实色块 | 整窗模式下按钮颜色取自整张壁纸的平均明暗,角落特别亮或特别暗时对比度不理想 |
| 设置页背景是纯黑 | 不是 bug —— 这一页故意不铺底,因为它是你唯一想看看壁纸效果的地方 |
| 右侧面板打开才变玻璃 | 故意的,收起时不画 |
| 图传上去变糊了 | 大图会被压到 2560px 宽再存,省内存 |
| 换图后滑杆全变了 | 不是 bug,每张图各有一套参数 |
| 左栏图标点了没反应 | 插件没加载成功。看 DSH 启动日志里有没有 dsh-private-background |
已知边界
- 作用范围靠 DSH 的外壳结构定位,宿主大改布局会失效。失效时设置页会提示,其他界面不受影响。
- 只改工作区时,标题栏整条是侧栏色 —— 想让壁纸顶到窗口最上沿就切成整窗。
- WebP 一律按动图处理(靠 MIME 判断不了「这张 WebP 到底动不动」),所以静态 WebP 不享受缩图,会比你预期的大一些。
- 视频壁纸会一直解码,比静图费电。笔记本上建议插电时再用。
- 只在 Windows + DSH 桌面版上测试过,macOS / Linux 未验证。
- 插件停用后所有改动自动撤回,DSH 恢复原样,设置留在本机。
隐私
- 图片、动图、视频只写进 DSH 自己页面下的 IndexedDB,不出这台电脑。
- 没有网络请求,没有统计上报,没有账号。
- 卸载插件后,数据库随该页面的存储一起清掉;也可以在设置页里逐张删除。
开发
node tools/smoke-test.cjs # 306 项:模块契约、槽位注册、样式表、状态机
node tools/store-test.cjs # 94 项:存储与判重
改动 client.js 后跑这两个,全绿再提交。设计取舍、宿主结构取证、每个断言在钉什么 —— 在 ENGINEERING.md。
No comments yet. Be the first to write one.