DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Transparent — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins

dsh-transparent

Transparent

非官方 DSH 桌面插件:使窗口变为半透明,从而显示桌面壁纸。仅支持 Windows。还附带一个真正具有折射效果的液态玻璃合成器,不过应用的布局使其几乎不可见。

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:969246694/dsh-transparent#802162024faaf0a3c10b7e42492427f1c29205bc
README兼容性版本

兼容性与来源证明

Transparent 以 dsh-transparent 发布,当前版本为 1.4.6。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
github
Registry 更新时间
2026/10/16

版本

1.4.6stable
2026/9/28
1.4.5stable
2026/9/28
1.4.4stable
2026/9/28
查看其余 12 个版本收起版本
1.4.3stable
2026/9/28
1.4.2stable
2026/9/28
1.4.0stable
2026/9/28
1.3.3stable
2026/9/28
1.3.2stable
2026/9/28
1.3.1stable
2026/9/28
1.3.0stable
2026/9/28
1.2.1stable
2026/9/27
1.2.0stable
2026/9/27
1.1.0stable
2026/9/27
1.0.1stable
2026/9/27
1.0.0stable
2026/9/27

相关插件

正在加载相关插件…

最新版
1.4.6
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
web
许可证
MIT
发布源
github
GitHub
★ 0
周下载
71
最近提交
2026/9/28
查看源码 ↗项目主页 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 ui-customization 分类下经过校验的插件。

Dafeiyudsh-dafeiyu由 DeepSeek Harness 会话事件驱动的原生桌面端 BigFish companion。Codex Ui@michengai/dsh-codex-uiDSH Codex UI — 为 DeepSeek Harness Web 提供 Codex 风格侧栏、工作区会话树、全局搜索和轮次导航Orbdsh-orb可安装的 Orb 捆绑包。插入 Computer Use 预设和悬浮球主机。Pet@linxin666/dsh-pet适用于 dsh Web GUI 的多宠物伴侣插件:由注册表驱动的浮动宠物,可响应模型活动,支持为每只宠物命名、抚摸/喂食互动以及亲密度评分

README

dsh-transparent

中文 | English

Make the DSH desktop window translucent so your wallpaper shows through.

An unofficial plugin for the DeepSeek Harness desktop client. Windows only.

It also contains a genuinely refracting liquid-glass implementation for the composer. Be aware before installing: on this app's layout the refraction is barely visible, because nothing scrolls behind the composer. What you will actually see is a translucent window. Read Known limitations below — it is short and it is the honest part.


What it does

EffectStatusWhere it is implemented
Window becomes translucent, wallpaper shows throughWorksHost half (Node) spawns a PowerShell helper that sets Win32/DWM window attributes
The app's opaque background is clearedWorksBrowser half (CSS)
The composer refracts its backdrop instead of just blurring itImplemented; barely visible in practiceBrowser half: an SVG displacement map generated at runtime, referenced from backdrop-filter: url()

Why the glass is barely visible

Refraction needs something behind it to bend. A displacement map moving a flat colour does nothing at all — every pixel is identical, so moving them changes nothing.

Two things then have to be true for the effect to show, and only the first is:

  1. The page must not be opaque. ✅ The wallpaper does reach the screen, via the translucent window.
  2. Content must pass behind the composer. ❌ The composer occupies its own row at the bottom of the window and the message list ends above it. Nothing ever scrolls behind it, so the lens has nothing to bend.

The refraction itself is real and verified — the composer's backdrop-filter resolves to url(#dsh-transparent-liquid), and rendering the same filter over scrolling text produces obvious distortion. It is the app's layout that keeps that text out of the lens.

Making it visible means changing the application's layout so the message list runs behind the composer. That was attempted three times and reverted three times; see Known limitations.

Install

From npm — recommended, and the only option that works without reaching GitHub. In the Add plugin dialog set the install source to 中国⼤陆镜像源 (registry.npmmirror.com) and enter the package name:

dsh-transparent

From GitHub — needs working access to github.com:

plugin_manager install_bundle  https://github.com/969246694/dsh-transparent

Pin the release instead of tracking main:

plugin_manager install_bundle  https://github.com/969246694/dsh-transparent#v1.0.0

From a local path — for a checkout or an unpacked tarball:

plugin_manager install_bundle  <path-to-this-repo>

Then restart the client. Window transparency is applied automatically at startup — there is no script to run by hand.

