xiaoyangcheng84-svg/dsh-skin-manager
一个可以管理皮肤的dsh插件
已收录
4
Market
Bundle 已验证
功能介绍
DSH Web GUI 皮肤管理器:自动发现已安装皮肤,在独立设置页一键互斥切换,热载入无需重启。
适合
- 安装了多个皮肤、希望集中发现和切换它们的 DSH Web 用户。
- 需要皮肤互斥启用,并能快速恢复官方默认外观的用户。
- 同时使用兼容皮肤与 dsh-market、需要协调启用状态的安装环境。
不适合
- 始终使用 DSH 默认外观、不需要管理皮肤的用户。
- 不涉及 Web GUI 皮肤机制的非 Web DSH profile。
- 缺少预构建客户端 bundle,或没有可识别皮肤/主题元数据的皮肤包。
README
dsh-skin-manager
| English | 中文 |
A lightweight skin manager for the DeepSeek Harness web GUI. It discovers
every installed skin (any package carrying a skin.json plus a prebuilt
client bundle), lists them in a dedicated Settings → Skins page, and lets
you switch the active skin with one click — mutually exclusive, hot-reloaded
without restarting dsh web.

Features
-
Dynamic discovery — scans the web profile’s
node_modulesfor packages withskin.json+ prebuiltlib/client.js, and also recognizes market themes withoutskin.json(a client bundle plus acordis.patch.ymlthat inserts a theme/skin loader row, e.g.dsh-skin/ Codex-style skin ordsh-kimino-theme). Newly installed skins appear automatically; no registry regeneration, no code changes. -
Dedicated settings page — a
settings.sectionentry (idskins, order 20) in the settings sidebar, next to General / Models. - One-click apply — pick a skin and click Apply; the profile patch is rewritten and DSH’s config watcher hot-reloads it within seconds. Refresh the page to activate.
-
Mutually exclusive — exactly one skin is active at a time (the active
one gets an
insertrow, every other skin adisabled: truerow). - Restore default — the Default option disables every skin and returns to the stock DeepSeek Harness appearance.
Install
dsh plugin --profile web add github:xiaoyangcheng84-svg/dsh-skin-manager
Then restart dsh web (or rely on the market’s hot install). Open
Settings → Skins after a page refresh.
Requires git for the
github:source install; alternatively install from a local checkout withdsh plugin --profile web add link:<path>.
Usage
- Open Settings → Skins.
- See Default plus every installed skin (e.g. 深海女仆工坊 / maid-atelier).
- Click Apply on a skin → click Refresh when prompted → the skin activates.
- Click Apply on Default to restore the stock look.
Skin package protocol
Any package is recognized as a skin when:
- it lives under the profile’s
node_modules(top-level or@scope/name), - it ships a
skin.json(id,name,package,accent,bodyAttr,tagline, optionalwiring.id— the same fields used by dsh-deep-whale / dsh-web-ui skins), and - it ships a prebuilt client bundle (
exports["./client"]orlib/client.js).
A market theme without skin.json is also recognized when:
- it has
dsh.clientanddsh.bundle.patch, - its
cordis.patch.ymlcontains a simpleinsertrow, - the package name, row id, or (for immediately-loaded client bundles) description/keywords mention theme/skin, and
- it ships a prebuilt client bundle.
dsh-market coordination
When dsh-market is installed, applying a skin from this manager also:
- rewrites the same
cordis.patch.ymlmanaged section (boot persistence), - updates dsh-market’s
.dsh-market/state.jsonso it cannot re-disable the chosen skin at boot, - unmounts stale dsh-market hot mounts that would otherwise overlap the newly applied skin, and
- syncs dsh-market’s in-memory disabled state before rewriting the patch, so the market’s self-healing guard cannot immediately re-disable the skin you just applied — no manual “use” click in the market is needed.
How switching works
Switching rewrites the managed section of the profile’s cordis.patch.yml
(between # --- dsh-skin-manager managed --- markers):
- active skin → an
- insert:row; - every other skin →
- id: <rowId>+disabled: true.
Non-skin user patch rows (e.g. dsh-market) are preserved untouched.
API
The host half mounts three routes under /api/skin-manager:
| Route | Method | Purpose |
|---|---|---|
/api/skin-manager/list |
GET | List installed skins + current active id |
/api/skin-manager/apply |
POST |
{ id } or { id: "official" } to switch |
/api/skin-manager/bundle |
GET |
?id=<skinId> serve a skin’s client bundle |
Development
The client bundle is written directly in the __ModuleLoader__ bundle format
(the same shape tsdown emits for the shipped ui-* packages), so no build
step is required. lib/client.js may require only module-table entities
(platform seed words like react and registered client bundles).
License
MIT
常见问题常见问题
在启用了 DSH 的终端中执行已验证命令 dsh plugin --profile default add github:xiaoyangcheng84-svg/dsh-skin-manager。命令会解析公开 package 元数据,并保持插件与本页展示的目录身份一致。
兼容性以页面上展示的 bundle 与 profile 状态为准。如果某个 profile 尚未检测到,请先保持禁用,并在生产启用前阅读仓库文档。
GitHub 链接和 activity 元数据是 release 与维护状态的来源。新版本发布后重新查看本页,确认目录已经观察到最新版本。