#289 by GitHub stars

liustack/modlens

Plug-in vision for text-only models. Hard rule: when a file path or URL with an image extension (.png, .jpg, .jpeg, .webp, .gif, .heic, .heif) appears anywhere in the conversation (typed by the user, injected as a `[Image: source: <path>]` line, or inside a tag) and you cannot see that image's conte

History

Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.

View weekly changes

skills/modlens/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Network or broad shell → After Network or broad shell

ac278f885386 → ac278f885386

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → ac278f885386

No earlier version was observed for comparison.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit ac278f885386f785dc1a35ddfbd8994bb5e744d7

git clone --filter=blob:none --no-checkout https://github.com/liustack/modlens.git .hotskills/liustack-modlens && git -C .hotskills/liustack-modlens checkout --detach ac278f885386f785dc1a35ddfbd8994bb5e744d7 # Copy each selected skill directory from .hotskills/liustack-modlens into .agents/skills/<skill-name>/
4.8kGitHub stars
155stars in 7 days
1skill in this repository
9commits in 30 days

Heat

7.4
  • Star growth, last 7 daysAhead of 94% of tracked repositories
  • Star growth, last 24 hoursAhead of 96% of tracked repositories
  • Rank movement, last 7 daysAhead of 57% of tracked repositories
  • Commits, last 30 daysAhead of 75% of tracked repositories
  • Accounts asking about it through MCP, last 7 daysNot available
  • Hot votes this weekAhead of 0% of tracked repositories

Heat never changes the order by stars, and sponsorship never touches it. How heat works

Stars over time

Aug 2, 2026Nov 7, 20264,838

Individual skills in this repository

How it works

modlens

When your agent uses it

Plug-in vision for text-only models. Hard rule: when a file path or URL with an image extension (.png, .jpg, .jpeg, .webp, .gif, .heic, .heif) appears anywhere in the conversation (typed by the user, injected as a `[Image: source: <path>]` line, or inside a tag) and you cannot see that image's content, run this skill on it before any other approach: no self-built OCR, no PIL, no tesseract. Also triggers on pasted-image placeholders such as `[Image #1]` and `[Unsupported Image]`. If you can actually see the image, do not use this skill. When unsure, run `modlens guard` before the first read of a session: a deny verdict means the active model has native vision and must read the image itself. Runs the modlens CLI to convert the image into structured JSON evidence: every word transcribed, layout regions, semantics, visual clues. Also use when the user asks how to install, configure, or switch modlens providers (Gemini API key, OpenAI-compatible endpoints, Claude API or Claude Code CLI).

What it loads into context

Frontmatter

283 tokens

Always available to the agent

SKILL.md

1,355 tokens

When the skill is activated

Reference documents

14,530 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. Run it
  2. Ask the CLI, not this file
  3. The loop
  4. Failures

Scripts executed separately

  • scripts/run.ps1
  • scripts/run.sh

Files

  • SKILL.mdcore5,361 bytes
  • SKILL.mdcore5,361 bytes
  • SKILL.mdcore5,361 bytes
  • references/configure.mddoc20,857 bytes
  • references/configure.zh-CN.mddoc20,595 bytes
  • references/find-image.mddoc3,428 bytes
  • references/onboard.mddoc4,159 bytes
  • references/runtime.mddoc5,633 bytes
  • scripts/run.ps1runs11,475 bytes
  • scripts/run.shruns10,815 bytes
Read SKILL.md

# ModLens — Vision Bridge Skill

Use this skill when an image is in play and you cannot see its content: a path or URL with an image extension (the path alone is the trigger, hand it to modlens, never Read the bytes or build your own OCR), a placeholder like `[Image #1]`, `[Unsupported Image]`, or a `[Image: source: <path>]` line, or the user asking to configure modlens. Do not use it for web search or fetch (that is `modsearch`), or for images you can already see natively.

## Run it

Every modlens command goes through the launcher bundled with this skill. Replace `<skill-dir>` with the directory this SKILL.md lives in:

```bash
bash <skill-dir>/scripts/run.sh <args>                              # macOS / Linux
powershell -ExecutionPolicy Bypass -File <skill-dir>\scripts\run.ps1 <args>     # Windows
```

It resolves a working runtime (PATH `modlens`, then `npx`, then `bunx`) and forwards your arguments unchanged. Exit 78 means no runtime: relay the `nextSteps` from its stderr JSON instead of retrying.
View the complete source on GitHub

