# π§ dynamic-schulte-dsh
[](https://github.com/deepseek-ai/deepseek-harness)
[](LICENSE)
[δΈζ](README.md) | English
> Dynamic Schulte Table Β· a waiting-room mini-game plugin for DeepSeek Harness.
The model does not play this game β it exists for **you to play while the model is
replying**. The plugin registers a "Schulte" entry at the bottom of the dsh Web UI
sidebar. While the current session's model is thinking, the entry shows a
breathing green dot.
## Features
- π― **Static grid**: classic nΓn Schulte Table (3Γ3 ~ 7Γ7), tap 1..N in order
- π‘ **Dynamic roulette**: numbers laid out on concentric rings, the wheel spins
at an adjustable speed to train hand-eye coordination and anti-distraction
- π **Waiting indicator**: the sidebar entry and the panel header both show a
hint while the model is thinking
- πΎ **Local persistence**: history and settings live in browser localStorage β
no backend needed
- Optional: target highlight / random color noise
## Screenshot
## Installation
The plugin declares a `dsh.bundle` manifest, so it installs via `dsh plugin add`:
```sh
# 1. Build (or use a published artifact)
pnpm install
pnpm build
# 2. Install into a profile
dsh plugin --profile add -w /path/to/dynamic-schulte-dsh
# 3. Start the Web UI
dsh --profile
```
Open the Web UI and click "Schulte" at the bottom of the sidebar to play. To
uninstall:
```sh
dsh plugin --profile remove dynamic-schulte-dsh
```
## Development
```sh
pnpm install # devDeps: typescript / tsdown / react types
pnpm typecheck # tsc --noEmit (framework types resolve via tsconfig paths to a local deepseek-harness checkout)
pnpm build # tsdown β lib/index.js (host stub) + lib/client.js (browser bundle)
pnpm verify:host # smoke-test the build artifacts
```
## Architecture
- **Host half** (`src/index.ts`): a stub plugin. The game is browser-only; the
host half exists so the Cordis Loader row resolves and the `dsh.client` client
package is discovered by the web shell.
- **Client half** (`src/client/`): the browser bundle, registering the
`sidebar.footer.action` slot. The panel is a complete game β `engine.ts` is a
pure-TS state machine (no React), while `GridBoard`/`RouletteBoard` render the
static grid and the dynamic roulette.
- **Build**: `tsdown.config.ts` mirrors the harness repo's client-bundle
conventions β platform modules stay external, everything else inlines, and the
output is a `window.__ModuleLoader__.load({id, factory})` closure factory served
by the web shell at `/plugins/dynamic-schulte-dsh/client.js`.
## Compatibility
- Runtime: dsh Web UI (`@deepseek-ai/dsh-web-app` bundle)
- Depends on: React 18 (a platform module) β no backend, no model involvement
- Requires browser localStorage support
## License
MIT