Preface¶
DeepSeek Harness (hereinafter referred to as dsh) is an agent runtime open-sourced by DeepSeek, whose core concept is “everything is a plugin”: models, tools, sessions, sandboxes, and even the web interface itself can be added or removed via plugins. It is currently in developer preview, and the interfaces will continue to change. The community has compiled a plugin directory (https://deepseek-harness-plugin.com/) for easy categorized searching and installation commands; this is an independent site not officially affiliated with DeepSeek / Horizons AI, and you should verify the source code for included entries yourself.
When running agents with dsh web daily, the row at the bottom of the chat interface showing the round status will default to always displaying Deep diving.... This same text appears when the task just starts, after 10+ seconds of running, or when it has been stuck for a long time. If you just want this row to update its text based on phases, add a typing effect and gradient, without modifying the dsh core itself, you can use the community plugin dsh-status-rotator.
What is this¶
dsh-status-rotator is a UI enhancement plugin for the dsh web interface, maintained by 01Virex, with the repository address at 01Virex/dsh-status-rotator. It is licensed under MIT, primarily written in JavaScript, with version 0.2.0 in package.json. As of 2026-08-17, GitHub shows 20 stars; the star snapshot on the community directory page is still 8, so refer to the repository page for the latest count.
Its function is narrow: it replaces the Deep diving... status text at the bottom of the chat interface during round execution with the text you define in JSON. The text can switch based on round phases, be output character by character with a typing effect, use flowing colorful gradients (which can be disabled), and rotate at set intervals. The round execution timer (which appears after approximately 15 seconds) will not be modified; in fact, the plugin uses this timer to determine which phase the current round is in.
It does not add tools to the model, nor does it change the agent’s reasoning or code-writing behavior. If the plugin cannot access any text source, the status row will remain as the original Deep diving..., making it functionally equivalent to not being installed.
Core Features¶
The repository README and the browser-side lib/client.js describe the capabilities consistently, which can be divided into the following sections:
1. Switch text based on round phases
The judgment is based on whether there is a timer in the TurnStatus element and the timer’s reading. By default, there are three phases:
| Phase | Trigger Condition | Default Duration |
|---|---|---|
thinking |
Round just started, no timer yet | 0 ~ 15 seconds |
running |
Timer has appeared, not yet timed out | 15 seconds ~ longAfterMs |
long |
Timer exceeds longAfterMs |
Default ≥ 60 seconds |
The text will switch immediately when the phase changes, without waiting for the next rotation interval. If there is no text for a certain phase, it will fall back according to running → thinking → any non-empty group.
2. Typing effect
New text will be typed out character by character, with the interval controlled by typeSpeedMs, defaulting to 30 milliseconds; set it to 0 to disable and display the full sentence directly.
3. Flowing colorful gradient
Enabled by default, it only applies to the text and does not affect the adjacent timer. The color sequence and flow speed are configurable, and it can be turned off with one click.
4. Separation of text and code
All sentences are written in JSON. The Node side of the plugin registers the HTTP route /plugins/dsh-status-rotator/config.json, which reads the config.json in the plugin directory in real time on each request (falls back to the built-in config.example.json if this file does not exist). You can modify the text and refresh the page without changing lib/client.js or configuring localStorage.
5. Chinese/English follow the interface language
There are two sets of texts for zh / en, which follow the “Settings → Language” switch; unknown languages will fall back to Chinese.
6. Targeted positioning
The browser side looks for TurnStatus by role="status" and aria-live="polite", plus an additional structure check, to avoid accidentally modifying code snippets in chat history, trace history, model save prompts and other areas with aria-live, and it will not alter the timer node.
Installation and Activation¶
The installation command given on the community directory page is as follows, execute it in the running DeepSeek Harness terminal:
dsh plugin add github:01Virex/dsh-status-rotator
The dsh CLI will parse the plugin from GitHub and install it into the current profile. Plugins from GitHub may execute code during installation, and they will run with the permissions of the current dsh process. Before installing, you should review the repository source code and the MIT license; only install plugins from trusted sources. For reproducible installations, you can pin the commit hash. When checking the repository for this article, the latest commit on the main branch is 09836ff04330a17fc670c27a4bed6855547c88ad (2026-08-15), which can be written as:
dsh plugin add github:01Virex/dsh-status-rotator#09836ff04330a17fc670c27a4bed6855547c88ad
The hash will change as the repository updates, so it is safer to confirm it on GitHub before installing. The placeholder写法 on the directory page is github:01Virex/dsh-status-rotator#commit.
After installation, restart dsh web as suggested in the README, and perform a hard refresh in the browser with Ctrl+F5. The plugin declares dsh.client.platform = "web", so it only works on the web interface; running tasks in pure headless mode will not show any effect.
If you do not want to use dsh plugin add, the README also provides manual mounting steps, consistent with the insertion content in cordis.patch.yml:
1. Place the project directory under the current profile’s node_modules (the default Windows path is like C:\Users\<YourName>\.dsh\profiles\node_modules\dsh-status-rotator\).
2. Insert the following into the profile’s cordis.patch.yml:
- insert:
- id: status-rotator
name: dsh-status-rotator
- Run
node gen-config.cjsin the plugin directory to generate the localconfig.jsonfromconfig.example.json(it will only create the file if it does not exist, and will not overwrite your modified configuration). - Restart
dsh weband perform a hard refresh in the browser with Ctrl+F5.
The gen-config.cjs step is not mandatory: when the Node side cannot read config.json, it will directly serve config.example.json, so after installing via the directory command and hard refreshing, you will generally see the sample text. If you want to permanently modify your own sentences, generating a local config.json is more appropriate; this file is already ignored by .gitignore.
To uninstall, delete the status-rotator line from cordis.patch.yml and restart dsh web.
Configuration and Typical Usage¶
There are two configuration files in the project root directory:
- config.example.json: The complete built-in template with default parameters and Chinese/English texts for the three phases.
- config.json: Local personalized configuration, initialized by gen-config.cjs.
The structure can be divided into two parts: “parameters” and “texts”. Below is the skeleton given in the README (texts are replaced with ellipses):
{
"config": {
"intervalMs": 10000,
"typeSpeedMs": 30,
"longAfterMs": 60000,
"debug": false,
"gradient": {
"enabled": true,
"colors": ["#ff5f6d", "#ffc371", "#ffdd55", "#7dff7d", "#5fd4ff", "#a78bfa", "#ff8adb"],
"speed": 4
}
},
"phrases": {
"zh": {
"thinking": ["…"],
"running": ["…"],
"long": ["…"]
},
"en": {
"thinking": ["…"],
"running": ["…"],
"long": ["…"]
}
}
}
The meaning of each field is as follows:
| Key | Default Value | Description |
|---|---|---|
intervalMs |
10000 | Rotation interval within the same phase (milliseconds) |
typeSpeedMs |
30 | Interval between each character for the typing effect (milliseconds), 0 to disable |
longAfterMs |
60000 | Threshold for entering the long phase |
debug |
false | Console diagnostic logs |
gradient |
See above | false to disable; true to use the default color scheme; or {enabled, colors, speed} |
phrases |
From the configuration file | Chinese/English × three phases; you can only write part of them, and missing items will be filled according to the fallback rules |
If you just want to turn off the rainbow text and keep other settings default, set gradient.enabled to false, for example:
"gradient": {
"enabled": false
}
The colors array requires at least two colors, which will loop from start to end; speed is the time in seconds for one full color flow cycle, defaulting to 4.
The default Chinese texts in the sample repository are community memes and jokes, for example, the running phase has “Playing Wordle by myself…”, “Pretending to pass the Turing test…”, and the long phase has “Server is busy, please try again later…”. These are just interface texts, not actual actions the plugin is performing. If you want to use it in a work environment, it is recommended to replace the entire table with your own sentences, for example:
{
"config": {
"intervalMs": 8000,
"typeSpeedMs": 0,
"longAfterMs": 60000,
"debug": false,
"gradient": { "enabled": false }
},
"phrases": {
"zh": {
"thinking": ["Reading task…", "Organizing context…"],
"running": ["Calling tools…", "Modifying workspace files…"],
"long": ["This round will take longer, please wait…"]
}
}
}
Save the modified config.json and refresh the page, and it will re-fetch the route. You do not need to restart the Node process; if the browser is still using old cache, perform a hard refresh again.
There are multiple layers of text source overriding, with priority from highest to lowest:
1. localStorage single-item override: dsh-status-rotator.texts.[.] / texts
2. localStorage full configuration: dsh-status-rotator.config (paste the entire JSON into it, take effect after refreshing)
3. External JSON: dsh-status-rotator.url > the EXTERNAL_URL constant in the source code > the locally auto-loaded /plugins/dsh-status-rotator/config.json
4. Built-in default values: only DEFAULT_CONFIG at the top of lib/client.js (does not include texts)
Old-format pure text JSON (such as { "zh": [...], "en": [...] } or { "thinking": [...] }) is still compatible and will be treated as “configuration only with texts”. Modifying config.json daily is sufficient; localStorage is more suitable for temporarily testing a sentence without editing files.
In addition, the repository also includes an optional script scripts/fetch-qq-group.cjs: if you have a OneBot v11 compatible HTTP API on your machine (the README gives examples of NapCat / LLOneBot / go-cqhttp / OpenShamrock), or prepare a local member list, you can generate sentences like “Routing (XX) to write code…”. Without a bot, write nicknames line by line into members.txt and run:
node scripts/fetch-qq-group.cjs --input members.txt
The generated result only has the zh.thinking group by default, and other phases will use the same group according to the fallback rules. This is not a required step for installing the plugin, and you can ignore it if you do not need it.
Applicable Scenarios and Notes¶
It is suitable for users who are already using the dsh web interface, find the bottom status line too monotonous, and want to customize their own texts. It only modifies this single display element, and is not the same type of tool as sidebars, theme skins, or task dashboards.
There are several points to note when using it:
1. This is a Web UI plugin. The dsh.client.platform in package.json is web, and there is no corresponding status line in headless mode without a graphical interface.
2. It does not change what the agent does. The phase division only looks at the timer in TurnStatus, not parsing model outputs or tool calls. The timer appears after about 15 seconds, so the first dozen seconds will fall into the thinking phase.
3. The default sample texts are in a joking tone, with some memes and sarcasm. If you use config.example.json directly after installation, the status bar will cycle through these sentences; you should replace them with your own texts for public demonstrations or formal environments.
4. The plugin runs with the permissions of the current dsh process, and may execute code from GitHub during installation. Check the source code repository and license before installing; pin the commit for reproducible environments. The community directory is not an official app store, and inclusion does not mean official endorsement.
5. dsh itself is still in developer preview, and if the DOM structure of the Web UI is adjusted later, the positioning method based on role / aria-live may fail. If the status line does not change, first perform a hard refresh, then enable debug: true and check the console logs.
Summary¶
dsh-status-rotator replaces the fixed Deep diving... text at the bottom of the web interface with custom texts that rotate by phase, support typing effects, and can use gradients, while keeping the timer and agent behavior unchanged. Use the installation command from the directory page:
dsh plugin add github:01Virex/dsh-status-rotator
Directory details page: https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-status-rotator/
GitHub repository: https://github.com/01Virex/dsh-status-rotator