DeepSeek Harness (CLI: dsh) treats the agent as a composition of plugins: shell, editor, MCP, browser, memory, and skill catalogs all hang off a Cordis graph. The official repo deepseek-ai/deepseek-harness states the design plainly—Everything is a Plugin. It is still a developer preview and will break compatibility. What actually makes a daily driver is not the next model drop, but which plugins you mount, where Skills are discovered, and how far permissions go.
The community filled the dsh-plugin topic with thousands of repos in weeks. This roundup is a working shortlist: kernel capabilities, skill markets, search/vision/memory/browser, and how not to flood the tool catalog. Canonical docs: DeepSeek Harness Docs and the plugins guide.
What the harness is: plugins, profiles, Skills
Think of it as an agent runtime, not another chat website.
- Kernel packages
@deepseek-ai/*ship with the distribution: bash, editor, MCP resources, plugin_manager, and the officialskilltool. - Community packages (npm name or
github:owner/repo) go into the current profile withdsh plugin --profile web add …. Bundle installs need a restart ofdsh web. - Skills are optional instruction files (
SKILL.md), not session events. The filesystem provider scans project and user roots in rank order; the model-facing catalog usually exposes onlynameanddescription, and loads the body on demand.
Shipped local scan order (dsh-skill-filesystem): project .dsh/skills → project .agents/skills → custom dirs → user DSH skills → user .agents/skills → bundled. On a name clash, the project-closer copy wins. The project root is the nearest ancestor with .git.
Layout is my-skill/SKILL.md. Frontmatter needs at least name and description. Names are lowercase letters, digits, and hyphens. Recursive **/SKILL.md discovery is not supported.
Boot it: web profile and install commands
You need Node.js (community plugins often want 22+). Local preview:
npx @deepseek-ai/dsh web
The Web UI defaults to http://127.0.0.1:3080. Docs and plugin authors agree: bind loopback and do not listen unauthenticated dsh web on 0.0.0.0. Over SSH, forward the port; do not put the plugin panel on a public IP.
Standard bundle install:
dsh plugin --profile web add skillhub-plugin
# or a git source (pin a commit in production)
dsh plugin --profile web add "github:minivv/dsh-agent-skills"
# restart
# dsh web / dsh --profile web
dsh plugin add forwards the spec to pnpm: npm, git, or link: local paths. Monorepo subpackages use the Settings repository source (github:owner/repo#ref&path:/packages/foo); plugin add does not parse &path:.
Inspect the composition with dsh web --dump-config | grep name. dsh plugin --profile web remove pkg drops the dependency but does not rewrite hand-inserted rows in $DSH_HOME/profiles/web/cordis.patch.yml—delete those yourself.
2026 starter stack (keep this)
Do not click twenty cards on a plugin radar. Freeze this set for a week, then add:
| Layer | Pick one | Job |
|---|---|---|
| Runtime | Official dsh web | Kernel tools + official skill tool + plugin manager |
| Skill discovery | dsh-agent-skills or dsh-skills-anywhere | Pull in Claude / Codex / Cursor / OpenCode skill dirs |
| Install UI | skillhub-plugin or official Discover | Search skills/plugins in chat or Settings, confirm, then install |
| Web search | modsearch (or an MCP you already run) | Structured retrieval when the model has no native search |
| Vision | Either modlens or dsh-vision-toolkit | Paste-image OCR/layout; do not run both |
| Memory | One official MCP overlay from examples | Memorix / MCP Reference Memory / Engram |
Two plugins in the same category make the model hunt through duplicate tools and fill the context with summaries. Add only HTTPS market indexes you trust.
Agent Skills: scan order and three managers
You likely already have SKILL.md trees under ~/.claude/skills, ~/.codex/skills, or ~/.cursor/skills. DSH itself prefers .dsh/skills and .agents/skills. Community plugins register extra providers on ctx.skills.
dsh-agent-skills: Settings page over local dirs
Repo: minivv/dsh-agent-skills.
dsh plugin --profile web add dsh-agent-skills
Then Settings → Agent Skills, take over, restart. It scans ~/.agents/skills, ~/.claude/skills, ~/.codex/skills, ~/.config/opencode/skills, ~/.gemini/skills. Toggle dirs or individual skills without rewriting the original files. State lives in $DSH_HOME/agent-skills/state.json. Compatibility notes are in the README (0.1.x and 0.2.x).
dsh-skills-anywhere: zero-copy, many agents, git skill repos
Unofficial: noteflowai/dsh-skills-anywhere. It registers another provider; the official skill tool stays:
- 60+ user- and project-level skill dirs (Claude Code, Codex, Cursor, Gemini CLI, OpenCode, and more).
- Skills nested in Claude Code plugin marketplaces.
- Shallow-clone any git skill repo into a cache; an edit in Cursor is visible on the next DSH load.
- Web UI Pin / Hide / Exclude by origin. Also usable as MCP:
npx dsh-skills-anywhere mcp.
dsh plugin --profile web add dsh-skills-anywhere
npx dsh-skills-anywhere list
npx dsh-skills-anywhere add anthropics/skills
npx dsh-skills-anywhere doctor
Skills you authored for DSH in the project rank higher than marketplace duplicates. Do not stack two “takeover” discovery plugins; pick one primary finder.
skillhub-plugin: search, inspect, install in chat
cocofhu/skillhub. npm name is skillhub-plugin (not the unrelated skillhub package; skip a raw git source that runs prepare):
dsh plugin --profile web add skillhub-plugin
Chat cards for skills, versions, safety flags, zip install into a discoverable dir; Settings can bump GitHub releases. A plugin plaza searches DSH plugins and installs from the card, then asks you to restart. Needs Node 22+. Bind dsh web to 127.0.0.1.
Skill markets vs the official plugin market
Two different “markets”:
- Skill market: drops
SKILL.mdbundles into~/.dsh/skills(the user-dsh root the official tool already reads). - Plugin market: one JSON index of installable DSH bundles (npm or a pinned git commit).
Community skill markets
- dsh-skill-market (QQ-M/dsh-skill-market): search GitHub skill repos from Settings.
dsh plugin --profile web add "github:QQ-M/dsh-skill-market", then restart. - dsh-skills-marketplace (cxdyun/dsh-skills-marketplace): git URL + ref + sparse path, flatten into
~/.dsh/skills/…, grouped toggles; uninstall only touches what it installed.
The same SKILL.md can serve DSH, Claude, and Codex. Check stars, recent commits, and install scripts before writing into the user root.
Official Custom plugin markets
Guide: Plugin markets. DSH ships no index source. Enable Custom plugin markets under experimental plugins, then add an https:// index URL on Discover. Confirm still runs normal compatibility checks. Market copy is third-party; the kernel validates JSON shape, not the truth of the blurbs.
Directories such as dshmarketplace.dev expose a search API and an optional dshmarketplace-plugin (/store). Treat them as a catalog; install from the confirmation’s npm/git spec and pin versions.
Capability plugins: search, vision, sessions, browser, memory
Search: modsearch
liustack/modsearch fills in models without native web search: ask the web or X, get structured JSON evidence. If you already run a stable Brave/Tavily MCP, skip a second layer.
Vision: modlens or dsh-vision-toolkit
For text-only models:
- modlens (liustack/modlens): paste image → OCR / layout / semantic JSON.
- dsh-vision-toolkit (Anionex/dsh-vision-toolkit): multi-image Q&A, long-screenshot OCR, UI restore, pixel diff.
Enable one set. Overlapping tool schemas make the model click the wrong one.
Session search: dsh-session-search
Docs example: dsh plugin --profile web add "github:dsh-external/dsh-session-search#main". Model-facing cross-session query is opt-in and wants an exact cwd match—decide the privacy boundary first. The sqlite index can exist without exposing the query tool to the model.
Browser: official browser-use plus one provider
Mount dsh-browser-use and exactly one provider: Playwright MCP, Chrome DevTools MCP, or Stagehand. A second provider is rejected. A launched browser belongs to that Agent/Session; disposing the session drops launched state (an attached external browser stays up).
Memory: official MCP examples, all default-off
examples/mcp-memory/ ships Memorix, MCP Reference Memory, and Engram overlays. They are interoperability samples, not an endorsement. Patch only one:
dsh web --patch "$PWD/examples/mcp-memory/memorix.cordis.yml"
To keep it across runs, merge the insert into the profile cordis.patch.yml—do not overwrite an existing patch file. The stdio bridge strips credential-like env vars and DSH_*; put secrets in the overlay config.env, not in prompts.
Channels and desktop: IM, Telegram, dsh-desktop
- dsh-im: QR or credentials for Feishu, WeChat, DingTalk, WeCom, QQ, Slack, Telegram, Discord, WhatsApp. Largest outbound-network surface—read the source and where tokens live.
- Standalone telegram / qqbot plugins need the same review of egress and webhook bind addresses.
- dsh-desktop: desktop shell as a plugin host; fine on a laptop. On a cloud host prefer web + SSH forward.
Channel plugins get messages in. They do not replace your business state machine. Tickets, builds, and billing still belong in your repo and database.
How to choose, remove, and avoid a bad install
- Read
dsh.bundleand the README; confirm the profile name isweb(or yours). - Pin versions:
name@x.y.zorgithub:owner/repo#<40-char sha>in production. - Watch install scripts: if git needs
allowBuilds/prepare, prefer a prebuilt npm package. - Tool-name clashes: do not run two vision plugins or two skill takeovers; check
--dump-config. - Uninstall:
remove, delete the matching patch insert, restart. If Settings is empty, check the client half-package and the browser console. - Market indexes: HTTPS only; an http index can swap install sources on the path.
The official README says THERE WILL BE COMPATIBILITY-BREAKING CHANGES. After a dsh upgrade, read each plugin’s engines.dsh before bulk-updating community packages. Keep useful Skills in Git (project .dsh/skills); do not treat the whole profile node_modules as a backup.
Running on a Cloud Mac
The harness fits 7×24 cron, MCP stdio, and long sessions. A Cloud Mac in a fixed region with SSH can run dsh web on loopback while you forward 3080 to a laptop browser. Commit Skills and cordis.patch.yml; keep secrets in the keychain or a KMS, not the repo.
iOS / Xcode work still uses Xcode and simulators on that Mac; DSH only orchestrates the agent and tools. Pick one browser provider so it does not fight headless CI for the same Chromium profile.
FAQ
Full Q&A is in the page JSON-LD. Short version: Skills are not plugins; Claude skill dirs work after a discovery plugin; do not stack two skill markets; one memory overlay; keep the web UI on 127.0.0.1 and SSH-forward it.