DSH Modern UI
A modern Web interface for the official, unmodified DeepSeek Harness (DSH): redesigned chat flow, reasoning folds, tool cards, model selection, themes and eight interface languages.
Install
dsh plugin --profile web add @iroha1145/dsh-modern-ui
Then refresh the browser. dsh plugin forwards to pnpm, so pnpm must be on PATH. If you have never started the web profile, run dsh web once first.
Model-visible behavior
Modern UI does not change the model prompt by default. It renders openui-lang (OpenUI) and followups code fences a model already wrote. Turning on Settings → General → Answer visual components appends about 30 KB (roughly 7,000 tokens) of presentation guidance to the system prompt. Deliver results in stages, a separate switch on the same page, appends about 3 KB of guidance that has the model hand over each finished part of a multi-stage answer before it researches the next. The same switches live in the entry config:
presentation:
prompt: false # model-visible guidance
progressive: false # model-visible progressive result delivery guidance
openui: true # render openui-lang fences as OpenUI components
followups: true # render followups fences as suggestion chips
jev: # optional TypeSafe Jev presentation advice tool
enabled: true # offered only with the presentation prompt on and a key present
credential: TYPESAFE_API_KEY # environment-variable name the DSH credentials service resolves
model: jev-latest
endpoint: https://api.typesafe.ai/v1/systemone
timeout: 4000 # ms; past it the tool answers that no suggestion is available
Settings → General has a "Jev presentation advice" row under the presentation switch: it saves the key through the official credentials Remote (credentials/set) into the DSH credentials file under the jev.credential name, shows only whether a key is configured and from which layer, and offers the enabled switch once a key exists. It refuses a key with spaces, line breaks or non-ASCII characters, which no request header could carry. A Host without the credentials Remote shows no row.
With a usable key, the main agent of each main session gets a jev_presentation_advice tool; a key from the environment or a .env file that no request header could carry keeps the tool hidden and logs one warning without the key. It is registered in that agent's own tool scope and follows presentation.prompt, jev.enabled and the key as they change, so it appears and disappears without a restart; subagents join the preset composition rather than the parent's scope and never see it. Nothing calls Jev on its own. When the model calls the tool, the plugin sends the user messages admitted in the turn being processed (at most four, 6,000 characters each) and the model's content_summary, a description of the structure of the planned answer of at most 600 characters (a longer one is refused, not cut), to TypeSafe. Jev is asked once per turn: the same summary again repeats the reply, and a different summary after that gets no new judgement. The reply is an ordinary tool result: "plain text" reads as no additional suggestion and any other choice as a partial candidate the model may ignore, replace or combine; the Tool row shows the title "Ask Jev about presentation" and the outcome (for example "Possible: table") from the result metadata, while the confidence stays in that metadata and is shown neither to the model nor on the card. The tool description says calling it is not a prerequisite for components, and no prompt asks the model to call it. A missing key, an error, an invalid answer, a timeout or a cancelled turn returns "no suggestion available" and never fails a turn.
Switch back to the official UI
Deselect the whole @iroha1145/dsh-modern-ui bundle in Plugin Management and refresh, or remove the plugin:
dsh plugin --profile web remove @iroha1145/dsh-modern-ui
Deselecting only the inner modern-ui entry is not enough: the bundle disables seven official UI owners and returns them only when the bundle itself is off.
Official Desktop
The DeepSeek Harness Desktop app renders the same Web Client over its own embedded host and keeps plugins in the reserved desktop profile:
- Open Desktop once, then quit it completely so it initializes the profile.
- Install with Desktop's own
dshcommand (menu App → Manage dsh command… puts it on the terminal PATH; on Windows it is%LOCALAPPDATA%\Programs\DeepSeek Harness\resources\runtime\cli\bin\dsh.cmd). The npmdshrefuses--profile desktop.dsh plugin --profile desktop add @iroha1145/dsh-modern-ui - Quit and reopen Desktop. Desktop has no page reload, so switching the bundle means restarting the app.
To switch back, run dsh plugin --profile desktop remove @iroha1145/dsh-modern-ui with the same command and restart Desktop. While Modern UI is selected, Desktop's first-run onboarding is recorded as skipped because its last step writes the official Chat settings this bundle replaces; adjust work details and usage display under Settings → General. Native bridges (dragging files out to the OS, multiple windows, Open In…, the native directory picker) are not verified yet; see the Desktop acceptance record.
Compatibility
Supported host versions are declared in dsh.compatibleHost and listed in the compatibility matrix.
Known limitations
- Changing the bundle selection requires a browser refresh (an app restart in Desktop).
- Git-hosted installs (
dsh plugin add github:...) are not supported; use this npm package or themodern-ui.tgzattached to each GitHub Release. - Session-level web switches (
/web on|off) are retired; web tools follow the official plugin configuration.
License
MIT. Portions derived from DeepSeek Harness and other projects keep their notices in THIRD_PARTY_NOTICES.md and licenses/.