ไธญๆ–‡ ยท English

# dsh-dream-skin ๐Ÿ”ฎ **Give DeepSeek Harness a face that breathes, feels, and belongs to you.** Native skinning ยท wallpaper ยท shareable theme packs โ€” a romance-engineered project built entirely on DSH's official `--dsw-*` token system. > **TL;DR: code with atmosphere.** โœจ | ๐ŸŽจ 8 original themes | ๐Ÿ–ผ๏ธ wallpaper + opacity/blur | ๐ŸŒˆ one-click accent | ๐Ÿ“ฆ shareable theme packs | |---|---|---|---| > 3-line install ยท purely native (no injection, no installer patches) ยท survives DSH updates [ไธญๆ–‡](./README.md) ยท [Changelog](./CHANGELOG.md) ยท [Project Notes](./docs/PROJECT.md) ยท [Publishing Guide](./docs/publishing-to-npm.md) ![npm version](https://img.shields.io/npm/v/dsh-dream-skin?color=4f83f2&label=npm) ![license](https://img.shields.io/github/license/RevolutionLA/dsh-dream-skin?color=34d399) [![Awesome DSH Plugin](https://awesome-dsh-plugin.com/badge.svg)](https://awesome-dsh-plugin.com) ![node](https://img.shields.io/badge/node-%3E%3D18-6d9af6) ![dsh](https://img.shields.io/badge/dsh-0.1.0--rc.6-blueviolet) ![plugin type](https://img.shields.io/badge/plugin-dual--face%20(dsh.bundle%2Bdsh.client)-4f83f2) ![ci](https://img.shields.io/github/actions/workflow/status/RevolutionLA/dsh-dream-skin/ci.yml?branch=main&label=CI&color=34d399) ![code size](https://img.shields.io/github/languages/code-size/RevolutionLA/dsh-dream-skin?color=orange)
> ๐Ÿš€ **Now on npm!** With DSH installed, add it in one command โ€” no cloning needed: > ```sh > dsh plugin --profile web add dsh-dream-skin > ``` > **Homage to [Codex-Dream-Skin](https://github.com/Fei-Away/Codex-Dream-Skin).** But the approach is different: > Codex injects CSS into the desktop client's renderer via CDP, whereas DSH is a **token-driven Web GUI** that ships > first-class "third-party plugins registering themes". So this plugin is **purely native** โ€” no injection, no binary > patches, and it won't break on client updates. > > **Not an official product.** Just a way to dress up your DeepSeek Harness workspace. --- ## ๐Ÿ“ธ Screenshots > Real screenshots, not mockups. Left: DSH after applying a skin; right: the dedicated **Theme / Appearance** section in Settings.

DSH skin preview    Theme section in settings

--- ## ๐Ÿ† Why it earns a star (vs alternatives) | Capability | Ours | Other DSH skinning | Codex-Dream-Skin (desktop) | |------|:---:|:---:|:---:| | Native token themes โ€” no injection, no installer patches | โœ… | โœ… | โŒ (CDP injection) | | Custom wallpaper + opacity/blur | โœ… | partial | โœ… | | **Theme-pack import/export + share links** | โœ… | โŒ | โœ… (zip packs) | | **Per-user Accent override** | โœ… | โŒ | partial | | **Wallpaper 2.0 (URL / gradient / per-skin suggestion / auto-dim)** | โœ… | โŒ | โœ… | | Local pack library + favorites + surprise-me | โœ… | โŒ | partial | | Validation + rollback | โœ… | partial | โœ… | | **Browser Web GUI, cross-platform natively** | โœ… | โœ… | โŒ (needs desktop App) | ## โœจ Features | Capability | Description | |------------|-------------| | ๐ŸŽจ **8 bundled presets (Mirage)** | Switch instantly under **Settings โ†’ Theme / Appearance**, light & dark | | ๐Ÿ–ผ๏ธ **Custom wallpaper** | Pick a local image (auto-compressed โ‰ค2MB), tune **opacity / blur** | | ๐Ÿ”ค **Opaque inner surfaces** | Cards, inputs, message bubbles stay readable โ€” never washed out | | โ†ฉ๏ธ **Default restore** | Back to DSH's built-in appearance (follow system) in one click | | ๐Ÿ’พ **Local persistence** | Skin & wallpaper stored in `localStorage`, survives reload | ## ๐Ÿš€ Advanced capabilities (P0) Differentiation inspired by existing DSH skin projects plus Codex's skin UX: | Capability | Description | |------------|-------------| | ๐Ÿ“ฆ **Theme-pack format + import/export** | A `*.dsh-theme.json` pack = format marker + version + manifest (id/name/author/scheme/accent/tokens). Import a file, one-click apply, and copy a **share link** (encoded in the URL hash) | | ๐ŸŒˆ **Per-user Accent** | Stack a custom brand-accent over the active skin (`overrideTokens` layer, the skin untouched): **12 one-click preset swatches**, a color picker, **randomize**, and clear | | ๐Ÿ–ผ๏ธ **Wallpaper 2.0** | Local image / **image URL** / **gradient presets**, with a **per-skin suggested gradient** and **auto-dim**; **Recent** (up to 5) to switch back in one click | | ๐Ÿงฉ **Local pack library** | Your imported theme packs in one place; **apply / favorite / remove** in a click (the 8 built-in skins live in the Skins row) | | โœ… **Clear selection feedback** | Switching skins updates the checked/bordered highlight **instantly** โ€” no stale white highlight box | | ๐ŸŽฒ **Surprise me** | Randomly switch to a theme different from the current one | | โญ **Favorites** | Star your favorite skins and switch between them fast | | โœ… **Validation + rollback** | Pack import validates format / required tokens / color legality; failures or removals fall back safely | ## โšก Quick start (3 steps) ```sh # 1. install dsh plugin --profile web add dsh-dream-skin # 2. restart dsh web # 3. open Settings โ†’ Theme / Appearance โ†’ pick a skin โ†’ done. ``` > Installs the published npm package โ€” no cloning. If `dsh plugin add` reports a workspace error, append `-w`. ## ๐Ÿงฉ What kind of plugin is this **A standard dual-face "everything-is-a-plugin" `dsh-plugin` โ€” loaded and used exactly like the official `ui-theme` package.** DeepSeek Harness's motto is *everything is a plugin*: models, tools, sandboxes, sessions, UI, even the Agent Loop itself are plugins. `dsh-dream-skin` ships skinning as an npm package that is **isomorphic with the official UI packages**: ```text โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ dsh-dream-skin (standard dsh-plugin / dual-face) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ dsh.bundle โ†’ cordis.patch.yml inserts the dream-skin entry (host half)โ”‚ โ”‚ dsh.client โ†’ lib/client.js (browser bundle) (browser half)โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` - **Install command = the official one**: `dsh plugin --profile web add dsh-dream-skin` - **Uses official extension points**: `ctx.theme` (register themes), `ctx.theme.overrideTokens` (override layers), `ctx.slots` (mount UI into a dedicated **Settings โ†’ Theme / Appearance** section). - **Manifest contract matches official packages**: `dsh.bundle` + `dsh.client` + `exports["./client"]`. In other words: you are not installing a fringe script โ€” this is a standard skin plugin inside DSH's official plugin system. ## ๐Ÿ–ผ๏ธ Preview โ€” the Mirage series > Previews below are generated from each skin's **real tokens** โ€” what you see is what you get.
abyss
abyss
aurora
aurora
nebula
nebula
ember
ember
midnight
midnight
ivory
ivory
mist
mist
rose
rose
## ๐ŸŽฒ The presets | id | scheme | vibe | |------|--------|------| | `abyss` | ๐Ÿ•ถ๏ธ dark | DeepSeek deep-blue abyss (anchor) | | `aurora` | ๐ŸŒŒ dark | aurora teal-green | | `nebula` | ๐Ÿช dark | cosmic purple | | `ember` | ๐Ÿ”ฅ dark | warm ember orange | | `midnight` | ๐ŸŒš dark | pure-black OLED | | `ivory` | ๐Ÿ“œ light | warm ivory / paper | | `mist` | ๐ŸŒซ๏ธ light | cool blue fog | | `rose` | ๐ŸŒธ light | rose pink / blush | ## ๐Ÿ“ฆ Install ### Option A: From npm (published, **recommended**) ```sh dsh plugin --profile web add dsh-dream-skin ``` Then **restart** the web server: ```sh # stop the running instance, then: dsh web ``` Open **Settings โ†’ Theme / Appearance** to see the **Skins**, **Accent**, **Wallpaper** / **Advanced Wallpaper**, and **Theme Packs** rows. > The `-w` (workspace) flag is needed on a bare `add` because every profile ships a `pnpm-workspace.yaml`; pnpm treats > the profile directory as a workspace root, so a bare add fails with `ERR_PNPM_ADDING_TO_ROOT`. If your profile already > uses the workspace, you won't need to repeat it. ### Option B: From source / a local directory (developers) ```sh dsh plugin --profile web add -w /path/to/dsh-dream-skin ``` ## ๐Ÿ”„ Update / Uninstall **Update to the latest** (when installed from the npm release): ```sh dsh plugin --profile web update dsh-dream-skin dsh web # restart to pick it up ``` > Stuck on an old version after an update? pnpm's minimum-release-age (supply-chain) policy can hold back a > freshly published release. In the profile dir run: > `pnpm add dsh-dream-skin@latest --config.minimumReleaseAge=0` to force it. **Uninstall:** ```sh dsh plugin --profile web remove dsh-dream-skin dsh web # restores the official appearance ``` ## ๐Ÿงฉ Compatibility | Item | Value | |------|-------| | DeepSeek Harness (`dsh`) | `0.1.0-rc.6` (peerDependencies pinned to `^0.1.0-rc.6`) | | Node.js | `>=18` | | Browser | modern Chromium / WebKit (native CSS variables & `matchMedia`) | > When upgrading DSH, bump the peerDependencies in `package.json` accordingly. ## โš™๏ธ How it works DSH's theme system is token-based: the web shell ships `--dsw-*` design tokens, and `ThemeRuntime` lets third-party plugins register themes that override the alias layer (`--dsw-alias-*`). This package is a standard dual-face plugin: ```text โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ dsh-dream-skin (dual-face plugin) โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค Host half โ”‚ lib/index.js โ”‚ Browser half โ”‚ โ”‚ cordis.patch.yml inserts โ”‚ lib/client.js โ”‚ โ”‚ dream-skin loader entry โ”‚ __ModuleLoader__โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ profile tree loaded /plugins/dsh-dream-skin/client.js โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ ctx.theme.register(8 skins) ctx.theme.overrideTokens(wallpaper) ctx.slots.inject('settings.general.item') ``` - **Host half** (`lib/index.js`) โ€” a `dsh.bundle` patch layer inserting the `dream-skin` loader entry; `apply` is a no-op, exactly like the shipped `ui-*` packages. - **Browser half** (`lib/client.js`): 1. registers the 8 skins via `ctx.theme.register(...)`; 2. restores the saved skin and applies it with `ctx.theme.setTheme(...)`; 3. renders the wallpaper as a `z-index:-1` fixed backdrop and stacks `ctx.theme.overrideTokens(...)` making the main canvas (`--dsw-alias-bg-base`) and sidebar (`--dsw-specific-sidebar-fill`) translucent; 4. listens for `theme/change` and re-shades the wallpaper wash on skin / scheme switch; 5. mounts both rows into the `settings.general.item` slot. Each skin carries its `colorScheme` (`light`/`dark`), driving `body[data-ds-dark-theme]`; the alias-token overrides are applied as inline custom properties on `` by ui-layout's ThemePresenter. ## ๐Ÿ’ผ Persistence notes - Skin & wallpaper are stored in `localStorage` (keys prefixed `dsh-dream-skin:`), **per browser**. - Why not Host settings? The Host settings wire only exposes an allowlisted set of namespaces to browser clients (`WEB_SETTINGS_NAMESPACES` in `dsh-host-apiproxy`), so a third-party namespace would answer `settings-not-exposed`; the product itself keeps remote browser preferences process-local. `localStorage` matches that boundary and survives reloads. ## ๐Ÿ› ๏ธ Development / extending themes The client bundle is written directly in the `__ModuleLoader__` 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 seeds (`react`, `react/jsx-runtime`, โ€ฆ) and registered client bundles (`@deepseek-ai/dsh-client-runtime/client`, โ€ฆ). - **Add a built-in skin**: append an object (`id` + `colorScheme` + `tokens`) to the `SKINS` array in `lib/client.js`; it then appears in Settings automatically. Add a `skin.` key to both the `zh` and `en` dictionaries. - **Ship a theme pack (recommended)**: follow [`docs/examples/sample-theme-pack.json`](./docs/examples/sample-theme-pack.json) โ€” one `*.dsh-theme.json` is importable in Settings and shareable via a link, no code changes needed. - **Add your own wallpapers**: drop images into [`wallpapers/`](./wallpapers/) (distribute only what you have rights to), then import them via DSH's "Wallpaper" row. - **Validate**: `npm test` (VM smoke tests covering factory eval, `apply()`, and pack import/persistence). - **Repaint**: reference the `--dsw-alias-*` tokens (full contract in [`docs/themes-spec.md`](./docs/themes-spec.md)). ## ๐Ÿ“Œ Roadmap - [x] v0.1: 8 themes + custom wallpaper (opacity / blur) + local persistence - [x] Theme-pack format + import / export / share link (JSON + manifest + validation) - [x] Per-user Accent + randomize - [x] Wallpaper 2.0 (URL / gradient / per-skin suggestion / auto-dim) - [x] Local pack library + one-click apply / favorites / surprise-me - [ ] Online palette / theme-preview Studio (pure frontend, contrast checker) - [ ] Community theme gallery (submit packs to the repo / online gallery) - [ ] Full i18n copy & docs (zh / en / more) - [ ] First-paint (FOUC) improvement ## ๐Ÿค Contributing Issues and PRs welcome! Please read the [Contributing Guide](./CONTRIBUTING.md) and follow the [Code of Conduct](./CODE_OF_CONDUCT.md). ## โญ Support the project If you like it: star **โญ** the repo, thumbs-up **๐Ÿ‘** on npm, or share it with DSH friends โ€” it helps the project get discovered and keeps it maintained. Want to contribute themes / an online Studio / more skins? Join in. ## ๐Ÿ”’ Security Found a security issue? Don't open a public issue โ€” see the [Security Policy](./SECURITY.md). ## ๐Ÿ“„ License [MIT](./LICENSE) ## ๐Ÿ™ Acknowledgments - Architecture & API reference: the official DeepSeek Harness [ui-theme](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/client/ui-theme) client package. - Concept homage: [Codex-Dream-Skin](https://github.com/Fei-Away/Codex-Dream-Skin).