# dsh-better-sidebar
A dual workbench for DSH: native right sidebar + self-drawn bottom panel, with the ctx.betterSidebar service open to every plugin
## β¨ Features
| | |
|---|---|
| **ποΈ File Management**
Lazy-loading tree, git status colors, live directory watch, global search, drag-and-drop upload, multi-select batch actions, dual-source "Open with" menu.

| **πΏ Git**
Source Control (Merge / Staged / Changes groups, message box with Generate, branch + sync footer) plus a this-session AI-changes lens, with a **read-only commit graph** (lanes, branch and tag badges, branch filter, commit details) in one tab.
|
| **π Editable Editor & Previews**
An editable CodeMirror (the stock preview is read-only), Markdown + Mermaid + floating outline, sandboxed HTML preview, `.jsonl` record cards, paged preview for huge files, streaming transfers with no size caps.
| **π§© Tasks**
Live subagent topology (workflow graph / tree modes) + background task list: exit codes, live output, force-kill.
|
| **π¬ Side Chat (beta)**
Codex-style side threads: inherit the full parent context and run independently, realtime push, visible & revocable queue, per-thread model selection, one-click promotion to a top-level session.
| **π₯οΈ Bottom Workbench**
A self-drawn bottom panel that coexists with the native right sidebar: drag-to-split panes, multiple terminal tabs, per-session persisted layout.
|
**Also**: π the `sidebar_open` tool lets the model open the sidebar itself Β· β‘ ~325KB core at startup, heavy chunks load on demand Β· π i18n follows DSH Β· π± narrow screens switch to a full-width drawer
### πΏ Git Graph (read-only commit graph)
Switch to **Git Graph** at the top of the Git panel for commit nodes, forks and merge edges across local branches, remote-tracking branches and HEAD. The branch selector only filters history β it **never checks out or fetches**; each commit is one line (lane edges + ref pills + subject), hover shows the author and short hash, and selecting one opens its full message and diff in the bottom pane. History loads in pages; reference changes during pagination prompt a refresh; reads are bounded (200 commits per page, offset 10,000, 1,000 branches) and report an explicit error past a limit. Lightweight and annotated tags appear on commits in the graph, rows and details use neutral tag pills, and tag changes invalidate pagination. Tag decorations keep the first 5,000 tags by ref name, further bounded by an 8 MiB complete-line output prefix; excess tags are omitted without failing the graph.
### π§ dsh-context diagnostics (optional)
With the `dsh-context` plugin installed, three places offer a one-click jump into that conversation's **Context** view: an agent node's detail card on the Tasks page, a background job's output window (the job's real owner session β never merely the session its row was watched under), and the session header. The entries **appear only** while dsh-context's `Context` page is actually registered: a deployment without it (or with that page hidden) shows no control at all, and while one jump is in flight every entry point is disabled. A failed jump is reported once, in a dismissible alert at the frame's bottom edge; nothing is polled while idle.
## π Installation
```sh
dsh plugin --profile web add dsh-better-sidebar@latest
```
Then **hard-refresh the browser** (Cmd/Ctrl+Shift+R). Requires DSH **0.2.2-rc.1+**.
> **Compatibility warning β match the plugin to the host line.** As of 2026-11-04, DSH's npm `latest` is **0.2.1-rc.5** and `next` is **0.2.2-rc.1**. **v0.30.0 requires DSH 0.2.2-rc.1+**; hosts on the 0.2.1 line (**0.2.1-rc.1 ~ rc.5**, i.e. today's `latest`) must pin `dsh-better-sidebar@0.28.2` β v0.29.0 was never published to npm. DSH 0.2.1-alpha.5 users must pin `dsh-better-sidebar@0.28.0-alpha.0`, and hosts still on **0.2.0-rc.2** must pin `dsh-better-sidebar@0.26.1`. A 0.x caret never spans a minor version, so one plugin build cannot serve two host lines. The marketplace installer picks the plugin's `latest` regardless of host version, so an old host gets a version-rejection error β upgrade the host or pin the version explicitly. The two packages' `latest` tags are independent.
Pick the plugin version for your DSH version
| Your DSH version | Install command |
| --- | --- |
| **0.2.2-rc.1+** | `dsh plugin --profile web add dsh-better-sidebar@0.30.0` |
| **0.2.1-rc.1 ~ 0.2.1-rc.5** | `dsh plugin --profile web add dsh-better-sidebar@0.28.2` |
| **0.2.1-alpha.5** | `dsh plugin --profile web add dsh-better-sidebar@0.28.0-alpha.0` |
| **0.2.0-rc.2** | `dsh plugin --profile web add dsh-better-sidebar@0.26.1` |
| **0.2.0-rc.1** | `dsh plugin --profile web add dsh-better-sidebar@0.24.1` |
| **0.1.7-rc.1 ~ 0.1.7 stable** | `dsh plugin --profile web add dsh-better-sidebar@0.22.1` |
| 0.1.7-alpha.x | No compatible release β upgrade DSH to rc.1 first |
| 0.1.6 and earlier (incl. the 0.1.5 line) | `dsh plugin --profile web add dsh-better-sidebar@0.19.1` |
Always pin **exact versions** for older releases (`latest` moves forward with each new stable). Replace `web` with your own profile name.
Other ways to install
**Let DSH install it for you** β paste this prompt into any DSH session:
```text
Install the dsh-better-sidebar plugin (a sidebar workbench for DSH):
1. Confirm DSH is 0.2.2-rc.1 or newer, then run dsh plugin --profile web add dsh-better-sidebar@0.30.0
2. Remind me to hard-refresh the browser (Cmd/Ctrl+Shift+R) afterwards
If something fails, check the FAQ table in https://github.com/omdsh-dev/DSH-better-sidebar README first.
```
**One-line script** β clone this repo and run `bash scripts/install.sh 0.30.0` (macOS / Linux / Windows Git Bash; `./scripts/install.ps1 -Version 0.30.0` for native Windows). It handles installation + bundle registration.
**Updating**: just re-run the install command, then hard-refresh the browser.
FAQ
| Symptom | Cause & fix |
|---|---|
| `Ignored build scripts` error | pnpm 11 blocked a transitive dependency's build script. Run `pnpm approve-builds` in the profile directory (`~/.dsh/profiles/web`) β this plugin itself has no build-script dependencies. |
| `minimum release age` / version younger than 24h | The release is less than 24 hours old. Wait 24h or re-run (pnpm auto-adds `minimumReleaseAgeExclude`). |
| "Profile directory not found" | Run `dsh web` once to initialize `~/.dsh/profiles/web`. |
| Host dies on start: `DesktopHostFatalError: β¦ required plugins did not activate / better-sidebar` | The profile carries its own `@deepseek-ai/dsh-*` copies (left by an older DSH, or listed in the profile's `package.json` / overrides) and they resolve ahead of the installation, so the `dsh-subagent` this plugin imports statically binds to a mixed set; when an export is missing the host only reports this fatal and never names the package. Confirm with the check shipped in the current plugin: `node ~/.dsh/profiles/web/node_modules/dsh-better-sidebar/scripts/check-profile-host-tree.mjs ~/.dsh/profiles/web`. Fix: remove `@deepseek-ai/dsh-*` from the profile's `package.json` / overrides and `pnpm install` there (the installation then supplies them), or align both copies to one version; then restart. The install scripts run this check for you. |
| **Two sidebars** on the page | Double mounting. Remove the legacy manual mount line (`- insert: ... better-sidebar ...`) from `~/.dsh/profiles/web/cordis.patch.yml`; aggregate packages mounting this package under a different id are auto-yielded, no action needed. |
| Settings values gone after upgrade | Since DSH 0.1.7, preferences live on this plugin's mount row in the profile (default entry id `better-sidebar`). The plugin migrates your old `settings.yaml` values once on first start and never overwrites newer values. |
| Terminal unavailable | Terminals are provided by **DSH itself** (this plugin ships no PTY) β see DSH docs; "host provides no terminal capability" in the bottom terminal means this deployment has no terminal controller mounted. |
| `dsh: command not found` | Install DSH first; or use `npx -y --package @deepseek-ai/dsh@0.2.2-rc.1 dsh plugin --profile web add dsh-better-sidebar@0.30.0`. |
## π Recent Updates
**v0.30.0 β DSH 0.2.2 support, side-chat images, clickable quote chips**
- **DSH 0.2.2-rc.1 is the new baseline** (all 14 peer floors move to `^0.2.2-rc.1`). The host replaced the installable model-selection ref with an agent-owned `AgentModel`, so a side-chat thread's model switch now goes through `agent.model.select()` β recorded once in the log and applied to the next step. A 0.x caret never spans a minor: DSH 0.2.1 hosts (today's npm `latest`) keep pinning plugin v0.28.2.
- **Side Chat takes images**: paste a screenshot or pick PNG / JPEG / WebP / GIF, preview or remove before sending, or send images alone; the preview survives a reload and a cold restore.
- **Quote chips are clickable**: a passage selected with "Add to conversation" lands as a chip that jumps back to the source file and flashes the quoted lines, with a nonce so a second click jumps again; if the reference record cannot be persisted the plugin falls back to the previous built-in chip instead of landing a dead one.
- **Drafts survive the host-owned close paths**: closing a native sidebar tab or quitting the desktop app keeps the unsaved draft and offers it back when the same file is reopened β the host exposes no cancellable close hook, so this is backup-and-restore rather than a prompt.
- **Reliability**: a side-chat seed built from a compacted parent no longer persists an unreadable session log; page CSS zoom is no longer misread as a page transform; the bottom workbench terminal no longer paints black; container workspaces show every child repository in the Git panel; the installers refuse a profile whose `@deepseek-ai/dsh-*` copies are a mixed version pair and print the repair command.
**v0.29.0 β GenUI in side chats**
- Adds the opt-in `registerSidechatSurfaceAdapter` service for GenUI 0.15.0. Settled assistant replies can render interactive components, with actions and state kept in the owning child thread.
- Uninstalled consumers, streaming replies and unsupported fences retain the existing Markdown view. The 0.28.2 cold-session read fix remains included.
- Provider contribution: [@sunxiuguo](https://github.com/sunxiuguo), [#1033](https://github.com/omdsh-dev/DSH-better-sidebar/pull/1033).
**v0.28.2 β large-session cold-read fix**
- **Root cause fixed**: a detached session's cwd no longer decodes the whole session log β it reads the workspace address stored in the header (first zstd frame only, header-only), memoized per session with in-flight sharing; `activeWorktreeRootOf` no longer folds the stored log for a detached session
- **Why 0.28.1 missed it**: the single-flight only covered `/sidebar/api`, while the real startup fan-out is one fs-watch frame per watched directory and one cwd resolution per `/sidebar/file|html` resource β a 39 MB session was still fully decoded dozens of times in parallel
- **Behavior**: an attached session still follows `working_directory` and linked worktrees; before attach the sidebar roots at the original project and the next 5 s poll switches back
- **Measured (40.2 MB session, local)**: 12 routes + 36 bypass-entry calls concurrently β 1 header read, 0 full reads, 3 ms, +0.3 MB RSS; pre-fix, 6 bypass calls were 6 full reads with a +1.0 GB peak (β6 GB extrapolated for 36)
**v0.28.1 β UX and reliability patch**
- **OOM fix**: cold cwd reads shared by the twelve `/sidebar/*` routes are merged per session and client hint, so a session-switch burst no longer decodes the same large session log N times in parallel
- **Silent wrong-file writes are gone**: tab reconciliation now covers tabs in background sessions, and worktree sessions use one address base β a renamed/deleted file is no longer re-created on the next save, and a chat link never opens a same-named file from another checkout
- **Host crash guard**: pathological `git status` output is capped with a latch and a process-tree kill, turning "host dies with `RangeError`" into one failed SCM refresh
- **Git page**: histories with more than 1,000 branches load again; tags now decorate commits, rows and details, and tag changes invalidate pagination
- **Editor**: saving after an mtime-only change no longer deadlocks on `fs-conflict`; the reading position survives tab re-seating; βAdd to conversationβ lands as a compact reference chip and never flattens earlier chips β and a selected passage now becomes a *clickable* quote chip that jumps back to the source file and flashes the quoted lines ([#888](https://github.com/omdsh-dev/DSH-better-sidebar/issues/888))
- **Markdown links**: local destinations normalize Windows backslashes, so `C:\ws\_analysis\report.md` opens instead of a bare ENOENT
- **Sidebar**: the bottom-workbench toggle stays visible while the right panel is open; the macOS dock fallback avoids the traffic lights; a content-stable tab scope ends needless full-file re-reads; closing a side-chat tab archives its session
## π Plugin Ecosystem
`ctx.betterSidebar` offers two extension points to every plugin β `registerTab` / `registerFileViewer`; the built-in 6 tabs + 4 viewers use the very same API. The GitHub topic [`dsh-better-sidebar`](https://github.com/topics/dsh-better-sidebar) already lists **30+ ecosystem plugins**; the full integration guide is at **[docs/external-plugin-guide.md](./docs/external-plugin-guide.md)**.
```ts
import type {} from 'dsh-better-sidebar' // triggers the ctx.betterSidebar type merge
export const inject = ['betterSidebar']
export function apply(ctx: Context) {
ctx.effect(() => ctx.betterSidebar.registerTab({
id: 'my-plugin:db', title: 'Database', component: ({ scope }) => ,
}))
}
```
Ecosystem catalog (28 tab plugins Β· 4 viewer plugins Β· 4 enhancements)
### π Tab plugins (sidebar pages)
| Plugin | β | Description |
|---|---|---|
| [ChenRuoT/dsh-sidebar-qa](https://github.com/ChenRuoT/dsh-sidebar-qa) |
| Select-to-ask side page: Codex-style side questions / Claude Code `/btw` |
| [fuhefei/dsh-sentinel](https://github.com/fuhefei/dsh-sentinel) |
| Condition-driven wake-up system: file / command / HTTP / process / webhook watchers that wake an agent; dock + sidebar branch + global dashboard |
| [Fisfzy/ego-browser](https://github.com/Fisfzy/ego-browser) |
| Agent browser: i18n-aware local browser tab (auto-registers a sidebar page when better-sidebar is present, falls back to a floating observer) |
| [jiuge2467/dsh-studio](https://github.com/jiuge2467/dsh-studio) |
| Full-stack workbench: multi-source MCP visual debugging hub, visual thinking engine |
| [Iwctwbh/dsh-flowglass](https://github.com/Iwctwbh/dsh-flowglass) |
| Flowglass: realtime session flow visualization (messages / tool groups / subagent branches) |
| [FeatherHunter/dsh-mattpocock-skills-deck](https://github.com/FeatherHunter/dsh-mattpocock-skills-deck) |
| Gamified mattpocock/skills task system: fog-of-war map, task bar progression |
| [GULI-lab/DSH-element-source](https://github.com/GULI-lab/DSH-element-source) |
| Click any UI element to jump to its Vue / React / Svelte / Angular source and feed it into the session |
| [Lzh3070/dsh-file-review-tab](https://github.com/Lzh3070/dsh-file-review-tab) |
| File review page: line-level red/green diff + undo + deep links into chat lines |
| [yq04/dsh-git-remotes](https://github.com/yq04/dsh-git-remotes) |
| Git remotes page: branches / upstreams / ahead-behind, fetch with prune, ff-only pull, confirmed push |
| [ztyhehe/dsh-better-sidebar-svn](https://github.com/ztyhehe/dsh-better-sidebar-svn) |
| SVN source-control page: status / diff / log / commit / update / revert / conflict resolution, symmetric to the built-in Git panel |
| [Melody-max114/dsh-excel-panel](https://github.com/Melody-max114/dsh-excel-panel) |
| Excel editing page: xlsx preview / edit, live formula evaluation, merged cells, save back to the original file |
| [v587d/dsh-anysearch-refs](https://github.com/v587d/dsh-anysearch-refs) |
| AnySearch result reference cards: query, source digest, keyword highlights |
| [Lukeknow0/dsh-markdown-link-preview](https://github.com/Lukeknow0/dsh-markdown-link-preview) |
| Markdown artifact link preview: click same-origin `.md` outputs in chat to read them in the sidebar |
| [mlosun/dsh-docs-panel](https://github.com/mlosun/dsh-docs-panel) |
| Global docs panel: portable Markdown notes readable from any workspace |
| [tylina/dsh-tylina](https://github.com/tylina/dsh-tylina) |
| Typst document tool: WYSIWYG typesetting for papers, reports, exams, resumes, charts, posters, sheet music, and PPTX-exported slides |
| [lnyuqian/dsh-skill-sidebar](https://github.com/lnyuqian/dsh-skill-sidebar) |
| Skills panel: scans local skill directories, short action phrases + one-click copy + pinning |
| [g-yixuan/dsh-sidenote](https://github.com/g-yixuan/dsh-sidenote) |
| Codex-style side chat + selection-anchored annotations (lightweight consumer plugin) |
| [OMSociety/dsh-ssh-tunnel](https://github.com/OMSociety/dsh-ssh-tunnel) |
| Multi-host SSH tunnels + SSH manager page |
| [OMSociety/dsh-git-forge](https://github.com/OMSociety/dsh-git-forge) |
| GitHub / Gitea accounts, project authorization and push policies |
| [YesSanSan/dsh-conversation-outline](https://github.com/YesSanSan/dsh-conversation-outline) |
| Conversation outline page: turn-structured view, one-click jump, LLM one-line titles |
| [Wulabalabo/dsh-sidebar-Explorer-Plus](https://github.com/Wulabalabo/dsh-sidebar-Explorer-Plus) |
| File manager page: upload / move / delete / rename / new folder (write operations) |
| [yq04/dsh-turn-review](https://github.com/yq04/dsh-turn-review) |
| Turn review: review agent changes turn by turn |
| [Ghz114514/dsh-refpics](https://github.com/Ghz114514/dsh-refpics) |
| Pinterest-style reference-image search: masonry flow, sidebar board, download & Eagle favorites |
| [yzlin499/dsh-yzlin499-easy-plugins](https://github.com/yzlin499/dsh-yzlin499-easy-plugins) |
| Handy utility bundle (friendly to bare-bones DSH) |
| [dong-victor/dsh-better-sidebar-starter](https://github.com/dong-victor/dsh-better-sidebar-starter) |
| Run-configuration page: IDEA-style Run/Debug configs β one-click start, history, WebSocket live logs, parallel instances |
| [baosfeng/my-dsh-plugins](https://github.com/baosfeng/my-dsh-plugins) |
| Personal plugin collection (`dsh-file-activity`): sidebar file-activity page β read / create / modify history and stats |
| [Hoemr/dsh-better-overleaf](https://github.com/Hoemr/dsh-better-overleaf) |
| Overleaf tab: CDP browser login, project switching, local git mirror with two-way sync |
| [Andor-Z/dsh-turn-outline](https://github.com/Andor-Z/dsh-turn-outline) |
| Turn-trace page: folds the session by user turns, click any step to jump back to its chat position; zero LLM, read-only |
### πΌοΈ Viewer plugins (file viewers)
| Plugin | β | Description |
|---|---|---|
| [HuanLinOTO/dsh-plugin-better-sidebar-plugin-office](https://github.com/HuanLinOTO/dsh-plugin-better-sidebar-plugin-office) |
| Office trio preview (.docx / .xlsx / .pptx), shipped as a separate slim bundle |
| [HuanLinOTO/dsh-plugin-better-sidebar-plugin-audio](https://github.com/HuanLinOTO/dsh-plugin-better-sidebar-plugin-audio) |
| Audio preview: zoomable waveform player + realtime spectrum, HTTP Range streaming route, scrubbable at any size |
| [zemul/dsh-video-preview](https://github.com/zemul/dsh-video-preview) |
| Inline video preview: .mp4 / .webm / .mov / .mkv / .avi with HTTP Range seeking |
| [dong-victor/dsh-better-sidebar-jupyter](https://github.com/dong-victor/dsh-better-sidebar-jupyter) |
| Runnable `.ipynb` notebook view: lazy Python kernel, streaming output, save-back |
### π§° Enhancements & tools
| Plugin | β | Description |
|---|---|---|
| [eg-bole/dsh-better-sidebar-icons](https://github.com/eg-bole/dsh-better-sidebar-icons) |
| VSCode-style file / folder icon theme (vscode-icons port, pure DOM overlay, zero intrusion) |
| [dong-victor/dsh-better-sidebar-terminal-plus](https://github.com/dong-victor/dsh-better-sidebar-terminal-plus) |
| Terminal enhancements: bundled Nerd Font icons, fixed xterm icon rendering, stable terminal cwd |
| [Max-Null/dsh-sidebar-preview-select](https://github.com/Max-Null/dsh-sidebar-preview-select) |
| Preview selection boost: select text in the sidebar preview β floating "send to session" |
| [Hoemr/dsh-quicklook](https://github.com/Hoemr/dsh-quicklook) |
| QuickLook-style Space preview: press Space on the active file tab for full-size image / PDF / text |
> π£ **List your plugin**: tag your repo with the `dsh-better-sidebar` topic to appear on the [topic page](https://github.com/topics/dsh-better-sidebar); then PR a `PluginEntry` into [`src/client/plugins-tabs.ts`](./src/client/plugins-tabs.ts) / [`plugins-viewers.ts`](./src/client/plugins-viewers.ts) to join the in-app recommended catalog.
β¨οΈ Keyboard Shortcuts
| Action | Keys |
|---|---|
| Save editor | `Ctrl/Cmd + S` |
| Find / replace in file | `Ctrl/Cmd + F` |
| Find next / previous | `Ctrl/Cmd + G` / `Shift + Ctrl/Cmd + G` |
| Select next occurrence | `Ctrl/Cmd + D` |
| Git commit | `Ctrl + Enter` |
| Close tab | Middle-click |
| Split / merge panes | Drag a tab to a pane edge / center |
| Reference a file in the input box | Hover a row β `@file` button |
π Security & β οΈ Known Limitations
- Routes sit behind a Host-header trust fence (same as `/api`); `fs.write` is atomic; git is only invoked via CLI and never sets identity
- β οΈ **Since v0.23.0 the fs routes do no workspace-containment check**: they can read/write any path the host user can reach (OS permissions only) β callers must not treat these routes as fenced
- HTML previews render in an **opaque-origin sandboxed iframe** and serve relative CSS, JavaScript, JSON, fonts and WebAssembly with their content types; the sandbox can be disabled per feature in settings (off by default, with warnings)
- No git push/pull/fetch; the file tree only watches **expanded** directories; Markdown preview renders the saved file
- Read-only formats (spreadsheets / PDF / images / Office) are rendered by DSH's own document preview and follow the host version; the browser view only exists in the desktop profile
- Unsaved drafts are confirmed before closing a tab / deleting a file / refreshing; saving after external modification is rejected, never silently overwritten
- On mobile (<768px) there is no bottom panel β its tabs merge into the right sidebar's full-width drawer
π οΈ Development & Build
```sh
pnpm install # @deepseek-ai/* devDependencies are published, resolves directly
pnpm typecheck && pnpm lint && pnpm build && pnpm test
make check # aggregate gate (matches CI)
make mount # real-mount smoke: build + pack β pnpm test:mount
```
**Architecture**: a single npm package with host/client halves β host (`src/index.ts`): `/sidebar/api/*` JSON API, media / HTML preview / upload routes and two WebSockets; client (`src/client/index.tsx`): native right-sidebar tabs + bottom workbench; state persisted per session in localStorage. Repository rules: [`AGENTS.md`](./AGENTS.md).
Windows / Linux / macOS supported (macOS verified daily, the rest covered by unit tests and Windows CI); no native dependencies β building needs only Node β₯ 20 + pnpm β₯ 10.
## π¬ Community
QQ group: 577011007
## π€ Contributing
- **Code changes go through PRs**: develop on a `feat/*` / `fix/*` branch β `gh pr create`; run `pnpm typecheck && pnpm build && pnpm test` (or `make check`) before submitting
- **List an ecosystem plugin**: tag your repo with `dsh-better-sidebar` + PR an entry into [`src/client/plugins-tabs.ts`](./src/client/plugins-tabs.ts) / [`plugins-viewers.ts`](./src/client/plugins-viewers.ts)
- Repository rules: [`AGENTS.md`](./AGENTS.md)
## π₯ Contributors
## π Friends
- [dsh-tianshu-tui](https://github.com/huiliyi37/dsh-tianshu-tui): interactive terminal UI plugin for DeepSeek Harness with TDD and evidence-gate workflows
- [dsh-TUI](https://github.com/ccch1mneyyy/dsh-TUI): Claude Code-style fullscreen terminal plugin β pixel-whale header, streaming thoughts, context progress bar + TPS gauge
- [dshfind plugin store](https://dshfind.com/zh/plugins): third-party plugin market β public repos under the `dsh-plugin` topic, synced daily
- [DeepSeek Harness Desktop Tauri](https://github.com/hairyf/deepseek-harness-desktop): Tauri desktop build β 5MB installer, zero setup, plugins preinstalled
- [DeepSeek Harness Desktop](https://github.com/anywhere-labs/deepseek-harness-desktop): a modern desktop app β start and manage local Harness services without configuring Node.js; [website](https://www.dshdesktop.cn)
---