Back to DSH Plugins
Reviewed listingLocal fileweb profile

modlens

The first vision plugin for DeepSeek Harness, and the vision bridge for every text-only coding agent. Paste an image, get structured JSON evidence (OCR, layout, semantics).

View source

Installation starting point

npx -y @deepseek-ai/dsh plugin --profile web add /absolute/path/to/modlens

Replace the example absolute path with the checkout on your machine. Follow the README below if a build or additional configuration is required.

Saved documentation

README snapshot

Source branch: main
<p align="center"> <img src="https://raw.githubusercontent.com/liustack/modlens/main/assets/banner.jpg" width="100%" alt="ModLens" /> </p> <h1 align="center">ModLens</h1> <p align="center"><b>Give a text-only model sight, and just paste the image.</b></p> <p align="center">🥇 <b>The FIRST vision plugin for DeepSeek Harness (dsh)</b> 🥇</p> <p align="center"> <a href="./README.zh-CN.md">简体中文</a> · <a href="docs/troubleshooting.md">Troubleshooting</a> · <a href="skills/modlens/references/configure.md">Configuration</a> · <a href="docs/output-schema.md">Output contract</a> · <a href="docs/security.md">Security</a> · <a href="https://github.com/liustack/modsearch">ModSearch (web)</a> </p> <p align="center"> <a href="https://x.com/liustack"><img src="https://img.shields.io/badge/follow-%40liustack-black?style=flat-square&logo=x&logoColor=white" alt="Follow @liustack on X"></a> <a href="https://www.npmjs.com/package/@liustack/modlens"><img src="https://img.shields.io/npm/v/@liustack/modlens?style=flat-square&label=npm&color=cb3837" alt="npm"></a> <a href="https://nodejs.org"><img src="https://img.shields.io/node/v/@liustack/modlens?style=flat-square" alt="Node.js"></a> <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue?style=flat-square" alt="License"></a> <img src="https://img.shields.io/badge/Not%20backed%20by-Y%20Combinator-FF6600?style=flat-square&logo=ycombinator&logoColor=white" alt="Not backed by Y Combinator"> <img src="https://img.shields.io/badge/users-unknown-lightgrey?style=flat-square" alt="Users unknown"> </p>

DeepSeek and GLM have no vision capability and cannot read images. ModLens is a plug-in vision engine that gives a text-only model sight. ModLens reads images pasted straight into the chat, no saving to a file and passing a path first.

Talk to us

Issues are welcome any time: open one. And come find me on X: @liustack. What you built with it, which harness you are on, what should come next. New releases land there first, and a proper community space is on the way.

Highlights

🥇 The first vision plugin for DeepSeek Harness (dsh): one command, npx -y @deepseek-ai/dsh plugin --profile web add @liustack/modlens@latest, and the text-only DeepSeek model behind dsh reads images through a native read_image tool. If dsh warns declares no dsh.bundle, pnpm's release-age gate installed an old version: see troubleshooting for the one-line fix. For pasted images, switch the model selector to one of the two entries the plugin adds, DeepSeek-V4-Flash (modlens vision) or DeepSeek-V4-Pro (modlens vision): pastes are admitted there, converted to evidence at request time (your message keeps its native thumbnail), and answered by the same DeepSeek route. The wrap covers DeepSeek and GLM text models only; their own vision models are excluded automatically.

Paste an image and it reads it. No saving to a file and passing a path first.

  • Zero-config start. Reuses what Claude Code, Codex, OpenCode, or Pi already have set up: the multimodal models on your machine go straight to work. Nothing at all? Antigravity CLI is a free no-key channel, and a free Gemini key brings a read down to 5-10 seconds.
  • Evidence, not imagination. Full transcription, reading-order layout regions, entity and relation lists. The model quotes specifics.
  • Install once, use everywhere. Verified on real machines in Claude Code, Codex, Pi, and OpenCode.

Installation

Step 1, hand it to your AI. Send it this line:

Install and configure the modlens skill following https://github.com/liustack/modlens/blob/main/INSTALL.md, then run the health check and tell me the result.

