README file from
GithubDSH Embedded
English | 简体中文
Host DeepSeek Harness (dsh) inside Obsidian — let the dsh agent read and write your Vault files, and maintain agent working memory directly inside the Vault.
What it does
- Embeds the dsh web UI in a dedicated Obsidian side panel (DSH View).
- Spawns a
dsh websubprocess bound to the current Vault's root directory. - Automatically registers the Vault as a dsh workspace on every start.
- Reaps orphaned dsh processes from previous crashed sessions on launch.
Prerequisites
-
Obsidian 1.13.0 or later (desktop only).
-
Node.js 22 or later (dsh requires
node:zlib.createZstdDecompress). -
dsh installed globally:
npm install -g @deepseek-ai/dshThe plugin scans nvm, Homebrew, Volta, asdf, fnm,
~/.local/bin, and~/bindirectories to locatedshand a compatiblenode, so it works even though Obsidian's bundled Electron ships an older Node. You can also add custom paths in the settings panel or use the Search for dsh button to auto-detect.
Installation
From source (development)
git clone https://github.com/bzlir/obsidian-dsh-plugin.git
cd obsidian-dsh-plugin
npm install
npm run build
Then copy main.js, manifest.json, and styles.css into your Vault's .obsidian/plugins/dsh-embedded/ directory.
Tip: This repo ships helper scripts (
scripts/install.sh,scripts/rollback.sh,scripts/uninstall.sh) that automate building, installing with rollback support, and cleanup. Runbash scripts/install.shafternpm install.
Enable in Obsidian
- Open Settings → Community plugins.
- Turn on Community plugins (if Safe Mode is on).
- Find DSH Embedded under Installed plugins and toggle it on.
Usage
- Click the dsh logo icon in the left ribbon, or run "Open DSH" from the command palette (
Cmd+P). - The DSH View opens in the right sidebar. The first launch may take a few seconds while dsh boots its internal plugin tree and the API becomes ready.
- Closing the DSH View stops the dsh subprocess. Reopening spawns a fresh one.
How it works
- Process resolution: Scans common
node/dshinstall locations (nvm, Homebrew, Volta, asdf, fnm,~/.local/bin,~/bin, plus any user-added custom paths) to find a Node ≥ 22 and the dsh CLI, bypassing Obsidian's bundled Electron Node. - Boot readiness: Waits in two phases — first for the TCP port to open, then for
POST /api/session.listto return a valid RPC response — so the iframe loads only after the dsh API gateway is live. - Workspace registration: Calls
POST /api/workspace.createwith the Vault path so dsh treats the Vault as its working directory. - Lifecycle: On DSH View close or plugin unload, kills the dsh process tree (children first, root last). On the next Obsidian launch, any orphaned dsh processes from a crashed previous session are reaped before spawning a new one.
Configuration
The plugin has a settings panel (Settings → DSH Embedded) where you can add custom search paths for the dsh binary, or click Search for dsh to automatically scan your machine.
dsh configuration lives in ~/.dsh/ — see the dsh documentation for profile and credential setup.
Privacy & network use
This plugin spawns a local dsh web subprocess and embeds its UI via an iframe. The following disclosures apply per the Obsidian developer policies:
-
Network use: The plugin starts a
dsh webHTTP server on127.0.0.1(loopback only). The dsh subprocess itself may make outbound network calls to LLM provider APIs (e.g. DeepSeek, NIO, OpenAI-compatible endpoints) as configured in~/.dsh/. The plugin does not make any network requests directly. -
Files outside the Vault: To locate the
dshandnodebinaries, the plugin reads the following locations outside the Vault:~/.nvm/,~/.volta/,~/.asdf/,~/.fnm/,~/.local/bin/,~/bin//opt/homebrew/bin,/usr/local/bin- Any user-added custom paths from the settings panel
- When Search for dsh is used: macOS Spotlight index (
mdfind) or a boundedfindover common install roots
The plugin also reads
~/.dsh/.credentials.yamlindirectly (dsh reads its own credentials file at startup). The plugin itself does not read, modify, or transmit credential files. -
No telemetry: The plugin collects no data and sends no analytics.