Juan Palomino Tuero9 downloadsConnect your vault to DeepSeek Harness, run its agents from a sidebar panel, and give them a token-saving local knowledge graph.
Connect your vault to DeepSeek Harness (DSH) and run its agents from a sidebar panel inside Obsidian.
Español: README.es.md
dsh web on a free loopback port, reads the launch URL, and loads it in the panel. Stop it or restart it from the toolbar.dsh-graphify package into your DSH profile, which gives agents the tools graphify_search and graphify_stats over a local graph of pre-extracted concepts. Agents then answer from that graph instead of re-reading raw notes, which costs fewer tokens.Obsidian desktop 1.4.0 or newer (Windows, macOS or Linux). The panel is desktop-only because it starts a local process.
DeepSeek Harness installed so that the dsh command is available on your PATH:
npm i -g @deepseek-ai/dsh
If dsh lives somewhere unusual, set an absolute path to its bin.js in the plugin settings.
Model credentials configured in DSH (for example through the DSH web UI, or the DEEPSEEK_API_KEY environment variable).
<your-vault>/.obsidian/plugins/dsh-sidebar/.main.js, manifest.json and styles.css into it.Use BRAT and add this repository, or copy the three files above into your vault after every change.
| Setting | Default | Description |
|---|---|---|
| dsh CLI path | (empty) | Empty uses dsh from PATH. Otherwise an absolute path to a DSH bin.js. |
| Port | 3081 |
Port for the web server. 0 lets the OS pick. Use a different port than another running DSH instance (for example the VS Code extension on 3080). |
| Auto-start | on | Start the server when the panel opens. |
| Embed mode | direct |
direct loads the launch URL (which carries the token). proxy runs a local proxy that re-mints and injects the session cookie, as a fallback for setups where the iframe cannot carry the cookie. |
| Extra args | (empty) | Extra CLI arguments, one per line, for example --trusted-host. |
| Knowledge graph bridge (graphify) | off | Install the bundled dsh-graphify package into your DSH profile so agents can search a local knowledge graph. |
| DSH profile | web |
The profile started by dsh web. |
| Knowledge graph folder | (empty) | Folder holding .graphify_chunk_*.json files. Empty uses <vault>/graphify-out. |
| Install / repair bridge · Remove bridge | — | Manual buttons; the current state is shown below them. |
The bridge is the part of this plugin that is not a plain iframe wrapper.
.graphify_chunk_*.json files (a nodes array of extracted concepts) in <vault>/graphify-out, or in the folder you configure.graphify_search(query, limit?) — returns matching concept labels, their type, source file and a short rationale.graphify_stats() — node count and source files, so the agent knows what the graph covers.The installer copies the bundled package to $DSH_HOME/profiles/<profile>/packages/dsh-graphify/ and appends one loader entry to that profile's cordis.patch.yml, marked with a comment. It is idempotent: if you already registered graphify by hand it leaves your entry alone, and it refuses to touch a cordis.patch.yml that is not a top-level array. A backup (cordis.patch.yml.dsh-sidebar-bak) is written before any change, and Remove bridge undoes only what the plugin added.
DSH 0.1.2 and later authenticate browsers with a SameSite=Strict cookie that is minted by a GET /?token=… 303 exchange. The plugin starts its own dsh web process, reads the ready line (dsh web: http://127.0.0.1:<port>/?token=…) from that process, and loads that URL in the iframe so the cookie is minted inside the frame. Because the plugin owns the process, it always has the token; an already-running server started elsewhere cannot be embedded this way, which is why the plugin prefers to start its own instance on a free port.
| Symptom | Cause | Fix |
|---|---|---|
listen EADDRINUSE in the log |
Another process already holds the port. | The plugin already retries on the next free port. If it still fails, change Port in the settings. |
dsh is not recognized / spawn error |
dsh is not on the PATH that Obsidian sees. |
Set an absolute path to the DSH bin.js in dsh CLI path. |
| Log shows a DSH plugin-tree error | A DSH profile plugin failed to load. | Read the log: the failing plugin is named. Fix or remove that entry in $DSH_HOME/profiles/<name>/cordis.patch.yml. |
| Panel stays blank | The iframe could not authenticate. | Switch Embed mode to proxy and press Start again. |
| Server floods the log while starting | Normal DSH boot output. | Press Logs to hide it. |
127.0.0.1. It makes no outbound requests, contains no telemetry, and does not download anything.dsh web, which runs with your user's permissions and reads the DSH data directory (~/.dsh). DSH itself may read files outside your vault, and — when you ask it to run a task — may make outbound requests to the model provider you configured. That behaviour belongs to DSH, not to this plugin.$DSH_HOME/profiles/<profile>/packages/ and edits that profile's cordis.patch.yml. Both live outside the vault by design, because that is where DSH loads its plugins from. A backup is written first, the edit is idempotent, and the plugin refuses to modify a file it does not understand.data.json.