Why the mirror only helps the npm route: a GitHub URL is classified as a git spec and fetched by git, bypassing npm entirely. The install-source setting therefore has no effect on it. That is why this package is published to npm at all.

Configuration

These options appear in the application's own settings UI — no YAML editing needed. The plugin declares a Config schema, which is how a plugin gets a form.

cordis.patch.yml still works and provides the initial values:

config:
  alpha: 215          # whole-window opacity
  darkTheme: true     # pin the interface to the dark theme
  updateCheck: true   # say so when a newer version exists
  updateSource: ""    # override where the version is read from

Why the schema is hand-written. Declaring a schema normally means z.object({...}) from @deepseek-ai/schemastery — but a plugin installed under <profile>/node_modules cannot import that package. It ships inside the application bundle and does not resolve from there (ERR_MODULE_NOT_FOUND). So the schema is a plain object shaped the way the settings service reads it: type, dict, meta.volatile, and a toJSON() returning schemastery's { uid, refs } form. The plugin stays dependency-free.

Only fields marked volatile are editable in the UI, and volatile changes the shape a field is delivered in — apply() receives { get() } rather than the value, which is why every option is read through a small unwrapping helper.

Updates

The plugin manager has no update affordance and no version check — there is no outdated, upgrade or checkForUpdate anywhere in it. Nothing in the application will ever tell you a newer version exists, so the host half asks once per start, against the registry your profile is configured to use, and says so in the console:

[transparent] v1.2.1 is available (running 1.2.0) — reinstall the plugin to update

The check costs one small request and a failure is silent — an offline machine, a private registry or a blocked route are none of them worth a warning.

It only reports. It never installs. To update: reinstall through the plugin manager, or run install_bundle dsh-transparent, which re-runs pnpm and takes the newest version in range. Either way the new version starts on the next restart.

A working copy is never checked: unless the package sits under node_modules — where a published install lives — the check is skipped, so running from a checkout cannot be mistaken for an installed release.

updateSource points the check somewhere other than the registry: any URL serving {"version":"x.y.z"} (the plugin appends /latest).

alphaEffect
255Window stays fully opaque. Wallpaper not visible; content at full crispness
215Default. Wallpaper visible, content slightly faded
150Wallpaper obvious, content clearly faded

darkTheme

Translucency over a light interface looks washed out — the wallpaper bleeds through as grey rather than as glass — so the plugin pins the theme to dark on activation. Default true; set it to false to leave your choice alone.

It writes the durable ui-theme.preference setting through the host's settings service, which is why the change survives a restart and shows up in the settings UI. It reads first and does nothing if the theme is already dark, and it passes the revision it read back to the write, so a change you made in the meantime is not silently overwritten.

Uninstalling the plugin does not put the previous preference back. If you want your own choice respected, set darkTheme: false.

Design tokens live in dsh-transparent.css:

TokenMeaningDefault
--tp-blurBlur applied before refraction2px
--tp-saturateSaturation of the refracted backdrop130%
--tp-liftBrightness lift1.12
--tp-lensRefraction strength, in px of displacement55
--tp-glass-fillGlass tintrgb(19 19 19 / 0.30)
--tp-rimRim highlight strength0.10

Edit dsh-transparent.css, run node build.mjs, and the browser half hot-reloads.


How the liquid glass works

Blur is not liquid glass. Refraction is. A real lens bends the backdrop along the shape's normal: vertically at the top and bottom edges, horizontally at the sides, diagonally at the corners — and leaves the flat middle alone.

That description is a normal map, and feDisplacementMap is what consumes one: red is the x offset, green is the y offset, and 128 means "no offset". Because the map is built centred on 128, the middle of the pane leaves the backdrop untouched while the rim bends it. That is the mechanism, not a convention to remember.

The map is generated at runtime with canvas, at the composer's own aspect ratio:

  1. draw the rounded rectangle, white on black
  2. blur it — this bevel stands in for glass thickness
  3. Sobel the bevel — gives the surface normal at every pixel
  4. write (128 + dx, 128 + dy) into red and green

Aspect ratio matters more than it looks. The map is stretched onto the element with preserveAspectRatio="none", and the composer is a very wide, very short bar — around 10:1. Building a 3:1 map and letting it stretch compresses the vertical bevel several times over, and the top and bottom edges are exactly the edges that produce refraction on a bar like this. Get the aspect wrong and the glass goes flat, with no error anywhere.

color-interpolation-filters must be sRGB. The linearRGB default flattens the displacement and the result collapses back into a plain blur.


Architecture