Skills included

  • modlens

Repository facts

License
MIT
Created
Feb 22, 2026
Last pushed
Oct 23, 2026
Forks
151
Open issues
2
Project activity
Active

Rank over the last 12 weeks

Now #289 · best #255 · down 19 in 30 days

  1. #281 on Nov 1
  2. #282 on Nov 2
  3. #284 on Nov 3
  4. #285 on Nov 4
  5. #286 from Nov 5 to Nov 6
  6. #289 since Nov 7
77 earlier periods
  1. #879 on Aug 2
  2. #817 on Aug 8
  3. #814 on Aug 9
  4. #842 on Aug 10
  5. #836 on Aug 11
  6. #824 on Aug 12
  7. #637 on Aug 13
  8. #479 on Aug 14
  9. #386 on Aug 15
  10. #344 on Aug 16
  11. #309 on Aug 17
  12. #294 on Aug 18
  13. #281 on Aug 19
  14. #271 on Aug 20
  15. #269 on Aug 21
  16. #264 on Aug 22
  17. #267 on Aug 23
  18. #266 on Aug 24
  19. #265 on Aug 25
  20. #262 on Aug 26
  21. #263 on Aug 27
  22. #261 from Aug 28 to Aug 29
  23. #257 on Aug 30
  24. #261 on Aug 31
  25. #262 on Sep 1
  26. #259 on Sep 2
  27. #264 on Sep 3
  28. #257 on Sep 4
  29. #259 on Sep 5
  30. #255 on Sep 6
  31. #260 on Sep 7
  32. #258 from Sep 8 to Sep 9
  33. #259 on Sep 10
  34. #258 on Sep 11
  35. #259 on Sep 12
  36. #263 on Sep 13
  37. #265 on Sep 14
  38. #264 on Sep 15
  39. #263 on Sep 16
  40. #262 on Sep 17
  41. #263 on Sep 18
  42. #261 on Sep 19
  43. #264 on Sep 20
  44. #268 on Sep 21
  45. #264 on Sep 22
  46. #266 on Sep 23
  47. #267 on Sep 24
  48. #262 on Sep 25
  49. #263 on Sep 26
  50. #262 on Sep 27
  51. #266 on Sep 28
  52. #268 on Sep 29
  53. #264 on Sep 30
  54. #265 on Oct 1
  55. #267 on Oct 2
  56. #264 on Oct 3
  57. #263 on Oct 4
  58. #267 on Oct 5
  59. #268 on Oct 6
  60. #269 on Oct 7
  61. #270 on Oct 8
  62. #273 on Oct 9
  63. #270 on Oct 10
  64. #271 on Oct 11
  65. #275 from Oct 12 to Oct 13
  66. #273 from Oct 14 to Oct 15
  67. #269 on Oct 16
  68. #271 on Oct 17
  69. #272 from Oct 18 to Oct 19
  70. #273 on Oct 20
  71. #275 from Oct 21 to Oct 22
  72. #273 on Oct 23
  73. #275 from Oct 24 to Oct 25
  74. #279 on Oct 28
  75. #280 on Oct 29
  76. #282 on Oct 30
  77. #283 on Oct 31

Before you install

Network or broad shell

Automated signals, not a guarantee

Checked Nov 2, 2026

Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.

Show 2 notes
  • skills/modlens/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/modlens/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
Show all 89 signals by file

