From 5d67d02bfa37caf1c5089734857633de1fb70c54 Mon Sep 17 00:00:00 2001 From: JorySeverijnse Date: Wed, 4 Mar 2026 11:44:02 +0100 Subject: [PATCH] Initial arkenfox user.js commit --- README.md | 26 ++ prefsCleaner.sh | 185 +++++++++++++ scratchpad-scripts/arkenfox-cleanup.js | 168 ++++++++++++ scratchpad-scripts/troubleshooter.js | 210 +++++++++++++++ user.js | 355 +++++++++++++++++++++++++ 5 files changed, 944 insertions(+) create mode 100644 README.md create mode 100755 prefsCleaner.sh create mode 100644 scratchpad-scripts/arkenfox-cleanup.js create mode 100644 scratchpad-scripts/troubleshooter.js create mode 100644 user.js diff --git a/README.md b/README.md new file mode 100644 index 0000000..1a27d8a --- /dev/null +++ b/README.md @@ -0,0 +1,26 @@ +### 🟪 user.js +A `user.js` is a configuration file that can control Firefox settings - for a more technical breakdown and explanation, you can read more in the [wiki](https://github.com/arkenfox/user.js/wiki/2.1-User.js) + +### 🟩 the arkenfox user.js + +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) + +The `arkenfox user.js` is a **template** which aims to provide as much privacy and enhanced security as possible, and to reduce tracking and fingerprinting as much as possible - while minimizing any loss of functionality and breakage (but it will happen). + +Everyone, experts included, should at least read the [wiki](https://github.com/arkenfox/user.js/wiki), as it contains important information regarding a few `user.js` settings. There is also an [interactive current release](https://arkenfox.github.io/gui/), thanks to [icpantsparti2](https://github.com/icpantsparti2). + +Note that we do *not* recommend connecting over Tor on Firefox. Use the [Tor Browser](https://www.torproject.org/projects/torbrowser.html.en) if your [threat model](https://2019.www.torproject.org/about/torusers.html) calls for it, or for accessing hidden services. + +Also be aware that the `arkenfox user.js` is made specifically for desktop Firefox. Using it as-is in other Gecko-based browsers can be counterproductive, especially in the Tor Browser. + +### 🟧 sitemap + + - [releases](https://github.com/arkenfox/user.js/releases) + - [changelogs](https://github.com/arkenfox/user.js/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3Achangelog) + - [wiki](https://github.com/arkenfox/user.js/wiki) + - [stickies](https://github.com/arkenfox/user.js/issues?q=is%3Aissue+is%3Aopen+label%3A%22sticky+topic%22) + - [diffs](https://github.com/arkenfox/user.js/issues?q=is%3Aissue+label%3Adiffs) + - [common questions and answers](https://github.com/arkenfox/user.js/issues?q=is%3Aissue+label%3Aanswered) + +### 🟥 acknowledgments +Literally thousands of sources, references and suggestions. Many thanks, and much appreciated. diff --git a/prefsCleaner.sh b/prefsCleaner.sh new file mode 100755 index 0000000..b9739b2 --- /dev/null +++ b/prefsCleaner.sh @@ -0,0 +1,185 @@ +#!/usr/bin/env bash + +## prefs.js cleaner for Linux/Mac +## author: @claustromaniac +## version: 2.1 + +## special thanks to @overdodactyl and @earthlng for a few snippets that I stol..*cough* borrowed from the updater.sh + +## DON'T GO HIGHER THAN VERSION x.9 !! ( because of ASCII comparison in update_prefsCleaner() ) + +readonly CURRDIR=$(pwd) + +## get the full path of this script (readlink for Linux, greadlink for Mac with coreutils installed) +SCRIPT_FILE=$(readlink -f "${BASH_SOURCE[0]}" 2>/dev/null || greadlink -f "${BASH_SOURCE[0]}" 2>/dev/null) + +## fallback for Macs without coreutils +[ -z "$SCRIPT_FILE" ] && SCRIPT_FILE=${BASH_SOURCE[0]} + + +AUTOUPDATE=true +QUICKSTART=false + +## download method priority: curl -> wget +DOWNLOAD_METHOD='' +if command -v curl >/dev/null; then + DOWNLOAD_METHOD='curl --max-redirs 3 -so' +elif command -v wget >/dev/null; then + DOWNLOAD_METHOD='wget --max-redirect 3 --quiet -O' +else + AUTOUPDATE=false + echo -e "No curl or wget detected.\nAutomatic self-update disabled!" +fi + +fQuit() { + ## change directory back to the original working directory + cd "${CURRDIR}" + [ "$1" -eq 0 ] && echo -e "\n$2" || echo -e "\n$2" >&2 + exit $1 +} + +fUsage() { + echo -e "\nUsage: $0 [-ds]" + echo -e " +Optional Arguments: + -s Start immediately + -d Don't auto-update prefsCleaner.sh" +} + +download_file() { # expects URL as argument ($1) + declare -r tf=$(mktemp) + + $DOWNLOAD_METHOD "${tf}" "$1" &>/dev/null && echo "$tf" || echo '' # return the temp-filename or empty string on error +} + +fFF_check() { + # there are many ways to see if firefox is running or not, some more reliable than others + # this isn't elegant and might not be future-proof but should at least be compatible with any environment + while [ -e lock ]; do + echo -e "\nThis Firefox profile seems to be in use. Close Firefox and try again.\n" >&2 + read -r -p "Press any key to continue." + done +} + +## returns the version number of a prefsCleaner.sh file +get_prefsCleaner_version() { + echo "$(sed -n '5 s/.*[[:blank:]]\([[:digit:]]*\.[[:digit:]]*\)/\1/p' "$1")" +} + +## updates the prefsCleaner.sh file based on the latest public version +update_prefsCleaner() { + declare -r tmpfile="$(download_file 'https://raw.githubusercontent.com/arkenfox/user.js/master/prefsCleaner.sh')" + [ -z "$tmpfile" ] && echo -e "Error! Could not download prefsCleaner.sh" && return 1 # check if download failed + + [[ $(get_prefsCleaner_version "$SCRIPT_FILE") == $(get_prefsCleaner_version "$tmpfile") ]] && return 0 + + mv "$tmpfile" "$SCRIPT_FILE" + chmod u+x "$SCRIPT_FILE" + "$SCRIPT_FILE" "$@" -d + exit 0 +} + +fClean() { + # the magic happens here + prefs="@@" + prefexp="user_pref[ ]*\([ ]*[\"']([^\"']+)[\"'][ ]*," + while read -r line; do + if [[ "$line" =~ $prefexp && $prefs != *"@@${BASH_REMATCH[1]}@@"* ]]; then + prefs="${prefs}${BASH_REMATCH[1]}@@" + fi + done <<< "$(grep -E "$prefexp" user.js)" + + while IFS='' read -r line || [[ -n "$line" ]]; do + if [[ "$line" =~ ^$prefexp ]]; then + if [[ $prefs != *"@@${BASH_REMATCH[1]}@@"* ]]; then + echo "$line" + fi + else + echo "$line" + fi + done < "$1" > prefs.js +} + +fStart() { + if [ ! -e user.js ]; then + fQuit 1 "user.js not found in the current directory." + elif [ ! -e prefs.js ]; then + fQuit 1 "prefs.js not found in the current directory." + fi + + fFF_check + mkdir -p prefsjs_backups + bakfile="prefsjs_backups/prefs.js.backup.$(date +"%Y-%m-%d_%H%M")" + mv prefs.js "${bakfile}" || fQuit 1 "Operation aborted.\nReason: Could not create backup file $bakfile" + echo -e "\nprefs.js backed up: $bakfile" + echo "Cleaning prefs.js..." + fClean "$bakfile" + fQuit 0 "All done!" +} + + +while getopts "sd" opt; do + case $opt in + s) + QUICKSTART=true + ;; + d) + AUTOUPDATE=false + ;; + esac +done + +## change directory to the Firefox profile directory +cd "$(dirname "${SCRIPT_FILE}")" + +# Check if running as root and if any files have the owner as root/wheel. +if [ "${EUID:-"$(id -u)"}" -eq 0 ]; then + fQuit 1 "You shouldn't run this with elevated privileges (such as with doas/sudo)." +elif [ -n "$(find ./ -user 0)" ]; then + printf 'It looks like this script was previously run with elevated privileges, +you will need to change ownership of the following files to your user:\n' + find . -user 0 + fQuit 1 +fi + +[ "$AUTOUPDATE" = true ] && update_prefsCleaner "$@" + +echo -e "\n\n" +echo " ╔══════════════════════════╗" +echo " ║ prefs.js cleaner ║" +echo " ║ by claustromaniac ║" +echo " ║ v2.1 ║" +echo " ╚══════════════════════════╝" +echo -e "\nThis script should be run from your Firefox profile directory.\n" +echo "It will remove any entries from prefs.js that also exist in user.js." +echo "This will allow inactive preferences to be reset to their default values." +echo -e "\nThis Firefox profile shouldn't be in use during the process.\n" + +[ "$QUICKSTART" = true ] && fStart + +echo -e "\nIn order to proceed, select a command below by entering its corresponding number.\n" + +select option in Start Help Exit; do + case $option in + Start) + fStart + ;; + Help) + fUsage + echo -e "\nThis script creates a backup of your prefs.js file before doing anything." + echo -e "It should be safe, but you can follow these steps if something goes wrong:\n" + echo "1. Make sure Firefox is closed." + echo "2. Delete prefs.js in your profile folder." + echo "3. Delete Invalidprefs.js if you have one in the same folder." + echo "4. Rename or copy your latest backup to prefs.js." + echo "5. Run Firefox and see if you notice anything wrong with it." + echo "6. If you do notice something wrong, especially with your extensions, and/or with the UI, go to about:support, and restart Firefox with add-ons disabled. Then, restart it again normally, and see if the problems were solved." + echo -e "If you are able to identify the cause of your issues, please bring it up on the arkenfox user.js GitHub repository.\n" + ;; + Exit) + fQuit 0 + ;; + esac +done + +fQuit 0 diff --git a/scratchpad-scripts/arkenfox-cleanup.js b/scratchpad-scripts/arkenfox-cleanup.js new file mode 100644 index 0000000..b1b44f5 --- /dev/null +++ b/scratchpad-scripts/arkenfox-cleanup.js @@ -0,0 +1,168 @@ +/*** + This will reset the preferences that since FF91 have been + - removed from the arkenfox user.js + - deprecated by Mozilla but listed in the arkenfox user.js in the past + + There is an archived version at https://github.com/arkenfox/user.js/issues/123 + if you want the full list since jesus + + Last updated: 14-August-2025 + + Instructions: + - [optional] close Firefox and backup your profile + - [optional] disable your network connection [1] + - start Firefox + - load about:config and press Ctrl+Shift+K to open the Web Console for about:config + - using about:config is important, so the script has the right permissions + - paste this script + - if you edited the list of prefs in the script, make sure the last pref does not have a trailing comma + - hit enter + - check the Info output to see which prefs were reset + - restart + - some prefs require a restart + - a restart will reapply your user.js + - [optional] re-enable your network connection + + [1] Blocking Firefox from the internet ensures it cannot act on your reset preferences in the + period before you restart it, such as app and extension auto-updating, or downloading unwanted + components (GMP etc). It depends on what you're resetting and how long before you restart. + +***/ + +(() => { + + if ('undefined' === typeof(Services)) return alert('about:config needs to be the active tab!'); + + const aPREFS = [ + /* DEPRECATED */ + /* 129-140 */ + 'browser.shopping.experience2023.enabled', // 140 + 'browser.urlbar.pocket.featureGate', // 140 + 'media.ondevicechange.enabled', // 137 + 'webchannel.allowObject.urlWhitelist', // 132 + /* 116-128 */ + 'browser.contentanalysis.default_allow', // 127 + 'browser.messaging-system.whatsNewPanel.enabled', // 126 + 'browser.ping-centre.telemetry', // 123 + 'dom.webnotifications.serviceworker.enabled', // 117 + 'javascript.use_us_english_locale', // 119 + 'layout.css.font-visibility.private', // 118 + 'layout.css.font-visibility.resistFingerprinting', // 116 + 'layout.css.font-visibility.standard', // 118 + 'layout.css.font-visibility.trackingprotection', // 118 + 'network.dns.skipTRR-when-parental-control-enabled', // 119 + 'permissions.delegation.enabled', // 118 + 'security.family_safety.mode', // 117 + 'widget.non-native-theme.enabled', // 127 + /* 103-115 */ + 'browser.cache.offline.enable', // 115 + 'extensions.formautofill.heuristics.enabled', // 114 + 'network.cookie.lifetimePolicy', // 103 [technically removed in 104] + 'privacy.clearsitedata.cache.enabled', // 114 + 'privacy.resistFingerprinting.testGranularityMask', // 114 + 'security.pki.sha1_enforcement_level', // 103 + /* 92-102 */ + 'browser.urlbar.suggest.quicksuggest', // 95 + 'dom.securecontext.whitelist_onions', // 97 + 'dom.storage.next_gen', // 102 + 'network.http.spdy.enabled', // 100 + 'network.http.spdy.enabled.deps', + 'network.http.spdy.enabled.http2', + 'network.http.spdy.websockets', + 'layout.css.font-visibility.level', // 94 + 'security.ask_for_password', // 102 + 'security.csp.enable', // 99 + 'security.password_lifetime', // 102 + 'security.ssl3.rsa_des_ede3_sha', // 93 + + /* REMOVED */ + /* 129-140 */ + 'dom.securecontext.allowlist_onions', + 'network.http.referer.hideOnionSource', + 'privacy.clearOnShutdown.cache', + 'privacy.clearOnShutdown.cookies', + 'privacy.clearOnShutdown.downloads', + 'privacy.clearOnShutdown.formdata', + 'privacy.clearOnShutdown.history', + 'privacy.clearOnShutdown.offlineApps', + 'privacy.clearOnShutdown.sessions', + 'privacy.cpd.cache', + 'privacy.cpd.cookies', + 'privacy.cpd.formdata', + 'privacy.cpd.history', + 'privacy.cpd.offlineApps', + 'privacy.cpd.sessions', + /* 116-128 */ + 'browser.fixup.alternate.enabled', + 'browser.taskbar.previews.enable', + 'browser.urlbar.dnsResolveSingleWordsAfterSearch', + 'geo.provider.network.url', + 'geo.provider.network.logging.enabled', + 'geo.provider.use_gpsd', + 'media.gmp-widevinecdm.enabled', + 'network.protocol-handler.external.ms-windows-store', + 'privacy.partition.always_partition_third_party_non_cookie_storage', + 'privacy.partition.always_partition_third_party_non_cookie_storage.exempt_sessionstorage', + 'privacy.partition.serviceWorkers', + /* 103-115 */ + 'beacon.enabled', + 'browser.startup.blankWindow', + 'browser.newtab.preload', + 'browser.newtabpage.activity-stream.feeds.discoverystreamfeed', + 'browser.newtabpage.activity-stream.feeds.snippets', + 'browser.region.network.url', + 'browser.region.update.enabled', + 'browser.search.region', + 'browser.ssl_override_behavior', + 'browser.tabs.warnOnClose', + 'devtools.chrome.enabled', + 'dom.disable_beforeunload', + 'dom.disable_open_during_load', + 'dom.netinfo.enabled', + 'dom.vr.enabled', + 'extensions.formautofill.addresses.supported', + 'extensions.formautofill.available', + 'extensions.formautofill.creditCards.available', + 'extensions.formautofill.creditCards.supported', + 'middlemouse.contentLoadURL', + 'network.http.altsvc.oe', + /* 92-102 */ + 'browser.urlbar.trimURLs', + 'dom.caches.enabled', + 'dom.storageManager.enabled', + 'dom.storage_access.enabled', + 'dom.targetBlankNoOpener.enabled', + 'network.cookie.thirdparty.sessionOnly', + 'network.cookie.thirdparty.nonsecureSessionOnly', + 'privacy.firstparty.isolate.block_post_message', + 'privacy.firstparty.isolate.restrict_opener_access', + 'privacy.firstparty.isolate.use_site', + 'privacy.window.name.update.enabled', + 'security.insecure_connection_text.enabled', + + /* IMPORTANT: last active pref must not have a trailing comma */ + /* reset parrot: check your open about:config after running the script */ + '_user.js.parrot' + ]; + + console.clear(); + + let c = 0; + for (const sPname of aPREFS) { + if (Services.prefs.prefHasUserValue(sPname)) { + Services.prefs.clearUserPref(sPname); + if (!Services.prefs.prefHasUserValue(sPname)) { + console.info('reset', sPname); + c++; + } else console.warn('failed to reset', sPname); + } + } + + focus(); + + const d = (c==1) ? ' pref' : ' prefs'; + alert(c ? 'successfully reset ' + c + d + "\n\nfor details check the console" : 'nothing to reset'); + + return 'all done'; + +})(); diff --git a/scratchpad-scripts/troubleshooter.js b/scratchpad-scripts/troubleshooter.js new file mode 100644 index 0000000..bd86786 --- /dev/null +++ b/scratchpad-scripts/troubleshooter.js @@ -0,0 +1,210 @@ +/*** arkenfox user.js troubleshooter.js v1.6.3 ***/ + +(function() { + + if ("undefined" === typeof(Services)) return alert('about:config needs to be the active tab!'); + + const aPREFS = [ + + /* known culprits */ + 'network.cookie.cookieBehavior', + 'network.http.referer.XOriginPolicy', + 'privacy.firstparty.isolate', + 'privacy.resistFingerprinting', + 'security.mixed_content.block_display_content', + 'svg.disabled', + + /* Storage + Cache */ + 'browser.cache.offline.enable', + 'dom.storage.enabled', + 'dom.storageManager.enabled', + + /* Workers, Web + Push Notifications */ + 'dom.caches.enabled', + 'dom.push.connection.enabled', + 'dom.push.enabled', + 'dom.push.serverURL', + 'dom.serviceWorkers.enabled', + 'dom.webnotifications.enabled', + 'dom.webnotifications.serviceworker.enabled', + + /* Fonts */ + 'browser.display.use_document_fonts', + 'font.blacklist.underline_offset', + 'gfx.font_rendering.graphite.enabled', + 'gfx.font_rendering.opentype_svg.enabled', + 'layout.css.font-loading-api.enabled', + + /* Misc */ + 'browser.link.open_newwindow.restriction', + 'canvas.capturestream.enabled', + 'dom.event.clipboardevents.enabled', + 'dom.event.contextmenu.enabled', + 'dom.IntersectionObserver.enabled', + 'dom.popup_allowed_events', + 'full-screen-api.enabled', + 'intl.accept_languages', + 'javascript.options.asmjs', + 'javascript.options.wasm', + 'permissions.default.shortcuts', + + /* Hardware */ + 'dom.vr.enabled', + 'media.ondevicechange.enabled', + + /* Audio + Video */ + 'dom.webaudio.enabled', + 'media.autoplay.default', // FF63+ + 'media.autoplay.blocking_policy', // FF78+ + + /* Forms */ + 'browser.formfill.enable', + 'signon.autofillForms', + 'signon.formlessCapture.enabled', + + /* HTTPS */ + 'security.cert_pinning.enforcement_level', + 'security.family_safety.mode', + 'security.OCSP.require', + 'security.pki.sha1_enforcement_level', + 'security.ssl.require_safe_negotiation', + 'security.ssl.treat_unsafe_negotiation_as_broken', + 'security.ssl3.dhe_rsa_aes_128_sha', + 'security.ssl3.dhe_rsa_aes_256_sha', + 'security.ssl3.ecdhe_ecdsa_aes_128_sha', + 'security.ssl3.ecdhe_rsa_aes_128_sha', + 'security.ssl3.rsa_aes_128_sha', + 'security.ssl3.rsa_aes_256_sha', + 'security.ssl3.rsa_des_ede3_sha', + 'security.tls.enable_0rtt_data', + 'security.tls.version.max', + 'security.tls.version.min', + + /* Plugins + Flash */ + 'plugin.default.state', + 'plugin.state.flash', + + /* unlikely to cause problems */ + 'dom.popup_maximum', + 'geo.provider.network.url', + 'layout.css.visited_links_enabled', + 'mathml.disabled', + 'network.auth.subresource-http-auth-allow', + 'network.http.redirection-limit', + 'network.protocol-handler.external.ms-windows-store', + 'privacy.trackingprotection.enabled', + 'security.data_uri.block_toplevel_data_uri_navigations', + 'privacy.window.name.update.enabled', // FF82+ + + 'last.one.without.comma' + ] + + // any runtime-set pref that everyone will have and that can be safely reset + const oFILLER = { type: 64, name: 'app.update.lastUpdateTime.browser-cleanup-thumbnails', value: 1580000000 }; + + function getMyList(arr) { + const aRet = []; + for (const sPname of arr) { + if (Services.prefs.prefHasUserValue(sPname)) { + const ptype = Services.prefs.getPrefType(sPname); + switch (ptype) { + case 32: // string (see https://dxr.mozilla.org/mozilla-central/source/modules/libpref/nsIPrefBranch.idl#31) + aRet.push({'type':ptype,'name':sPname,'value':Services.prefs.getCharPref(sPname)}); + break; + case 64: // int + aRet.push({'type':ptype,'name':sPname,'value':Services.prefs.getIntPref(sPname)}); + break; + case 128: // boolean + aRet.push({'type':ptype,'name':sPname,'value':Services.prefs.getBoolPref(sPname)}); + break; + default: + console.log("error detecting pref-type for '"+sPname+"' !"); + } + } + } + return aRet; + } + + function reapply(arr) { + for (const oPref of arr) { + switch (oPref.type) { + case 32: // string + Services.prefs.setCharPref(oPref.name, oPref.value); + break; + case 64: // int + Services.prefs.setIntPref(oPref.name, oPref.value); + break; + case 128: // boolean + Services.prefs.setBoolPref(oPref.name, oPref.value); + break; + default: + console.log("error re-appyling value for '"+oPref.name+"' !"); // should never happen + } + } + } + + function myreset(arr) { + for (const oPref of arr) Services.prefs.clearUserPref(oPref.name); + } + + function resetAllMatchingDefault(arr) { + const aTmp = getMyList(arr); + myreset(aTmp); + reapply(aTmp); + } + + function _main(aALL) { + const _h = (arr) => Math.ceil(arr.length/2); + + let aTmp = aALL, aDbg = aALL; + reapply(aALL); + myreset(aTmp.slice(0, _h(aTmp))); + while (aTmp.length) { + alert('NOW TEST AGAIN !'); + if (confirm('if the problem still exists click OK, otherwise click Cancel.')) { + aTmp = aTmp.slice(_h(aTmp)); + } else { + aTmp = aTmp.slice(0, _h(aTmp)); + aDbg = aTmp; // update narrowed down list + if (aDbg.length == 1) break; + } + reapply(aALL); + myreset(aTmp.slice(0, _h(aTmp))); // reset half of the remaining prefs + } + reapply(aALL); + + if (aDbg.length == 1) return alert("narrowed it down to:\n\n"+aDbg[0].name+"\n"); + if (aDbg.length == aALL.length) { + const msg = "Failed to narrow it down beyond the initial "+aALL.length+" prefs. The problem is most likely caused by at least 2 prefs!\n\n" + + "Either those prefs are too far apart in the list or there are exactly 2 culprits and they just happen to be at the wrong place.\n\n" + + "In case it's the latter, the script can add a dummy pref and you can try again - Try again?"; + if (confirm(msg)) return _main([...aALL, oFILLER]); + } else if (aDbg.length > 10 && confirm("Narrowed it down to "+aDbg.length+" prefs. Try narrowing it down further?")) { + return _main(aDbg.reverse()); + } + + alert("Narrowed it down to "+ aDbg.length.toString() +" prefs, check the console ..."); + console.log('The problem is caused by 2 or more of these prefs:'); + for (const oPref of aDbg) console.log(oPref.name); + } + + + resetAllMatchingDefault(aPREFS); // reset user-set prefs matching FFs default value + + const aBAK = getMyList(aPREFS); + //console.log(aBAK.length, "user-set prefs from our list detected and their values stored."); + + const sMsg = "all detected prefs reset.\n\n" + + "!! KEEP THIS PROMPT OPEN AND TEST THE SITE IN ANOTHER TAB !!\n\n" + + "IF the problem still exists, this script can't help you - click Cancel to re-apply your values and exit.\n\n" + + "Click OK if your problem is fixed."; + + focus(); + myreset(aBAK); + if (!confirm(sMsg)) { + reapply(aBAK); + return; + } + _main(aBAK); + +})(); diff --git a/user.js b/user.js new file mode 100644 index 0000000..2fdb59e --- /dev/null +++ b/user.js @@ -0,0 +1,355 @@ +user_pref("_user.js.parrot", "START: Oh yes, the Norwegian Blue... what's wrong with it?"); + +user_pref("browser.aboutConfig.showWarning", false); + +user_pref("_user.js.parrot", "0100 syntax error: the parrot's dead!"); + +user_pref("browser.startup.page", 0); + +user_pref("browser.startup.homepage", "chrome://browser/content/blanktab.html"); + +user_pref("browser.newtabpage.enabled", false); + +user_pref("browser.newtabpage.activity-stream.showSponsored", false); + +user_pref("browser.newtabpage.activity-stream.showSponsoredTopSites", false); + +user_pref("browser.newtabpage.activity-stream.showSponsoredCheckboxes", false); + +user_pref("browser.newtabpage.activity-stream.default.sites", ""); + +user_pref("_user.js.parrot", "0200 syntax error: the parrot's definitely deceased!"); + +user_pref("geo.provider.ms-windows-location", false); + +user_pref("geo.provider.use_corelocation", false); + +user_pref("geo.provider.use_geoclue", false); + +user_pref("_user.js.parrot", "0300 syntax error: the parrot's not pinin' for the fjords!"); + +user_pref("extensions.getAddons.showPane", false); + +user_pref("extensions.htmlaboutaddons.recommendations.enabled", false); + +user_pref("browser.discovery.enabled", false); + +user_pref("browser.newtabpage.activity-stream.feeds.telemetry", false); + +user_pref("browser.newtabpage.activity-stream.telemetry", false); + +user_pref("app.shield.optoutstudies.enabled", false); + +user_pref("app.normandy.enabled", false); + +user_pref("app.normandy.api_url", ""); + +user_pref("breakpad.reportURL", ""); + +user_pref("browser.tabs.crashReporting.sendReport", false); + +user_pref("browser.crashReports.unsubmittedCheck.autoSubmit2", false); + +user_pref("captivedetect.canonicalURL", ""); + +user_pref("network.captive-portal-service.enabled", false); + +user_pref("network.connectivity-service.enabled", false); + +user_pref("_user.js.parrot", "0400 syntax error: the parrot's passed on!"); + +user_pref("browser.safebrowsing.downloads.remote.enabled", false); + +user_pref("_user.js.parrot", "0600 syntax error: the parrot's no more!"); + +user_pref("network.prefetch-next", false); + +user_pref("network.dns.disablePrefetch", true); + +user_pref("network.dns.disablePrefetchFromHTTPS", true); + +user_pref("network.predictor.enabled", false); + +user_pref("network.predictor.enable-prefetch", false); + +user_pref("network.http.speculative-parallel-limit", 0); + +user_pref("browser.places.speculativeConnect.enabled", false); + +user_pref("_user.js.parrot", "0700 syntax error: the parrot's given up the ghost!"); + +user_pref("network.proxy.socks_remote_dns", true); + +user_pref("network.file.disable_unc_paths", true); + +user_pref("network.gio.supported-protocols", ""); + +user_pref("_user.js.parrot", "0800 syntax error: the parrot's ceased to be!"); + +user_pref("browser.urlbar.speculativeConnect.enabled", false); + +user_pref("browser.urlbar.quicksuggest.enabled", false); + +user_pref("browser.urlbar.suggest.quicksuggest.nonsponsored", false); + +user_pref("browser.urlbar.suggest.quicksuggest.sponsored", false); + +user_pref("browser.search.suggest.enabled", false); + +user_pref("browser.urlbar.suggest.searches", false); + +user_pref("browser.urlbar.trending.featureGate", false); + +user_pref("browser.urlbar.addons.featureGate", false); + +user_pref("browser.urlbar.amp.featureGate", false); + +user_pref("browser.urlbar.fakespot.featureGate", false); + +user_pref("browser.urlbar.mdn.featureGate", false); + +user_pref("browser.urlbar.weather.featureGate", false); + +user_pref("browser.urlbar.wikipedia.featureGate", false); + +user_pref("browser.urlbar.yelp.featureGate", false); + +user_pref("browser.formfill.enable", false); + +user_pref("browser.search.separatePrivateDefault", true); + +user_pref("browser.search.separatePrivateDefault.ui.enabled", true); + +user_pref("_user.js.parrot", "0900 syntax error: the parrot's expired!"); + +user_pref("signon.autofillForms", false); + +user_pref("signon.formlessCapture.enabled", false); + +user_pref("network.auth.subresource-http-auth-allow", 1); + +user_pref("_user.js.parrot", "1000 syntax error: the parrot's gone to meet 'is maker!"); + +user_pref("browser.cache.disk.enable", false); + +user_pref("browser.privatebrowsing.forceMediaMemoryCache", true); + +user_pref("media.memory_cache_max_size", 65536); + +user_pref("browser.sessionstore.privacy_level", 2); + +user_pref("toolkit.winRegisterApplicationRestart", false); + +user_pref("browser.shell.shortcutFavicons", false); + +user_pref("_user.js.parrot", "1200 syntax error: the parrot's a stiff!"); + +user_pref("security.ssl.require_safe_negotiation", true); + +user_pref("security.tls.enable_0rtt_data", false); + +user_pref("security.OCSP.enabled", 1); + +user_pref("security.OCSP.require", true); + +user_pref("security.cert_pinning.enforcement_level", 2); + +user_pref("security.remote_settings.crlite_filters.enabled", true); + +user_pref("security.pki.crlite_mode", 2); + +user_pref("dom.security.https_only_mode", true); + +user_pref("dom.security.https_only_mode_send_http_background_request", false); + +user_pref("security.ssl.treat_unsafe_negotiation_as_broken", true); + +user_pref("browser.xul.error_pages.expert_bad_cert", true); + +user_pref("_user.js.parrot", "1600 syntax error: the parrot rests in peace!"); + +user_pref("network.http.referer.XOriginTrimmingPolicy", 2); + +user_pref("_user.js.parrot", "1700 syntax error: the parrot's bit the dust!"); + +user_pref("privacy.userContext.enabled", true); + +user_pref("privacy.userContext.ui.enabled", true); + +user_pref("_user.js.parrot", "2000 syntax error: the parrot's snuffed it!"); + +user_pref("media.peerconnection.ice.proxy_only_if_behind_proxy", true); + +user_pref("media.peerconnection.ice.default_address_only", true); + +user_pref("_user.js.parrot", "2400 syntax error: the parrot's kicked the bucket!"); + +user_pref("dom.disable_window_move_resize", true); + +user_pref("_user.js.parrot", "2600 syntax error: the parrot's run down the curtain!"); + +user_pref("browser.download.start_downloads_in_tmp_dir", true); + +user_pref("browser.helperApps.deleteTempFileOnExit", true); + +user_pref("browser.uitour.enabled", false); + +user_pref("devtools.debugger.remote-enabled", false); + +user_pref("permissions.manager.defaultsUrl", ""); + +user_pref("network.IDN_show_punycode", true); + +user_pref("pdfjs.disabled", false); + +user_pref("pdfjs.enableScripting", false); + +user_pref("browser.tabs.searchclipboardfor.middleclick", false); + +user_pref("browser.contentanalysis.enabled", false); + +user_pref("browser.contentanalysis.default_result", 0); + +user_pref("security.csp.reporting.enabled", false); + +user_pref("browser.download.useDownloadDir", false); + +user_pref("browser.download.alwaysOpenPanel", false); + +user_pref("browser.download.manager.addToRecentDocs", false); + +user_pref("browser.download.always_ask_before_handling_new_types", true); + +user_pref("extensions.enabledScopes", 5); + +user_pref("extensions.postDownloadThirdPartyPrompt", false); + +user_pref("_user.js.parrot", "2700 syntax error: the parrot's joined the bleedin' choir invisible!"); + +user_pref("browser.contentblocking.category", "strict"); + +user_pref("_user.js.parrot", "2800 syntax error: the parrot's bleedin' demised!"); + +user_pref("privacy.sanitize.sanitizeOnShutdown", true); + +user_pref("privacy.clearOnShutdown_v2.cache", true); + +user_pref("privacy.clearOnShutdown_v2.historyFormDataAndDownloads", false); + +user_pref("privacy.clearOnShutdown_v2.browsingHistoryAndDownloads", false); + +user_pref("privacy.clearOnShutdown_v2.downloads", false); + +user_pref("privacy.clearOnShutdown_v2.formdata", true); + +user_pref("privacy.clearOnShutdown_v2.cookiesAndStorage", true); + +user_pref("privacy.clearSiteData.cache", true); + +user_pref("privacy.clearSiteData.cookiesAndStorage", false); + +user_pref("privacy.clearSiteData.historyFormDataAndDownloads", false); + +user_pref("privacy.clearSiteData.browsingHistoryAndDownloads", false); + +user_pref("privacy.clearSiteData.formdata", true); + +user_pref("privacy.clearHistory.cache", true); + +user_pref("privacy.clearHistory.cookiesAndStorage", false); + +user_pref("privacy.clearHistory.historyFormDataAndDownloads", false); + +user_pref("privacy.clearHistory.browsingHistoryAndDownloads", false); + +user_pref("privacy.clearHistory.formdata", true); + +user_pref("privacy.sanitize.timeSpan", 0); + +user_pref("_user.js.parrot", "4000 syntax error: the parrot's bereft of life!"); + +user_pref("_user.js.parrot", "4500 syntax error: the parrot's popped 'is clogs"); + +user_pref("privacy.window.maxInnerWidth", 1600); + +user_pref("privacy.window.maxInnerHeight", 900); + +user_pref("privacy.resistFingerprinting.block_mozAddonManager", true); + +user_pref("privacy.spoof_english", 1); + +user_pref("widget.non-native-theme.use-theme-accent", false); + +user_pref("browser.link.open_newwindow", 3); + +user_pref("browser.link.open_newwindow.restriction", 0); + +user_pref("_user.js.parrot", "5000 syntax error: the parrot's taken 'is last bow"); + +user_pref("_user.js.parrot", "5500 syntax error: this is an ex-parrot!"); + +user_pref("_user.js.parrot", "6000 syntax error: the parrot's 'istory!"); + +user_pref("extensions.blocklist.enabled", true); + +user_pref("network.http.referer.spoofSource", false); + +user_pref("security.dialog_enable_delay", 1e3); + +user_pref("privacy.firstparty.isolate", false); + +user_pref("extensions.webcompat.enable_shims", true); + +user_pref("security.tls.version.enable-deprecated", false); + +user_pref("extensions.webcompat-reporter.enabled", false); + +user_pref("extensions.quarantinedDomains.enabled", true); + +user_pref("_user.js.parrot", "7000 syntax error: the parrot's pushing up daisies!"); + +user_pref("_user.js.parrot", "8000 syntax error: the parrot's crossed the Jordan"); + +user_pref("_user.js.parrot", "8500 syntax error: the parrot's off the twig!"); + +user_pref("datareporting.policy.dataSubmissionEnabled", false); + +user_pref("datareporting.healthreport.uploadEnabled", false); + +user_pref("toolkit.telemetry.unified", false); + +user_pref("toolkit.telemetry.enabled", false); + +user_pref("toolkit.telemetry.server", "data:,"); + +user_pref("toolkit.telemetry.archive.enabled", false); + +user_pref("toolkit.telemetry.newProfilePing.enabled", false); + +user_pref("toolkit.telemetry.shutdownPingSender.enabled", false); + +user_pref("toolkit.telemetry.updatePing.enabled", false); + +user_pref("toolkit.telemetry.bhrPing.enabled", false); + +user_pref("toolkit.telemetry.firstShutdownPing.enabled", false); + +user_pref("toolkit.telemetry.coverage.opt-out", true); + +user_pref("toolkit.coverage.opt-out", true); + +user_pref("toolkit.coverage.endpoint.base", ""); + +user_pref("_user.js.parrot", "9000 syntax error: the parrot's cashed in 'is chips!"); + +user_pref("browser.startup.homepage_override.mstone", "ignore"); + +user_pref("browser.newtabpage.activity-stream.asrouter.userprefs.cfr.addons", false); + +user_pref("browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features", false); + +user_pref("browser.urlbar.showSearchTerms.enabled", false); + +user_pref("_user.js.parrot", "9999 syntax error: the parrot's shuffled off 'is mortal coil!"); + +user_pref("_user.js.parrot", "SUCCESS: No no he's not dead, he's, he's restin'!"); \ No newline at end of file