Preface¶
After running the DSH web interface for a while, the interface is just a solid color: the canvas background color and the sidebar background color are fixed semantic color tokens. To change a background image, there are usually two paths: either modify the theme file to override --dsw-alias-bg-base and --dsw-specific-sidebar-fill, but figuring out which components change and how they look in light/dark modes often requires trial and error; or simply leave it alone and accept the default appearance.
dsh-wallpaper takes a different path: the photo is placed on a fixed layer at the very bottom of the page, and the canvas and sidebar are changed to semi-transparent semantic colors to let the image show through. Other cards, buttons, and text colors remain unchanged. All parameters can be adjusted in real-time in “Settings → Wallpaper”. Below is an introduction to its positioning, installation, and usage.
What is it¶
dsh-wallpaper is a web client plugin in the DSH ecosystem, maintained by dingzhen-114514. The repository is at https://github.com/dingzhen-114514/dsh-wallpaper , and the community directory page is at https://www.skillhub.cn/plugins/dingzhen-114514/dsh-wallpaper . It solves a very narrow problem: adding a photo background to the DSH web interface (desktop version or dsh web) and providing a set of real-time settings that take effect without restarting.
It belongs to the “Fun Costume Change” category. The repository currently has 1 star, and the license is MIT.
Core Features¶
The following are the capabilities listed in the README, all of which can be verified.
- Real background image: A fixed layer with
background-size: cover. It does not shift when the window resizes or the page scrolls. - Only covers two semantic colors: Canvas
--dsw-alias-bg-baseand Sidebar--dsw-specific-sidebar-fill. Component-specific cards, buttons, and text colors remain unchanged; light and dark themes retain their original hue. - Five adjustable parameters: Canvas transparency, Sidebar transparency, Veil, Brightness, and Soften (blur). Dragging applies changes immediately; writes to Host after debouncing.
- Change image: Click “Select image…” or drag an image into the panel. Supports
webp / png / jpg / jpeg / gif / avif / bmp. Single image limit is 24 MB, with correctContent-Typeprovided based on the extension. - One-click restore built-in image: Clear the current image and return to the built-in
assets/placeholder.webp. - Failure isolation: Host side zero static imports, route-by-route try/catch; Browser side declares
inject: ['slots']. Failure at any step only causes the settings page or the background to disappear; the plugin entry activates normally.
Installation and Enablement¶
The prerequisite is DSH 0.2.1 or higher. Both the desktop version and dsh web are applicable, and the plugin runs on the web interface.
The installation method given in the README is to clone the repository locally and then use the built-in script to hook it into the profile:
git clone https://github.com/dingzhen-114514/dsh-wallpaper.git
cd dsh-wallpaper
node scripts/install.mjs # Installs into desktop profile by default
# node scripts/install.mjs --profile work # Or specify another profile
The script only does three things, all of which are local directory operations and are not published to npm:
- Creates a directory link to the current repository at
~/.dsh/profiles/desktop/node_modules/@local/dsh-wallpaper(does not copy files, so code changes take effect immediately); - Adds
"@local/dsh-wallpaper": "link:<local-repo-path>"to the profile’spackage.json; - Adds the package name to
dsh.profile.bundles; the package’s built-incordis.patch.ymlwill insert a loading line at startup.
You must then restart DSH. The bundle list in the configuration is only read at startup and does not watch for changes. After restarting, open “Settings → Wallpaper”. The package name uses the @local/ scope because it is installed into the profile via link: and not published to npm; it doesn’t matter which directory it is cloned to.
Uninstalling also uses the script:
node scripts/install.mjs --remove # Remove bundles, delete dependencies and links
Restart DSH to restore the original state. Personal settings are still in ~/.dsh/wallpaper/; to completely clear them, delete this directory along with the plugin.
Typical Usage¶
Open “Settings → Wallpaper”. The interface is a set of controls below, with default values given in parentheses in the README:
| Control | Default | Description |
|---|---|---|
| Enable Background | On | Master switch. Turn it off to revert to the native opaque appearance |
| Canvas Transparency | 60% | Opacity of the main content area background. The lower it is, the more transparent |
| Sidebar Transparency | 72% | Opacity of the sidebar background. Usually more transparent than the canvas |
| Veil | 18% | A layer of film covering the image: brightens in light themes and darkens in dark themes, used to hold down flashy photos and ensure text contrast |
| Brightness | 100% | Image brightness, range 50%–150% |
| Soften | 1px | Gaussian blur, range 0–12px, suitable for spreading out photos with too many details |
In the “Image” card, you can preview the current image, select a new image (or drag and drop), or restore the built-in image. The bottom status bar will display results like “Saved” or “Restored built-in image”.
Changing to your own image¶
The README provides three ways; choose any one:
- Click “Select image…” or drag and drop in the settings page, saving it to
~/.dsh/wallpaper/wallpaper-<timestamp>.<extension>; - Save the image directly as
wallpaper.webpin the repository root directory; this file is ignored by.gitignore, so it won’t be accidentally committed by others; - When you don’t want the built-in image, do nothing;
assets/placeholder.webpserves as an automatic fallback.
A noteworthy point regarding implementation¶
The photo itself is on a fixed layer, and the application core is on the layer above. On the browser side, the settings are written as CSS variables on documentElement: --dw-canvas-a, --dw-sidebar-a, --dw-veil-a, --dw-brightness, --dw-blur, --dw-image. The stylesheet uses these variables to synthesize two versions of background colors: light (rgb(255 255 255 / var(--dw-canvas-a))) and dark (rgb(21 21 23 / var(--dw-canvas-a)), distinguished by body[data-ds-dark-theme]). Since only semantic aliases are changed, any component depending on --dsw-alias-* will automatically receive the correct contrast without needing to be patched one by one.
The image URL includes ?rev=<mtime>-<size>, so the browser won’t fetch old cached images after changing the image.
The coordination between Host and Browser is roughly as follows. Data lands in ~/.dsh/wallpaper/state.json (preferring $DSH_HOME), and startup diagnostics are written to ~/.dsh/wallpaper/boot.log. The plugin provides four routes:
| Route | Method | Description |
|---|---|---|
/wallpaper/state |
GET |
Returns { state, image }, image.url includes version number |
/wallpaper/state |
POST |
Partial update, clamped to valid range if values are invalid |
/wallpaper/image.webp |
GET |
Current effective image bytes, Content-Type matches the actual file extension |
/wallpaper/upload |
POST |
{ name, dataUrl }, switches automatically after writing to disk |
The fields of state.json are enabled, image (absolute path or null), canvas, sidebar, veil (0–100), brightness (50–150), blur (0–12).
The README also lists two hard constraints for writing DSH client plugins, worth noting separately:
- On the browser side, you must declare
inject: ['slots']on the plugin object you export. Cordis’s context is a proxy, and trying to read undeclared service properties throws acannot get property "slots" without injecterror directly. This exception causes the entire client entry to fail activation. The desktop shell reports it asweb boot: 1 entry did not activate, the page won’t load, and the plugin has to be disabled. - On the Host side, do not write static imports, and catch errors for each route individually. If a route registration fails, the plugin still activates, and the error lands in
boot.log, preventing a decorative plugin from becoming a startup blocker.
There are two troubleshooting entry points: ~/.dsh/wallpaper/boot.log to see Host activation and the results of each route; the web interface startup crash report for the desktop shell is in %APPDATA%\@deepseek-ai\dsh-desktop\logs\crash-*-web-boot.log.
Suitable Scenarios and Notes¶
The suitable scenarios are clear: you want to put a background image on the DSH web interface or in your personal configuration, while not wanting the colors of cards, buttons, and text to be dragged off by the background contrast. It only animates two semantic colors, the canvas and sidebar, changing the visual atmosphere, not the theme.
A few things to note before installation:
- This plugin is a community plugin with no official affiliation to DeepSeek or Snowflake. The directory page is an independent site. The plugin runs with the permissions of the current DSH process, will read and write files under
~/.dsh/wallpaper/, and provide HTTP routes. You should read the source code, confirm the license (MIT), and the scripts packaged infilesbefore installing. - The environment verified in the README is Windows + DSH Desktop
0.2.1-rc.5(Electron 44 / Node 24). On the Host side, onlyctx.webServer.registerandnode:fsare used, and all paths go throughDSH_HOME. It is claimed to be compatible withdsh weband the desktop version, but no verification results are listed for other platforms. - The installation script degrades to a normal symbolic link on non-Windows systems; the
junctiontype only takes effect on Windows. - If you have installed other theme-changing plugins, and both write to
--dsw-alias-bg-base, the final effect depends on the loading order. - The built-in
assets/placeholder.webpin the repository is a program-generated gradient image and can be used directly. When submitting your own images, only submit files for which you have rights.
Conclusion¶
dsh-wallpaper does a small thing: a photo, two semantic colors, five adjustable parameters, in exchange for a web interface background that can be tested repeatedly without restarting. It confines the failure surface to the decorative layer, so it won’t hold up the startup process—that is what is truly worth learning from.
Directory Page: https://www.skillhub.cn/plugins/dingzhen-114514/dsh-wallpaper
GitHub: https://github.com/dingzhen-114514/dsh-wallpaper