skills/modlens/SKILL.md

  • Broad permissionsline 1
    Bash
  • Network accessline 10
    Use this skill when an image is in play and you cannot see its content: a path or URL with an image extension (the path alone is the trigger, hand it to modlens, never Read the bytes or build your own OCR), a placeholder like `[Image #1]`, 
  • Network accessline 26
    2. Otherwise, if `npx` exists: `npx --yes --package @liustack/modlens@3.27.2 modlens <args>`. 3. Otherwise, if `bunx` exists: `bunx --bun @liustack/modlens@3.27.2 <args>`. 4. Otherwise tell the user no JavaScript runtime was found and that 
  • Network accessline 28
    4. Otherwise tell the user no JavaScript runtime was found and that installing Node 22.19+ (https://nodejs.org) or Bun (https://bun.sh) is the next step. Do not claim modlens itself failed.

skills/modlens/references/configure.md

  • Network accessline 14
    modlens config set provider <name>      # change the default provider modlens config set <provider>.<field> <value>   # fields: apiKey, baseUrl, model, proxy, extraBody, structuredOutput modlens config set proxy http://127.0.0.1:7890       
  • Network accessline 15
    modlens config set <provider>.<field> <value>   # fields: apiKey, baseUrl, model, proxy, extraBody, structuredOutput modlens config set proxy http://127.0.0.1:7890          # default for every API provider modlens config set openai.proxy ""
  • Network accessline 16
    modlens config set proxy http://127.0.0.1:7890          # default for every API provider
  • Network accessline 28
    "provider": "gemini-api",   "cooldown": "on",   "proxy": "http://127.0.0.1:7890",
  • Network accessline 29
    "cooldown": "on",   "proxy": "http://127.0.0.1:7890",   "reuse": { "claude": true, "codex": true, "opencode": false, "pi": true, "grok": true },
  • Network accessline 30
    "proxy": "http://127.0.0.1:7890",
  • Network accessline 32
    [Credential-related source omitted]
  • Network accessline 33
    [Credential-related source omitted]
  • Network accessline 34
    [Credential-related source omitted]
  • Network accessline 44
    [Credential-related source omitted]
  • Network accessline 45
    [Credential-related source omitted]
  • Network accessline 46
    "baseUrl": "https://generativelanguage.googleapis.com",
  • Network accessline 49
    [Credential-related source omitted]
  • Network accessline 50
    [Credential-related source omitted]
  • Network accessline 51
    "baseUrl": "https://dashscope.aliyuncs.com/compatible-mode/v1",
  • Network accessline 52
    "model": "qwen3.6-27b",       "proxy": "http://127.0.0.1:7890",       "extraBody": { "thinking": { "type": "disabled" } },
  • Network accessline 53
    "proxy": "http://127.0.0.1:7890",
  • Network accessline 57
    [Credential-related source omitted]
  • Network accessline 58
    [Credential-related source omitted]
  • Network accessline 59
    "baseUrl": "https://api.anthropic.com",
  • Access to secretsline 82
    [Credential-related source omitted]
  • Dangerous shell operationline 95
    curl -fsSL https://antigravity.google/cli/install.sh | bash
  • Network accessline 95
    curl -fsSL https://antigravity.google/cli/install.sh | bash
  • Network accessline 103
    1. The user creates a key at https://aistudio.google.com (three minutes, no credit card, free tier does not expire).
  • Network accessline 121
    modlens config set openai.baseUrl https://dashscope.aliyuncs.com/compatible-mode/v1
  • Network accessline 126
    `baseUrl` is required, official OpenAI included (`https://api.openai.com/v1`): this route serves any compatible endpoint, and guessing one would send a key meant for another vendor, and the image beside it, somewhere the user never named. T
  • Access to secretsline 144
    [Credential-related source omitted]
  • Network accessline 148
    Rides an existing `kimi` sign-in, so it spends the user's Kimi Code subscription rather than a key. Install from https://moonshotai.github.io/kimi-code/, run
  • Network accessline 149
    rather than a key. Install from https://moonshotai.github.io/kimi-code/, run

skills/modlens/references/configure.zh-CN.md

  • Network accessline 14
    modlens config set provider <name>      # 更改默认 provider modlens config set <provider>.<field> <value>   # 字段:apiKey、baseUrl、model、proxy、extraBody、structuredOutput modlens config set proxy http://127.0.0.1:7890          # 所有 API provider 的默认
  • Network accessline 15
    modlens config set <provider>.<field> <value>   # 字段:apiKey、baseUrl、model、proxy、extraBody、structuredOutput modlens config set proxy http://127.0.0.1:7890          # 所有 API provider 的默认代理 modlens config set openai.proxy ""                   
  • Network accessline 16
    modlens config set proxy http://127.0.0.1:7890          # 所有 API provider 的默认代理
  • Network accessline 28
    "provider": "gemini-api",   "cooldown": "on",   "proxy": "http://127.0.0.1:7890",
  • Network accessline 29
    "cooldown": "on",   "proxy": "http://127.0.0.1:7890",   "reuse": { "claude": true, "codex": true, "opencode": false, "pi": true, "grok": true },
  • Network accessline 30
    "proxy": "http://127.0.0.1:7890",
  • Network accessline 32
    [Credential-related source omitted]
  • Network accessline 33
    [Credential-related source omitted]
  • Network accessline 34
    [Credential-related source omitted]
  • Network accessline 44
    [Credential-related source omitted]
  • Network accessline 45
    [Credential-related source omitted]
  • Network accessline 46
    "baseUrl": "https://generativelanguage.googleapis.com",
  • Network accessline 49
    [Credential-related source omitted]
  • Network accessline 50
    [Credential-related source omitted]
  • Network accessline 51
    "baseUrl": "https://dashscope.aliyuncs.com/compatible-mode/v1",
  • Network accessline 52
    "model": "qwen3.6-27b",       "proxy": "http://127.0.0.1:7890",       "extraBody": { "thinking": { "type": "disabled" } },
  • Network accessline 53
    "proxy": "http://127.0.0.1:7890",
  • Network accessline 57
    [Credential-related source omitted]
  • Network accessline 58
    [Credential-related source omitted]
  • Network accessline 59
    "baseUrl": "https://api.anthropic.com",
  • Access to secretsline 82
    [Credential-related source omitted]
  • Dangerous shell operationline 95
    curl -fsSL https://antigravity.google/cli/install.sh | bash
  • Network accessline 95
    curl -fsSL https://antigravity.google/cli/install.sh | bash
  • Network accessline 103
    1. 用户到 https://aistudio.google.com 创建一个 key(约三分钟,无需信用卡,免费额度不过期)。
  • Network accessline 121
    modlens config set openai.baseUrl https://dashscope.aliyuncs.com/compatible-mode/v1
  • Network accessline 126
    `baseUrl` 必填,用官方 OpenAI 也要写(`https://api.openai.com/v1`):这条路线服务任意兼容端点,替用户猜一个,就等于把本该发给别家的密钥连同图片一起送到用户从没指定过的地方。模型必须是多模态的,纯文本模型会失败或产生幻觉。
  • Access to secretsline 144
    [Credential-related source omitted]
  • Network accessline 148
    搭在已有的 `kimi` 登录上,花的是用户的 Kimi Code 订阅而不是密钥。先从 https://moonshotai.github.io/kimi-code/ 安装,跑一次 `kimi` 并 `/login`,然后:

skills/modlens/scripts/run.ps1

  • Executable scriptline 1
    Executable file
  • Network accessline 166
    if ($script:Selected -eq 'none') {         $major = $Pinned.Split('.')[0]         $first = "Install Node 22.19+ from https://nodejs.org so npx can run $Package@$Pinned, then re-run this launcher."
  • Network accessline 167
    $major = $Pinned.Split('.')[0]         $first = "Install Node 22.19+ from https://nodejs.org so npx can run $Package@$Pinned, then re-run this launcher."         if ($script:NpxPresent -and (-not $script:NodeFloorOk)) {
  • Network accessline 168
    $first = "Install Node 22.19+ from https://nodejs.org so npx can run $Package@$Pinned, then re-run this launcher."
  • Network accessline 169
    if ($script:NpxPresent -and (-not $script:NodeFloorOk)) {             $first = "npx is present but node $(if ($script:NodeVer) { $script:NodeVer } else { 'missing' }) is below the $NodeFloor floor this CLI needs. Upgrade Node at https://nod
  • Network accessline 170
    $first = "npx is present but node $(if ($script:NodeVer) { $script:NodeVer } else { 'missing' }) is below the $NodeFloor floor this CLI needs. Upgrade Node at https://nodejs.org, then re-run this launcher."
  • Network accessline 172
    $steps = @(             $first,             "No JavaScript runtime? Install Bun from https://bun.sh to use bunx, or put a compatible $Bin (major $major, at or above $Pinned) on PATH."
  • Network accessline 173
    $first,             "No JavaScript runtime? Install Bun from https://bun.sh to use bunx, or put a compatible $Bin (major $major, at or above $Pinned) on PATH."         )
  • Network accessline 174
    "No JavaScript runtime? Install Bun from https://bun.sh to use bunx, or put a compatible $Bin (major $major, at or above $Pinned) on PATH."
  • Network accessline 216
    Write-Output ("No runtime can launch {0} here. {1}" -f $Bin, $NativeNote)         Write-Output 'Next steps:'         Write-Output '  - Install Node 22.19+ from https://nodejs.org, then re-run this launcher.'
  • Network accessline 217
    Write-Output 'Next steps:'         Write-Output '  - Install Node 22.19+ from https://nodejs.org, then re-run this launcher.'         Write-Output ("  - Or install Bun from https://bun.sh, or put a compatible {0} on PATH." -f $Bin)
  • Network accessline 218
    Write-Output '  - Install Node 22.19+ from https://nodejs.org, then re-run this launcher.'
  • Network accessline 219
    Write-Output ("  - Or install Bun from https://bun.sh, or put a compatible {0} on PATH." -f $Bin)

skills/modlens/scripts/run.sh

  • Executable scriptline 1
    #!/bin/sh
  • Network accessline 104
    # Phase B goes here: check a versioned user cache, then download and verify a   # native artifact into it. Any such download must use curl (never a piped
  • Network accessline 105
    # native artifact into it. Any such download must use curl (never a piped
  • Network accessline 188
    if [ "$G_SEL" = "none" ]; then     if [ "$G_NPX_PRESENT" = 1 ] && [ "$G_NODE_FLOOR_OK" = 0 ]; then       _s1="npx is present but node ${G_NODE_VER:-missing} is below the $NODE_FLOOR floor this CLI needs. Upgrade Node at https://nodejs.org, 
  • Network accessline 189
    if [ "$G_NPX_PRESENT" = 1 ] && [ "$G_NODE_FLOOR_OK" = 0 ]; then       _s1="npx is present but node ${G_NODE_VER:-missing} is below the $NODE_FLOOR floor this CLI needs. Upgrade Node at https://nodejs.org, then re-run this launcher."     els
  • Network accessline 190
    _s1="npx is present but node ${G_NODE_VER:-missing} is below the $NODE_FLOOR floor this CLI needs. Upgrade Node at https://nodejs.org, then re-run this launcher."
  • Network accessline 191
    else       _s1="Install Node 22.19+ from https://nodejs.org so npx can run $PKG@$PINNED, then re-run this launcher."     fi
  • Network accessline 192
    _s1="Install Node 22.19+ from https://nodejs.org so npx can run $PKG@$PINNED, then re-run this launcher."
  • Network accessline 193
    fi     _s2="No JavaScript runtime? Install Bun from https://bun.sh to use bunx, or put a compatible $BIN (major ${PINNED%%.*}, at or above $PINNED) on PATH."     G_NEXTSTEPS="$(printf '"%s", "%s"' "$(json_escape "$_s1")" "$(json_escape "$_s
  • Network accessline 194
    _s2="No JavaScript runtime? Install Bun from https://bun.sh to use bunx, or put a compatible $BIN (major ${PINNED%%.*}, at or above $PINNED) on PATH."
  • Network accessline 195
    G_NEXTSTEPS="$(printf '"%s", "%s"' "$(json_escape "$_s1")" "$(json_escape "$_s2")")"
  • Network accessline 256
    printf '\nNo runtime can launch %s here. %s\n' "$BIN" "$NATIVE_NOTE"     printf 'Next steps:\n'     printf '  - Install Node 22.19+ from https://nodejs.org, then re-run this launcher.\n'
  • Network accessline 257
    printf 'Next steps:\n'     printf '  - Install Node 22.19+ from https://nodejs.org, then re-run this launcher.\n'     printf '  - Or install Bun from https://bun.sh, or put a compatible %s on PATH.\n' "$BIN"
  • Network accessline 258
    printf '  - Install Node 22.19+ from https://nodejs.org, then re-run this launcher.\n'
  • Network accessline 259
    printf '  - Or install Bun from https://bun.sh, or put a compatible %s on PATH.\n' "$BIN"

How the signals fit together

Facts from a static read of the files at the pinned commit. They describe what the code does, not why.

Signal confidence: 89 facts

and 39 more

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeCompatibleStandard SKILL.md skills/modlens/SKILL.md.claude/skills/<skill-name>/
CodexNativeManifest AGENTS.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md skills/modlens/SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md skills/modlens/SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md skills/modlens/SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard SKILL.md skills/modlens/SKILL.md.opencode/skills/<skill-name>/
  • Native The repository ships a manifest, folder or frontmatter field for this agent.
  • Compatible A standard SKILL.md that this agent can read.
  • Unknown No evidence either way.

Derived automatically from paths, manifests and frontmatter. Not tested on each agent.

Explore alternatives and comparisons

Add this badge to your README

It updates every night and links to this page.

liustack/modlens: #289 on hotskills, 4.8k stars

[![liustack/modlens on hotskills](https://hotskills.dev/badge/liustack-modlens.svg)](https://hotskills.dev/skill/liustack-modlens/)