A Rust-based CLI tool and WebAssembly library that converts Chrome Manifest V3 extensions to Firefox-compatible format.
Live Demo: https://otsobear.github.io/chrome2moz/
Firefox natively supports chrome.* APIs, but some Chrome-only APIs don't exist in Firefox. This tool:
- Detects 176 Chrome-only APIs (e.g.,
chrome.offscreen,chrome.declarativeContent,chrome.tabGroups) - Converts manifests (service workers → event pages, permission separation)
- Provides runtime shims for Chrome-only APIs
- Checks keyboard shortcuts for conflicts with Firefox built-ins
Read more: ARCHITECTURE.md covers Chrome API detection system, detection scope, and keyboard shortcuts in detail.
- Smart Detection: Identifies Chrome-only APIs that need conversion
- Manifest Transformation: Handles MV3 manifest differences for Firefox
- Keyboard Shortcut Checker: Detects conflicts with 60+ Firefox shortcuts
- Multiple Formats: Supports
.crx,.zip, or unpacked directories - Web Interface: Browser-based UI (no installation required)
./build-wasm.sh
cd web && python3 -m http.server 8080
# Open http://localhost:8080Drag & drop your Chrome extension ZIP, analyze, and download the converted Firefox version.
# Install
git clone https://github.com/OtsoBear/chrome2moz.git
cd chrome2moz
cargo build --release
# Analyze
./target/release/chrome2moz analyze -i ./chrome-extension
# Convert
./target/release/chrome2moz convert -i ./chrome-extension -o ./output
# List Chrome-only APIs
./target/release/chrome2moz chrome-only-apisOptions: --report (generate report), --yes (skip prompts), --preserve-chrome (keep both namespaces)
Chrome-Only APIs → Runtime shims provided for:
chrome.storage.session→ In-memory polyfillchrome.sidePanel→ FirefoxsidebarActionchrome.offscreen→ Web Workers/content scriptschrome.declarativeContent→ Content script patternschrome.tabGroups→ No-op stub (Firefox doesn't support)- And more... (see ARCHITECTURE.md)
Manifest Changes:
background.service_worker→background.scripts(event page)- Add
browser_specific_settings.geckofor Firefox ID - Separate
permissionsfromhost_permissions - Convert
web_accessible_resourcesformat - Handle
importScripts()→ Add to manifest
Firefox Compatibility Fixes:
- Automatically disables
browser.management.uninstallSelf()calls - Prevents extensions from self-destructing when detecting Firefox
- See docs/FIREFOX_SELF_UNINSTALL_FIX.md for details
- Open
about:debugging#/runtime/this-firefox - Click "Load Temporary Add-on"
- Select the converted
manifest.jsonor.xpifile
Check Browser Console (Ctrl+Shift+J) for any errors.
- Firefox supports
chrome.*namespace natively - no need to rewrite tobrowser.* - Static analysis has limits - runtime behavior differences need manual testing
- ~90% of conversions work automatically; remaining 10% may need manual adjustments
- See ARCHITECTURE.md for what's detected vs. what requires testing
Contributions welcome! See ARCHITECTURE.md for architectural details.
cargo fmt && cargo clippy && cargo testMIT License - See LICENSE file for details.