dsh-plugin-liquid-glass
A liquid glass UI plugin for the DSH desktop app. Works alongside most wallpaper plugins. Currently supports dark mode only.
Install
dsh plugin --profile web add dsh-plugin-liquid-glass
Sandbox test results
| Stage | Result |
|---|---|
| 1 install | ✓ |
| 2 list | ✓ |
| 3 mount | ✓ |
| 4 boot | — |
Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).
README
dsh-plugin-liquid-glass
适用于 DSH 桌面端的液态玻璃美化插件。输入框、消息气泡、侧栏与顶栏等主要界面元素
改为液态玻璃材质,可搭配各类壁纸插件使用(需深色模式)。
Liquid-glass beautification plugin for DSH desktop. Gives the composer, message
bubbles, sidebar, top bar and menus a liquid-glass material. Works alongside
wallpaper plugins. Dark mode only.
覆盖范围(市场会拿描述对代码核查,所以写清楚实际做了什么):
输入框 · 用户消息气泡 · 助手回复卡片 · 侧栏工作区块 · 顶栏与标签页 ·
右侧栏面板 · 侧栏控件药丸 · 菜单与弹窗材质。
材质为半透明玻璃:底色 + 背景模糊 + 内高光 + 细描边 + 投影。
⚠ 措辞备注:此处原来写的是"输入框(真折射)"。当前发布版(0.1.72)的材质是
背景模糊(backdrop-filter: blur),不含位移折射 ——
git show HEAD:artifacts/client.js里dsh-lens出现 0 次。
折射(SVG 高度场 + feDisplacementMap 透镜)那一版保留在
snapshot/lens-refraction 分支上,未合入主线,因此也不在本发布版里。
市场会拿描述对代码核查,所以这里不写"折射",等它真正发布后再改回来。
与壁纸插件的关系:按"能力"而非"品牌"判定是否已有壁纸在场,分三层探测
(显式契约 / 各家已知钩子 / 通用结构判据),因此各种壁纸插件都能搭配使用。
你也可以用 data-dsh-glass-canvas="off" 显式关掉插件自带的背景。
状态:v0.1.72(已发布到 npm)
- 三个可调开关(「设置 → 液态玻璃」):省token建议 / 启用开场动画 /
启动DSH后进入新会话。后两者联动 —— 开场动画不可用(开关关闭,或画质档位为
极低/低)时,「进入新会话」会置灰并按关闭处理。
关掉开场动画后,插件整套启动介入一起停(不注入任何可见性闸门、不建黑场、
取消入场编排),启动流程交回 DSH 官方加载。
- 首次安装会问一次画质。装好后第一次启动(等开场动画演完)会弹出五档选择,
让你自己挑一个 —— 不同机器的显卡能力差别很大,选高了会卡。
之后随时可以在「设置 → 液态玻璃」里改。
- 只适配 DSH 桌面端。浏览器环境会整体停用(不注册任何 UI、不改动界面),
并弹一次说明。这不是"没测过浏览器",是明确不支持。
- 暂不适配浅色模式。材质只针对深色底调过,所以外观会被锁定在深色;
点「浅色」或「跟随系统」会被拦下并说明原因。
如需解除锁定:在~/.dsh/下创建空文件glass-theme-lock-off。
- 已在 Windows 桌面端实测(材质、开场、主题锁定、更新通道均可用)。
## ⚠️ 请先读这一段(尤其是想改代码的人)
本插件是开源软件(MIT)。你可以随意修改它 —— 但请先明白三件事:
1. 改了就不是官方版本了。 一旦你(或你用的 AI)改动过源码,
之后出现的任何问题由修改者自行承担,开发者不负责修复。
这是 MIT 许可证的正式条款(LICENSE 里有完整的 AS IS 段落与修改说明),
不是口头声明。
2. 你能在 5 秒内知道自己改没改过。 在插件目录下执行:
```bash
node verify-integrity.mjs
```
它会逐文件比对官方发布的 SHA-256 清单:
- 显示「未做任何修改」→ 你这份是官方版本,有问题尽管反馈
- 显示「这份代码被动过」→ 已经被改过,请先重装回官方版本再排查
3. 想恢复官方版本,重装一次即可:
```bash
dsh plugin --profile desktop add dsh-plugin-liquid-glass
```
---
为什么加这段:开源代码挡不住别人修改(那是开源的定义),
但"有没有被改过"应该是一个能判定的事实,而不是各说各话。
所以每次官方发布都会附带逐文件校验清单(INTEGRITY.json),
让这件事变得可查、可证。
两条更新通道
用户端「设置 → 液态玻璃 → 启用快照版更新」决定查哪条线:
开关 · 查到 · npm dist-tag · 说明
关闭(默认) · 正式版 · latest · 稳定
开启 · 快照版 · snapshot · 内测,可能不稳定
两条线靠 dist-tag + 预发布版本号隔开:快照版带 -snapshot 后缀,
永远小于同号正式版,所以不会把用户从正式版"顶上"去。
为什么装插件必须走 npm(而不是 GitHub 源)
实测(2026-10-04,国内网络):
地址 · 结果
github.com · 超时 12 秒
raw.githubusercontent.com · 连不上
registry.npmmirror.com(npm 镜像) · 200 OK,57 ms
所以:GitHub 用来给人看代码,npm 用来给用户下载(国内自动走镜像加速)。
github: 源还有一个缺点:它拉取整个仓库,没有裁剪机制。
npm 侧靠 files 白名单 + .npmignore 裁到约 2.5 MB。
效果
位置 · 效果 · 层级定位
输入框(composer) · 半透明玻璃 —— 背景模糊 + 指针跟随高光 · 导航层
用户消息气泡 · 玻璃外观 —— 自发光渐变 + 发丝描边 + 内高光 · 内容层
助手回复卡片 · 玻璃外观 + 900px 收窄 + 平滑生长 · 内容层
⚠ 事实更正:本表原写"真折射 —— SVG 位移贴图 + 模糊 + 指针高光"。
当前发布版 0.1.72 里,输入框的材质只有背景模糊
(backdrop-filter: blur(var(--dsh-glass-blur, 32px)) saturate(...) brightness(...)),
代码里没有 SVG 位移贴图。折射版在 snapshot/lens-refraction 分支上,未合入主线。
下面那段讲的是折射工作想服务的设计意图,保留作背景说明,不代表当前发布版已有该能力。
关于"导航层 / 内容层"的区分:苹果在 WWDC25 明确玻璃只适用于导航层。
输入框悬浮在滚动内容之上、背后有连续滚过的东西可供折射采样;
消息内容背后只有聊天底,做折射会扭曲正文、不可读,所以只做玻璃外观。
这个区分不是洁癖,是必要的。
安装
方式一:双击 安装插件.cmd(最省事)
从本仓库下载 安装插件.cmd,双击运行即可。
⚠ Release 页面的附件叫 install-liquid-glass.cmd,就是同一个文件。
GitHub 的 Release 附件名不支持中文,上传时会退化成无意义的 default.cmd,
所以附件用了英文名;本仓库里的源文件保持中文名。内容完全一样
(都是 3515 字节,SHA-256 相同)。
它会自己找到 DSH 自带的命令行工具(找不到时会在几个常见安装目录里找),
然后执行下面的 npm 安装命令,并告诉你成功了没有。
⚠ 它装的是 npm 上的包,不是从本仓库直接装。
原因是源码没有构建产物,而 pnpm 10+ 从github:源安装会触发allowBuilds
构建授权、需要用户手动点同意。走 npm 更稳,而且国内自动走镜像加速。
所以这个方法不需要插件市场,但仍然需要联网下载。
方式二:命令行
dsh plugin --profile desktop add dsh-plugin-liquid-glass
为什么必须走 npm:实测(2026-10-04,国内网络)github.com 超时 12 秒、
raw.githubusercontent.com 连不上,而 npm 国内镜像 57 ms。
用 github: 源还会拉取整个仓库(含开发产物,约 13 MB);
npm 侧靠 files 白名单裁到约 2.5 MB。
方式三:插件市场
在市场里搜「液态玻璃」。代码来源与其他方式完全相同,只是多一个入口。
装完都要重启 DSH(材质样式表需要重新注入)。
首次启动会弹一次画质选择(等开场动画演完),选一个适合你机器的即可 ——
选高了会卡。之后可以在「设置 → 液态玻璃」里改。
卸载
dsh plugin --profile desktop remove dsh-plugin-liquid-glass
卸载后界面会回到 DSH 原本的样式 —— 插件只做注入,不改动 DSH 自己的文件。
开发:改动本仓库时怎么装
下面这些是开发者自用的流程,普通用户不需要。
web profile(仅用于看 CSS 效果;材质逻辑在浏览器上不生效)
dsh plugin --profile web add link:<本目录绝对路径>
官方 Electron 桌面端
桌面端的 desktop profile 由应用独占管理,CLI 会直接拒绝:
error: profile "desktop" is managed exclusively by the Electron application
绕开方式:把配置复制成一个临时 profile 名安装,再把配方同步回去。
$P = "$env:USERPROFILE\.dsh\profiles"
Copy-Item "$P\desktop" "$P\glass-tmp" -Recurse
dsh plugin --profile glass-tmp add link:<本目录绝对路径>
# 同步配方(保留 desktop 原有的 cordis.patch.yml)
foreach ($f in 'package.json','pnpm-lock.yaml','cordis.patch.yml','cordis.yml','pnpm-workspace.yaml') {
Copy-Item "$P\glass-tmp\$f" "$P\desktop\$f" -Force
}
robocopy "$P\glass-tmp\node_modules" "$P\desktop\node_modules" /E
Remove-Item "$P\glass-tmp" -Recurse -Force
为什么用「结构化注入行」而不是 tapIndex
这是本插件最关键的设计决定,也是踩坑换来的。
dsh web 和官方 Electron 桌面端把页面送上屏幕的方式完全不同:
dsh web DSH web 服务器提供 index.html
→ tapIndex 的字符串改写能到达页面
Electron 桌面端 页面由 dsh-app:// 协议从磁盘直读
(dsh-web-frontend/dist/index.html)
→ index.html 从不经过 web 服务器,tapIndex 永远到不了
桌面端真正认可的是结构化注入表:@deepseek-ai/dsh-desktop-host 会调用
ctx.webServer.collectIndexInjections(),把行通过 boot payload 发给页面侧解释器。
行类型是闭集(读自 @deepseek-ai/dsh-host-webserver):
global | script | script-src | script-preload | style | html
注意没有 style-src —— 外部样式表无法表达为行,所以 CSS 作为**内联
style 文本**下发。这同时是更稳的选择:整个效果不依赖任何路由可达。
插件优先用结构化行(两端通吃),tapIndex 仅作为老版本运行时的回退。
现状(v0.1.72)
已在 Windows 桌面端实测通过
- 三处玻璃(输入框 / 用户气泡 / 助手卡片)与侧栏、顶栏、弹窗材质
- 开场动画:黑场 → 用户视频完整播完 → 三拍(标题 / 卡片行 / 输入框)同刻入场
- 首帧遮挡:黑场层在窗口出现的同一帧就是纯黑,动画前不
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::8,最后更新 2026-11-06