Preface¶
DeepSeek Harness (dsh) treats models, tools, sessions and interfaces as plugins. The official repository deepseek-ai/deepseek-harness positions itself as “Everything is a plugin” and is currently in developer preview, with its interface subject to change. The community has already developed a set of interface enhancement plugins: sidebar, theme, desktop pet, status text carousel. When waiting for model streaming output or for an Agent to finish a round of tool calls, the right side of the web interface is usually empty.
What dsh-minigames does is very specific: it attaches a collapsible mini-games panel to the right edge of the Web UI, with 18 offline pure Canvas games built-in. It does not register tools for the model, nor does it access the network. This article is organized after cross-checking with the plugin directory page, GitHub repository README and package.json: what it is, where to install it, how to play it, and how developers can add new games.
First, the source must be clarified. DeepSeek Harness itself is open-sourced by DeepSeek AI; the plugin directory deepseek-harness-plugin.com cited in this article is an independent community site, not affiliated with or endorsed by DeepSeek or High-Flyer, and cannot be regarded as an official app store.
What It Is¶
dsh-minigames is an interface enhancement plugin for the DeepSeek Harness web interface, maintained by GitHub user lhh010, with the repository at lhh010/dsh-minigames. It is licensed under BSD-3-Clause, primarily written in TypeScript. The npm package name is @dsh-external/dsh-minigames, and the current package.json version is 0.3.2. The dsh.client.platform declared in package.json is web, meaning it only runs in the browser.
The directory page categorizes it under “Interface Enhancements” and included it on 2026-08-15. The repository has two topics: dsh and dsh-plugin. As of the check on 2026-08-17, GitHub shows 20 stars; the directory page at that time still showed 18 stars, so star counts should be referred from the repository page.
The problem it solves can be summed up in one sentence: during the gaps waiting for replies or tasks, open a game on the right side of the Web UI that does not depend on the external network and does not seize the chat input box. The author described it as a “idle game artifact” in the README, and clearly defined its capabilities: fully offline, zero resource files, drawn via Canvas; high scores are only written to localStorage; keyboard focus only takes effect after clicking into the game area.
In the plugin manifest dsh.plugin.json, both contributes.tools and contributes.skills are empty arrays. It does not add tools or skills to the model, only attaches a UI to the page.
Core Features¶
Right-side Panel: Collapsible Bar and Half-screen Canvas¶
The panel has two states, which are consistent between the README and the directory page:
- Collapsed state: A small vertical bar with 🎮 on the right edge of the browser, which barely occupies layout space.
- Expanded state: After clicking, it defaults to occupying the right half of the window (50vw), and you can drag the left edge to adjust the width, which is limited between 360px and 80vw.
The game canvas scales according to the actual available space of the panel. The toolbar, canvas and key prompts must be fully displayed together without scrollbars appearing. The maximum width and height are 960px. The layout will rearrange when the browser zooms or the panel is narrowed by dragging.
It is mounted as a portal on document.body, does not occupy the host’s layout slots, and does not depend on the host’s services. The README clearly states that dsh.client.inject is empty, and the client runtime does not import the @deepseek-ai package. When the layout changes to left sidebar, right sidebar or collapsed state, this panel should not compete for slots with the main interface by design.
The game will automatically pause when the panel is collapsed or the browser tab is switched, and resume when returning. The high score of each round is written to localStorage. Keyboard events only take effect after clicking the game area to avoid stealing keystrokes from the chat input box.
18 Built-in Games¶
The 18 games listed in the repository README (set to 18 games starting from v0.3.0, with table tennis removed afterwards) are all offline and have no external resource files:
1. Dino Jump: The classic Chrome offline dinosaur game, with day/night switching and rainy day visuals.
2. Tetris: 10×20 standard board, with ghost piece preview, hold and next piece preview.
3. Tank Battle (with AI): 2D tanks, enemy greedy tracking + line-of-sight firing, total 3 waves.
4. Match 3: Four-connected same-color elimination, target score to pass the level.
5. Fifteen Puzzle: 16-grid digital 15-puzzle, randomly shuffled from a solved state to ensure solvability.
6. Snake: Torus map, pass through boundaries and appear on the opposite side, game over only when colliding with yourself.
7. 2048: Slide to merge tiles, reaching 2048 counts as completion.
8. Minesweeper: 9×9 board with 10 mines, first click is safe, supports double-clicking numbers to expand area.
9. Memory Flip: 4×4 grid with 8 pairs of cards.
10. Gomoku vs AI: 15×15 board, AI will block five-in-a-row and also make five-in-a-row.
11. Jump Game: Hold to charge, release to jump.
12. Brick Breaker: Clear all bricks to advance to next level, ball speed increases over time.
13. Whac-A-Mole: 30-second time limit, 5×5 grid with 25 holes, up to 5 moles popping up at the same time.
14. Reversi vs AI: 8×8 Othello board, automatically pass when no moves are available.
15. Flappy: Click or press space to flap wings and pass through pipes.
16. Sudoku: 9×9 board, press D to switch between easy / normal / hard (45 / 35 / 30 clues respectively).
17. Pac-Man: Maze eating game, power pellets allow you to eat ghosts.
18. Aim Training: Pointer lock first-person mode, lock mouse to rotate view, left click to shoot with recoil.
These rules are from the “Gameplay and Details” section of the repository README, not from demo videos or third-party reviews. If the feel of a certain game does not match the documentation, refer to the current built artifact.
Extensible Registry¶
Built-in games use registerGame. To add a new game, you need to implement the MiniGameDefinition interface (src/client/games/types.ts): id, title, icon, description, controls, and create(host, options). The instance returned by create is driven by the panel’s lifecycle:
- Switching games: first destroy() the old instance, then create() the new instance.
- Collapsing, hiding the tab, or user pause: call pause().
- Report score changes via options.onScore?.(score), and the panel is responsible for displaying the score and persisting the high score.
The README recommends writing game logic as pure functions that do not touch the DOM or set timers, and cover them with Vitest tests. The repository claims there are currently 201 pure logic unit tests; the development script comments still write 189, so refer to the 201 in the README body and changelog.
Installation and Activation¶
The installation command given on the directory page is as follows, executed in a terminal where dsh is already running:
dsh plugin add github:lhh010/dsh-minigames
The plugin runs with the permissions of the current dsh process, and may execute code during installation. You should check the source repository and license before installing. If you need a reproducible installation, fix the commit hash according to the directory page instructions. The latest commit on the current main branch is a22b3c143839e4ed75e98e64345e41fb02f8d9c0 (2026-08-13, bilingual documentation commit), and the installation command is:
dsh plugin add github:lhh010/dsh-minigames#a22b3c143839e4ed75e98e64345e41fb02f8d9c0
Afterwards, use dsh plugins list to confirm whether it has been added to the current configuration. Plugins installed from GitHub may run build scripts during installation, only install repositories you have reviewed.
The repository README also provides a local development installation path, with prerequisites being a built DSH 20260808+ snapshot and pnpm:
git clone https://github.com/lhh010/dsh-minigames.git
cd dsh-minigames
pnpm install
pnpm build
# Install to the current web profile (write dependencies and add to dsh.profile.bundles)
dsh plugin --profile web add /absolute/path/to/dsh-minigames
# Optional: Confirm there is only one line in the combined configuration
dsh --profile web --dump-config | grep dsh-minigames
Changes to the plugin collection will only take effect after restarting dsh web. To uninstall:
dsh plugin --profile web remove @dsh-external/dsh-minigames
The README clearly states that the repository contains both dsh.plugin.json (registry channel) and cordis.patch.yml (profile bundle channel), install one or the other, do not enable both at the same time.
In terms of compatibility, the README states that real-machine boot verification has been done on the following baselines: snapshot0810 (snapshots/20260810T155924Z), snapshot0811 (snapshots/20260811T152241Z), final snapshot snapshot0812 (snapshots/20260812T172954Z-final), as well as npm releases @deepseek-ai/dsh@0.0.1-rc.5 (dist-tag next) and @deepseek-ai/dsh@0.0.1-rc.2. The verification items include window.__DSH_BOOT__ manifest containing @dsh-external/dsh-minigames, and /plugins/@dsh-external/dsh-minigames/client.js returning 200. Harness is still in developer preview, and subsequent snapshots are not guaranteed to load directly.
Typical Usage¶
According to the “Usage” section of the README, daily operations are:
1. Start the Web UI (dsh web, the official default address is http://127.0.0.1:3080).
2. Check if the 🎮 vertical bar appears on the right edge of the page.
3. Click the bar, and the panel will expand to the right half of the window.
4. Click the game card to start; press P to pause, press R to restart after settlement, click “Select Game” to return to the list.
5. Click “Collapse” to fold back to the vertical bar. The game will pause, and the current round progress will be retained according to the README; whether level progress is saved across sessions is covered in the next section.
For developers who want to add custom games, the interface example given by the repository is as follows (extracted from the README, path subject to the source code):
import { registerGame, type MiniGameDefinition } from './index.ts'
const myGame: MiniGameDefinition = {
id: 'my-game', // Unique ID (for saved memory and high score key)
title: 'My Game',
icon: '🎯',
description: 'One-sentence introduction',
controls: ['Space: Jump', 'P: Pause'],
create(host, options) {
return {
start() {},
pause() {},
resume() {},
destroy() {},
}
},
}
registerGame(myGame)
Common commands for local development:
pnpm run typecheck # tsc --noEmit
pnpm run test # Vitest pure logic unit tests
pnpm run build # Output lib/index.js (node side loader) and lib/client.js (browser bundle)
lib/index.js is a placeholder for the node-side loader (only logs), and the client scans dependencies for the existence of this line. lib/client.js is registered via window.__ModuleLoader__.load, and its ID must match the name field in package.json (@dsh-external/dsh-minigames).
Applicable Scenarios and Notes¶
It is suitable for these situations:
- You are already using dsh web and want an offline mini-game on the page while waiting for model output.
- You need to confirm that the plugin only modifies the browser UI and does not add tools to the model.
- You want to add a Canvas game yourself via registerGame and reuse the panel’s pause, high score and focus gating functions.
Notes before use:
1. Permissions and Security. The plugin runs with the permissions of the current dsh process, and may execute code during installation. Check the GitHub source code and BSD-3-Clause license before installing; fix the commit hash in production or shared environments. The community directory is not an official store, and inclusion does not equal endorsement.
2. Only covers Web UI. dsh.client.platform is web. This panel will not appear in terminal TUI or headless mode.
3. Keyboard focus is intentional design. After clicking the chat input box, you must click back to the game area to continue using the keyboard. Do not treat this as a bug.
4. Limited persistence scope. Only high scores are saved across sessions. Level progress in Match 3, Tetris and Tank Battle is not saved across sessions. Day/night and rainy day effects for the dinosaur game are visual atmosphere and do not change collision judgment.
5. Limited AI strength. The Tank Battle AI uses greedy tracking and line-of-sight firing, without pathfinding. Gomoku and Reversi use heuristic algorithms, not complete game engines.
6. Manifest version may lag behind package version. package.json is at version 0.3.2, but the version field in the root dsh.plugin.json of the repository is still 0.1.0, and the description still stays at “Dino / Tetris / Tank Battle” three games. Refer to package.json and the README body.
7. Do not mix the two installation channels. Enabling both dsh.plugin.json and cordis.patch.yml may cause duplicate mounting. Restart dsh web after modifying the plugin collection.
Summary¶
dsh-minigames attaches 18 offline Canvas mini-games to the right side of the DeepSeek Harness Web UI. When collapsed, it only leaves a 🎮 vertical bar, and expands to let you choose games from the panel. It is maintained by lhh010, open-sourced under BSD-3-Clause, does not register tools for the model, and only saves high scores to local localStorage.
Directory page installation command:
dsh plugin add github:lhh010/dsh-minigames
Directory page: https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-minigames/
GitHub: https://github.com/lhh010/dsh-minigames