Everyone's reviewing the philosophy. I went through the plugin directory instead.
DeepSeek open-sourced DeepSeek Harness (DSH) on August 13. A week later: 160k stars, 4,000+ third-party plugins. The coverage has mostly been about the "everything is a plugin" pitch: model, tools, session, sandbox, even the UI is swappable.
Neat. But I had a more specific question: across those 4,000 plugins, what is everyone actually bolting onto this thing?
So I spent an evening going through the plugin directories. Found a pattern, found a gap, and filled the gap with a single command. Details below.
What people are actually installing
The category map as of mid-August:
| Category | What it does | Representatives |
|---|---|---|
| Workbench | VS Code-style sidebar workbench | DSH-better-sidebar |
| Long-term memory | Cross-session project memory | dsh-memory-evolve, EverOS, dsh-persist |
| Vision (image reading) | Give the text-only model sight | ModLens, dsh-tool-describe-image |
| File references | @-mention files in the input | dsh-at-file |
| Multi-agent | Spin up sub-agent teams | dsh-agent-teams |
| Claude Code migration | Move configs/skills/history over | dsh-claude-move |
| Memes | Virtual pets, mini-games | deepseek-manners |
Memory is a three-way race, vision has two clear leaders, and the long tail is everything else.
An easy-to-miss detail: one provider keeps showing up
DSH's chat models are text-only, so "reading images" was the first gap the ecosystem filled. The two leading vision plugins both default to Qwen-VL on Alibaba's Bailian (Model Studio) platform.
- dsh-tool-describe-image has you set a
DASHSCOPE_API_KEYin setup, default modelqwen-vl-plus(one config line swaps toqwen-vl-max) - ModLens's OpenAI-compatible channel example uses Bailian's compatible-mode endpoint as the base URL, sample model
qwen3-vl-plus
Two authors who don't know each other, same default choice. Meanwhile in the memory lane, EverOS (local-first memory layer) configures its LLM in standard OpenAI-compatible form and defaults to OpenRouter, but points at Bailian's endpoint just fine. And DSH itself doesn't lock the main model; custom providers and base URLs are first-class settings.
So inside DeepSeek's own ecosystem, the community has voted Bailian into three seats: the eyes, the memory engine, and the backup model slot. Nobody planned that. Config files did.
The gap: eyes everywhere, no hands
Here's what I did not find in the directory: a single plugin that lets the agent produce image, video, or audio files.
Every vision plugin solves "looking in." Nothing solves "making out."
This bit me personally. I had an agent in DSH build me a small Pomodoro timer web app. Code came out clean. But when I wanted to share it with friends (a decent card image, a short demo clip), the agent could only suggest tools for me to go use. The 90% was automated; the last 10% meant leaving the session, opening a design tool and a screen recorder.
Filling the spot without writing a plugin
Writing a DSH plugin is real dev work. Filling the "generation" seat isn't, for three architectural reasons:
- DSH's standard mode ships a shell tool: the agent can run commands, so any CLI is already its tool
- Bailian's CLI (
bl) wraps image generation, image editing, and video generation as subcommands; the agent discovers flags via--helpon its own -
blreads the sameDASHSCOPE_API_KEYenvironment variable as the vision plugins. If you've configured one for reading images, you're already done
If you haven't: grab a free API key from the Bailian console, install the CLI (npm install -g bailian-cli, Node.js 18+; full docs), and store the key once:
bl auth login --api-key sk-your-key
Then tell the agent the ground rules once: every image, image edit, and video request in this project gets done with bl. That's the whole setup. Everything below: the prompts I typed were plain English; the commands are the agent's work.
Scenario 1: A share card for the finished project
What I said: "Make a share card for FocusTick. Dark background, a clean tomato-timer glyph in the center, the tool name below. Restrained, lots of whitespace."
What the agent ran:
bl image generate --prompt "product share card, dark background, flat-style tomato timer glyph at center, tool name FocusTick in clean type below, generous whitespace, restrained minimal design" --size 1280*720 --model qwen-image-3.0-pro --watermark false --out-dir ./assets --out-prefix focustick-card
A 1280×720 PNG lands in assets/ as focustick-card.png. Two things I learned: my first prompt omitted "generous whitespace" and the render came out cluttered; two words and a rerun fixed it, and iterating on a prompt is much cheaper than iterating on a workflow. And --out-prefix is a habit worth teaching the agent; without it, outputs default to the name image and become indistinguishable after a few runs.
Scenario 2: Wrong vibe. Edit, don't regenerate.
Friends pointed out the app is light-themed; a dark card felt disjointed.
What I said: "Switch the card's background to off-white. Don't touch the glyph or layout."
What the agent ran:
bl image edit --image ./assets/focustick-card.png --prompt "replace the dark background with an off-white light background, keep the tomato glyph, text, and overall composition exactly unchanged" --out-dir ./assets --out-prefix focustick-card-light
Key distinction: image edit is local modification. The composition you already liked survives. A fresh generate washes it away and redraws everything. Both files sit side by side (focustick-card / focustick-card-light), which is exactly what the prefix naming buys you. Bonus: --image can be passed multiple times for merges and composites, a rabbit hole for another post.
Scenario 3: "A static image doesn't show me how it works"
What I said: "Take the home screen screenshot and make a 5-second demo video. Slow push-in. Save it to assets."
What the agent ran:
bl video generate --image ./screenshots/home.png --prompt "camera slowly pushes toward the interface, cards gently appearing one by one, clean product-demo style, calm pacing" --duration 5 --download ./assets/focustick-demo.mp4
Three technical notes: passing --image auto-switches to image-to-video mode; video is an async task, so the agent waiting is not the agent stuck; and --download writes the mp4 on completion. Without it you get a task ID and need a separate download command.
The meter is running
These are real billable calls, and the agent runs them automatically. Three images in a burst means three charges. Two commands to have in place before you start:
bl usage freetier --all # auto-stop when the free tier runs out
bl usage free --expiring 30 # remaining quota per model (needs bl auth login --console once)
Honest caveats on the free tier: it's valid for 90 days (not forever), and each model has its own quota. Running one dry doesn't auto-switch to another. Anyone claiming "permanent free quota" is misinformed.
Who should bother
If you build things inside DSH (small tools, personal sites, demos) and regularly hand something outward (cards, clips, illustrations), this closes the loop: code, assets, README, all in one session, no context-switching to a design app.
If your output is just code and text, skip it: running a bl command by hand when needed works fine; routing it through the agent isn't the point.
The takeaway I'd keep: 4,000+ plugins voted on what the ecosystem wants, and the "seeing" vote went to Qwen-VL. The "generating" seat is still empty, and filling it didn't take a new plugin, just one command already on the PATH.
To see what Bailian can do before committing, start from the console, more informative than any roundup, mine included.


Top comments (0)