A fork of MPIV (Mouseover Popup Image Viewer).
- on GreasyFork: link
- directly from GitHub: script.user.js (Tampermonkey/Violentmonkey/Greasemonkey should be installed first)
| Action | Trigger |
|---|---|
| Activate | hover the target and wait... or configure activation on Ctrl or AppMenu key |
| Deactivate | move cursor off target, or click, or zoom out fully |
| Ignore target | hold Shift ⏵ hover the target ⏵ release the key |
| Freeze popup | hold Shift ⏵ leave the target ⏵ release the key |
| Force-activate (videos or small pics) |
hold Ctrl ⏵ hover the target ⏵ release the key |
| Start zooming | configurable (automatic or via right-click) or tap Shift while popup is visible |
| Zoom | mouse wheel |
| Rotate | L r for "left" or "right" |
| Flip/mirror | h v for "horizontal" or "vertical" |
| Previous/next (in album) |
mouse wheel, j k or ← → keys |
| Antialiasing | a |
| Caption in info | c |
| Download | d |
| Fullscreen | f |
| Info | i |
| Mute | m |
| Night mode | n |
| Open in tab | t |
| Configure | userscript manager toolbar icon ⏵ User Script Commands ⏵ MPIV: configure |
Install Node.js 22 or newer, then run:
pnpm ciEdit the ES modules in src/. src/index.js starts the application, and
src/metadata.js contains the userscript header and version. Run pnpm run build
to bundle them with esbuild into script.user.js. Commit that generated file so
the existing installation links keep working. It is a standalone userscript;
users do not need Node.js or a module loader.
Run pnpm run dev (or pnpm run watch) while editing to rebuild automatically when
source modules or userscript metadata change. Build errors leave the previous
successful bundle intact; saving a fix resumes rebuilding. Stop watching with
Ctrl+C. Reload your userscript manager's local development copy to try the result.
The local pre-commit hook rebuilds and stages script.user.js.
pnpm run build # regenerate the installable userscript
pnpm run dev # rebuild on source and metadata changes
pnpm run lint # lint the source modules
pnpm test # regression, startup, and hook checks
pnpm run build:check # verify the committed bundle matches the sourceCI runs lint, tests, and the bundle freshness check. Tests exercise the source modules and the generated userscript, including modern and legacy userscript APIs.
-
Instagram: hover photos, profile/grid thumbnails, and loaded post or Reel media to preview the largest source provided by the page. Transparent hover overlays are supported. Reel covers and streaming players resolve their playable video from embedded post data. When Instagram identifies a video but withholds its playable URL, MPIV reports an error instead of showing its poster. Loaded carousel slides can be previewed individually. Links to posts, Reels, and legacy TV posts use embedded post data (including carousel galleries) or Open Graph metadata when Instagram supplies it. Login-required or unavailable posts may not expose this metadata; the script does not bypass Instagram's access restrictions.
-
Instagram embeds: direct Instagram iframes and s9e embeds (such as those used by phpBB forums) relay media hover events to the containing page, so the preview can extend beyond the iframe. Video URLs are extracted from Instagram's embedded JSON even when the HTML shows only a thumbnail; photos use the largest available image. Keep the userscript enabled in all frames, including
s9e.github.ioandinstagram.com, and reload the forum after updating it. -
After installing development dependencies, run the regression checks with
pnpm test. -
Ancient browsers aren't supported anymore because the code is using the modern JS syntax.
-
Most rules were updated/enhanced, some added, some dead hostings removed.
-
ShadowDOM support added for sites built with Web Components e.g. Polymer.
-
The internal status updates are not exposed by default on the
<html>node because doing so slows down complex sites due to recalculation of the entire page layout. Instead, only the hovered node (as reported by the matching rule) receives status updates on itsmpiv-statusattribute (it's not theclassnordata-attribute to avoid confusing sites with unknown stuff being present in these standard places). If you were using the global status feature to customize CSS of those statuses, you'll need to enable it manually in the MPIV's config dialog. -
Advanced
"e"syntax for sites that show a small overlay when hovering thumbnails (usually transparent or semi-transparent) thus effectively hiding the thumbnails from MPIV. Now you can specify"e": {".parent": ".image"}where.parentselector should match the closest parent element that contains both the overlay and the actual image, which MPIV will find using the.imageselector applied relatively to that parent element. To refer to that parent, use:scopelike this:{".parent": .":scope > img:first-child"}. To specify multiple parent-image relations:"e": {".parent1": ".image1", ".parent2": ".image2"}. -
New rule property
"u"(a single string or an array of strings) that performs a very fast plain-string check. Only when it succeeds, the slow regexp"r"is checked. Special symbols may be specified in"u"property to increase the reliability of matching:||,|,^- same syntax as in AdBlock filters, see the source code of the script for usage examples.||foo.bar/path, here||means "domain or subdomain" so the pattern matches domains likefoo.barorsubdomain.foo.barand doesn't match unrelated domains partially like for examplefoofoo.bar|foomatches things that start with foo (the entire URL is checked so that meanshttpat least, usually)^is a URL part separator (like/or?or:) but not a letter/number, neither any of%._-. Additionally, when used at the end likefoo^it also matches when the source ends withfoo
-
New rule property
"anonymous": trueto make the requests for this rule anonymously (i.e. without sending cookies).
