DeepSeek Harness Plugin Hub

Publish and manage complete Harness Profiles. Discover Plugins for your next setup.

Explore

PluginsPresetsDocsNews

Community

Publish a pluginContactReport an issue

Resources

Plugin Hub on GitHubDeepSeek HarnessSystem statusPrivacy notice
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

Independent and unofficial. Not affiliated with, authorized by, or endorsed by DeepSeek.

Media Web Preview — DSH Plugin for DeepSeek Harness
DeepSeek Harness Plugin Hub
ProfilesPluginsCategoriesNewsDocsSign inManage Profiles
ProfilesPluginsCategoriesNewsDocsSign in
← Plugins
M

dsh-media-web-preview

Media Web Preview

In-browser audio and video previews in the DSH right Sidebar, backed by an authenticated byte-range media route so a remote browser can play and seek large files without opening a native app on the Host.

The plugin will be installed here. Keep web if you are unsure.

npx -y @deepseek-ai/dsh plugin --profile web add github:wilsonchengassistant/dsh-media-web-preview#eb1ae92be47e2e79022e72599957643f1357a105
READMECompatibilityVersions

Compatibility and provenance

Media Web Preview is published as dsh-media-web-preview and currently resolves to version 1.0.0. The Hub verifies its manifest and preserves the exact installation source for reproducible installs.

DSH compatibility
*
Runtime surfaces
web
Release source
github
Registry updated
10/19/2026

Versions

1.0.0stable
10/19/2026

Related plugins

Loading related plugins…

Latest
1.0.0
DSH
*
HMR
Process restart
Tree shaking
Safe tree shaking not declared
Unpacked size
Unavailable
Files
Unavailable
Surface
web
License
MIT
Source
github
GitHub
★ 0
Weekly downloads
0
Last push
10/19/2026
View source ↗
README badge

Click the badge to copy Markdown for your README.

Do you maintain this Plugin?Claim benefit · Priority security scan

Verify the GitHub repository declared in package.json to manage this listing. After you claim it, Hub will prioritize a security scan of the current version and publish the result when it passes.

Claim this Plugin →
Report an issue

Related plugins

More verified plugins in vision-media.

Experimental Voice Input Bundle@deepseek-ai/dsh-experimental-voice-input-bundleExperimental voice input with local SenseVoice; downloads its runtime on first useModlens@liustack/modlensPlug-in vision for text-only LLMs, powered by the free Antigravity CLIAb Ocrdsh-ab-ocr--- description: "The out-of-tree ocr tool: recognizes a scanned PDF or image page by page, merges the pages in order only after the last one, and saves one Markdown document with the heading levels the model decided." kind: "package-reference" ---Tool Describe Image@linxin666/dsh-tool-describe-imageModel-facing describe_image tool for the dsh web GUI: gives a text-only model image understanding by asking a vision-language model at an OpenAI-compatible endpoint to describe one image (local path, http(s) URL, or attachment reference). Hot-pluggable —

README

dsh-media-web-preview

Play video and audio inside the DSH right Sidebar — including from a remote browser, where the native Open button would otherwise launch QuickTime or Music on the Host Mac.

The problem

DeepSeek Harness's document preview renders text, Markdown, code, images, PDF, HTML, Office documents and spreadsheets. It has no audio or video renderer, and mp4, mp3, wav, flac, ogg, m4a, aac, wma and opus are listed as known binary containers with no viewer. Opening one shows:

Preview is not available for this file type yet. Open

Open asks the Host to launch the file in a native application. On the machine running the Host that is fine; from a phone, another laptop, or a Tailscale peer it opens a window on a screen you are not looking at.

What this plugin does

It registers two document renderers, video and audio, and draws the browser's native player in the preview pane. A companion Host route streams the file with HTTP Range, so seeking works and a large video is never read into memory or into the conversation.

  • Native controls — play/pause, seek, volume, fullscreen (video), and the browser's own picture-in-picture where available.
  • Seek without downloading everything — 206 Partial Content + Content-Range; the player asks for the bytes it needs.
  • Remote-browser ready — the URL is document-relative, so the same preview works under http://127.0.0.1:3080, a LAN address, a Tailscale MagicDNS name, or tailscale serve on port 80. No configuration.
  • Download / open in a new tab — both actions sit under the player.
  • Localized — English and Simplified Chinese dictionaries.
  • Zero runtime dependencies — one Host module and one browser bundle.

Formats

