xiaoyangcheng84-svg/dsh-skin-manager
一个可以管理皮肤的dsh插件
Listed
4
Market
Bundle verified
What it does
Skin manager for the DSH web GUI: discovers installed skins and switches the active one from a dedicated Settings page, mutually exclusive, hot-reloaded without restart.
Best for
- DSH Web users with multiple installed skins who want one place to discover and switch them.
- Users who want mutually exclusive skin activation and quick return to the stock appearance.
- Installations combining compatible skins with dsh-market and needing coordinated activation state.
Not ideal for
- Users who always keep the stock DSH appearance and do not manage skins.
- Non-web DSH profiles where the Web GUI skin mechanism is irrelevant.
- Skin packages without the required prebuilt client bundle or recognizable skin/theme metadata.
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
Frequently Asked QuestionsFAQ
Use the verified command dsh plugin --profile default add github:xiaoyangcheng84-svg/dsh-skin-manager in a DSH-enabled shell. The command resolves the public package metadata and keeps the plugin attached to the catalog identity shown on this page.
Compatibility follows the bundle and profile status shown above. If a profile is not detected, keep the plugin disabled there and check the repository documentation before enabling it in production.
The GitHub link and activity metadata are the source of truth for releases and maintenance. Revisit this page after a new release to confirm the catalog has observed the latest version.