DeepSeek Harness Plugin Hub

Publish and manage complete Harness Profiles. Discover Plugins for your next setup.

Explore

PluginsPresetsDocsNews

Community

Publish a pluginContactReport an issue

Resources

Plugin Hub on GitHubDeepSeek HarnessSystem statusPrivacy notice
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

Independent and unofficial. Not affiliated with, authorized by, or endorsed by DeepSeek.

Plugin Blender — DSH Plugin for DeepSeek Harness
DeepSeek Harness Plugin Hub
ProfilesPluginsCategoriesNewsDocsSign inManage Profiles
ProfilesPluginsCategoriesNewsDocsSign in
← Plugins
P

dsh-plugin-blender

Plugin Blender

Blender for DeepSeek Harness: headless render/convert tools for 3D models plus a three.js viewer panel in the workbench sidebar

The plugin will be installed here. Keep web if you are unsure.

npx -y @deepseek-ai/dsh plugin --profile web add github:s1lverex/dsh-plugin-blender#6d69d9a32bcf50e3768279e355b0e0203c44db3f
READMECompatibilityVersions

Compatibility and provenance

Plugin Blender is published as dsh-plugin-blender and currently resolves to version 0.1.0. The Hub verifies its manifest and preserves the exact installation source for reproducible installs.

DSH compatibility
*
Runtime surfaces
web
Release source
github
Registry updated
9/25/2026

Versions

0.1.0stable
9/25/2026

Related plugins

Loading related plugins…

Latest
0.1.0
DSH
*
HMR
Process restart
Tree shaking
Safe tree shaking not declared
Unpacked size
Unavailable
Files
Unavailable
Surface
web
License
MIT
Source
github
GitHub
★ 0
Weekly downloads
0
Last push
9/25/2026
View source ↗
README badge

Click the badge to copy Markdown for your README.

Do you maintain this Plugin?Claim benefit · Priority security scan

Verify the GitHub repository declared in package.json to manage this listing. After you claim it, Hub will prioritize a security scan of the current version and publish the result when it passes.

Claim this Plugin →
Report an issue

Related plugins

More verified plugins in developer-tools.

Web App@deepseek-ai/dsh-web-appThe dsh browser-surface bundle: the web patch layer over dsh-base plus the runtime glue plugin (frontend dist serving, web-surface prompt, bash runtime variables, URL line)Sdk Minimal@deepseek-ai/dsh-sdk-minimalThe standalone minimal SDK profile bundle: JSON-RPC, one DeepSeek adapter, persistent shell, and JSONL sessionsSdk App@deepseek-ai/dsh-sdk-appThe dsh SDK profile bundle: stdio JSON-RPC serving and process lifecycle over dsh-baseSubagent Codex@deepseek-ai/dsh-subagent-codexOne-shot Codex subagent provider over the official app-server protocol

README

dsh-plugin-blender

Blender for DeepSeek Harness: the agent renders 3D models headlessly through Blender, and the workbench gets a 3D Viewer panel in the right sidebar that loads the exported models with three.js and shows the rendered images.

Host half: three model tools plus two HTTP routes. Client half: one sidebar tab. No runtime dependencies — the host uses node builtins, and the panel is one prebuilt bundle.


What it adds

Three model tools.

ToolPurpose
blender_statusThe executable in use, its version, the work directory, and how many models/renders the panel lists.
blender_renderRender a 3D file to a PNG and return the image to the model. .blend files keep their own camera and lights; imported files are framed automatically.
blender_export_glbConvert any supported file to .glb and publish it to the viewer panel.

One sidebar tab. blender-viewer-tab in the right sidebar: a three.js canvas with orbit/zoom controls, a model picker, and a strip of Blender's renders (click one to view it full-panel).

Two HTTP routes. GET /blender/models lists what the panel may show; GET /blender/file/<id> serves an already-scanned file. A request can only name an id, never a path, so the routes cannot read outside the scanned directories. They are registered on the web server directly, so they carry no session token: with the default loopback bind only this machine can reach them, but a server bound to 0.0.0.0 exposes the listed files to that network — set enableViewer: false in that deployment.

One Cordis service. ctx.blender exposes detect(), version(), listModels(), render(request, signal) and convertToGlb(request, signal).


Architecture

┌─ Host (Node) ──────────────────────────────────────────────┐
│  lib/index.js     Cordis plugin: name/inject/apply, routes │
│  lib/tools.js     the three defineTool definitions         │
│  lib/blender.js   detection, subprocess runner, registry   │
│  lib/scripts/render.py       bpy: import, frame, render    │
│  lib/scripts/convert_glb.py  bpy: import, export GLB       │
└──────────────────────────┬─────────────────────────────────┘
                           │  /blender/models, /blender/file/<id>
┌──────────────────────────┴─────────────────────────────────┐
│  src/client.jsx   tab type + slot registrations            │
│  lib/client.js    built bundle (three.js inside)           │
└─ Browser (web shell) ──────────────────────────────────────┘

Blender is driven as blender -b --factory-startup -noaudio --python <step> -- <json>; each step prints one DSH_BLENDER_RESULT {json} line, which the host parses. Rendering defaults to Cycles on CPU, the reliable headless engine; EEVEE and Workbench are available but need a GPU.

Cycles renders on CPU, so an unattended blender_render works on a headless host. A 960x720x32-sample render of a simple model takes well under a second.

The panel loads .glb, .gltf, .obj, .stl and .ply directly. Everything else (.blend, .fbx, .dae, .usd, .abc) must go through blender_export_glb first, and the panel marks those entries.


