sakka6868 / dsh-skin

Listed

DSH skin plugin: Alphacoders popular wallpapers as the DeepSeek Harness Web GUI background — gallery, search, local image upload, light/dark mask

masterTool View source

Installation

npx -y @deepseek-ai/dsh plugin --profile web add github:sakka6868/dsh-skin

This installation command is an unverified starting point generated from the GitHub repository address.

README

Maintainer-authored documentation snapshot.

View on GitHub ↗
Commit 8024618Synced Aug 18, 2026

dsh-skin-alphacoders

English | 中文

License: MIT npm version GitHub Release Topic: dsh-plugin

A DSH skin plugin that turns Alphacoders popular wallpapers into the DeepSeek Harness Web GUI background. A dual-half (Host + Client) Cordis plugin following the DSH package conventions.

Wallpaper preview

Settings gallery

Features

  • Gallery: a "Wallpaper" settings section browsing the popular wallpapers (15 per page, pagination, lazy loading).
  • Search: keyword search via the Alphacoders search page (single page, up to 30 results); clearing the search restores the popular list.
  • Local images: "Upload local image" accepts PNG/JPEG/WebP/GIF files; bytes are stored under $DSH_HOME/storages/skin-alphacoders/ and survive restarts; switching or removing the wallpaper deletes the orphaned file (at most one local wallpaper is kept on disk).
  • One-click apply: click a thumbnail to apply it as the background; the main surfaces (conversation, sidebar) turn translucent through theme token overrides so the wallpaper shows through — while the settings panel and floating surfaces (--dsw-alias-bg-layer-2) stay fully opaque, keeping their text crisp.
  • Per-theme wallpapers (v2): the light and dark schemes each keep their own wallpaper and follow automatically when you switch light/dark.
  • Favorites (v2): star any gallery card; favorites persist in user-data.json and apply with one click.
  • Auto change (v2): periodic auto-swap — random (fresh remote picks), sequence (walk the favorites in order) or favorites (random favorite) — plus a "Change now" button; interval 1–168 hours.
  • History (v2): every applied wallpaper is recorded (up to 30 entries); one click restores an older backdrop.
  • Display controls: four fill modes (cover/contain/center/stretch) and a 0–90% mask strength for readability.
  • Light/dark linkage: follows the DSH theme (light/dark/system) — white fog on light, black dim on dark.
  • Persistence: preferences persist through the Host settings namespace ui-skin into $DSH_HOME/settings.yaml and restore on restart; favorites/history live in $DSH_HOME/storages/skin-alphacoders/user-data.json.
  • Performance: the background prefers the 1920px variant (thumb-1920-<id>) instead of downloading 5K/8K originals; gallery pages and searches have an in-memory TTL cache.
  • Clean unload: removing the plugin row removes its route, scheduler and styles; the GUI returns to the default look.

Install

# Installs the built package into the web profile
dsh plugin --profile web add dsh-skin-alphacoders

Option 2: build from source

# 1. Build this package (produces lib/)
pnpm install && pnpm build   # or npm install && npm run build

# 2. Install into the web profile
dsh plugin --profile web add "file:<absolute path to this package>"

Either way, register the plugin row in $DSH_HOME/profiles/web/cordis.patch.yml:

# $DSH_HOME/profiles/web/cordis.patch.yml
- insert:
    - id: skin-alphacoders
      name: 'dsh-skin-alphacoders'
      config:
        cacheTtlMs: 3600000      # optional: list cache TTL (ms)
        requestTimeoutMs: 20000  # optional: fetch timeout (ms)

Restart dsh web; the section lives under Settings → Wallpaper.

Dev tip: pnpm's file: dependency hardlinks a copy, so during iteration replace node_modules/dsh-skin-alphacoders with a directory junction to the source folder (or re-run dsh plugin add after each rebuild).

Architecture

┌─ Host half (node) ───────────────────────────────────────────┐
│  fetch + parse alphacoders popular-wallpapers?page=N         │
│  (server-rendered schema.org ImageObject, 15/page)           │
│  in-memory TTL cache (1h default)                            │
│  ctx.settings.register('ui-skin', SkinSettingsSchema)        │
│  user-data.json (favorites ≤200, history ≤30, atomic write)  │
│  auto-change scheduler (setTimeout chain, per-mode pools)    │
│  HTTP routes (via ctx.webServer):                            │
│    GET  /skin-alphacoders/wallpapers?page=N | ?query=Q       │
│    GET  /skin-alphacoders/settings                           │
│    POST /skin-alphacoders/settings   (field-allowlist patch) │
│    GET  /skin-alphacoders/user-data                          │
│    POST /skin-alphacoders/favorites (+ /favorites/remove)    │
│    POST /skin-alphacoders/theme   (active scheme reporting)  │
│    POST /skin-alphacoders/auto-change/now                    │
│    GET  /skin-alphacoders/health                             │
└──────────────────────────────────────────────────────────────┘
        same-origin fetch (no CORS surface)
┌─ Client half (browser) ──────────────────────────────────────┐
│  skin-store: local snapshot of the settings route + subscribe│
│  user-data store: favorites/history snapshot                 │
│  per-theme mirror: theme/change re-syncs the flat wallpaper  │
│  fields from the active scheme's slot (fromTheme marker)     │
│  background: body::before wallpaper layer + ::after mask     │
│              + ctx.theme.overrideTokens surface translucency │
│              (signature-deduped against theme/change storms) │
│  settings.section "Wallpaper": gallery + favorites + history │
│  + auto-change controls + per-theme tabs                    │
└──────────────────────────────────────────────────────────────┘

Why not the settingsScope transport

The api-proxy settings wire is a Host allowlist (locale, ui-theme, …); a namespace registered by a plugin outside the repository answers settings-not-exposed. The Host half therefore persists through the owner seam (SettingsScope.update, no allowlist) and the browser half reads/writes through the plugin's own HTTP route — the durable document is still the ui-skin section of $DSH_HOME/settings.yaml.

Configuration

FieldDefaultMeaning
cacheTtlMs3600000Gallery page cache lifetime in memory (ms)
requestTimeoutMs20000Timeout for fetching alphacoders.com (ms)
  • Wallpaper copyright belongs to their authors and Alphacoders; personal use only, no bulk downloading or redistribution.
  • Requires network access to alphacoders.com and the image CDN (images*.alphacoders.com).

Verification

e2e/verify.mjs is a Puppeteer (system Chrome) end-to-end check. Install the plugin and start dsh --profile web --port 3090, then:

node e2e/verify.mjs

Covers (39 assertions): gallery render, favorites round-trip, per-theme wallpapers, light/dark linkage, persistence across reload, history restore, auto-change (favorites mode), search, local upload/cleanup, user-data persistence, no page errors.

Project files and signals

Shown items are public repository signals detected in the directory snapshot.

DocumentationDetected

Repository information

Language
TypeScript
License
MIT
Latest release
v0.2.0
Last updated
Aug 15, 2026, 1:54 AM

Install deliberately

Review source code, permissions, lifecycle hooks, dependencies and network access. Test untrusted plugins in an isolated environment.