This is a Python script which provides update notifications for Chrome extensions. It is also able to automatically deobfuscate the extension's source and generate diffs between two versions. The script then exports these results to a Discord webhook.
- Clone this repository.
- Install Node.js dependencies (webcrack) by running
npm i. - Create a Python virtual environment by running
python3 -m venv .venvthen activate it withsource .venv/bin/activate. - Install Python dependencies by running
pip3 install -r requirements.txt. - Run
python3 main.pyto generate the config file. - Edit
config/config.json. The configuration options are detailed in the next section. - Run
python3 main.pyto download the extensions you configured. Running this file in the future will also check for updates and report them to the configured webhook. - (optional) Put
main.pyon a cron job to automatically notify you of updates.
watched_extensions- A dict of extensions that the script will check for updates, with the extension ID as the key and any options as the value.discord_webhooks- A list of strings containing Discord webhook URLs to report to.collapse_diffs- If this is set to true, the generated diffs will be in one file, instead of being split up for each modified file.debug- If this is set to true, the logging level will be set tologging.DEBUGinstead oflogging.INFO.chrome_version- A string containing the reported Chrome browser version when checking for updates. This will default to the latest known Chrome version.unbundle- If this is set to true, Webcrack will attempt to unbundle JS files.save_crx- If this is set to true, downloaded CRX files will be saved to thecrx/directory.
Extension options should be specified as a dict. All settings in this list are optional.
update_url- The custom update server for the extension. This defaults to Google's official servers.name_override- Overrides the extension's name.discord_webhooks- Additional Discord webhooks to use only for this extension.footer_text- Text that will be appended to the webhook message body for notifications related to this extension. You can use this to ping specific roles or people for certain extensions.
{
"watched_extensions": {
"haldlgldplgnggkjaafhelgiaglafanh": {
"update_url": "https://ext.goguardian.com/stable.xml"
},
"joflmkccibkooplaeoinecjbmdebglab": {
"update_url": "https://extensions.securly.com/extensions.xml"
},
"pgmjaihnmedpcdkjcgigocogcbffgkbn": {},
"iheobagjkfklnlikgihanlhcddjoihkg": {
"name_override": "Securly for Chromebooks (old)"
},
"ddfbkhpmcdbciejenfcolaaiebnjcbfc": {}
},
"discord_webhooks": [
"https://discord.com/api/webhooks/xxxxxxxxxxxxxx/xxxxxxxxxxxxxx"
],
"collapse_diffs": true,
"debug": false,
"chrome_version": "140.0.7559.221",
"unbundle": false,
"save_crx": true
}This project uses webcrack for the deobfuscation of JS files.
ading2210/ext-watcher: A Python program for Chrome extension update notifications.
Copyright (C) 2026 ading2210
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.