config.js
The entry point. See Configuration files.
Modern Firefox cannot load legacy add-ons (extensions built on install.rdf and bootstrap.js),
and it no longer loads userChrome.js scripts. Extensions like
TabMixPlus and many popular user scripts depend on exactly
those two mechanisms.
Firefox Scripts restores both, using Firefox's own AutoConfig startup hook, and adds the piece Mozilla will never ship: an updater, so what you install today keeps working after the next browser update.
Firefox 55 ESR disabled legacy add-ons by default and Firefox 57 dropped them entirely. The reasons were structural rather than a rejection of the feature:
bootstrap.js had no permission model at all.Nothing about the feature was ever declared fixed for good. But restoring it means re-introducing the same trust hole, deliberately, per browser installation. That is the trade-off every tool in this space makes, and it is worth making explicitly.
Nothing is injected into the browser binary, and no extension is installed. Two packages of plain files are copied into places Firefox already looks:
| Package | Goes where | What it contains |
|---|---|---|
fx-folder |
the browser's installation directory (next to the binary) | config.js, defaults/pref/config-prefs.js |
utils |
each profile's chrome/utils/ directory |
BootstrapLoader.js, userChrome.js, and the in-browser updater |
The first file is picked up by Firefox's AutoConfig mechanism, which runs once at startup, before the browser window exists. That one file registers the second package and loads the rest. The full chain is explained in How it works.
config.js
The entry point. See Configuration files.
BootstrapLoader.js
Brings legacy add-ons back. See BootstrapLoader.js.
userChrome.js
Runs your own .uc.js. See userChrome.js.
The scripts come from xiaoxiaoflood/firefox-scripts, the original project that made this possible, published under the MPL-2.0. This repository packages them, keeps them working on current Firefox versions, and adds the installer and the updater. Waterfox ships its own variant of the loader; where a fork already provides one, ours stays out of the way.