dsh-jmcomic
September 10, 2026 · View on GitHub
English | 简体中文
A DeepSeek Harness plugin. Adds a comic button to the sidebar: search and download from JMComic (18comic), browse a local library, and read inside a window without leaving DSH.
The plugin bundles the download engine and the reader frontend, so it works without installing the jmcomic PyPI package.
Compatibility
Tested on DSH 0.1.5-rc.1 (web profile). Also runs on 0.1.2-rc.1 — those two
releases are what dsh.engines.dsh in package.json declares, so a host or
plugin manager can read the same range without parsing this file.
Uses the sidebar.footer.action and settings.section slots, the host's
workspaces.pickDirectory, and webServer.register for its local routes. The
DSH core is not modified.
Install
-
Add the plugin:
dsh plugin --profile web add github:lywusichen/dsh-jmcomic -
Restart DSH.
-
A comic button appears in the sidebar foot, above the skills button. On first use it asks for a local library folder; set the Python path in Settings → jmcomic Settings if it is not detected.
What it does
- Small panel — search by album ID or title and download. Once a local folder is bound, the panel shows the two or three most recent covers; click one to start reading.
- Library window — a grid of everything in the local folder. Click a cover to see its chapter list.
- Reader — drag any edge or corner to resize, drag the title bar to move. Size and position are remembered. Reopening an album returns to the chapter and page you were last on, and the footer has a page jump box.
- Hover a card to reveal a delete button. Only albums inside the base folder can be deleted; the root and system directories are protected.
- A
downloadingbanner appears at the top while a download runs.
Screenshots



Offline operation
The plugin ships four things under vendor/, so a machine with only DSH and
Python can run it:
jmcomic2.7.3 source — the download enginecommonX— the engine's support packagejmcomic-ai— helper scripts- the reader frontend
Missing binary dependencies degrade instead of failing:
| Missing | Behavior |
|---|---|
| curl_cffi | falls back to requests |
| Pillow | no image decoding; files download but cannot be previewed |
| pycryptodome | prompts to install it |
Known limitations
- Python is required. The plugin calls a Python bridge; it does not reimplement the download engine in JavaScript.
- Downloads talk to JMComic's mobile API domain directly, so no proxy or Cloudflare workaround is needed. If that domain is blocked on your network, the plugin has no fallback.
- The plugin does not manage your library for you: it downloads into the folder you bind and reads what is there.
Build
npm install # esbuild
npm run build # generates lib/client.js and lib/server.cjs
Commit both artifacts. Git-hosted installs consume them directly.
Configuration
- Settings file:
~/.dsh/plugins/dsh-jmcomic/settings.json(Windows) - Directory rule:
Bd/{Atitle}/第{Pindex}話 - Concurrency is kept low on purpose: 3 for images, 1 for photo albums.
Credits
The download engine, the reader frontend, and some helper scripts come from
hect0x7's projects, vendored under vendor/:
- JMComic-Crawler-Python — download engine
- jm-view-server — reader frontend
- jmcomic-ai — helper scripts
Copyright belongs to their respective authors.