Replaces the model button with a Claude Desktop-style model and reasoning-effort switcher, with per-model effort memory, theme-aware styling, smooth slider feel, rounded track, hover highlight, and pixel-dot animation.
Install
# from npm (prebuilt)
dsh plugin --profile web add @domitor-syh/dsh-ui-skin-switcher
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:domitor-syh/dsh-ui-skin-switcher
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
A Claude Desktop-style switcher plugin for the DeepSeek Harness (DSH) Web GUI: a floating "seat" next to the input box for picking a model and dialing reasoning effort — dropdown for models, slider for effort.
Compatibility: supports DSH 0.1.5 and newer only.
What it is
dsh-ui-skin-switcher registers the conversation.input.model slot and renders a model + reasoning-effort switcher seat next to the composer input.
It rides the exact same channel the first-party selector uses: it reads the provider-grouped model directory and the current selection through ctx.modelDirectories — the same source the /model panel renders — and submits through that same selection call, so a switch made here is what /model shows next and takes effect on the current session.
The style pays homage to Claude Desktop's switcher — slider feel, rounded track, hover highlight.
Features
| Feature | Detail |
|---|---|
| Model switching | Clicking the model entry expands the model list ordered by vendor; the selection applies immediately and the matching reasoning effort updates together |
| Effort slider | Supports both click and drag, with multiple effort nodes; supported levels differ per model, and adjustments apply immediately |
| Max-effort dot matrix | Reaching max effort reveals a right-to-left dot-matrix sweep on the track, with the handle glowing |
| Per-model memory | Remembers the last effort per model, kept across switches |
| Theme adaptive | All colors bound to DSH theme tokens; readable in light/dark themes and transparent skins |
Video preview
The inline player needs a GitHub sign-in and cannot play while signed out; in that case click the link below to watch in a new tab.
▶︎ Watch the full demo video — model switching, the effort slider, and the top-level dot-matrix animation.
Compatibility
Supports DSH 0.1.5 and newer only.
| DSH version | Works | Notes |
|---|---|---|
| 0.1.5-alpha.1 … 0.1.5-rc.3 | ✅ | The whole 0.1.5 line; spot-checked at alpha.1, rc.2 (full end-to-end run) and rc.3 |
| 0.1.6-alpha.1 / alpha.2 | ✅ | Same generation as 0.1.5 |
| 0.1.7-alpha.1 / alpha.2 | ✅ | Same generation as 0.1.5; spot-checked at alpha.2 |
| 0.2.0-rc.2 | ✅ | Current Desktop version; verified end-to-end (mount, browser half delivery, selection takes effect) |
| 0.1.3-alpha.2 and earlier | ❌ | Older generation: only connection.api, no remote.session |
The dividing line is 0.1.5: that release replaced the old connection.api face with ctx.remote.session / ctx.modelDirectories and dropped the dsh-client-ui-slots dependency. This plugin is built on the new interfaces, so it cannot load on earlier DSH versions.
A second contract change landed in 0.2.0: select() answers with a result envelope ({ ok: false, error }) instead of rejecting, and directoryFor() throws for a session with no scope or binding. This plugin has handled both shapes since 0.2.3; earlier versions failed silently on 0.2.0.
How this table was produced: each version's
dsh-client-ui-model-selectionpackage was unpacked and checked for themodelDirectories/modelCatalog/selectModelinterfaces, plus full end-to-end runs on 0.1.5-rc.2 and 0.2.0-rc.2.
Install
With the DSH CLI installed:
dsh plugin --profile web add @domitor-syh/dsh-ui-skin-switcher
Restart dsh web — the button appears next to the input box.
Running dsh from source? Inside the repo root, use your launch command plus dsh plugin --profile web add @domitor-syh/dsh-ui-skin-switcher, for example:
# Normal start
pnpm dsh web
# Add the plugin
pnpm dsh plugin --profile web add @domitor-syh/dsh-ui-skin-switcher
Verify & uninstall
Restart dsh web — the button appears next to the input box and takes effect immediately. Verify with dsh --profile web --dump-config.
Uninstall (if running from source, uninstall the same way you installed): dsh plugin --profile web remove @domitor-syh/dsh-ui-skin-switcher, then restart dsh web.
Usage
- Pick a model — click the button and pick from the list; the list is grouped by vendor and the current model shows a checkmark.
- Dial effort — for models declaring
reasoningEfforts, an effort button appears to the right of the model; click it, then drag the slider or tap the track to switch levels.
Why is there no reasoning-effort switcher after adding a model?
The current model does not declare a reasoning effort (reasoningEfforts) or vision capability. To keep model declarations accurate, we do not apply a uniform effort preset to every model — check the model vendor's official documentation and patch the underlying config file yourself, or hand the vendor's deep-thinking documentation (or its link) to the LLM and let it modify the config directly.
Taking effect: you edit
settings.yamlunder the DSH home (~/.dsh) — not this plugin's files; DSH watches that file and hot-reloads, so the change takes effect immediately with no restart and persists across restarts.
Why do it yourself? To keep declarations accurate — accuracy over coverage. Reasoning effort is a per-vendor, per-level wire value; a wrong value silently breaks requests, so we never fill in a guessed preset.
License
Links
More in this category
zhu1090093659/dsh-web#packages/dsh-task-board★ 8567
Task board for the dsh web GUI: a sidebar multi-column kanban whose cards run in real DSH agent sessions and can also be scheduled with cron expressions, executed host-side even with the browser closed.
zhu1090093659/dsh-web#packages/dsh-web-all★ 8567
Plugin and skin collection for the DSH Web UI: task board, Git graph, right-side panel, remote mobile UI, pet, live token stats, and a skin center.
MeteorNOX/DeepSeek-Balance-Whale-Widget★ 4363
A fixed-corner whale widget for the DSH web GUI — balance, today's usage and per-turn cost with peak/off-peak pricing, editable balance-alert and daily-budget bubbles, a module-based custom bubble queue with A/B weighted choices and random lines or images, 30+ vendor templates (OpenAI, OpenRouter, Kimi, SiliconFlow, Ark, Zhipu, MiniMax and more) with per-model balance and subscription quota, plus task-end sound, imported audio, custom roles and a resource manager. Local-only, no telemetry.
ccch1mneyyy/dsh-TUI★ 4235
Claude Code-style full-screen terminal UI: pixel-whale header, live status line, and streaming thought expansion.
omdsh-dev/DSH-better-sidebar★ 4081
Full sidebar workbench with file rendering and editing, terminal, Git, and subagents; third-party plugins can register new tabs.
Devin-AXIS/deepseek-design#deepseek-idesign★ 1441
Visual design studio for websites, app prototypes, posters, cards, reports, and magazines, with templates, direct element editing, selection-aware AI draft handoff, and export.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.