DSH web-profile plugin bundle that replaces the static "Deep diving..." turn-status label with 96 rotating loading phrases. Entirely browser-side: it claims the [role="status"] label text node, re-asserts the claim when React reconciles the stock string back, and rotates phrases on a 2.2s timer so the label keeps moving even when streaming never re-renders it. The elapsed-time clock, aria-live, and shimmer styling are untouched. Includes a headless DOM-stub test covering initial claim, clock preservation, React revert, timer rotation, localized-label detection (Deep diving... / 深度求索中...), and clean disposal. Architecture inspired by ldgeng/dsh-claudecode-tips (MIT).
based-dsh-diving
Deep diving was never the vibe.
A DeepSeek Harness (DSH) plugin for the web profile. It swaps the static Deep diving... turn-status label for 96 rotating loading phrases drawn from the terminally-online end of the English language. The elapsed-time clock beside the label is left alone.
Inspired by ldgeng/dsh-claudecode-tips, with the vibes recalibrated.
Before: Deep diving... 12s
After: Nuking the database... 12s
Install
Requires the web profile and DSH 0.1.0-rc.6 or newer (out-of-tree bundle support).
# straight from Gitea
dsh plugin --profile web add git+https://gitea.milesward.dev/mward4/based-dsh-diving.git
# or from a local checkout
dsh plugin --profile web add /path/to/based-dsh-diving
Then restart the web UI:
dsh --profile web
Verify it works
- Open a session.
- Send a message.
- While the model works, the status line should cycle phrases every ~2.2s —
Burning tokens...,Yapping...,Tracing Satoshi Nakamoto...— with the timer still counting on the right.
Disable it
Without uninstalling, add this to the profile's cordis.patch.yml:
- id: based-dsh-diving
disabled: true
Coexistence with @claude-code-tips/dsh-plugin
Both plugins claim the same role="status" label, so whichever loads first wins and the other goes quiet. Run one at a time:
- id: claude-code-tips
disabled: true
Configuration
Everything tunable lives at the top of client.js:
| Constant | Default | Purpose |
|---|---|---|
PHRASES |
96 | Bare phrases — the ... is appended at render time. |
ROTATE_MS |
2200 |
How often the label changes while a turn runs. |
SCAN_DEBOUNCE_MS |
120 |
Debounce for DOM rescans. |
To add your own, drop a string into PHRASES and restart the web UI. No build step.
The phrases
The originals (22)
Draining oceans, Killing sea turtles, Half-assing responses, Burning tokens,
Doomscrolling, Vibecoding, Deep diving, Bullshitting, Gaslighting,
Procrastinating, Guessing, Glazing, Crashing out, Deleting all files,
Melting glaciers, Evaporating a lake, Frying the power grid,
Strip-mining for lithium, Nuking the database, Malding, Spiraling,
Hallucinating
Chronically online (20)
Yapping, Rizzing up the context window, Aura farming, Losing aura,
Letting him cook, Locking in, Fumbling the bag, Securing the bag,
Standing on business, Thugging it out, Schizoposting, Touching grass,
Catching feelings, Having a whole episode, Doing donuts in the parking lot,
Rage-quitting mid-thought, Silently judging you, Speedrunning your codebase,
Pretending to work, Panicking quietly
Engineering crimes (9)
Refactoring everything for no reason, Renaming everything to data,
Force-pushing to prod, Blaming the intern, Gaslighting the compiler,
Copy-pasting from Stack Overflow, Blaming DNS, Consulting the rubber duck,
Shipping it anyway
Crashed out (10)
Dissociating, Blacking out, Losing the plot, Watching paint dry,
Staring at the wall, Buffering, Texting your ex, Buying more RAM,
Downloading more RAM, Mining bitcoin
Superstition (5)
Reading your horoscope, Blaming Mercury retrograde, Praying,
Flipping a coin, Rerolling the dice
Hardware abuse (4)
Shoveling coal into the GPU, Blowing on the cartridge, Wiggling the cable,
Reseating the RAM
Eco-villain arc (13)
Boiling the ocean, Siphoning the water table, Deforesting the Amazon,
Burning down the server farm, Farting in the datacenter, Blowing a transformer,
Draining the reservoir, Murdering the ozone layer, Starting a land war in Asia,
Running the AC with the window open, Idling a jet engine,
Launching a rocket for no reason, Causing a minor international incident
Financial damage (7)
Embezzling tokens, Burning your API budget, Costing you $47 in one turn,
Draining your credit card, Burning the rent money, Money-laundering,
Overdrafting the account
Federal crimes (6)
Selling data to China, Exporting APIs to China, Selling your data to advertisers,
Parsing Hunter Biden's laptop, Installing key-logger, Tracing Satoshi Nakamoto
How it works
A DSH plugin bundle is three small pieces:
| File | Role |
|---|---|
index.js |
Host-side half. Deliberately a no-op — the work happens in the browser. |
client.js |
Browser-half bundle: finds the status label and rewrites its text node. |
cordis.patch.yml |
Inserts the based-dsh-diving row into the web profile's plugin tree. |
client.js locates the label via [role="status"] and matches its text against the stock label in every shipped locale (Deep diving... / 深度求索中...). It then:
- claims the text node and swaps in a random phrase,
- re-asserts the claim if React reconciles the label back to the stock string,
- rotates the phrase on a timer, so it keeps moving even when streaming never re-renders the label.
Only the label text node is touched. The clock span, aria-live, and the shimmer styling are untouched.
No server code, no model prompt changes, no fork of DSH.
Development
No build step, no runtime dependencies.
node test/client.test.mjs
The test runs client.js against a minimal DOM stub and checks six behaviours: initial claim, clock untouched, React revert re-asserted, timer rotation, localized-label detection, and clean disposal. All checks print PASS/FAIL.
Credits
- Architecture inspired by
ldgeng/dsh-claudecode-tips(MIT). - Built for DeepSeek Harness.
License
MIT — see LICENSE.