Preface¶
DeepSeek Harness (command: dsh) is an open-source agent runtime from DeepSeek, currently in developer preview. The official repository summarizes its design in one sentence: Everything is a Plugin —— models, tools, skills, conversations, sandboxes, storage, loops, scheduling, and even the interface can be added or removed via plugins without modifying the framework source code. The official entry to launch the web interface is:
npx @deepseek-ai/dsh web
A gap quickly emerges when actually asking questions in the web conversation: most responses are still just plain text, a Markdown table, or a static code block. If you ask “How are this month’s orders?”, the model will provide revenue, month-over-month growth, and conversion rates, but trend charts, statistic cards, and refresh buttons will not appear in the reply. To view them again, you have to type another message.
That is exactly what dsh-genui was built for. The model writes interface descriptions into JSON wrapped in dsh-ui fences; the browser-side renderer turns them into cards, charts, forms, quizzes, and embeds the components directly within the reply. Clicking refresh, dragging sliders, or submitting a quiz will be completed locally immediately, while actions requiring model involvement will be sent back to update the same interface block.
This article is collated by cross-checking against the community directory details page, GitHub repository README / SKILL.md / package.json / CHANGELOG.md, and the DeepSeek Harness official repository. One thing to note first: the plugin directory site deepseek-harness-plugin.com is an independent community directory, not officially affiliated with DeepSeek / HyperMind, and should not be treated as an official app store.
What is this¶
dsh-genui is an interface enhancement plugin for DeepSeek Harness Web Interface, maintained by the GitHub organization omdsh-dev, with the repository address: https://github.com/omdsh-dev/dsh-genui. The npm package name is @omdsh-dev/dsh-genui, licensed under MIT, primarily written in TypeScript. The repository has two topics: dsh and dsh-plugin. The community directory categorizes it under “Interface Enhancement”, with an inclusion date of 2026-08-15.
As of 2026-08-17, the GitHub repository has approximately 147 stars; the directory page showed 88 stars at that time. Star counts are based on the repository’s primary data. The current package.json version is 0.8.6 (CHANGELOG marked date 2026-08-16). The dsh.client.platform in package.json is web, meaning it runs on the web conversation interface, not the terminal TUI.
It solves a specific problem: enabling assistant responses to go beyond plain text. The model outputs a whitelisted JSON, and the renderer draws real components at the fence’s location. Without the plugin, this fence will just be a normal code block without errors or polluting the conversation. The repository includes three components: a host plugin to teach models how to write fences, a browser-side renderer, and a SKILL.md that can be copied to the skill directory.
Core Features¶
Response as Interface¶
Components are embedded directly within the reply, not as a separate tool card. The README makes a direct comparison: a normal response would be “This month’s revenue is ¥128,430, a 12.4% month-over-month increase, pay attention to conversion rates”; after installing the plugin, the same analysis will be accompanied by rendered statistic cards, trend charts, and progress bars. Rendering starts as soon as the fence is closed, without waiting for the entire reply to finish.
The fence output by the model looks like this (for browser reference, you don’t need to write it manually for daily use):
{"title":"Order Overview","items":[
{"type":"stat","label":"Total Revenue","value":"¥128,430","delta":"+12.4%"},
{"type":"stat","label":"Order Count","value":"1,024","delta":"-3.1%"}
]}
The rendered result is two statistic cards. A delta starting with - will be displayed in red, while one starting with + will be displayed in green.
Dual-channel Rendering¶
The plugin comes with two built-in rendering channels, which are automatically selected on startup, and are not tied to a specific dsh build:
- Registry Channel: When the host provides the fence-registry extension point, the fence uses the host’s streaming rendering pipeline.
- DOM Channel: When the host does not have this extension point (including the original DSH and some old builds), the plugin observes the conversation DOM and mounts the rendering tree on its own. Since version 0.7.2, the DOM channel supports streaming rendering: components appear as the model writes them. Since version 0.8.3, the fence will match both the standard md-code-block and the .code-block / .code-block-small used by some hosts, and fall back to marking the dsh-ui structure with a banner.
The component, interaction, panel, and persistence behaviors are consistent across both channels. CHANGELOG 0.8.6 also fixed an issue where the original DSH 0.1.0-rc.6 had silent fence rendering failures caused by hard-coded inputTriggers: this item is now an optional subscription, and if the service is missing, only the /panel will not be registered, and the rendering itself will not be affected.
Over 30 Components¶
SKILL.md lists allowed type values as a whitelist, and models cannot create new ones. They are roughly categorized by use case:
- Layout: text, row, col, grid, card, divider, spacer
- Display: stat, badge, progress, list, table, keyvalue, timeline, file-tree, diff, json, code, callout, steps, etc.
- Charts: chart (bar/line/ring), plot (mathematical function graphs, with parameter sliders for real-time redrawing, optional automatic animations)
- Interaction: button, input, select, checkbox, radio, switch, textarea, tabs, accordion, copy, submit, etc.
- Advanced: mermaid (flowcharts, sequence diagrams, Gantt charts, etc.), scene3d (3D scenes with a small number of meshes), quiz (multiple-choice grading, explanations, retries)
Table headers can be clicked for local sorting; file tree directories can be collapsed locally. None of these actions require model involvement.
Local-first, Then Callback to Model¶
The documentation divides interactions into two layers. Tasks that the UI can handle on its own —— grading papers, judging answers, resetting, expanding, selecting —— are all completed immediately locally. The action is only reserved for steps that require model participation: generating new content, executing tools, or providing next-step suggestions.
Specific constraints from README and SKILL.md:
- Interactive components must include an action. Buttons without an action will be rendered as disabled to avoid the “looks clickable but nothing happens” issue.
- Buttons with an action will immediately show “triggered” after being clicked. This only confirms that the local event has been sent, not that the model has received it.
- Buttons, switches, inputs, dropdowns, checkboxes, radio buttons, textareas, quizzes with an action will send data back to the model when clicked or blurred, and the model will update the interface. Duplicate action names are debounced by 300ms, consecutive clicks are merged into one, and the final value takes effect.
- Multiple-choice questions can be made into a test paper: each question is a radio with a group, answer, and explanation, with a final submit button. After the user selects all options and clicks once, the score, correctness, and explanations will appear immediately with zero model round trips; the questions will then be locked. “Retry” resets locally, with an optional resetAction to notify the model.
- Answers, submission locks, and input values are saved based on “conversation + content fingerprint”, with a maximum of 200 LRU entries. Refreshing or reopening the conversation will restore the state of the same UI block; if the content changes, it will start over.
- GenUI must not request secrets such as passwords, API keys, access tokens, or recovery codes. Even if a password input appears, it will remain masked, not persisted, and not included in form collection.
Tool Channel and Conversation Panel¶
Fences are suitable for “interfaces within responses. Deliverable UIs can use therender_ui` tool to draw the same spec into a tool bar card.
The conversation panel is a persistent area above the input box: fences with render_ui or panel: true will update the same surface in place. Client commands:
- /panel: Open the panel
- /panel <instruction>: Pass customization requirements to the model
- /panel clear: Clear the panel
The top border can be dragged to adjust the height. append: true enables incremental merging: same-named tabs append content, while new tabs are added. The panel defaults to a maximum of 200 nodes and 200 appends; once the limit is reached, the model should send a replace to rebuild. Version 0.8.6 added a close button to the panel header, which has the same effect as /panel clear.
Specification Guard and Bundle Size¶
Each fence will go through a specification guard: bad nodes are silently discarded, values are clamped, and strings are truncated. The maximum limit for the entire component tree is 200 nodes and 8 levels of nesting. SKILL.md also requires the JSON to be strictly valid: the plugin only fixes minor punctuation errors such as half-width quotes within strings and trailing commas; structural errors such as missing brackets or incorrect brackets will not be fixed, and it will degrade to a code block with a red banner.
If mermaid rendering fails, it will automatically attempt repairs first (removing backticks, adding quotes to labels containing Chinese or spaces), and only degrade to displaying the source code if it still fails. Components are whitelisted, so models cannot inject HTML or scripts; function expressions use a separate parser instead of eval.
The main rendering package is approximately 110 KB (minified) / 28 KB (gzip). mermaid and three.js are packaged into separate on-demand assets, loaded via the plugin’s self-registered HTTP route when first used, so only the rendering core is downloaded at startup.
Installation and Activation¶
The installation command given on the community directory page is:
dsh plugin add github:omdsh-dev/dsh-genui
For reproducible installations, the directory page recommends pinning the commit hash:
dsh plugin add github:omdsh-dev/dsh-genui#<commit>
Replace <commit> with the actual commit hash from the repository. The plugin runs with the permissions of the current dsh process, and may execute code during installation. You should inspect the source repository and license before installing.
The maintainer’s README states that installation uses the git URL on the web profile (public repository, no npm account required). The current package.json indicates that the npm package is not the primary installation path, and the FAQ also notes that @omdsh-dev/dsh-genui will return 404 on npm. If the command from the directory page does not install the plugin into the web conversation, use the following command per the README:
dsh plugin --profile web add git+https://github.com/omdsh-dev/dsh-genui.git
There are two mandatory prerequisites:
1. dsh has already been installed. Any build of the open-source version works, and the plugin will automatically select the rendering channel on startup.
2. pnpm is in the PATH, as dsh plugin depends on it. If not, run corepack enable or npm i -g pnpm, then open a new terminal and confirm that pnpm -v returns a version number.
package.json also declares the runtime environment: Node.js ^22.19.0 || >=24.0.0, pnpm >=11.7.0 <12; a set of @deepseek-ai/dsh-* peer dependencies aligned with ^0.1.0-rc.6, and Cordis as @deepseek-ai/cordis@^4.0.1.
Do not use link: for directories that have just been cloned and have not installed dependencies yet. The README clearly states that link: will not install mermaid / three / react, and the renderer will break after installation. It is only used for local development iteration:
cd dsh-genui
pnpm install
dsh plugin --profile web add link:$PWD
After cloning, you can also run the one-click script in the repository, which will check dsh, pnpm, and repository accessibility, then install via the git URL and sync SKILL.md to the skill directory:
git clone https://github.com/omdsh-dev/dsh-genui.git
cd dsh-genui
./scripts/install.sh
It installs into the web profile by default; run ./scripts/install.sh tui to specify a different profile name. After installation, restart dsh web, hard refresh your browser (Cmd+Shift+R on macOS), and start a new conversation and say “draw a statistics dashboard using dsh-ui” to verify. You can also use dsh plugin --profile web list to confirm that the plugin is in the list.
Typical Usage¶
Let the Model Generate Fences Proactively¶
New conversations will include the plugin’s vocabulary for fences only after restarting. If the model still only returns plain text, just say “output using dsh-ui” directly. You can also copy SKILL.md to ~/.dsh/skills/genui/ (the installation script will also sync it to ~/.agents/skills/genui/) to enhance the model’s adherence to component syntax.
The repository’s demo-prompts.md provides a four-scene demo script showing layout and data, interactive components, function graphs / quizzes / mermaid / 3D, and the event loop where the model updates the panel after clicking a button. You don’t need to follow the script for daily use; it is better suited for comparing against the demo video in the README to understand the feature boundaries.
How the Event Loop Works¶
The official example from the fourth scene is a “server monitoring panel”: four statistic cards, an auto-refresh switch, a refresh button, and an environment selector. Both the button and selector have an action. After the user clicks “Refresh Data” or switches the environment, the model receives [genui-action] and updates the values with a new dsh-ui fence. This is the two-way interaction documented, no additional workflow plugins required.
Common Troubleshooting¶
The README’s FAQ lists several common issues that you can reference after installation:
- Displayed as a code block: Confirm that the current dsh build supports either the fence-registry or DOM channel fallback; the plugin is listed in dsh plugin --profile web list; you have restarted and hard refreshed your browser.
- Chat interface white screen when rendering fences: The dsh version is too old, update dsh first then reinstall the plugin.
- dsh: pnpm not found on PATH: Install pnpm and open a new terminal before trying again.
- Installation stuck on git credentials or 404: The repository is public, so no login is required for the git URL; a 404 for @omdsh-dev/dsh-genui means the npm package has not been published yet, use the git URL instead.
- scene3d / mermaid not rendering: These two engines are loaded on demand (/plugins/@omdsh-dev/dsh-genui/assets/*.js). First restart and hard refresh your browser; if it still doesn’t work, uninstall and reinstall:
dsh plugin --profile web remove @omdsh-dev/dsh-genui
dsh plugin --profile web add git+https://github.com/omdsh-dev/dsh-genui.git
Older hosts missing asset routes will degrade to displaying source code or loading failure prompts, which can be fixed by updating dsh.
Applicable Scenarios and Notes¶
It is suitable for users who are already using DeepSeek Harness Web UI and want structured interfaces directly within responses. Good matches include: metric dashboards, comparison tables, processes/steps, quizzes with local grading, function curve demonstrations, and simple 3D geometry explanations. The judgment rule from SKILL.md is: would using structured components make it easier to scan, understand, and operate than plain text? If yes, use it, without waiting for the user to ask for a UI. The documentation requires not using it for things that can be explained in one sentence, casual small talk, cases where the user explicitly says no UI, or 3D flashy content unrelated to the topic.
Before using, please note these points:
1. Permissions and Source: The directory page clearly states that the plugin runs with the permissions of the current dsh process, and may execute code during installation. Inspect the GitHub source code and MIT license before installing; pin the commit hash for production environments. This directory is not an official DeepSeek store, and inclusion does not equal endorsement.
2. Web-only: package.json declares platform: web. Terminal TUI and headless runs without a UI are not supported.
3. Depends on pnpm and a relatively new dsh: You cannot install it without pnpm; older hosts may cause white screens or missing mermaid/three asset routes.
4. Specification Limits: The entire tree cannot exceed 200 nodes and 8 levels of nesting, and excess content will be truncated. For complex specs, use the `validate_dsh