The install starts by checking what your machine already has. An existing login in Claude Code, Codex, OpenCode, or Pi can be enough: modlens asks before reusing any of them, and the health check tells you where things stand.

Step 2, only if the health check comes back empty, set up a free engine. The recommended choice is a free Gemini API key (about three minutes at Google AI Studio, no credit card), which also makes every read 5-10 seconds. A free OpenAI-compatible key from another platform works too. To avoid any sign-up, install Antigravity CLI instead, then sign in:

curl -fsSL https://antigravity.google/cli/install.sh | bash
agy                                                           # sign in, then exit

The install also inventories vision reachable through your other local harness CLIs (Codex, OpenCode, Pi) and asks, per harness, whether modlens may reuse it. Granted logins join the engine pool as equals, and every reused read is labeled with whose quota it spent.

Usage

Once installed, just chat. Paste an image or drop a path, ask anything, and the skill triggers on its own: the image goes to a vision engine and the answer comes back grounded in what it read.

Vision engines: five providers, one failover chain

ModLens does not depend on any single vision service. Five providers are built in, and any one of them is enough:

ProviderWhat it needsSpeed per readGood for
gemini-apia free Gemini API key (3 minutes, no card)5-10sthe recommended default
openaiany OpenAI-compatible endpoint (key + baseUrl + model)5-10sqwen-vl, GLM, self-hosted gateways
anthropican Anthropic API key5-10smachines already holding one
antigravity-clithe free agy CLI, one browser sign-in, no key15-45szero-signup starts
claude-clia signed-in Claude Code20-45sriding your existing Claude subscription

Without a pinned provider, every configured engine forms one failover chain: the fast API providers try first, the agent CLIs back them up, the first good result wins, and meta.attempts records every attempt so a fallback is never silent. On top of the built-ins, ModLens can reuse the logins already on your machine: a signed-in Codex, an OpenCode vision model, credentials held by Pi, or a Grok login can each join the chain, one explicit yes per harness, and every reused read is labeled with whose quota it spent.

Picking is two knobs: modlens config set provider <name> states a preference (the chain still backs it up), -p <name> pins exactly one with no fallback. Machines behind a proxy set HTTPS_PROXY or modlens config set proxy <url> and the API providers route through it. Details: the CLI manual for defaults and flags, Configuration for every key, and Security for who fetches what on remote URLs.

See it work

Unedited runs, all driving a text-only DeepSeek-V4-Flash.

The newest one first: pasting a screenshot straight into DeepSeek Harness on the DeepSeek-V4-Flash (modlens vision) variant. The paste keeps its native thumbnail, the trajectory shows the image arriving "already transcribed by the modlens vision bridge", and the answer walks the UI element by element.

Pasting an image straight into DeepSeek Harness, read through the modlens vision plugin

A tweet screenshot in the Codex desktop app. It reads the author, the caption, the photo itself (down to what both people are wearing), the timestamp, and every engagement number: 5.4M views, 1.6K replies, 5.7K reposts, 116K likes.

Text-only DeepSeek reading a tweet screenshot in full detail via ModLens

Three images pasted at once. The model reads them one by one, spots that they belong to one visual family, and describes each illustration's content and style.

Three images dropped together, read one by one

The stress test: a scatter plot comparing 128 AI models. It reads both axes, the log scale, the per-provider color coding, the highlighted region, and every DeepSeek model called out with dashed markers. Dense charts are where vision bridges most often fail.

The 128-model scatter plot read in full: axes, log scale, and highlighted region

And the paste path, end to end, in a Claude Code terminal on DeepSeek. The pasted image arrives as a path rather than pixels, the skill triggers on its own, the guard confirms the model truly has no vision, and the slide's full content comes back: titles, layout, background, plus an honestly stated uncertainty about the truncated filename.

The skill triggering on its own in a DeepSeek Claude Code session and reading a pasted slide

Documentation

