AdGuard is a fast and lightweight ad blocking browser extension
that effectively blocks all types of ads and trackers.
AdGuard.com |
Reddit |
Twitter |
Telegram
AdGuard is a fast and lightweight ad blocking browser extension that effectively blocks all types of ads and trackers on all web pages. We focus on advanced privacy protection features to not just block known trackers, but prevent web sites from building your shadow profile. Unlike its standalone counterparts (AG for Windows, Mac), the browser extension is completely free and open source. You can learn more about the difference here.
AdGuard does not collect any information about you, and does not participate in any acceptable ads program. The only source of income we have is selling premium versions of our software, and we intend to keep it that way.
- Installation
- Contribution
- Development
- Permissions required
- Auto-publish builds
- Minimum supported browser versions
You can get the latest available AdGuard Extension version from the Chrome Web Store.
You can get the latest version of AdGuard Extension from the Mozilla Add-ons website.
Opera is basically a Chromium browser, but it maintains its own add-ons store. You can get AdGuard Extension from there.
The latest stable version of AdGuard browser extension is available in Microsoft Store.
We are blessed to have a community that does not only love AdGuard, but also gives back. A lot of people volunteer in various ways to make other users' experience with AdGuard better, and you can join them!
We, on our part, can only be happy to reward the most active members of the community. So, what can you do?
If you want to help with AdGuard translations, please learn more about translating our products here: https://adguard.com/kb/miscellaneous/contribute/translate/program/
You can get a beta version of AdGuard Browser Extension for any browser. All necessary information on this topic can be found on a dedicated page on our website.
GitHub can be used to report a bug or to submit a feature request. To do so, go to this page and click the New issue button.
Note
For the filter-related issues (missed ads, false positives etc.) use the dedicated repository.
Here is a dedicated page for those who are willing to contribute.
Ensure that the following software is installed on your computer:
Install local dependencies by running:
pnpm install
Running unit tests:
pnpm test
Running integration tests:
pnpm test:integration <MODE>
# MODE can be 'dev', 'beta', 'release', same as build targets.
Running integration tests with enabling debug mode (page will be stopped after tests execution) for one of them:
pnpm test:integration <MODE> [-d <TEST_ID>]
# MODE can be 'dev', 'beta', 'release', same as build targets.
# TEST_ID can be extracted from https://testcases.agrd.dev/data.json
Run the following command to build the dev version:
pnpm dev
This will create a build directory with unpacked extensions for all browsers:
build/dev/chrome
build/dev/edge
build/dev/firefox-amo
build/dev/firefox-standalone
build/dev/opera
To make a dev build for a specific browser, run:
pnpm dev <browser>
Where <browser>
is one of the following: chrome
, chrome-mv3
, edge
, opera
, firefox-amo
,
firefox-standalone
, like this:
pnpm dev chrome
To run dev build in watch mode, run:
pnpm dev --watch
Or for a specific browser:
pnpm dev <browser> --watch
Since version v4.0, AdGuard browser extension uses an open source library tsurlfilter that implements the filtering engine.
While developing the browser extension it may be required to test the changes
to tsurlfilter
. Here's what you need to do to link your local dev build
to the local dev build of tsurlfilter
.
-
Clone and build tsurlfilter libraries.
-
You have two options to link the packages:
-
Option 1: Link the packages globally:
-
Go to the
tsurlfilter/packages/tsurlfilter
ortsurlfilter/packages/tswebextension
directory. -
Run the following command:
pnpm link --global
This command will create a symlink to the package in the global
node_modules
directory. -
Once you have the packages linked globally, you can link them to the browser extension. Just run the following command in the root directory of the browser extension:
pnpm link @adguard/tsurlfilter
-
-
Option 2: Link the packages by path:
-
Just run the following command in the root directory of the browser extension:
pnpm link <path-to-tsurlfilter/packages/tsurlfilter>
-
-
-
If you want to unlink the packages, just run
pnpm unlink @adguard/tsurlfilter
orpnpm unlink @adguard/tswebextension
in the root directory of the browser extension regardless of the linking option you chose.[!WARNING] pnpm will modify the lock file when linking packages. See pnpm/pnpm#4219.
[!NOTE] If you want to list linked packages, run
pnpm list --depth 0
in the root directory of the browser extension which will show you all dependencies. Linked packages have a version likelink:../path/to/package
. -
Build the browser extension in the watch mode:
pnpm dev <browser> --watch --no-cache
--no-cache
flag is required to rebuild the extension on changes in the linked packages.
Before building the release version, you should manually download the necessary resources that will be included into the build: filters and public suffix list.
pnpm resources
Tip
Run pnpm resources:mv3
to download resources for MV3 version.
This command also checks if there are dangerous rules in the filters. See dangerous rules
pnpm beta
pnpm release
You will need to put certificate.pem file to the ./private/AdguardBrowserExtension
directory. This
build will create unpacked extensions and then pack them (crx for Chrome).
For testing purposes for dev
command credentials taken from ./tests/certificate-test.pem
file.
WARNING: DO NOT USE TEST CREDENTIALS FOR PRODUCTION BUILDS, BECAUSE THEY ARE AVAILABLE IN PUBLIC.
You can use Crx CLI keygen
to generate credentials for crx
builds, see the example below:
# Command will generate `key.pem` credential in the `./private/AdguardBrowserExtension` directory
pnpm crx keygen ./private/AdguardBrowserExtension
-
To ensure that the extension is built in the same way, use the docker image:
docker run --rm -it \ -v $(pwd):/workspace \ -w /workspace \ adguard/extension-builder:22.14--0.2--0
-
Inside the docker container, install the dependencies:
pnpm install
-
To build the BETA version, run:
pnpm beta firefox-standalone
-
Navigate to the build directory:
cd ./build/beta
-
Compare the generated
firefox-standalone.zip
file with the uploaded one.
If you need to build the RELEASE version:
-
Run:
pnpm release firefox
-
Navigate to the build directory:
cd ./build/release
-
Compare the generated
firefox.zip
file with the uploaded one.
If you want to analyze the bundle size, run build with the ANALYZE
environment:
pnpm cross-env ANALYZE=true pnpm <build command>
So, for example, if you want to analyze the beta build for Chrome, run:
pnpm cross-env ANALYZE=true pnpm beta chrome
Or if you want to analyze all beta builds, run:
pnpm cross-env ANALYZE=true pnpm beta
Analyzer will generate reports to the ./build/analyze-reports
directory in the following format:
build/analyze-reports
├── <browser-name>-<build-type>.html
If you want to debug MV3 declarative rules and check exactly which rules has been applied for some requests, you can build extension in dev mode as described in the upper How to build section, but for specified branch, in which we develop MV3 version.
Then install extension via developer mode, make requests and see applied declarative rules in the filtering log.
-
Run the following command in the terminal:
pnpm dev chrome-mv3
-
The built extension will be located in the directory:
./build/dev/chrome-mv3
That's it!
-
Find and modify the rule you need in the
./Extension/filters/chromium-mv3
directory in the.txt
files. -
Convert the rules from txt to declarative form:
pnpm convert-declarative
-
Build the extension again:
pnpm dev chrome-mv3
-
Reload the extension in the browser:
-
If you see an ❗ mark - it means that assumed rule (which we calculated with our tsurlfilter engine, which performed applying rules in MV2) and actually applied rule (from which we converted to DNR rule) are not the same. And this can be a problem of conversion.
Otherwise, if assumed and applied rules are the same - only applied rule (in text and declarative ways) will be shown.
Despite our code may not currently comply with new style configuration,
please, setup eslint
in your editor to follow up with it .eslintrc
To download and append localizations run:
pnpm locales download
To upload new phrases to crowdin you need the file with phrases
./Extension/_locales/en/messages.json
. Then run:
pnpm locales upload
To remove old messages from locale messages run:
pnpm locales renew
To validate translations run:
pnpm locales validate
To show locales info run:
pnpm locales info
The browser extension project includes a comprehensive bundle size monitoring system, located in tools/bundle-size
. This system helps ensure that our extension bundles remain within defined size limits, and that any significant increases are reviewed and justified.
- Tracks and compares bundle sizes across different build types (
beta
,release
, etc.) and browser targets (chrome
,chrome-mv3
,edge
, etc.) - Detects significant size increases using configurable thresholds (default: 10%)
- Ensures Chrome MV3 bundle stays under the 30MB limit
- Checks for duplicate package versions using
pnpm
- Stores historical size data in
.bundle-sizes.json
- Designed for CI/CD integration (Bamboo)
- For Firefox targets (AMO and Standalone) only, every individual
.js
file is checked to ensure it does not exceed the 4MB limit imposed by the Firefox Add-ons Store. If any.js
file is larger than 4MB, the check fails and the offending files are reported.
- On each beta or release build, the system compares the current bundle sizes to the reference values in
.bundle-sizes.json
. - If any size exceeds the configured threshold, or additionally check for 30MB limit for Chrome MV3 target or 4MB limit for Firefox targets - the check fails.
- Duplicate package versions are detected and reported.
We have defined size limits in the project.
- When we build the
beta
orrelease
version, the build process checks if we’re exceeding those limits. - If we exceed the limits, the developer should investigate the cause and decide whether the size increase is acceptable.
- If the new sizes are justified, the developer updates the size values in the package and creates a commit.
- We then review and approve any changes to the sizes as part of the PR process.
-
Run the build for the desired environment (e.g.,
pnpm beta
orpnpm release
). -
If the build fails due to bundle size limits, investigate the cause (e.g., new dependencies, large assets).
-
If the increase is justified, update the reference sizes by running:
pnpm update-bundle-size <buildEnv> [targetBrowser] # Example: pnpm update-bundle-size release chrome-mv3 # Or: pnpm update-bundle-size beta firefox-amo # Or: pnpm update-bundle-size dev
-
Commit the updated
.bundle-sizes.json
file and include justification in your PR. -
The changes will be reviewed and approved as part of the PR process.
To check bundle sizes locally, use:
pnpm check-bundle-size <buildEnv> [targetBrowser]
# Example: pnpm check-bundle-size release chrome-mv3
# Or: pnpm check-bundle-size beta firefox-amo
# Or: pnpm check-bundle-size dev
For CLI help on parameters, use:
pnpm check-bundle-size --help
pnpm update-bundle-size --help
You can override the default threshold for significant bundle size increases using the --threshold
option:
pnpm check-bundle-size <buildEnv> [targetBrowser] --threshold 5
# or
pnpm check-bundle-size release chrome-mv3 --threshold=20
# or
pnpm check-bundle-size beta
--threshold <number>
: Sets the allowed percentage increase in bundle size before the check fails. Default: 10%.
This is useful for temporarily relaxing or tightening the allowed size delta for a specific check/build.
tabs
- this permission is required in order to get the URL of the options page tabwebRequest
- this permission is necessary to apply complicated rules (cosmetic for instance), detecting and removing tracking cookies, counting blocked resources.cookies
- this permissions is required to delete cookies from requests or changing their lifetime.contextMenus
- this permission is required in order to create a context menuscripting
- this permission is required in order to inject assistant script only in the required pagesstorage
- this permission is required in order to save user settings, user rules and custom filtersdeclarativeNetRequest
- this permission is required in order to block, redirect and modify URL requestsdeclarativeNetRequestFeedback
- this permission is required in order to create a log of the blocked, redirected or modified URL requestsunlimitedStorage
- this permission is required in order to save large filterswebNavigation
- this permission is required in order to catch the moment for injecting scriptlets
Due to the transition from MV2 to MV3, we cannot update our filters remotely. To keep the filters as fresh as possible, we have configured automated tasks in our CI plans. These tasks will build a new version of the extension with only the updated @adguard/dnr-rulesets
package, which contains new static rulesets.
These automated tasks will run all necessary checks: unit tests, translation checks, and linter. After that, they will update resources, including filters and local script rules, create a build, and run integration tests to ensure the update is safe.
Finally, the new version of the extension will be published to the Chrome Web Store.
Browser | Version |
---|---|
Chromium-based browsers MV2 | ✅ 106 |
Chromium-based browsers MV3 | ✅ 121 |
Firefox | ✅ 78 |
Firefox Mobile | ✅ 113 |
Opera | ✅ 67 |
Edge Chromium | ✅ 80 |
Edge Legacy | ❌ |