uBlock Origin MV3
An unofficial port of uBlock Origin to Manifest V3, enabling webRequestBlocking with policy installation or --allowlisted-extension-id.
This website currently hosts version 1.74.0 of uBlock Origin. You can download the CRX from /uBlock0_1.74.0.crx.
Installation
Chrome 138 or newer is required. To install, add "blockddmmcjpfkbhanlgegpmjpfpfjka;https://ublock.r58playz.dev/update.xml" to Chrome's ExtensionInstallForcelist policy, or
install manually and use the --allowlisted-extension-id=blockddmmcjpfkbhanlgegpmjpfpfjka flag.
This varies across operating systems and is heavily restricted on Windows and macOS.
The flag must be present on every launch. Unlike a policy install, the flag-based install does not allow blocking handlers to return promises while uBO starts.
Linux
- Create
/etc/opt/chrome/policies/managed/policy.json, or/etc/chromium/policies/managed/policy.jsondepending on your install. - Write
{ "ExtensionInstallForcelist": ["blockddmmcjpfkbhanlgegpmjpfpfjka;https://ublock.r58playz.dev/update.xml"] }into the file. - Restart the browser, then enable
Allow User Scriptsin the extension's details page.
Windows and macOS
Chrome refuses to force-install an extension from a non-Web-Store update URL unless the device has a management authority it considers trustworthy.
Merely writing the policy locally via platform policy locations like regedit or plists does not establish that trust.
Chrome shows the effective entry as [BLOCKED]... in chrome://policy.
Option 1: give the device a trusted management authority
This is the only way to get a full policy install, including promise-returning webRequestBlocking handlers.
- Windows Pro or higher: join the device to Microsoft Entra ID, join an Active Directory domain, or enroll the device in an MDM.
-
macOS: enroll the Mac in an MDM, or bind it to a directory server, meaning an Open Directory node under
/LDAPv3or/Active Directory. - Either platform: enroll the browser in Chrome Enterprise Core and set the forcelist entry in the Google Admin console. No local registry or plist entry is needed in this case.
If the device is managed through a domain or MDM, deploy the policy through that management system. A locally applied machine policy can also be used after Chrome recognises the device as managed:
- Windows: in regedit, create the key
HKEY_LOCAL_MACHINE\Software\Policies\Google\Chrome\ExtensionInstallForcelist, add a string value named1(or the next free number), and set it toblockddmmcjpfkbhanlgegpmjpfpfjka;https://ublock.r58playz.dev/update.xml. - macOS: add
ExtensionInstallForcelist, as an array containingblockddmmcjpfkbhanlgegpmjpfpfjka;https://ublock.r58playz.dev/update.xml, to/Library/Managed Preferences/com.google.Chrome.plist.
Then restart the browser and enable Allow User Scripts in the extension's details page.
If chrome://policy still shows the value with a [BLOCKED] prefix, the device is not being recognised as managed.
Option 2: manual install plus a launch flag
This works on any unmanaged Windows or macOS machine, but the extension ends up installed as an ordinary extension rather than by policy.
Promise-returning webRequestBlocking handlers are therefore unavailable.
While uBO starts, subresource requests are temporarily cancelled and affected tabs may be reloaded instead of requests being held until the filtering engine is ready.
On branded Google Chrome, the packaged CRX must also be added to the machine-level ExtensionInstallAllowlist policy so Chrome does not disable it after installation.
This is not needed for unbranded Chromium. The allowlist does not install the extension or replace the launch flag.
- Download the CRX.
- Remove any
ExtensionInstallForcelistentry for this extension. -
Add
blockddmmcjpfkbhanlgegpmjpfpfjkato the machine-levelExtensionInstallAllowlistpolicy:- Windows: in regedit, create
HKEY_LOCAL_MACHINE\Software\Policies\Google\Chrome\ExtensionInstallAllowlist, add a string value named1(or the next free number), and set it to the extension ID. - macOS: add
ExtensionInstallAllowlist, as an array containing only the extension ID, to/Library/Managed Preferences/com.google.Chrome.plist.
- Windows: in regedit, create
- Completely quit Chrome, including background processes, restart it, and verify the allowlist in
chrome://policy. - Launch Chrome with
--allowlisted-extension-id=blockddmmcjpfkbhanlgegpmjpfpfjka. Chrome will show an unsupported command-line flag warning; do not suppress it with--test-type, which changes other browser behaviour. - Open
chrome://extensions, enableDeveloper mode, then drag the CRX onto the page and approve the installation. - Enable
Allow User Scriptsin the extension's details page. Wait for the!badge to clear; reload the extension if it does not.
The flag is what makes Chromium grant the MV3 webRequestBlocking permission to this extension. Chrome must be started with it every time.
How it works
- This port does not convert uBO's filtering engine to
declarativeNetRequest. The existing engine runs in an MV3 service worker and returns blocking decisions throughwebRequest. -
Chromium normally grants
webRequestBlockingto MV3 extensions only when they are installed by policy. The--allowlisted-extension-idflag bypasses that permission check, but does not turn a manual install into a policy install.- Only a real policy install may return promises from blocking handlers. This port uses them to hold requests while the filtering engine starts.
- A manual install instead temporarily cancels subresource requests during startup and reloads affected tabs after the engine is ready, like Chrome on MV2. Normal filtering decisions are synchronous after startup.
- Legacy script and CSS injection APIs are implemented with
chrome.scriptingandchrome.userScripts. - Small DOM and
XMLHttpRequestshims provide the background-page APIs uBO uses, and a periodic extension API call keeps the service worker active. - Web Workers run in a lazily created offscreen document and communicate with the service worker through message ports.
Check out the GitHub for the source and for build instructions.