KindSuffixes
Videomp4 m4v webm ogv mov mkv avi mpg mpeg 3gp 3g2 ts m2ts
Audiomp3 m4a m4b aac wav flac ogg oga opus weba aiff aif wma mid midi

Playback is the browser's decision: Chromium plays H.264/AAC MP4, WebM, Ogg and most audio, but usually cannot decode Matroska (.mkv) or AVI. When a codec is unsupported the player shows an explicit message and the download link rather than failing silently.

Install

From npm:

dsh plugin --profile web add dsh-media-web-preview

From a local directory:

dsh plugin --profile web add file:/absolute/path/to/dsh-media-web-preview

dsh plugin add records the dependency and appends the package to dsh.profile.bundles; the package ships dsh.bundle.patch, so no manual insert: row is needed in the profile's cordis.patch.yml.

The Host half hot-mounts into the running dsh web; refresh the page once so the browser bundle enters the module graph. If your build only composes plugins at boot, restart dsh web instead.

Then open any supported file in the Sidebar's Files tab. The native Open menu stays available at the top.

Why a second file route

DSH already has GET /api/file, used by the image and Markdown previews. It always answers with a full 200, ignores Range, and caps the response at the attachment image limit (20 MB by default). That is fine for images and hopeless for video: no seeking, and a large file just returns 413.

Rather than change a shared route, this plugin adds a range-capable sibling:

/api/file/api/media
Full response200200
Range requestignored (full 200)206 + Content-Range
Seekingmust download the whole fileimmediate
Byte cap~20 MBbounded by the filesystem
Readswhole file buffered1 MiB chunks via ctx.fs.readByteRange

Both routes sit under /api, so the Connection service applies the same Host / Origin check and browser-cookie authentication to both.

Implementation

lib/index.js      Host: GET/HEAD /api/media, Range parsing, chunked streaming
lib/client.js     Browser: documentPreviews + sidebar.right.tab.document
cordis.patch.yml  bundle insert row

The browser half registers through ctx.documentPreviews with loading: 'renderer' and declares the suffixes as binary so nothing falls back to a text preview. The player reads the absolute path from the file resource (useResource(resourceAddress).value.absolutePath), builds a document-relative api/media?path=… URL, and calls content.loaded(version) once to end the loading state.

The Host half registers ctx.connection.fetch.register({ path: '/api/media', methods: ['GET', 'HEAD'] }). Requests resolve through ctx.fs, so the Host's own file policy still applies; parseRange turns Range into a closed interval. 416 carries bytes */<size>; HEAD returns headers only; download=1 adds an attachment Content-Disposition.

Security

  • The route lives under /api, so it inherits the same authentication and Host/Origin checks as every other DSH API. Unauthenticated requests get 401; an untrusted Host gets 403.
  • Only absolute paths are accepted; there is no directory listing, and nothing bypasses the filesystem provider's resolution and access policy.
  • Responses carry Cache-Control: private, no-store and X-Content-Type-Options: nosniff.
  • No telemetry, no outbound network requests, no runtime dependencies.

Verified

  • A 59.6 s MP4 plays and seeks to 40 s over a Tailscale MagicDNS URL.
  • A 28.6 MB MP4 returns 413 on /api/file but 200 / 206 on /api/media.
  • Range: bytes=0-1023 returns 206, Content-Length: 1024, Content-Range: bytes 0-1023/<size>.
  • Unauthenticated requests return 401; an invalid range returns 416 with bytes */<size>.
  • An MP3 reads its metadata and seeks to 30 s.

Compatibility

  • DSH 0.2.0-rc.2 web composition, and later versions that keep providing ctx.documentPreviews, sidebar.right.tab.document, ctx.connection.fetch and ctx.fs.readByteRange.
  • Node 22+.
  • Also usable from the DSH desktop app: the in-app route is document-relative.

Scope

This plugin focuses on the stock right Sidebar and remote-browser playback. It does not provide playlists, subtitle tracks, playback-speed controls, or inline media cards in the chat transcript — other community plugins cover those. Playback behaviour is whatever the browser's native controls provide.

Development

npm test        # node --test: Range parsing and MIME mapping

There is no build step. lib/client.js is a hand-written module-loader bundle (window.__ModuleLoader__.load) that requests only react and react/jsx-runtime, so it uses the Host's own React.

End-to-end check: with the plugin installed in a DSH web instance, open a supported file and confirm the <video>/<audio> element reaches readyState 4 and that currentTime follows after a seek.

License

MIT © 2026 Wilson Cheng