dsh-viewer # @crosery/dsh-viewer **Everything renders.** One `display_file` tool that puts images, video, audio, PDF, Office documents and local web pages inline in the [DeepSeek Harness](https://github.com/deepseek-ai) conversation, on the web and in the desktop app — with a real player, not a filename and a byte count. [English](README.md) · [中文](README.zh.md) · MIT [![npm version](https://img.shields.io/npm/v/@crosery/dsh-viewer)](https://www.npmjs.com/package/@crosery/dsh-viewer) [![npm downloads](https://img.shields.io/npm/dm/@crosery/dsh-viewer)](https://www.npmjs.com/package/@crosery/dsh-viewer) [![Harness compatibility](https://github.com/Crosery/dsh-viewer/actions/workflows/harness-compat.yml/badge.svg)](https://github.com/Crosery/dsh-viewer/actions/workflows/harness-compat.yml)
--- ## What it does The harness ships `read_image`, whose job is to put a picture into **model context**. It refuses on a text-only route, it handles four raster formats, and up to harness 0.1.2 the built-in web client draws no card for it — so the human in front of the screen sees one line of text. (From 0.1.3 the harness draws its own `read_image` view, and this plugin's card for that key steps aside.) This plugin inverts that. Its job is to put a file **on your screen**. A text-only model route is a normal outcome, not a refusal, and every medium a browser can play is in scope. **36 file extensions across 6 render kinds:** | Kind | Element | Extensions | | --- | --- | --- | | Image | `` + click-to-zoom lightbox | `png` `jpg` `jpeg` `webp` `gif` `svg` `avif` `bmp` `ico` `apng` | | Video | `