MotionBlock is a Chrome Manifest V3 extension for blocking distracting motion first: GIFs, GIFV, looping video, and autoplay. Broader media controls are available as opt-in settings for images, video, audio, emoji, and CSS motion.
Working store title:
MotionBlock: GIF Blocker & Animation Stopper
The product is built around the repeated review themes from existing blockers:
- People search for GIF blockers and animation stoppers, not broad "media control".
- They want per-site rules because image and video needs vary by website.
- They dislike giant replacement graphics.
- They want GIFV, Reddit, Discord, Giphy, Steam, and autoplay-style videos covered.
- They do not want normal WebP images blocked by default.
- Open
chrome://extensions. - Enable Developer mode.
- Choose Load unpacked.
- Select this folder:
C:\Users\molod\Documents\Personal\settings\MotionBlock.
The popup controls the current site. The options page controls global defaults and exact-host website preferences.
- DOM-aware GIF and image blocking that avoids tiny interface GIFs, plus network blocking for GIFV, WebP URL patterns, broad video, and audio settings.
- DOM cleanup for already-in-page images, video, audio, emoji renderers, and CSS motion.
- Audio blocking covers native media elements, common audio file request paths, and page-owned Web Audio playback/decoding paths.
- Per-site tri-state preferences: inherit, block/on, allow/off.
- Settings export/import with JSON backup files.
- Chrome-profile settings sync through Chrome extension sync storage when browser sync is enabled.
- System, light, and dark UI theme modes.
- Optional reveal buttons for blocked media. Off by default because complex sites can reuse hidden media surfaces.
- Optional advanced diagnostics that show a copyable in-memory popup log for troubleshooting site-specific blocking issues.
docs/product-brief.mdrecords the positioning and naming.docs/review-feedback.mdrecords the vital review feedback and product implications from competitor research.docs/roadmap.mdtracks likely release order.docs/release-notes.mdrecords packaged release changes and verification.docs/store-listing-draft.mdcontains initial Chrome Web Store copy.docs/chrome-web-store-entry.mdcontains copy-paste Chrome Web Store fields.docs/chrome-web-store-category.mdcontains the StorePilot-ready category decision.docs/chrome-web-store-additional-fields.mdcontains StorePilot-ready additional fields.docs/chrome-web-store-privacy-form.mdcontains StorePilot-ready privacy form fields.docs/localization.mdrecords the 66-locale Chrome Web Store coverage and QA workflow.docs/code-structure.mdrecords current ownership and modularization debt.docs/permissions.mdexplains requested extension permissions.docs/manual-test-plan.mdlists local and live-site test targets.store-assets/store-listing/*.txtcontains localized Store listing long descriptions.store-assets/promo/contains Chrome Web Store promotional tiles.store-assets/screenshots/is reserved for final Store screenshots.
Run:
.\scripts\serve-fixtures.ps1Then open http://127.0.0.1:8765/fixtures.html.
Run the lightweight settings sanity check:
npm testRun the release checks:
npm run verify:releaseUseful narrow checks:
npm run verify:architecture
npm run verify:manifest
npm run verify:locales
npm run verify:package- WebP blocking is URL-based for now. It is off by default because detecting animated WebP reliably needs deeper byte inspection.
- First-frame GIF replacement is not implemented yet. The current default is a compact placeholder that preserves the displayed size when possible.
- Reveal buttons are opt-in. They are useful on simple pages, but broad video/image blocking can produce unreliable click-to-play behavior on complex sites.
- Emoji removal restores same-page text and common text attributes while the original nodes remain. A reload can still be needed when a site re-renders text internally.
- GIF image blocking is DOM-aware instead of a blanket
.gifnetwork rule, because many sites still use static GIFs as tiny interface controls. - Broad image blocking is DOM-aware instead of a blanket image request rule, because image galleries often need loaded dimensions to keep their layout.
MotionBlock stores global defaults, per-site rules, display mode, reveal-button preference, diagnostics preference, and UI theme in Chrome extension sync storage. Optional diagnostics keep a bounded per-tab report in extension memory and show it in the popup only while diagnostics are enabled. It uses storage, declarativeNetRequest, and broad host access so the selected media rules can run locally across arbitrary websites.
MotionBlock does not collect analytics, send browsing data to a developer server, use remote rule lists, or run remote code. See PRIVACY.md and docs/permissions.md.
After uninstalling the Chrome version, Chrome may open an optional feedback page at https://molodchyk.com/motionblock/uninstall/. The extension passes only generic source, version, and UI-language parameters to that page.
The extension UI, manifest metadata, and Chrome Web Store detailed description are localized for the 66 locales tracked in docs/localization.md. Locale files live in _locales/<locale>/messages.json; StorePilot-ready listing files live in store-assets/store-listing/<locale>.txt.
Regenerate locale files with:
npm run generate:locales:liveThen run:
npm run verify:localesIf this extension saves you time and you want to support its development:
MotionBlock is licensed under the GNU General Public License v3.0. See LICENSE.
Source code: