让窗口透出桌面壁纸,界面分层雾面且文字清晰
30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/23 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add YSDLNGF/dsh-acrylic-light该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · desktop
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 11 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 84 处,展示前 63 条)
- 读取本地文件plugin/index.js:89
const raw = readFileSync(configPath(), 'utf8') - 写入本地文件plugin/index.js:101
mkdirSync(dirname(file), { recursive: true }) - 写入本地文件plugin/index.js:102
writeFileSync(tmp, JSON.stringify(config), 'utf8') - 写入本地文件plugin/index.js:103
renameSync(tmp, file) - 执行外部命令固定命令plugin/index.js:118
const text = execFileSync('reg', ['query', 'HKCU\\Control Panel\\Desktop', '/v', 'Wallpaper'], { - 读取本地文件plugin/index.js:142
if (!existsSync(path)) continue - 读取本地文件plugin/index.js:143
const st = statSync(path) - 读取本地文件plugin/index.js:151
const bytes = readFileSync(path) - 发起网络请求plugin/client.js:949
const response = await fetch(WALLPAPER_URL, { cache: 'no-cache' }) - 发起网络请求plugin/client.js:1110
return fetch(NOTICE_API, { cache: 'no-store' }) - 发起网络请求plugin/client.js:1123
fetch(NOTICE_API, { - 读取本地文件install.mjs:52
if (existsSync(candidate)) return candidate - 写入本地文件install.mjs:96
mkdirSync(outDir, { recursive: true }) - 读取本地文件install.mjs:101
if (!existsSync(full)) throw new Error(`缺少插件文件:${full}`) - 读取本地文件install.mjs:102
files.push({ name: `package/${name}`, data: readFileSync(full) }) - 读取本地文件install.mjs:135
const manifest = JSON.parse(readFileSync(join(SOURCE, 'package.json'), 'utf8')) - 写入本地文件install.mjs:137
writeFileSync(tgz, gz) - 读取本地文件install.mjs:148
if (c && existsSync(c)) return c - 读取本地文件install.mjs:158
if (!existsSync(join(SOURCE, 'package.json'))) { - 执行外部命令来自配置/变量install.mjs:194
execFileSync(nodeExe, [pnpm, 'add', tgz, '--config.confirmModulesPurge=false'], { - 写入本地文件install.mjs:216
if (!args.dryRun) writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`, 'utf8') - 写入本地文件install.mjs:265
copyFileSync(patchPath, backup) - 写入本地文件install.mjs:266
writeFileSync(patchPath, out.join('\n'), 'utf8') - 执行外部命令来自配置/变量install.mjs:291
const out = execFileSync(process.execPath, [patcher, '--asar', args.asar, ...(args.dryRun ? ['--dry-run'] : [])], { encoding: 'utf8' }) - 读取本地文件patch-asar.mjs:56
if (!existsSync(asarPath)) { - 读取本地文件patch-asar.mjs:69
if (!existsSync(from)) fail(`找不到备份 ${from}`) - 写入本地文件patch-asar.mjs:70
copyFileSync(from, asarPath) - 读取本地文件patch-asar.mjs:78
const buffer = readFileSync(asarPath) - 写入本地文件patch-asar.mjs:236
writeFileSync(join(HERE, '_dryrun-main.js'), patched, 'utf8') - 写入本地文件patch-asar.mjs:243
mkdirSync(backupDir, { recursive: true }) - 写入本地文件patch-asar.mjs:244
copyFileSync(asarPath, join(backupDir, 'app.asar')) - 写入本地文件patch-asar.mjs:251
writeFileSync(temporary, output) - 读取本地文件patch-asar.mjs:256
const check = readFileSync(temporary) - 写入本地文件patch-asar.mjs:269
renameSync(asarPath, `${asarPath}.glass-original`) - 删除本地文件patch-asar.mjs:271
rmSync(`${asarPath}.glass-original`, { force: true }) - 读取本地文件patch-asar.mjs:284
console.log(` 归档:${asarPath}(${(statSync(asarPath).size / 1048576).toFixed(1)} MB,大小未变)`) - 读取本地文件uninstall-all.mjs:37
if (c && existsSync(c)) return c - 读取本地文件uninstall-all.mjs:57
if (existsSync(candidate)) return candidate - 读取本地文件uninstall-all.mjs:107
if (existsSync(own)) candidates.push(own) - 读取本地文件uninstall-all.mjs:112
if (existsSync(p)) candidates.push(p) - 读取本地文件uninstall-all.mjs:116
if (args.asar && existsSync(`${args.asar}.glass-original`)) { - 读取本地文件uninstall-all.mjs:124
entries = readdirSync(root, { withFileTypes: true }) - 执行外部命令来自配置/变量uninstall-all.mjs:193
execFileSync(process.execPath, [pnpm, 'remove', PLUGIN, '--config.confirmModulesPurge=false'], { - 删除本地文件递归uninstall-all.mjs:212
if (!args.dryRun) rmSync(pluginDir, { recursive: true, force: true }) - 删除本地文件递归uninstall-all.mjs:219
if (!args.dryRun) rmSync(cacheDir, { recursive: true, force: true }) - 写入本地文件uninstall-all.mjs:236
if (!args.dryRun) writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`, 'utf8') - 写入本地文件uninstall-all.mjs:265
copyFileSync(patchPath, backup) - 写入本地文件uninstall-all.mjs:266
writeFileSync(patchPath, out.join('\n'), 'utf8') - 写入本地文件uninstall-all.mjs:298
renameSync(args.asar, probe) - 写入本地文件uninstall-all.mjs:299
renameSync(probe, args.asar) - 写入本地文件uninstall-all.mjs:314
copyFileSync(backup, args.asar) - 删除本地文件递归uninstall-all.mjs:334
rmSync(backupDir, { recursive: true, force: true }) - 删除本地文件uninstall-all.mjs:352
if (!args.dryRun) rmSync(join(profileDir, old), { force: true }) - 读取本地文件uninstall.mjs:37
if (!existsSync(manifestPath)) { - 读取本地文件uninstall.mjs:43
if (!existsSync(targetDir)) { - 删除本地文件递归uninstall.mjs:46
rmSync(targetDir, { recursive: true, force: true }) - 读取本地文件uninstall.mjs:53
const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) - 写入本地文件uninstall.mjs:64
writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`, 'utf8') - 读取本地文件uninstall.mjs:71
const patchText = existsSync(patchPath) ? readFileSync(patchPath, 'utf8') : '' - 读取本地文件uninstall.mjs:71
const patchText = existsSync(patchPath) ? readFileSync(patchPath, 'utf8') : '' - 读取本地文件uninstall.mjs:81
if (existsSync(patchPath)) { - 写入本地文件uninstall.mjs:86
writeFileSync(patchPath, cleaned, 'utf8') - 读取本地文件verify-asar.mjs:20
const buffer = readFileSync(asarPath)
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DeepSeek Harness 桌面端:Windows 亚克力材质 + 分层磨砂面板
README
由 DeepSeek 最新模型翻译生成dsh-acrylic-light
本项目的代码与文档均由 AI 编写。
从需求讨论、逆向 DSH 窗口参数、调试、到这份 README,全部由 AI 智能体与用户协作完成。
详见文末「关于本项目」。
DeepSeek Harness 桌面版的透明轻薄亚克力主题。
窗口透出桌面壁纸,由 Windows 系统 Acrylic 材质负责模糊;页面分层雾面,输入栏与浮层保持可读。
效果 · 安装 · 插件市场 · 卸载 · 已知限制
效果
同一套主题,换不同壁纸的效果 —— 壁纸的颜色和明暗会透上来,界面跟着变,但文字始终清晰:
| 示例 1 | 示例 2 |
| 示例 1 | 示例 2 |
| 示例 3 |
| 示例 3 |
| 区域 | 表现 |
| 主面板 / 顶栏 | 完全透明,透出壁纸,模糊由系统 Acrylic 完成 |
| 侧栏 / 三列 | 极淡底色(8%–10%),保留层次 |
| 输入栏 | 透明雾面玻璃,文字在输入栏上沿硬断(不钻进输入栏背后) |
| 悬停预览 / 菜单 / 工具提示 | rgb(20 22 28 / 18%) + blur(12px) |
| 设置面板 / 对话框 | rgb(26 28 34 / 78%) + blur(24px) |
| 代码块 | rgb(20 22 28 / 55%),保证长段可读 |
展开完整文档(README 剩余 1 节)
dsh-acrylic-light
本项目的代码与文档均由 AI 编写。
从需求讨论、逆向 DSH 窗口参数、调试、到这份 README,全部由 AI 智能体与用户协作完成。
详见文末「关于本项目」。
DeepSeek Harness 桌面版的透明轻薄亚克力主题。
窗口透出桌面壁纸,由 Windows 系统 Acrylic 材质负责模糊;页面分层雾面,输入栏与浮层保持可读。
效果 · 安装 · 插件市场 · 卸载 · 已知限制
效果
同一套主题,换不同壁纸的效果 —— 壁纸的颜色和明暗会透上来,界面跟着变,但文字始终清晰:
| 示例 1 | 示例 2 |
| 示例 1 | 示例 2 |
| 示例 3 |
| 示例 3 |
| 区域 | 表现 |
| 主面板 / 顶栏 | 完全透明,透出壁纸,模糊由系统 Acrylic 完成 |
| 侧栏 / 三列 | 极淡底色(8%–10%),保留层次 |
| 输入栏 | 透明雾面玻璃,文字在输入栏上沿硬断(不钻进输入栏背后) |
| 悬停预览 / 菜单 / 工具提示 | rgb(20 22 28 / 18%) + blur(12px) |
| 设置面板 / 对话框 | rgb(26 28 34 / 78%) + blur(24px) |
| 代码块 | rgb(20 22 28 / 55%),保证长段可读 |
深色主题下文字会自动提亮:label-primary/secondary/tertiary 及底层 bluish-200/300/400/600/700 一并改为白色系,否则深底上发灰。
为什么窗口能透出壁纸
窗口材质(backgroundMaterial)是 Electron BrowserWindow 的构造参数,只存在于主进程。插件跑在独立的 Node 进程里,require('electron') 直接报 Cannot find module 'electron',拿不到窗口对象 —— 所以没有纯插件方案,必须给 app.asar 打一次补丁(同类插件也一样)。本插件把「打补丁」做成了 一键脚本,双击一次即可完成:退出→等字节补丁→校验→自动重启。
安装
本插件已在插件市场(dsh-market)上架,也支持从 GitHub 直接安装。二选一即可。
方式一:从插件市场安装(推荐,最简单)
1. 打开 Harness → 设置 → 插件,进入插件市场
2. 切到「主题」分类,搜 dsh-acrylic-light(或「透明亚克力」)
3. 点击安装,确认来源,重启提示后重启
安装完成后进入 设置 → 通用 → 透明亚克力,把「启用」打开。
插件市场安装只装页面一半。窗口要透出壁纸还需要补丁 —— 见下方「第 2 步补丁」。
方式二:从 GitHub 地址安装
1. 打开 Harness → 设置 → 插件(内置那一页,不是插件市场)
2. 点 「添加插件」,输入:
https://github.com/YSDLNGF/dsh-acrylic-light
也接受这几种等价写法:
https://github.com/YSDLNGF/dsh-acrylic-light.git
github:YSDLNGF/dsh-acrylic-light
Harness 会 clone 到 ~/.dsh/profiles/desktop/node_modules/dsh-acrylic-light、登记 bundles,然后提示重启。
第 2 步(两种方式都需做):让窗口透出壁纸 —— 双击一次即可
只装插件只改了页面样式,窗口本身仍是不透明的。这一步让壁纸透出来:
下载补丁包 zip 解压,然后双击其中的 enable-transparency.cmd。
补丁包直接把整套脚本打包好了,无需整仓下载:releases/dsh-acrylic-light-patch.zip。
或者 clone 本仓库后,直接在仓库根目录双击 enable-transparency.cmd(内容相同)。
它会:
1. 等你自己从托盘退出 Harness(它会一直等,直到进程消失)
2. 自动给 app.asar 打等字节补丁(主窗口加 backgroundMaterial: acrylic,标题栏 overlay 改透明)
3. 校验补丁确实写进归档
4. 自动重启 Harness
你只需要退出一次,剩下它自己完成。
命令行等价: powershell -ExecutionPolicy Bypass -File .\apply-when-closed.ps1
补丁只在改动 main.js 的几处属性,文件总大小不变(等字节修补),所以不会破坏 asar 的其他条目。锚点对不上时脚本直接失败退出,不动已安装文件。
插件市场上架
本插件已被 awesome-dsh-plugin 仓库收录,市场目录见 data/plugins/YSDLNGF__dsh-acrylic-light.yml,分类为 theme,会出现在插件市场的「主题」Tab,支持一键安装、切换、卸载。
仓库自带的 contrib/YSDLNGF__dsh-acrylic-light.yml 是提交给市场的源文件,与市场上线版保持一致。
卸载
推荐:用 Harness 自带的卸载按钮
设置 → 插件(内置那页)→ 找到 dsh-acrylic-light → 点 「卸载」。
和卸载其它插件完全一样,不需要额外步骤。卸载只会移除插件本身, 窗口材质补丁仍留在 app.asar 里(想连它一起还原,见下)。
连同窗口材质一起还原
node uninstall.mjs
powershell -ExecutionPolicy Bypass -File .\restore-asar.ps1
两者都做完再重启,恢复原生外观。
卸载按钮点了没反应 / 报错?
这通常是插件的登记状态不一致。官方卸载依赖四处状态同时正确:
| 位置 | 内容 |
| package.json → dependencies | "dsh-acrylic-light": "github:YSDLNGF/dsh-acrylic-light" |
| package.json → dsh.profile.bundles | 数组里要有 "dsh-acrylic-light" |
| cordis.patch.yml | - insert: 下要有 id: dsh-acrylic-light |
| node_modules/dsh-acrylic-light | 插件目录存在 |
最常见的坑是第 2 项缺失:插件装上了(依赖和目录都在),却没被登记进 bundles。这时卸载按钮在 bundles 里找不到它,就会失败。
手动补登记(~/.dsh/profiles/desktop/package.json):
"dsh": {
"profile": {
"bundles": [
"@deepseek-ai/dsh-base",
"@deepseek-ai/dsh-web-app",
"dsh-acrylic-light"
]
}
}
补好后重启 Harness,卸载按钮就能正常识别了。
若提示文件被占用(DSH 仍在运行),重启后运行 cleanup-uninstall.ps1 清理残留。
设置与实时调参
设置页:设置 → 通用 → 透明亚克力,只保留「启用」开关。关闭即恢复原生外观。
控制台实时调参(F12 → Console,无需重启):
glass() // 看当前参数
glass({ enabled: false }) // 一键关闭
glass.reset() // 回默认
往版有 alpha / noise 滑块,已在视觉方案稳定后移除。想改配色直接编辑 plugin/client.js 顶部的 GLASS_STYLE,每个值旁都注明了由来。
这个仓库里都有什么
plugin/ 是插件本体,其余是透明的补丁工具与安装脚本。没有构建步骤,即插即用:
| 文件 | 作用 | 需要编译吗 |
| plugin/client.js | 插件本体(页面样式 + 输入栏硬裁) | ❌ |
| plugin/index.js | 插件宿主半部(提供桌面壁纸路由) | ❌ |
| patch-asar.mjs | 给 app.asar 打窗口材质补丁的工具 | ❌ Node 直接跑 |
| enable-transparency.cmd | 一键:等退出→打补丁→校验→重启 | ❌ 双击即可 |
| apply-when-closed.ps1 | 上面的脚本主体 | ❌ |
| restore-asar.ps1 | 还原补丁 | ❌ |
| verify-asar.mjs | 校验补丁是否写进归档 | ❌ |
| install.mjs / uninstall.mjs | 命令行安装 / 卸载插件 | ❌ |
| 卸载.cmd | 双击卸载入口 | ❌ |
用 Node 18+ 或 PowerShell 即可。没有构建步骤。
已知限制
- 插件无法自己打开窗口材质(实测结论)。窗口材质是 BrowserWindow 的构造参数,而插件宿主跑在独立 Node 进程里 —— require('electron') 直接报 Cannot find module 'electron',拿不到窗口对象。
Electron 30+ 的 win.setBackgroundMaterial() 运行时 API 同样需要窗口对象,这条路也不通。所以「透出桌面壁纸」只能靠补丁改 app.asar。
- 窗口材质补丁在 Harness 更新后失效。更新会覆盖 app.asar,重跑一次 apply-when-closed.ps1(或 node patch-asar.mjs --asar <路径>)即可。
- 改的是宿主程序。请自行评估风险;本仓库提供备份与还原路径,且补丁脚本在锚点不匹配时会直接退出、不动已安装文件。
- Acrylic 失焦会变实。Windows 降级材质行为,无法绕过。
介意可改用 -Material mica。
- 输入栏硬裁依赖移动 React 节点。聊天内容滚到输入栏上沿会被硬切,这是输入栏透明的必然代价;冷启动已做防抖动保护,正常情况下重启不空白。
关于本项目
本项目的代码与文档全部由 AI 编写。
从用户一句"我想让 harness 有透明轻薄亚克力效果"开始,确认需求、逆向 main.js 里的窗口参数、发现 backgroundColor 与 backgroundMaterial 互斥、逐层定位"发灰"来源、把侧栏收起按钮位移的 bug 定位到 backdrop-filter 创建包含块、到最终的分层雾面方案 ——包括 plugin/client.js 里的每一条规则、每一个数值、这几百行中文注释,以及这份 README,都出自 AI Agent 之手(与用户多轮协作完成)。
也走了不少弯路。 曾经连续多轮在错误假设上打转,以为调 backdrop-filter 的 blur 值就能糊掉背后的文字,直到做像素测量才发现它从未生效;也曾把"插件市场"和内置的"添加插件"混为一谈,写出了错误的安装说明;还曾用「纯 CSS 蒙版」和「绝对定位」两种方式裁输入栏,要么切线随文本滚动、要么输入栏不再压缩滚动容器而裁切失效,直到改用「把输入栏座作为 flex 兄弟」才真正实现固定位置硬裁。
这些失败结论都被写进了代码注释和「已知限制」,因为知道什么行不通,和知道什么行得通同样有用。
如果你也在做类似的事,希望这个仓库能替你省掉那些来回试错的夜晚。
欢迎提交 Issue 或 PR。
许可证
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
YSDLNGF/dsh-acrylic-light
让窗口透出桌面壁纸,界面分层雾面且文字清晰
相关插件 · 桌面端
Codex 任务面板chuspeeism/dashi-taskboard
现代化可灵活嵌入的任务面板,支持 Codex、DeepSeek Harness
★ 3,409已汉化DSH
71.7
多智能体自进化开发平台Prism-Shadow/penguin-harness
统一、稳定的 Agent 自进化框架全自动优化:任意模型 · 任意算法 · 任意 Benchmark
★ 3,111已汉化DSH
71.1
桌面宠物PC2005-cloud/dsh-pet
DSH 桌面宠物:一行命令装好即用的透明动画小桌宠,支持多开、大小位置随心配置;还内置 DIY 素材链,能用 AI…
★ 5,341已汉化DSH
71
多端 Agent 工作台GCWing/OpenBitFun
OpenBitFun 是一个高度可定制的开源 Agent 工作台,让任务按你的方式持续推进。
★ 3,449已汉化DSH
70.8
DSH Desktopanywhere-labs/dsh-desktop
为 DeepSeek Harness DSH 插件生态打造的现代化桌面端解决方案。万物皆「插件」,桌面本身也是「插件」。
★ 34,532已汉化DSH
70.7
桌面宠物伴侣OpenPetsHQ/openpets
桌面伴侣平台,带宠物、插件,还能选配本地智能体集成。
★ 1,353已汉化DSH
70.2
这是你的仓库?认领条目