Styles are applied with CSS selectors that match by structure, not by JavaScript marking elements.

That choice is the whole design, and it came out of a failure. Marking elements with data-* attributes and generating CSS for them cannot avoid flicker:

the app replaces its own elements when it re-renders
  -> the replacement carries no marker
  -> the rule stops applying
  -> the plugin notices, and re-applies

As long as re-application exists, there is a window in which the element is painted unstyled. The only way to close it is to delete the re-application.

So the browser half does exactly two things, both once:

  1. Resolves how deeply the composer's card sits above the editable element, then appends one rule with a :has() selector for that depth. Depth is a property of the app's component tree, not of any re-render, so resolving it once is enough. Every step of the chain is a direct-child step, so exactly one element matches — no nesting, no compounding.
  2. Builds the lens map, which CSS genuinely cannot express.

There is no MutationObserver, no scheduler, no rate limiter, no re-marking. If the composer is replaced a thousand times, the browser matches it a thousand times and none of our code runs.

Repository layout

dsh-transparent.css      design tokens + structural rules (source of truth)
build.mjs                splices the CSS into lib/client.js; guards it
verify.mjs               30+ checks against stubs; no browser needed
lib/index.js             host half  — Node, spawns the window helper
lib/client.template.js   browser half — classic script, __CSS__ placeholder
lib/client.js            GENERATED by build.mjs — do not edit
assets/window-glass.ps1  Win32/DWM helper, run by the host half

Three traps worth knowing

1. .ps1 files must be pure ASCII. powershell.exe reads a script as ANSI unless it has a UTF-8 BOM. A UTF-8 file without one turns non-ASCII comments into mojibake, and a stray byte inside a string can break parsing outright — which is exactly what happened here once, with Chinese comments. assets/window-glass.ps1 contains no non-ASCII characters and should stay that way.

2. A client half runs under traps. setTimeout, setInterval, clearTimeout, clearInterval, fetch and require are shadowed by throwing traps inside a dynamically evaluated client half. All timing must run on requestAnimationFrame. verify.mjs fails if any of them is called.

3. Disabling a feature means removing its stylesheet, not just not writing it. An injected <style> element does not disappear when the bundle stops writing it. Reverting a rule in code while the old element is still in the page leaves the old rule applying. The plugin explicitly removes stale stylesheets on activation for this reason.


Known limitations

  • Windows only for window transparency. On other platforms the browser half still works; only the translucency is skipped.
  • The wallpaper cannot be refracted. backdrop-filter only ever sees content inside the page. The desktop is composited by the OS, outside the browser, so the glass refracts the app's own content — text, code blocks, cards — but never the wallpaper itself. Not a tuning problem; it is where the API ends.
  • Chat text does not pass behind the composer. The composer occupies its own row at the bottom of the window and the message list ends above it, so nothing scrolls behind the glass. Making it do so requires changing the application's layout — attempted three times, reverted three times. See below.
  • If the app changes its DOM depth, the :has() selector stops matching and the glass simply disappears. This is a quiet degradation, not a flicker.

Troubleshooting

The browser half logs one line at startup:

[transparent] selector div:has(> * > * > :is(...)) | card 952x98 ratio 9.7:1 | depth 3

If the glass is missing, check that line first. depth 0 means the composer could not be found.

From the console:

window.__tp.layout()   // dump the layout chain around the composer
window.__tp.depth()    // composer depth, 0 if not found
window.__tp.retry()    // re-resolve and reinstall

Host-half activity is appended to %TEMP%\dsh-transparent.log.

Development

node build.mjs     # splice CSS into the client bundle (guarded)
node verify.mjs    # contract, packaging, trap and YAML checks

build.mjs refuses to emit a theme that declares backdrop-filter in CSS, or that uses bare container selectors. Both rules exist because breaking them caused real, visible damage during development.

An honest note on what was tried and reverted

Making chat text scroll behind the glass was attempted three times and reverted three times. Every attempt damaged the layout; the worst left the sidebar one character wide.

The cause was the same each time: modifying another application's layout without being able to see it. A helper that picked "the tallest scrollable element outside the composer" picked a layout wrapper rather than the message list — and verifying that a class suffix is unique says nothing about whether the element is the right one.

It is recorded here because a reader deserves to know which parts of this plugin are load-bearing and which stopped being attempted, rather than discovering it from the issue tracker.

Licence

MIT — see LICENSE. Unofficial, and unaffiliated with DeepSeek — see NOTICE.