Shows all chapter pages at once in a single scrolling reader on 100+ manga, manhwa, comic and adult sites (MangaDex, Asura, Batoto, MangaPark, WebToons, Madara/MangaStream sites and more). Zoom, 7 view modes, hotkeys, bookmarks, auto-scroll, lazy loading, ZIP download, local files.
Source: Manga_Viewer_MM_user.js (16,642 lines, ~724 KB). Line numbers refer to this file.
Coverage: metadata, architecture, settings, keyboard and action tables, startup flow, console helpers, and a sample of site modules (Asura, MangaDex, ExHentai, Local Files, Madara and MangaStream groups). Not all 89 site modules were read line by line.
A Tampermonkey/Violentmonkey userscript (MIT license, version 2026.10.09.adult1). It replaces a supported site's chapter page with its own reader that shows all pages in one scrolling view.
@include regexes.Category.HENTAI).document-end, with @noframes.unsafeWindow, GM_getValue, GM_setValue, GM_listValues, GM_deleteValue, GM_xmlhttpRequest, GM_addValueChangeListener.@connect *: cross-origin requests to any domain are allowed..../(manga|series|manhua|comic|ch|novel|webtoon|tmo)/.+/.+, *(scans?|comic|realm|...)*/.+ and /read/.+ match many unrelated sites. A module's run() decides whether the page is really a chapter.| § | Content |
|---|---|
| 01-04 | Config constants, 3-level logging with error history, pure helpers, wait/timeout utilities |
| 05-06 | Userscript-manager storage wrappers, device detection, page reading and fetch helpers (fetchJson, fetchDocument, timeouts) |
| 07 | UI strings in 6 languages (en_US is the fallback) |
| 08-09 | Settings store (saves only the diff from defaults, cross-tab sync, bookmarks) and runtime state |
| 10-12 | Color math and themes, CSS, HTML template functions |
| 13-14 | Popups and toasts; table mapping each setting to the function that applies it |
| 15 | Image loading |
| 16-18 | Actions table, keyboard engine and keybinding editor, delegated events |
| 19 | ZIP tools and chapter download |
| 20 | Toasts, bookmarks, auto-scroll, comments, local file reader |
| 21 | Startup |
| 22-23 | Site helpers and site modules |
| 24 | Console helpers and entry point |
url regex matches the address.site.run().before() hook, load mode.Page takeover (takeOverPage, line 11318) clones the document root and replaces it, which drops every event listener the original site attached. It then writes the reader's own head and body.
Site module contract: an object with name, url, homepage, language, category, optional waitEle and obs (warning note), testUrls, and run(). run() returns title, series, pages, prev, next, and one image-loading strategy.
Pages are shown as plain <img src>: no CORS handling needed, each image requested once. A queue limits concurrency and spacing.
Strategies
images: direct URLs.pages: fetch each page's HTML and read the image URL from it.bruteForce: the site module drives loading itself.Load speed presets (concurrency / delay)
| Preset | Concurrency | Delay |
|---|---|---|
| Safe (default) | 5 | 1000 ms |
| Standard | 5 | 500 ms |
| Faster | 10 | 500 ms |
| Extreme | 10 | 250 ms |
| All | 20 | 50 ms |
Lazy loading: rules are distance (within 2000 px), lookAhead (next 5 pages) or both. Per the code comments, bruteForce sites are never lazy. Any page can be loaded on demand and jumps to the front of the queue. Retry delay is 2 s and image timeout is 60 s.
enableComments, default on).#29487D (global) and #004526 (per-site).locale, bookmarks and keybinds are always global. Old 2025 keys are migrated once.Own engine; ignored while typing in inputs. All bindings are editable in a panel with validation, and modifier combos (ctrl+x, etc.) are supported.
| Action | Keys |
|---|---|
| Scroll up / down | ↑ W Num8 / ↓ S Num2 |
| Next chapter | → / D Num6 |
| Previous chapter | ← ; A Num4 |
| Zoom in / out | = Num+ E / - Num- Q |
| Restore zoom | 9 R |
| Fit width / height | 0 Num* F / H Num0 |
| Settings | Num/ Num5 X |
| Return to chapter list | Backspace Del NumDecimal |
| Toggle controls | L |
| View modes | C WebComic, V Vertical, N Left, B Right, G Gallery |
| Auto-scroll | Space start, . faster, , slower |
<a download>. Skipped pages are reported and a partial download can be offered. Bytes come through fetch (blob: URLs and same-origin fallback) or GM_xmlhttpRequest. downloadZip defaults to false.file:///...index.html page, or via MVMOpenFiles(), you can open loose images, a folder, or a ZIP/CBZ archive. Includes a DEFLATE decoder and natural-sort comparator. Applies loadSpeed: All and disables lazy loading in this mode.| Command | Purpose |
|---|---|
MVMDiagnose() |
Tests every matching module without opening the reader |
MVMDebug(true/false) |
Toggles verbose logging (persisted) |
MVMSettings() |
Prints effective, global and local settings |
MVMErrors() |
Prints the last errors with context |
MVMSiteData() |
Prints data captured by some site modules |
MVMOpenFiles() |
Opens the local files panel |
MVM(begin, end) |
Opens the reader now for a page range |
Setting window.__MVM_TEST_MODE__ = true before load exposes __MVM_INTERNALS__ instead of starting.
props JSON.api.mangadex.org/at-home/server/<id> and builds image URLs from the response.listImages:, 8 listPages:, 12 bruteForce mentions.eval( or new Function found.cdn-icons-png.flaticon.com). URLs inside the 89 site modules were not fully audited.@connect * with GM_xmlhttpRequest allows any domain. Observed uses: site APIs, page fetches, image downloads.run() means the script does nothing there.The script was not executed and no target site was tested. Some site modules may be outdated, since sites change often.