This page documents the per-platform manifest.json files for the MV2 uBlock Origin extension — Chromium, Firefox, Opera, and Thunderbird — covering permissions, background page declarations, content script registration, platform-specific keys, and how differences are managed. This page covers only the MV2 classic product; for the MV3 (uBOLite) manifests, see MV3 Architecture Overview. For the keyboard commands declared in these manifests, see Command System and Keyboard Shortcuts. For the browser abstraction layer that sits above these platform differences, see Browser Abstraction Layer (vAPI).
Each supported platform has its own manifest.json under platform/:
| Platform | Manifest Path |
|---|---|
| Chromium (Chrome, Edge) | platform/chromium/manifest.json |
| Firefox (Desktop + Android) | platform/firefox/manifest.json |
| Opera | platform/opera/manifest.json |
| Thunderbird | platform/thunderbird/manifest.json |
All four are MV2 manifests ("manifest_version": 2). The build system copies the appropriate manifest into the assembled extension directory during each platform build (see Build System and Makefile).
The following diagram maps the major manifest sections to their concrete keys and the source files they reference.
Diagram: manifest.json key structure across all MV2 platforms
Sources: platform/chromium/manifest.json1-118 platform/firefox/manifest.json1-138 platform/opera/manifest.json1-119 platform/thunderbird/manifest.json1-94
All four manifests declare the same persistent background page:
There is no service worker variant among these; that is exclusive to the MV3 uBOLite product.
The following table compares permissions declared per platform.
| Permission | Chromium | Firefox | Opera | Thunderbird |
|---|---|---|---|---|
alarms | ✓ | ✓ | ✓ | ✓ |
contextMenus | ✓ | — | ✓ | — |
menus | — | ✓ | — | — |
dns | — | ✓ | — | — |
privacy | ✓ | ✓ | ✓ | ✓ |
storage | ✓ | ✓ | ✓ | ✓ |
tabs | ✓ | ✓ | ✓ | ✓ |
unlimitedStorage | ✓ | ✓ | ✓ | — |
webNavigation | ✓ | ✓ | ✓ | ✓ |
webRequest | ✓ | ✓ | ✓ | ✓ |
webRequestBlocking | ✓ | ✓ | ✓ | ✓ |
<all_urls> | ✓ | ✓ | ✓ | ✓ |
Notable differences:
menus (the WebExtensions standard name) instead of contextMenus. It also adds the dns permission, enabling Firefox-specific DNS resolution queries used internally by vAPI.contextMenus/menus and unlimitedStorage. It lacks a conventional browser context menu integration and operates with the standard storage quota.webRequest + webRequestBlocking + <all_urls> — the trio that enables synchronous request interception, the core of the MV2 blocking architecture.Sources: platform/chromium/manifest.json98-109 platform/firefox/manifest.json114-126 platform/opera/manifest.json94-105 platform/thunderbird/manifest.json79-88
All platforms register the same three content script groups. The diagram below maps each group to the scripts it injects and the URL patterns it targets.
Diagram: content_scripts groups mapped to script files and URL match patterns
Key platform difference — file:// scheme:
Firefox and Thunderbird include file://*/* in Group 1's matches array, allowing content scripts to run on locally opened HTML files. Chromium and Opera do not include this; local file access requires the user to grant it manually via extension settings.
Sources: platform/chromium/manifest.json38-79 platform/firefox/manifest.json54-96 platform/thunderbird/manifest.json21-63
| Script | Purpose |
|---|---|
vapi.js | Platform abstraction bootstrap, injected first |
vapi-client.js | Client-side vAPI messaging and utilities |
contentscript.js | DOM watcher, cosmetic filter application, element collapsing |
subscriber.js | Detects abp:subscribe / ubo:subscribe links; sends subscribeTo message to background |
updater.js | In-page extension update detection on uBlockOrigin GitHub/Reddit pages |
Sources: src/js/scriptlets/subscriber.js40-70
browser_specific_settingsOnly Firefox and Thunderbird use this key (it is a Gecko-only extension). It provides the stable extension ID and minimum engine version.
| Key | Firefox | Thunderbird |
|---|---|---|
gecko.id | [email protected] | [email protected] |
gecko.strict_min_version | 115.0 | 91.0 |
gecko_android.strict_min_version | 115.0 | (absent) |
gecko.data_collection_permissions | { "required": ["none"] } | (absent) |
The shared extension ID [email protected] allows the same Firefox-signed package to be sideloaded on both Firefox Desktop and Thunderbird.
Sources: platform/firefox/manifest.json17-28 platform/thunderbird/manifest.json2-7
minimum_*_version| Platform | Key | Value |
|---|---|---|
| Chromium | minimum_chrome_version | 93.0 |
| Opera | minimum_opera_version | 79.0 |
| Firefox | (uses strict_min_version in browser_specific_settings) | 115.0 |
| Thunderbird | (uses strict_min_version in browser_specific_settings) | 91.0 |
Sources: platform/chromium/manifest.json92 platform/opera/manifest.json91
sidebar_actionFirefox and Opera both declare a sidebar panel. It exposes the logger UI as a persistent side panel.
| Platform | default_panel | default_title |
|---|---|---|
| Firefox | logger-ui.html | __MSG_statsPageName__ |
| Opera | logger-ui.html | __MSG_statsPageName__ |
Firefox additionally sets "open_at_install": false to suppress the sidebar from opening automatically on first install.
Chromium and Thunderbird do not support sidebar_action.
Sources: platform/firefox/manifest.json128-133 platform/opera/manifest.json107-114
options_ui vs. options_page| Platform | Key | Value |
|---|---|---|
| Chromium | options_ui with open_in_tab: true | dashboard.html |
| Firefox | options_ui with open_in_tab: true | dashboard.html |
| Opera | options_page (legacy form) | dashboard.html |
| Thunderbird | options_ui with browser_style: false, open_in_tab: true | dashboard.html |
Opera uses the older options_page key (a flat string) rather than the options_ui object form. Both cause the same dashboard.html to open, but Opera's form does not support the open_in_tab control.
Sources: platform/chromium/manifest.json94-97 platform/firefox/manifest.json110-113 platform/opera/manifest.json93 platform/thunderbird/manifest.json73-78
content_security_policyOnly the Chromium manifest declares an explicit CSP:
platform/chromium/manifest.json81
Firefox and Opera infer a suitable default; Thunderbird omits it entirely.
storage.managed_schemaOnly the Chromium manifest includes:
platform/chromium/manifest.json111-113
This allows enterprise administrators to push managed configuration via Chrome's managed storage policy mechanism. Firefox uses a different enterprise policy delivery mechanism and does not require this key.
incognitoBoth Chromium and Opera set "incognito": "split", meaning the extension runs as a separate instance in incognito/private windows. Firefox and Thunderbird do not declare this key and rely on browser defaults.
Sources: platform/chromium/manifest.json90 platform/opera/manifest.json89
All platforms except Thunderbird declare keyboard shortcut commands. Firefox adds one additional command.
| Command | Chromium | Firefox | Opera | Thunderbird |
|---|---|---|---|---|
_execute_browser_action | — | ✓ | — | — |
launch-element-zapper | ✓ | ✓ | ✓ | — |
launch-element-picker | ✓ | ✓ | ✓ | — |
launch-logger | ✓ | ✓ | ✓ | — |
open-dashboard | ✓ | ✓ | ✓ | — |
relax-blocking-mode | ✓ | ✓ | ✓ | — |
toggle-cosmetic-filtering | ✓ | ✓ | ✓ | — |
toggle-javascript | ✓ | ✓ | ✓ | — |
_execute_browser_action is a Firefox-only synthetic command name that allows users to assign a keyboard shortcut to open the popup directly. It requires no handler in commands.js — Firefox handles it internally.
The handler for all other commands lives in src/js/commands.js122-180
Sources: platform/chromium/manifest.json15-37 platform/firefox/manifest.json29-53 platform/opera/manifest.json15-37
| Platform | Format | Sizes |
|---|---|---|
| Chromium | PNG | 16, 32, 64, 128 |
| Opera | PNG | 16, 32, 64, 128 |
| Firefox | SVG | 16, 32, 48, 64, 96, 128 (all resolve to img/ublock.svg) |
| Thunderbird | SVG | 16, 48, 96 (all resolve to img/ublock.svg) |
Firefox and Thunderbird benefit from SVG's resolution independence. Chromium does not support SVG extension icons, so discrete PNG sizes are provided instead.
Sources: platform/chromium/manifest.json84-89 platform/firefox/manifest.json100-107 platform/thunderbird/manifest.json68-72
Diagram: Per-platform manifest feature presence
Sources: platform/chromium/manifest.json1-118 platform/firefox/manifest.json1-138 platform/opera/manifest.json1-119 platform/thunderbird/manifest.json1-94
Refresh this wiki
This wiki was recently refreshed. Please wait 2 days to refresh again.