# AEMEATH Theme for DeepSeek Harness [中文说明 / Chinese README](README.md) Sakura petals at dusk by the Fading Lake, with a faint glow of the Void — a violet-rose theme for the **DeepSeek Harness Web** GUI. ![theme preview](assets/aemath-poster.jpg) - **Full reskin**: a light "Sakura Dawn" and a dark "Sakura Night" palette, covering the whole `--dsw-*` design-token set — not just a swapped primary colour - **Brand colour**: violet-rose `#963f86` (light) / `#c96f9e` (dark), wired through buttons, links, selection, scrollbars and code blocks - **Conversation background art**: the key art, processed into a soft watermark behind the chat column (a fixed full-screen layer faded out by a left-edge mask — no dependency on any build-hashed component class name) - **Chibi badge**: the round avatar at the bottom-left, with a white ring, violet outline and soft glow - **Favicon and title**: the *Flying Snowfluff* pixel seal as favicon, page title `DeepSeek Harness - AEMEATH Theme` - **Zero requests**: stylesheet, key art and favicon are all inlined — the plugin fetches nothing ## Install This is a **client plugin**: it takes effect on a page refresh. ### From the plugin market Settings → **Plugin Market** → search `aemath` → one-click install → refresh the page. ### CLI (`dsh web`'s web profile) ```powershell dsh plugin --profile web add dsh-theme-aemath ``` Then **restart `dsh web`**. ### Manual enable (local directory or tarball install) If the package is already in the profile but not loaded yet, add an insert entry to the profile's `cordis.patch.yml` (`~\.dsh\profiles\web\cordis.patch.yml`): ```yaml - insert: - id: ui-theme-aemath name: 'dsh-theme-aemath' ``` Then restart `dsh web`. > The Electron desktop client reads the **`desktop` profile**, and `dsh plugin` does not touch it by design. There, let DSH install it from inside a desktop session — just ask: "install dsh-theme-aemath". ### Disable it Any one of these: ```yaml # ~\.dsh\profiles\web\cordis.patch.yml - id: ui-theme-aemath disabled: true ``` …or comment out the insert entry, or hot-disable it from Settings → Plugins. The theme disappears and the stock palette comes back; the plugin leaves nothing injected behind. ## What it touches Only colour tokens and two decorative layers. No component structure is modified: | Covered | How | | --- | --- | | Every `--dsw-*` token | redefined under `html body`, light/dark switched by `[data-ds-dark-theme]` | | Conversation background art | `html body::before`, `z-index: 50` (above content, below overlays), `pointer-events: none` | | Chibi badge (bottom-left) | `html body::after`, `z-index: 999`, `pointer-events: none` | | Favicon / page title | swapped inside the client plugin's `ctx.effect`; restored on unload | Because it relies only on `body` pseudo-elements and CSS variables, **a frontend upgrade that changes build hashes cannot break it**. That is deliberate: the theme used to ship art into the frontend `dist`, which an upgrade restores — it has failed that way once already. ## Tweaking Edit the variables at the top of `src/aemath-theme.css`: ```css --aemath-art-opacity: 0.42; /* background art strength */ --aemath-chibi-size: 96px; /* badge size */ --aemath-chibi-left: 92px; /* badge x-offset: (sidebar width - size) / 2 */ --aemath-chibi-bottom: 170px; /* badge bottom offset */ ``` Then rebuild: ```powershell node scripts/build-client.mjs ``` The build is idempotent and reproducible: the background art is cache-stamped by content hash, the chibi is inlined as a data URI, the favicon as an SVG data URI. `lib/client.js` is a build artefact — do not hand-edit it. ### Swapping the artwork 1. Save the new background as `assets/aemath-bg.jpg` (about 1600px wide, JPEG quality ~80; the theme renders it as a watermark at `--aemath-art-opacity`) 2. Save the new chibi as `assets/aemath-chibi.jpg` (square; it is cropped into a circle) 3. `node scripts/build-client.mjs` > The bundled artwork is the author's own material. **Check that you hold the rights to any image you substitute or redistribute.** ## Layout ``` dsh-theme-aemath/ ├── package.json # dsh.client.platform = web ├── lib/ # shipped code (built + hand-written) │ ├── client.js # browser half: the whole stylesheet inlined (build output) │ └── index.js # host half: serves /aemath-assets/* ├── src/ │ ├── aemath-theme.css # theme source: two palettes + background layer + chibi │ └── client.template.js # browser-half template (__CSS__ / __SVG__ placeholders) ├── scripts/ │ ├── build-client.mjs # dependency-free build script │ ├── self-check.mjs # pre-publish self check (63 assertions) │ └── make-poster.py # generates assets/aemath-poster.jpg (needs Pillow) ├── assets/ │ ├── aemath-poster.jpg # market / README preview poster (a composite, not a UI screenshot) │ ├── aemath-bg.jpg # conversation background art │ ├── aemath-chibi.jpg # chibi badge (inlined at build time) │ └── aemath-favicon.svg # pixel-seal favicon (inlined at build time) ├── screenshots.json # market screenshot list └── PUBLISHING.md # full market-submission steps (not shipped to npm) ``` ## Self check Before publishing, run: ```powershell node scripts/self-check.mjs ``` 63 assertions: package manifest (name / version / exports / `dsh.client.platform` / `files` allowlist), that every image really is a JPEG, that `lib/client.js` executes in the client loader context, that `apply()` actually mounts the stylesheet into `document.head`, that the favicon is swapped, what the host route answers to traversal and bad methods, and that no machine-local absolute path survived into the artefacts. ## Publishing Market entries come from the curated [awesome-dsh-plugin](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin) list (the market itself keeps no catalogue). The three steps from this machine to a listing — npm release, GitHub repo, PR — are in [PUBLISHING.md](PUBLISHING.md), commands and pitfalls included. ## Asset route The host half does exactly one thing: it opens `/aemath-assets/*`. - Serves only `aemath-`-prefixed files inside `assets/`, with every directory component stripped — `..`, absolute paths and encoded traversal cannot get in - `GET` / `HEAD` only - The asset directory is resolved **relative to the module itself**, never as a hard-coded absolute path, so both a `node_modules` install and a `link:.` dev install find their own art - Carries `?v=`, so swapping an image takes effect immediately ## License MIT. This is an unofficial fan theme, unaffiliated with *Wuthering Waves* / Kuro Games.