Requirements

  • DeepSeek Harness 0.1.5 or a compatible 0.1.x with the web profile
  • Node.js 20 or newer
  • Blender 3.6+ (4.x recommended) — headless works, no display needed

Blender is optional at load time: without it, the tools still register and fail with an actionable message, and the panel still lists any .glb files that are already in the models directory.

Installation

The host resolves @deepseek-ai/dsh-tools from the profile dependency closure, so the package must live there as a real directory; a symlink would move its realpath out of the closure and break that import.

From GitHub (one command, any machine)

package.json declares dsh.bundle with cordis.patch.yml, so the repository installs as a profile bundle and the plugin row is composed automatically. lib/client.js is committed prebuilt, so nothing is compiled on install.

dsh plugin --profile web add github:<owner>/dsh-plugin-blender

Then restart dsh web (a bundle install changes the tree, which the live patch watcher does not cover). Blender must be installed on that machine; everything else is in the package.

From a local checkout

SRC=/path/to/dsh-plugin-blender
cd "$SRC" && npm install && npm run build     # produces lib/client.js
npm run deploy                                 # copies lib/ into $DSH_HOME/profiles/node_modules/dsh-plugin-blender

Then add one row to $DSH_HOME/profiles/web/cordis.patch.yml:

- insert:
    - id: blender
      name: 'dsh-plugin-blender'

The shipped web profile uses patchReload: live, so the row is picked up without a restart. Editing a plugin's lib/ afterwards is not watched — re-run npm run deploy and restart dsh web after changing host code.

The tab opens itself once a session exists. It can also be opened by hand from the right sidebar's + page ("3D Viewer").

Publishing (maintainers)

GITHUB_TOKEN=... npm run publish:github    # creates the repo, sets the dsh-plugin topic, pushes
GITHUB_TOKEN=... npm run publish:market    # forks the registry and opens the entry PR

The token is a classic PAT with repo (or public_repo) and read:user. The market lists one YAML entry per plugin (data/plugins/<owner>__<repo>.yml) and requires the repo to declare dsh.bundle and to be at least one day old, so run the market step the day after the first push.

Blender detection

In order: the blenderPath config, $BLENDER_PATH, blender on PATH, then common installs (/usr/bin, /snap/bin, /opt, ~/.local/share/blender*, ~/.local/bin, macOS Blender.app, Windows Program Files). blender_status reports which one won.


Configuration reference

KeyTypeDefaultMeaning
blenderPathstring''Explicit Blender executable. Empty means auto-detect.
workDirstring$DSH_HOME/blenderHolds models/ and renders/. Created on load.
modelDirsstring[][]Extra directories to list and serve in the panel (scanned 4 levels deep, 400 files max).
timeoutMsnumber300000Per-render budget; the Blender process is killed when it expires.
defaultWidthnumber960Default render width.
defaultHeightnumber720Default render height.
defaultSamplesnumber32Default Cycles samples.
defaultEnginestringcyclescycles, eevee or workbench.
enableViewerbooleantrueRegister the viewer routes.

Every key is optional; a row needs only id and name.


Tools

blender_render

ArgumentMeaning
fileModel or .blend to render.
outputOutput path or file name; defaults to a timestamped PNG in workDir/renders.
width, height, samples, engineOverride the defaults for this render.
frameAnimation frame for an animated .blend.
cameraCamera name inside the .blend to render from.
transparentRender with an alpha background.

A .blend renders through its own camera when it has one; otherwise (and for every imported format) the camera is placed to frame the geometry, and a key + fill light pair is added only when the scene has no lights. The PNG is saved, published as an attachment so a multimodal model actually receives it, and listed in the panel.

blender_export_glb

file plus an optional name; writes workDir/models/<name>.glb, strips cameras and lights, exports Y-up, and returns the geometry statistics.


Verification

npm run build     # lib/client.js
npm run verify    # structural checks on both halves
npm run client    # loads the bundle like the shell does, activates it, renders the panel
npm run smoke     # real headless Blender: convert, render, .blend render, HTTP routes
npm run viewer    # Chromium screenshot of the panel showing a Blender-exported model

npm run smoke writes a cube .obj and a .blend to a temp directory, converts and renders both, asserts the GLB magic and PNG signature, then serves the captured routes on a real socket and checks the listing, the content types, an unknown id (404) and a path-traversal attempt (404). npm run client evaluates lib/client.js through a stub module table, runs apply() against a stub shell context and server-renders the registered tab. npm run viewer bundles the real panel component for a standalone page, loads it in Chromium and screenshots the three.js canvas (written to test/viewer-shot.png). The Blender-dependent scripts exit 0 with a skip notice when Blender or Playwright is missing.


Troubleshooting

"Blender was not found" — install Blender, put it on PATH, or set blenderPath in the row config; blender_status echoes the path that was tried.

The panel shows "no models yet" — nothing has been exported. Ask the agent to run blender_export_glb, or drop a .glb into $DSH_HOME/blender/models.

The tab does not appear — confirm lib/client.js exists and was built, that the row's name matches the package name exactly, and that the deployed copy in the closure is the one you edited (npm run deploy). Host lib/ changes need a dsh web restart.

A model renders black or empty — a Cycles render of a file with no geometry fails with "the scene contains no mesh geometry to render". For imported files the auto-camera is computed from mesh bounds, so a file with only cameras, lights or empties cannot be framed.

Renders are slow — lower samples (8–16 is enough to judge a shape), lower the resolution, or use engine: workbench when a GPU is present.

License

MIT