DocRead it when
Install guideInstalling the skill step by step (written for an agent)
CLI manualThe CLI the skill drives: flags, config, doctor
TroubleshootingA command failed and the message needs decoding
ConfigurationSetting a key, switching providers, fixing config
Output contractParsing the JSON or building on it
Harness setupWiring it into Codex, Claude Code, Pi, or OpenCode
SecurityFile permissions, image content as untrusted input
CHANGELOGFinding what changed in a version

Contributing

ModLens does not accept pull requests. The project is maintained by a single author who reviews every line, which is a deliberate choice for reliability. Two effective ways to contribute:

  • Open an issue. Bugs, suggestions, confusing errors, unclear docs. Issues are read and shape what gets built next.
  • Fork it. Under MIT your copy is fully yours to modify and publish.

Shameless plug

This project runs on LIUSTACK Skills: shaping before you build, coding while you build, dig when it breaks, snapshot when you hand off. Lighter than Superpowers, and stronger.

npx -y skills add liustack/liustack -g

⭐ If it helps, star ModLens and liustack. Stars are how the next developer finds them.

Star History

<a href="https://www.star-history.com/?repos=liustack%2Fmodlens&type=date&legend=top-left"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/chart?repos=liustack/modlens&type=date&theme=dark&legend=top-left&sealed_token=oQQAwrPffo9WRUsM6P4RnEu4ZdRART3ChPwIkavGtAfrMycGmLYdjuM2uJ4gjnoIyaF_MDwhOBkJlzmS8pT_W9IRDlsCqLafe7gwvw7Vcnr5MRTkczOasg" /> <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/chart?repos=liustack/modlens&type=date&legend=top-left&sealed_token=oQQAwrPffo9WRUsM6P4RnEu4ZdRART3ChPwIkavGtAfrMycGmLYdjuM2uJ4gjnoIyaF_MDwhOBkJlzmS8pT_W9IRDlsCqLafe7gwvw7Vcnr5MRTkczOasg" /> <img alt="Star History Chart" src="https://api.star-history.com/chart?repos=liustack/modlens&type=date&legend=top-left&sealed_token=oQQAwrPffo9WRUsM6P4RnEu4ZdRART3ChPwIkavGtAfrMycGmLYdjuM2uJ4gjnoIyaF_MDwhOBkJlzmS8pT_W9IRDlsCqLafe7gwvw7Vcnr5MRTkczOasg" /> </picture> </a>

Disclaimer

Provided as-is under the MIT License below. The author makes no warranty and gives no endorsement for any particular use, commercial use included. Your use of upstream engines (Antigravity CLI, the Gemini, OpenAI, and Anthropic APIs, and any OpenAI-compatible endpoint) is governed by their own terms and quotas, which you are responsible for.

License

MIT

The snapshot helps with discovery but can become outdated. The upstream repository is authoritative for current code, requirements, permissions, and installation steps.

Reviewed

dsh-browser

dsh plugin: Chrome sidebar extension that lets DSH operate your browser directly—no vision capabilities required.

npx -y @deepseek-ai/dsh plugin --profile web add /absolute/path/to/dsh-browser
Local checkout · web profileView details
Verified for DSH Plugins 1
Reviewed

dsh-annotation

DSH Web 选中批注插件:选文字→批注→回车随消息发送;气泡隐藏批注块(零闪烁);回复按 Annotation N 逐条对照(可悬浮芯片)。官方 bundle,零核心改动

npx -y @deepseek-ai/dsh plugin --profile web add @omdsh-dev/dsh-annotation
Package install · web profileView details
Verified for DSH Plugins 0
Reviewed

dsh-memory-evolve

为 DeepSeek Harness 带来「跨会话长期记忆 + 后台自我进化」能力的纯插件实现:五轨记忆 · git 分支感知 · 回合内自我审查 · 技能自我进化与技能管理器 · 四轨待办 · COI 调度 · 会话广播 · 会话搜索 · 提示词管理器 · 临时信息便签——零核心修改、零运行时依赖,随装随用、卸载即净。

npx -y @deepseek-ai/dsh plugin --profile web add /absolute/path/to/dsh-memory-evolve
Local checkout · web profileView details
Verified for DSH Plugins 0