# dsh-plugin-desktop English | [Русский](README.ru.md) | [中文](README.zh.md) Opens the DeepSeek Harness Web UI in a native window instead of a browser tab. The plugin does not start a harness of its own. By the time it loads, the process is already listening, so the window simply attaches to it. Ownership stays in one place: the harness outlives the window, and closing the window never takes the server down. ## Requirements The window itself is a separate application, [DSH Desktop](../dsh-desktop). The plugin locates and launches it; without it the UI stays in the browser and a warning goes to the log. Windows only for now. ## Installation ``` dsh plugin --profile web add dsh-plugin-desktop ``` From a local directory: ``` dsh plugin --profile web add ./dsh-plugin-desktop ``` Check that the layer is in place without booting the harness: ``` dsh --profile web --dump-config ``` ## Configuration The bundle patch already takes the host and port from the `webStartup` service, that is, from whatever the web app actually bound to. | Field | Meaning | |---|---| | `port` | Harness port. Taken from `webStartup` by default. | | `host` | Address. The window only opens for a loopback address. | | `executable` | Full path to `dsh-desktop.exe` when the search fails. | The search looks in `%LOCALAPPDATA%\DSH Desktop`, `%LOCALAPPDATA%\Programs\DSH Desktop`, `%PROGRAMFILES%\DSH Desktop`, then along `PATH`. To override the path in your own profile — `$DSH_HOME/profiles/web/cordis.patch.yml`: ```yaml - id: desktop config: executable: 'C:\Tools\DSH Desktop\dsh-desktop.exe' ``` A patch replaces a row's whole `config`, so an override must restate every field it needs, not only the changed one. ## Behaviour - Server bound to a non-loopback address — the window does not open and the log explains why: a browser is the right surface there. - The app is already running — a second launch raises the existing window. - The plugin is unloaded — the window closes, the harness keeps running. ## Licence MIT.