useful-dsh-plugins
August 24, 2026 · View on GitHub
Community plugins for DeepSeek Harness (@deepseek-ai/dsh). This is an independent community project, not affiliated with DeepSeek.
Drop-in plugins that work together: upload a file in the chat composer → let the agent read documents → images are recognized into text automatically via DeepSeek's built-in multimodal model.
Packages
| Package | Type | What it does |
|---|---|---|
dsh-upload-button | dual-face (host + browser) | A borderless 📎 button in the composer toolbar. Uploaded files appear as floating, Microsoft-classic colored cards above the input; pressing the ordinary Send button attaches their saved paths to the outgoing message automatically (native input-machine occurrence pipeline — zero send interception); message paths render as compact file cards (click to open). |
dsh-plugin-doc-reader | host | The model-facing read_document tool: reads text, PDF, DOCX and XLSX files through the harness filesystem backend (ctx.fs), with the built-in read tool's line-window semantics. Text only — no image recognition (OCR); scanned PDFs yield no text. |
dsh-plugin-vision-reader | dual-face (host + browser) | Lets text-only main models read images: image content is routed through DeepSeek's built-in multimodal model (deepseek-v4-flash-vision-exp) and returned as plain text — no extra API key required (shares the main model's DEEPSEEK_API_KEY). Three capabilities: a vision tool, auto-transcription of pasted images, and automatic read_image hiding while the main model is text-only. |
dsh-desktop-config | dual-face (host + browser) | Desktop launcher configuration: port, bind host, auto-open — owned as a settings namespace (desktop-launcher) in $DSH_HOME/settings.yaml, shared between the Electron desktop shell and the web settings page. |
useful-dsh-plugin-manager | dual-face (host + browser) | A visual plugin manager: a Manage tab in Web Settings → Plugins — disable/enable any plugin row, check and update out-of-tree packages, one-click repair of every row (official packages included, restored from the registry tarball), and restore-all. |
Installation
One command installs everything:
dsh plugin --profile web add useful-dsh-plugins@latest --config.minimumReleaseAge=0
# restart dsh web
@latest --config.minimumReleaseAge=0guarantees the newest published release: pnpm ≥ 11.7's supply-chain gate otherwise skips releases that are only minutes old, so a plainadd useful-dsh-pluginsright after a release can resolve an older version. If you already have an older range installed,addwithout@latestkeeps it.
Or install the plugins individually:
dsh plugin --profile web add dsh-upload-button@latest --config.minimumReleaseAge=0
dsh plugin --profile web add dsh-plugin-doc-reader@latest --config.minimumReleaseAge=0
dsh plugin --profile web add dsh-plugin-vision-reader@latest --config.minimumReleaseAge=0
dsh plugin --profile web add dsh-desktop-config@latest --config.minimumReleaseAge=0
dsh plugin --profile web add useful-dsh-plugin-manager@latest --config.minimumReleaseAge=0
# restart dsh web
All packages declare their cordis bundle patch (dsh.bundle), so dsh plugin registers them into dsh.profile.bundles automatically.
Troubleshooting (broken plugins / startup failures)
The plugins live in $DSH_HOME/profiles/<name>/node_modules (default ~/.dsh/profiles/web). If a locally modified plugin crashes or a conflict prevents startup, work through these steps:
- Diagnose:
dsh --profile web --dump-configprints the composed tree; failing rows are marked. - Uninstall:
dsh plugin --profile web remove useful-dsh-plugins(or the offending package name) — this also clears its bundle registration. - Reinstall the published version:
dsh plugin --profile web add useful-dsh-pluginsrestores the npm release. - Force-restore corrupted files:
dsh plugin --profile web add useful-dsh-plugins --force(re-links files from the pnpm store, ignoring local edits). - Pin an older version:
dsh plugin --profile web add useful-dsh-plugins@0.1.0. - Nuclear reset: delete
$DSH_HOME/profiles/webentirely; the nextdsh webrebuilds the default template (clears all plugins and custom config for that profile). - Restart
dsh webafter every change.
A graphical alternative (enable/disable, version check, one-click update in Settings → Plugins) is provided by useful-dsh-plugin-manager.
Requirements
- DeepSeek Harness
@deepseek-ai/dsh≥ 0.1.0-rc.6 (peer dependencies are provided by the harness installation) dsh-upload-buttonadditionally needs thewebprofile composition (it mountsctx.webServer,ctx.slotsandctx.inputTriggers)dsh-plugin-vision-readerneeds a DeepSeek account withdeepseek-v4-flash-vision-expavailable (shares the main model'sDEEPSEEK_API_KEY— no separate billing channel)
Development
# doc-reader: plain ESM, no build step
cd dsh-plugin-doc-reader && npm install --legacy-peer-deps && npm test
# upload-button / vision-reader / desktop-config: esbuild bundles both halves
cd dsh-upload-button && npm install --legacy-peer-deps && npm run build && npm test
cd dsh-plugin-vision-reader && npm install --legacy-peer-deps && npm run build && npm test
cd dsh-desktop-launcher && npm install --legacy-peer-deps && npm run build && npm test
Architecture notes and the UI-mechanism deep dive live in docs/ (currently in Chinese) — notably the input-machine occurrence pipeline research (docs/dsh-web-ui-plugin-research.md), which is the reference for anyone building composer-attachment plugins on this platform.