Introduction

When using DeepSeek Harness (dsh) with its Web interface, a fixed status message like Deep diving... appears at the bottom during each turn. For those who frequently monitor the interface, this message is functionally adequate but lacks customization and provides no insight into the current phase or conversation context.

Here, we introduce dsh-status-rotator. It only replaces the text in the TurnStatus line, leaving the runtime clock (which appears after 15 seconds) untouched, and does not affect code blocks or other aria-live areas in the chat history. The phrases, gradients, tab title, floating pill, and preset scheduling can all be customized via JSON or the DSH settings page, typically without requiring a process restart.

What Is It

dsh-status-rotator is a DSH Web plugin maintained by 01Virex and categorized as a “Fun Customization” in the SkillHub community directory. The GitHub repository currently has approximately 52 stars.

In one line: it replaces the Deep diving... status label at the bottom of the dsh Web UI turn with custom phrases that switch by phase, feature typewriter animation, support vibrant gradients, and utilize template placeholders for real-time values.

The license is MIT. The plugin runs with the dsh process; it’s recommended to review the source code and license before installation.

Core Features

Based on the above description, the following details are broken down by capability. All information comes from the project README and package.json declarations.

Phase-Aware Phrases

Phrases are grouped into three phases based on turn progress. The text changes immediately upon phase transitions, without waiting for the rotation interval:

Phase Trigger Condition Default Duration
thinking Turn just started, no clock in TurnStatus yet 0 – 15s
running Clock appears, hasn’t exceeded longAfterMs 15s – 60s
long Clock reading exceeds longAfterMs ≥ 60s

If a phase lacks phrases, it automatically falls back (runningthinking → any non-empty group).

Typewriter, Gradient, and Rotation

  • Phrases can be typed out character by character, with typeSpeedMs controlling the speed. Set to 0 to disable the typewriter effect.
  • A flowing vibrant gradient is enabled by default, affecting only the status text (not the clock). It can be disabled or customized via the color sequence and speed in the configuration.
  • intervalMs (default: 10000 ms) controls the rotation interval for multiple phrases within the same phase.

Template Placeholders and Live Engine

Any phrase, title template, or pill template supports placeholders. Fields that change over time (e.g., {elapsed}, {tps}) refresh according to liveTickMs (default: 1000 ms); set to 0 to update only on rotation.

Common placeholders include:

Placeholder Meaning
{elapsed} Current turn elapsed time, styled like the interface clock
{phase} / {phaseLabel} Phase ID or localized short label
{model} / {provider} Current session model and provider routing
{tps} Estimated streaming tokens per second
{pending} / {tools} / {running} Pending approvals, running tool names, running status
{locale} / {date} / {time} Interface language, local date and time

Live values are sourced from a status engine that subscribes to dsh session snapshots and model RPC; when the session API is unavailable, related fields display , but other plugin functions continue to work.

Example:

"phrases": {
  "zh": {
    "thinking": ["正在写代码 {elapsed}…", "正在{phaseLabel}中 ({elapsed})…"]
  }
}

Tab Title, Floating Pill, and Presets

  • Browser Tab Title: Optionally rotate document.title during an active turn, and restore the original title or display an idleTemplate when idle.
  • Floating Status Pill: Registered in the official shell.overlay slot, with a default template like {model} · {phaseLabel} · {elapsed} · ⚡{tps} tok/s. Position and opacity are configurable.
  • Presets and Scheduling: Multiple named phrase sets can have independent config / phrases; the settings page allows manual switching or automatic switching based on day and time (schedule).

Settings Page, Hot Reload, and Localization

The DSH “Settings” page gains a Status Phrases section: a visual editor for Chinese/English × three-phase phrase sets. Basic parameters, gradients, pills, presets, and scheduling rules are also on the same page. Saving writes back the configuration via HTTP routes registered by the node half, applying changes immediately without refreshing the opened page.

Phrases switch between Chinese and English following “Settings → Language”; unknown languages fall back to Chinese. The plugin precisely targets TurnStatus using role="status" and aria-live="polite", preventing unintended changes to chat content.

Installation and Activation

Recommended to install the latest version from npm using the official one-liner:

dsh plugin --profile web add dsh-status-rotator

