Preface¶
DeepSeek Harness (command name dsh) is an agent runtime open-sourced by DeepSeek AI, currently in developer preview. Its repository is located at deepseek-ai/deepseek-harness. The official documentation clearly states its core philosophy: Everything is a plugin. Models, tools, skills, sessions, sandboxes, and even the Web UI can all be replaced or reconfigured at the configuration layer without modifying the framework source code.
After running dsh web for an extended period, the interface itself becomes a pluggable space. Community plugins like task boards, sidebar workbenches, and theme skins have already emerged. One particularly specific demand is: while a session is running, users want to casually scroll through short videos in the sidebar in a mobile-like manner, rather than opening a new browser tab and getting distracted by recommendation feeds.
dsh-douyin was built to solve this exact problem. It is not an official Douyin client, nor does it interface with ByteDance’s open APIs. Instead, it embeds a native <video> player into the DSH WebUI: it parses direct MP4 links from third-party category APIs and enables sequential playback in series. It is listed under the “Interface Enhancement” category in the community directory DeepSeek Harness Plugin Repository. Please note that this directory is an independent website and has no official affiliation with DeepSeek / HyperMind; do not treat it as an official app store.
This article is organized after cross-checking the directory’s detail page, the GitHub repository’s README, package.json, source code, and official Harness documentation.
What It Is¶
dsh-douyin is an interface enhancement plugin maintained by anacondakc, with its repository at anacondakc/dsh-douyin. As of 2026-08-18, GitHub shows 3 stars, its primary language is TypeScript, and it uses the BSD-3-Clause license. The version number in package.json is 0.2.0, and the CHANGELOG records that this release migrated the host/client to the Cordis Context, WebServer, and ClientContext contracts for DSH rc.5. The directory page was added on 2026-08-14, and the latest push was on 2026-08-13.
The problem it solves can be summed up in one sentence: use the native player to directly play short video direct links in the WebUI sidebar (or the right-side floating panel when no sidebar workbench is installed), instead of wrapping a web iframe to scroll through recommendation feeds.
The aggregated video source comes from the category API of api.yujn.cn. The README specifies: each request will 302 redirect to a random MP4 direct link; the browser cannot see the cross-domain redirect target, so the host side registers /dsh-douyin/resolve, uses Node fetch to read the Location header, and then passes it to the native player. The history stack stores the parsed real URL, so scrolling back up will play the previous segment instead of getting a new random link from the API.
Core Features¶
Two Mounting Methods¶
The README divides interface mounting into two modes, automatically selected based on whether dsh-better-sidebar is installed in the current WebUI:
1. dsh-better-sidebar installed: Automatically registers a sidebar tab named “Watch Videos” (single instance), accessible from the sidebar and menu.
2. No sidebar installed: A play button appears on the right edge of the page, and expanding it reveals a full-screen immersive playback panel. This mode does not depend on additional plugins.
The floating dock will not mount the player or iframe when closed, nor will it parse, download, or play media in the background; the panel is immediately unmounted when collapsed. When the panel is open, the session area #root will make space for the panel on the right, with a 200ms smooth animation to prevent content from being blocked.
Native Playback and Precise Playback History¶
The playback workflow is not “opening a short video website”, but follows these steps:
1. Select a feed category.
2. The browser requests the host route /dsh-douyin/resolve.
3. The host only sends a HEAD request to the built-in HTTPS endpoint (redirect: 'manual'), and extracts the Location header from the 302 response.
4. After verifying that the redirect target is a public network address, pass the direct link to the native <video> player.
5. Save this direct link to the history stack. When scrolling back or switching to the previous segment, the same URL will be played.
For automatic sequential playback, the history stack is prioritized; new segments are only requested from the API when reaching the end of the stack. If a single segment fails to load or decode, the backoff interval will increase and the segment will be skipped; after 3 consecutive failures, playback will stop and an error screen will be displayed.
The feed parser is not an open proxy. Both the source code src/index.ts and the README state the same boundary: it only accepts built-in HTTPS endpoints and the _t cache parameter, and will not proxy arbitrary URLs, loopback addresses, or intranet services on behalf of the browser. There are also limits on concurrency and rate (8 concurrent requests at the same time, maximum 60 requests within a 10-second window). This is meaningful for the plugin running the host route with the current dsh process permissions: parsing requests are made in the local Node process, and the whitelist and public IP checks are designed to restrict SSRF, not to turn dsh into a general-purpose video proxy.
21 Built-in Feed Categories¶
The top of the interface features a horizontal category track: the currently selected item is centered, adjacent items fade based on distance, and after stopping scrolling, the corresponding category is loaded, the playback history of the previous category is cleared, and the selection is persisted.
The README specifies that the selector includes 21 feed categories verified via HTTPS 302, including schoolgirls, kawaii, cute girls, smooth dance, perfect body, slow dance, pure girls, COS, street snaps, sweet girls, hot dance, outfits, Zhang Ruonan, Ju Jingyi, etc. The complete id/name/API path can be found in src/feed-sources.ts in the repository. The source code comments also note that categories explicitly marked as minor-oriented on the upstream page have been intentionally excluded.
It is important to clarify the nature of the content: api.yujn.cn provides random short entertainment videos, not user-selected playlists or Douyin account homepages. The category names are just entry points, and the next video to play is determined by the API.
In addition to built-in feeds, the plugin supports two other source types, defined in the README’s type definitions:
| kind | URL Meaning | Playback Method |
|---|---|---|
feed |
Built-in random video API (302 redirects to MP4) | Parsed via host whitelist, then played sequentially by the native player |
direct |
Fixed video file (mp4/webm, etc.) | Played once by the native player, can be paused and replayed; does not respond to previous/next segment switches |
web |
Embeddable web page | Rendered via iframe |
Operation Methods¶
The playback operations listed in the repository README are as follows:
- Click to Pause/Play: Click the video screen to pause; click the screen or the center button again to resume. The center button stays visible when paused.
- Progress and Volume: The current time/total duration is displayed at the bottom, and the progress bar can be dragged; the volume slider in the bottom-right corner ranges from 0–100%, with icons graded for mute/low/high volume.
- Gestures: Swipe up on the mobile video area to go to the next segment, swipe down to go to the previous segment; there will be no accidental pause triggers after swiping.
- Mouse Wheel: On desktop, scroll down to go to the next segment, scroll up to go to the previous segment, with 400ms debounce; scrolling on the blank area of the top floating bar also switches videos.
- Keyboard: Space or K to toggle play/pause, M to toggle mute, left/right arrow keys to rewind/fast-forward 5 seconds, up/down arrow keys to switch videos.
- Category Navigation: The top track can be switched using the mouse wheel, touch horizontal swipe, left/right arrow keys, or direct clicks.
The interface follows the design of mobile short video players: full-screen black background, lightweight category bar at the top, and media controls at the bottom. Selection and focus use the colors #fe2c55 (red) and #25f4ee (cyan), with controls using Lucide icons. The panel width is calculated as min(100vw, clamp(380px, 100vh×9/16, 700px)); 9:16 vertical screen content is almost not cropped at the default aspect ratio, while horizontal or square content will have its left and right sides cropped and centered.
Installation and Activation¶
The installation command provided on the community directory page is as follows, to be run in the DeepSeek Harness terminal:
dsh plugin add github:anacondakc/dsh-douyin
The directory page also notes that for a reproducible installation, you can pin the commit hash:
dsh plugin add github:anacondakc/dsh-douyin#commit
Replace #commit with the actual commit hash. The latest commit on the repository’s main branch as of now is the rc.5 adaptation on 2026-08-13 (commit prefix 2f28338), please use the full SHA from GitHub on the day of installation, do not use an expired short hash.
This is a WebUI plugin. The dsh.client.platform field in package.json is set to web. The local mounting method in the repository README requires adding the --profile web flag, and you need to restart dsh web after making changes:
dsh plugin --profile web add /path/to/DSH-douyin
# Restart dsh web for changes to take effect
When building from source, the commands provided in the README are:
pnpm install
pnpm build # tsc + tsdown + artifact validation
pnpm test # vitest (23 test cases)
dsh plugin --profile web add . # Mount the plugin
The directory page has a fixed reminder: the plugin runs with the permissions of the current dsh process, and may execute code during installation. Please check the source repository and license before installing. dsh-douyin will register HTTP routes in the host process and send HEAD requests to external networks, so this reminder should not be overlooked.
Typical Usage¶
After installing and restarting the WebUI, follow the corresponding entry based on whether dsh-better-sidebar is installed:
1. With sidebar workbench installed: Open the “Watch Videos” tab.
2. No sidebar installed: Click the play button on the right edge of the page to expand the immersive panel.
3. Select a category from the top track, wait for the first segment’s direct link to be parsed.
4. On desktop, use the mouse wheel or up/down arrow keys to switch segments; on mobile, swipe up/down; press space to pause, and left/right keys to fine-tune the progress.
5. Scroll back to confirm that the previously played video is replayed, not a new random video from the API.
6. Collapse the panel when not in use. According to the README, the player will be unmounted after collapsing, and will not continue to pull streams in the background.
Developers can use browser DevTools to verify the mounting, using the command from the repository README:
window.__DSH_BOOT__.entries // Should include id: "dsh-douyin"
document.querySelector('video.vf-video') // Native player exists and paused === false
Applicable Scenarios and Notes¶
This plugin is suitable for users who are already using the DSH WebUI and want a short video player in the sidebar; when used with dsh-better-sidebar, it appears as a sidebar tab, and when used alone, it uses the floating dock. It does not provide Douyin account login, video search, or downloading, nor does it save links from sessions to local files — those are the responsibilities of other plugins.
There are several boundary conditions you need to accept before use:
- Permissions and Sources: The plugin runs in the current dsh process and can register routes and send network requests. Read the repository source code and the BSD-3-Clause license before installing, and confirm that you accept this permission model.
- Third-party APIs: Feed playback depends on the availability of api.yujn.cn. The API content is random short entertainment videos, you cannot specify a specific video, and it cannot be used as a stable video library. After 3 consecutive failures, the player will stop and show an error, which is designed behavior, not a problem that can be fixed by “refreshing”.
- Content and Occasions: The category names and video content are general entertainment. It is not suitable for use in environments such as office screen sharing, public presentations, or scenarios with content compliance requirements.
- Video Cropping: The video uses object-fit: cover. 9:16 vertical screen videos are basically not cropped, while horizontal or square videos will have their left and right sides cropped.
- Headless Browsers: The README notes that in soft decode environments like agent-browser, some videos may report a Format error; this is not an issue on real browsers with hardware decoding, and the player will automatically skip broken segments.
- Ecosystem Status: It is a community plugin, not an official DeepSeek component or official Douyin feature. The directory page, GitHub stars, and category listing only indicate that it has been included, and do not constitute a quality endorsement.
Summary¶
dsh-douyin has fully implemented a very narrow use case: playing direct-link short videos with a native player in the DSH WebUI, with switchable categories and precise playback history, and a floating panel available when better-sidebar is not installed. Direct link parsing is handled on the host’s whitelist route, instead of letting the browser guess the 302 redirect target.
The video source, content, and availability are all tied to third-party APIs. Treat it as an interface plugin for “watching a couple of videos during a meeting break”, and do not expect the account system and recommendation algorithm of the official Douyin app.
Directory page: https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-douyin/
GitHub: https://github.com/anacondakc/dsh-douyin