DeepSeek Harness Plugin

cccc12138/dsh-read-aloud

Stars ★ 0 Downloads (30d) 157 Category Voice & Audio Added 2026-09-21 npm dsh-read-aloud

Adds a speaker button immediately right of the Like button on every finalized assistant reply; click it to hear the reply through the browser speech engine, and hover it for a speed and voice panel.

Install

# from npm (prebuilt)

dsh plugin --profile web add dsh-read-aloud

# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)

dsh plugin --profile web add github:cccc12138/dsh-read-aloud

Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).

README

English | 中文

A speaker button beside the Like button: read any DeepSeek Harness reply aloud.

Every finalized assistant message gets one extra action in the row it already has, immediately to the right of 👍👎:

copy · 👍 👎 · 🔊 · branch

Click it and the reply is spoken by your browser's own speech engine. Nothing is uploaded, no API key is involved, and no host-side code runs.

Install

dsh plugin --profile web add dsh-read-aloud

Or install it from Settings → Plugin Market. Most installs go live after a page refresh.

Use

Action Result
Click the speaker Starts reading this reply from the top
Click again while reading Pauses; the icon becomes ▶
Click again while paused Resumes from the same sentence
Click another message's speaker Stops the current one and starts that one
Esc Stops immediately, wherever the pointer is
Hover the speaker Opens the speed and voice panel

The button shows three states: 🔈 idle, ⏸ reading, ▶ paused. Reading ends by itself, and the icon returns to 🔈.

Speed and voice

Hovering the button opens a small panel that stays with the message you are listening to:

Speed   [0.5×] [0.75×] [1×] [1.25×] [1.5×] [1.75×] [2×]
Voice   [ System default ▾ ]

Both choices take effect on the sentence being read and are remembered in the browser's local storage. Voices come from your operating system; the list is sorted with Chinese voices first, and System default picks a voice matching your interface language.

What gets read

Replies are Markdown, and reading Markdown literally sounds terrible — URLs get spelled out character by character and code blocks become noise. So the text is cleaned first:

Kept Dropped
Prose and headings Fenced code blocks (silently)
List items, with their markers removed Table rows
Inline code content, without the backticks Image syntax
Link labels Link targets and bare URLs
Emphasis text, without ** and * HTML tags, file paths, emoji

Long replies are read in full — nothing is truncated. The text is queued in sentence-sized pieces rather than handed to the engine in one lump, because several engines silently cut short or drop a single very long utterance.

Requirements

  • DeepSeek Harness 0.1.2-rc.1 or newer
  • A browser with the Web Speech API. Speech comes from your operating system's installed voices, so an OS with no voice for the reply's language will stay silent — Windows and macOS both ship usable voices, and Edge exposes additional natural voices.
  • If the engine is missing entirely, the button says so instead of failing silently.

Privacy

  • No network requests. The plugin never contacts a server.
  • No API keys, no accounts, no telemetry.
  • No host-side code: lib/index.js is an empty apply that exists only so the plugin appears in the profile's loader.
  • Speed and voice live in your browser's local storage under dsh-read-aloud/settings. Clearing site data resets them to and System default; nothing else is affected.

Compatibility

The plugin declares engines.dsh >= 0.1.2-rc.1 and registers one entry in the conversation.chat.assistant-actions slot at order: 20, so it sits beside the shipped feedback entry (order: 10) without replacing it. It reads the reply text through the slot's own useChat standard prop, so it needs no host RPC and no DOM scraping.

Development

npm test

The bundle is hand-written in the client-module format the web shell loads, so there is no build step and no bundler — lib/client.js is shipped as authored. The test loads that shipped file with a stubbed module graph and exercises the text-cleaning, chunking, message-lookup and voice-listing helpers.

License

MIT

Content from the project README on GitHub ↗

Links

More in this category

View the whole category →

Community comments

Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.