The package.json declares dsh.bundle.patch, so it will be automatically recognized by dsh after installation without needing extra flags. After the first installation, a restart of dsh web is required; a hard refresh (Ctrl+F5) in the browser is also suggested.

Installation from a local cloned directory or a Release .tgz package uses the same syntax:

dsh plugin --profile web add ./dsh-status-rotator
dsh plugin --profile web add /path/to/dsh-status-rotator-<version>.tgz

For manual installation, place the project in the profile’s node_modules, insert the plugin entry into cordis.patch.yml, run node gen-config.cjs to initialize config.json, and then restart dsh web.

To uninstall, remove the status-rotator entry from cordis.patch.yml and restart.

Typical Usage

1. Edit Phrase Sets in the Settings Page (Easiest Way)

Open DSH’s bottom-left “Settings” → Status Phrases, edit the thinking / running / long text boxes (one phrase per line) under the Chinese / English tabs, adjust rotation interval, typewriter speed, gradient, and pill, then click “Save Phrases”. Changes take effect immediately on the current page.

2. Directly Edit config.json

On first use, generate the local config.json from config.example.json via node gen-config.cjs. Top-level structure example:

{
  "config": {
    "intervalMs": 10000,
    "typeSpeedMs": 30,
    "longAfterMs": 60000,
    "reloadIntervalMs": 15000,
    "liveTickMs": 1000,
    "gradient": { "enabled": true, "speed": 4 },
    "title": { "enabled": false },
    "pill": {
      "enabled": true,
      "template": "{model} · {phaseLabel} · {elapsed} · ⚡{tps} tok/s",
      "position": "right-bottom"
    }
  },
  "phrases": {
    "zh": { "thinking": ["…"], "running": ["…"], "long": ["…"] },
    "en": { "thinking": ["…"], "running": ["…"], "long": ["…"] }
  }
}

While the page remains open, the plugin automatically re-reads the configuration according to reloadIntervalMs; switching back to the tab also triggers an immediate re-read, so browser refreshes are generally unnecessary.

3. Work / Fun Presets with Time-Based Switching

{
  "activePreset": "work",
  "presets": [
    {
      "id": "work",
      "label": { "zh": "工作模式", "en": "Work" },
      "config": { "intervalMs": 12000, "gradient": false },
      "phrases": { "zh": { "thinking": ["正在认真写代码…"] } }
    },
    {
      "id": "fun",
      "label": { "zh": "摸鱼模式", "en": "Fun" },
      "phrases": { "zh": { "thinking": ["正在摸鱼…"] } }
    }
  ],
  "schedule": [
    { "preset": "work", "days": ["mon", "tue", "wed", "thu", "fri"], "from": "09:00", "to": "18:00" },
    { "preset": "fun", "days": ["sat", "sun"], "from": "00:00", "to": "23:59" }
  ]
}

4. Disable Vibrant Gradient

"gradient": {
  "enabled": false,
  "colors": ["#ff5f6d", "#00ff88", "#4da6ff"],
  "speed": 4
}

Use Cases and Notes

Who It’s For

  • Developers who frequently wait for model output in the dsh Web UI and want the status line to be more informative or personalized.
  • Users who need to display different tone phrases by phase (just started / running / long task) or want to include real-time fields like {model}, {tps} in the status line.
  • DSH users looking to give the interface a lightweight “fun customization” without modifying the dsh core.

Important Notes Before Use

  • The plugin runs with the current dsh process permissions; review the source code and MIT license before installing from npm or GitHub.
  • SkillHub (https://www.skillhub.cn/plugins/01Virex/dsh-status-rotator) is a community plugin directory with no official affiliation to DeepSeek or Moby. The DSH ecosystem follows an “everything is a plugin” philosophy; this plugin is a community contribution, not an official built-in feature.
  • If the browser console shows [status-rotator] ⚠ localStorage override active, it means an old override in localStorage is still in effect, potentially overriding the external config.json; clear the relevant key if needed.
  • After upgrading to a version with a settings page and write interface, a restart of dsh web is required for the node half to register the PUT route; subsequent phrase editing can then be done via the settings page.

Links

  • SkillHub Directory Page: https://www.skillhub.cn/plugins/01Virex/dsh-status-rotator
  • GitHub Repository: https://github.com/01Virex/dsh-status-rotator
  • npm Package Name: dsh-status-rotator