🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

透明亚克力主题 YSDLNGF/dsh-acrylic-light

DeepSeek Harness
YSDLNGF11 天前有提交已提供中文文档扫描:含敏感能力

让窗口透出桌面壁纸,界面分层雾面且文字清晰

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
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 11 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
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
预览分享卡片长什么样 ↓YSDLNGF/dsh-acrylic-light
分享 · DeepSeek Harness Hub
YSDLNGF/dsh-acrylic-light

让窗口透出桌面壁纸,界面分层雾面且文字清晰

这是你的仓库?认领条目

回到顶部