tonarchy
tonarchy
https://git.tonybtw.com/tonarchy.git
git://git.tonybtw.com/tonarchy.git
Several updates includeing xfce configs, firefox profiles, nvim profile, code cleanup, etc.
Diff
diff --git a/.gitignore b/.gitignore
index ba31254..ef6f883 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,8 +1,17 @@
*.o
*.a
*.so
-*.md
compile_commands.json
-build/
-tonarchy
+/tonarchy
+/tonarchy-static
.cache/
+
+*.iso
+*.qcow2
+OVMF_VARS.fd
+vm-test
+retest.sh
+test-disk*
+
+result
+notes/
diff --git a/README.org b/README.org
index c846ed9..a96d656 100644
--- a/README.org
+++ b/README.org
@@ -4,202 +4,116 @@
* Tonarchy
-A zero-dependency Arch Linux installer with a clean TUI built from scratch.
+A zero-dependency Arch Linux installer with a clean TUI built from scratch in C.
-(Alternative to OMARCHY, but way less bloated and intelligently programmed, and doesn't require a team of devs making 7500 ai slop bash scripts, but instead just basic c.)
-
-*Status:* Work In Progress - TUI complete, installation flow in development
+*Status:* Alpha - Beginner (XFCE) and Suckless modes functional, Wayland (Niri) coming soon
* Philosophy
Tonarchy is designed to take users from *zero to hero* with an opinionated beginner mode that sets up a complete, working Linux desktop environment. No choices, no confusion - just a solid foundation to start learning.
-For experienced users, intermediate and advanced modes provide full customization.
+For experienced users, the suckless mode provides a minimal dwm setup.
-* Features
+* Installation Modes
-** Three Installation Levels
+** Beginner (XFCE)
+Opinionated setup with XFCE desktop, essential applications, and sane defaults. Perfect for your first Linux installation.
-- *Beginner* :: We'll pick everything for you - opinionated setup with Cinnamon desktop, essential applications, and sane defaults. Perfect for your first Linux installation.
-- *Intermediate* :: Choose desktop environment and toolsets - guided customization with clear options.
-- *Advanced* :: Full control - pick your window manager, display server, packages, and dotfiles.
+** Tony-Suckless (dwm)
+Minimal setup with dwm, st, and dmenu built from source. For users who want a lightweight tiling experience.
-** Technical Highlights
+** Oxidized (Coming Soon)
+Wayland-native setup with Niri compositor. Modern, secure, and efficient.
-- *Zero dependencies* :: Raw terminal control using termios + ANSI codes (no ncurses)
-- *Clean C23 codebase* :: Modern C with snake_case conventions
-- *Modular package lists* :: Easy to customize and maintain
-- *Fuzzy finding* :: fzf integration for keyboard and timezone selection
-- *Form-based input* :: Inline cursors with field validation
-
-* Current Status
-
-** Completed ✓
-
-- [X] TUI Framework (raw terminal control)
-- [X] ASCII logo display
-- [X] User input form (6 fields with validation)
- - Username (alphanumeric)
- - Password (hidden)
- - Confirm Password (hidden with validation)
- - Hostname (default: tonarchy)
- - Keyboard (fzf fuzzy finder, default: us)
- - Timezone (fzf fuzzy finder, required)
-- [X] Form confirmation system
-- [X] Level selection menu (j/k navigation)
-- [X] Disk selection with confirmation
-
-** In Progress
-
-- [ ] Disk partitioning and formatting
-- [ ] Pacstrap installation
-- [ ] System configuration (timezone, locale, users)
-- [ ] Bootloader installation
-- [ ] Desktop environment setup
-- [ ] Cinnamon keybindings configuration
-- [ ] Application defaults (Firefox with arkenfox)
+* Keybindings
-* Requirements
+** General (XFCE Beginner Mode)
-- UEFI system
-- Internet connection
-- Boot from Arch Linux ISO or custom Tonarchy ISO
+| Key | Action |
+|------------------+-----------------------|
+| Super+Return | Terminal (Alacritty) |
+| Super+d | App Launcher (Rofi) |
+| Super+e | File Manager (Thunar) |
+| Super+q | Close Window |
+| Super+f | Maximize Window |
+| Super+Shift+f | Fullscreen |
-* Building
+** Window Management
-#+BEGIN_SRC bash
-make clean && make
-./tonarchy
-#+END_SRC
+| Key | Action |
+|------------------+-----------------------|
+| Super+j | Cycle Windows |
+| Super+k | Cycle Windows Reverse |
+| Super+Left | Tile Left |
+| Super+Right | Tile Right |
+| Super+Up | Tile Up |
+| Super+Down | Tile Down |
-* Project Structure
-
-#+BEGIN_SRC
-tonarchy/
-├── src/
-│ └── main.c # Main TUI and installer logic
-├── include/
-│ ├── installer.h # Installation functions
-│ ├── tui.h # Terminal UI functions
-│ ├── types.h # Type definitions
-│ └── utils.h # Utility functions
-├── packages/ # Modular package lists
-│ ├── base.txt
-│ ├── de_cinnamon.txt
-│ ├── de_gnome.txt
-│ ├── de_hyprland.txt
-│ ├── de_kde.txt
-│ ├── de_sway.txt
-│ ├── display_wayland.txt
-│ ├── display_xorg.txt
-│ └── suckless.txt
-├── configs/ # Configuration templates
-├── Makefile
-└── flake.nix # Nix development shell
-#+END_SRC
+** Workspaces
-* Package Lists
+| Key | Action |
+|------------------+-----------------------|
+| Super+1-9 | Switch to Workspace |
+| Super+Shift+1-9 | Move Window to WS |
+| Super+Tab | Next Workspace |
+| Super+Shift+Tab | Previous Workspace |
-Package lists are modular text files in =packages/=:
+* Technical Highlights
-- =base.txt= :: Core system packages
-- =de_cinnamon.txt= :: Cinnamon desktop (beginner default)
-- =de_hyprland.txt= :: Hyprland + Wayland tools
-- =de_gnome.txt= :: GNOME desktop
-- =de_kde.txt= :: KDE Plasma
-- =de_sway.txt= :: Sway compositor
-- =display_wayland.txt= :: Wayland support packages
-- =display_xorg.txt= :: Xorg support packages
+- *Zero dependencies* :: Raw terminal control using termios + ANSI codes (no ncurses)
+- *Single C file* :: Entire installer in ~1500 lines of C
+- *Fuzzy finding* :: fzf integration for keyboard and timezone selection
+- *Static binary* :: Ships as a single static executable on the ISO
+
+* Requirements
+
+- UEFI system
+- Internet connection
+- Boot from Tonarchy ISO
* Beginner Mode Setup
-The beginner installation is completely opinionated and handles everything:
+The beginner installation handles everything:
** Desktop Environment
-- Cinnamon (familiar Windows-like interface)
-- LightDM display manager
-- Custom keybindings:
- - Super+Return :: Terminal (Alacritty)
- - Super+B :: Browser (Firefox)
- - Super+E :: File Manager (Nemo)
- - Super+Q :: Close window
- - Super+F :: Fullscreen
+- XFCE with preconfigured keybindings
+- Autologin via getty (no display manager)
+- Adwaita-dark theme
** Applications
-- Firefox (with optional arkenfox user.js)
-- Zed editor (fully open source)
+- Firefox (with uBlock Origin, Dark Reader)
+- Neovim
- Alacritty terminal
+- Thunar file manager
- VLC media player
-- Nemo file manager
-- Xreader PDF viewer
-- Xviewer image viewer
+- Rofi launcher
** System Configuration
-- Locale: =en_US.UTF-8= (hardcoded for simplicity)
+- Locale: =en_US.UTF-8=
- Timezone: User selected via fzf
-- Keyboard: User selected via fzf (default: us)
+- Keyboard: User selected via fzf
- NetworkManager enabled
- Sudo configured for wheel group
** Disk Layout
-- 1GB FAT32 EFI boot partition
+- 1GB FAT32 EFI partition
- 4GB swap partition
-- Remaining space for ext4 root partition
-
-* Design Decisions
-
-** Why no ncurses?
-Zero dependencies means:
-- Minimal ISO size
-- Easier debugging
-- Full control over terminal behavior
-- No external library issues
-
-** Why fzf for selection?
-- 598 timezones require fuzzy search
-- Ergonomic keyboard layout selection
-- Minimal dependency (~1MB)
-- Fast and responsive
-
-** Why hardcode locale?
-- Simplifies installer UX
-- Most users use en_US.UTF-8
-- Easy to change post-install if needed
-
-** Why Cinnamon for beginners?
-- More Windows-like than KDE
-- Stable and mature
-- Familiar to Linux Mint users
-- Lower learning curve
+- Remaining space for ext4 root
-** Why Zed instead of VSCodium?
-- Fully open source (no marketplace issues)
-- Modern architecture
-- Clean Arch Linux package
+* Roadmap
-* Development
+- [X] XFCE Beginner Mode
+- [X] Suckless Mode (dwm/st/dmenu)
+- [ ] Niri Wayland Mode
+- [ ] Encrypted disk support
+- [ ] Multi-disk configurations
-** Language
-C23 with snake_case naming conventions
-
-** Build System
-Simple Makefile for compilation
-
-** Nix Development Shell
-=flake.nix= provides development environment:
+* Building
#+BEGIN_SRC bash
-nix develop
+make
#+END_SRC
-* Contributing
-
-This is a personal project in active development. Feel free to fork and customize for your own use.
-
* License
-GNU General Public License (GPL)
-
-* Safety Note
-
-The installer will display clear warnings before any destructive operations. Currently, disk partitioning is not implemented, making the TUI safe to test without risk of data loss.
+GPL
diff --git a/iso/airootfs/usr/share/tonarchy/alacritty/alacritty.toml b/iso/airootfs/usr/share/tonarchy/alacritty/alacritty.toml
new file mode 100644
index 0000000..0c8ac79
--- /dev/null
+++ b/iso/airootfs/usr/share/tonarchy/alacritty/alacritty.toml
@@ -0,0 +1,37 @@
+[window]
+# opacity=0.9
+[window.padding]
+y = 6
+x = 6
+
+[font]
+# normal = { family = "JetBrainsMono Nerd Font Propo", style = "Regular" }
+normal = { family = "Iosevka Nerd Font Propo", style = "Regular" }
+# size = 20
+size = 14
+
+[colors.bright]
+black = "#444b6a"
+blue = "#7da6ff"
+cyan = "#0db9d7"
+green = "#b9f27c"
+magenta = "#bb9af7"
+red = "#ff7a93"
+white = "#acb0d0"
+yellow = "#ff9e64"
+
+
+[colors.primary]
+background = "#1a1b26"
+foreground = "#c0caf5"
+
+[colors.normal]
+black = "#15161e"
+red = "#f7768e"
+green = "#9ece6a"
+yellow = "#e0af68"
+blue = "#7aa2f7"
+magenta = "#bb9af7"
+cyan = "#7dcfff"
+white = "#a9b1d6"
+
diff --git a/iso/airootfs/usr/share/tonarchy/favicon.png b/iso/airootfs/usr/share/tonarchy/favicon.png
new file mode 100644
index 0000000..5ba7616
Binary files /dev/null and b/iso/airootfs/usr/share/tonarchy/favicon.png differ
diff --git a/iso/airootfs/usr/share/tonarchy/firefox/installs.ini b/iso/airootfs/usr/share/tonarchy/firefox/installs.ini
new file mode 100644
index 0000000..2a6a8be
--- /dev/null
+++ b/iso/airootfs/usr/share/tonarchy/firefox/installs.ini
@@ -0,0 +1,3 @@
+[308046B0AF4A39CB]
+Default=default
+Locked=1
diff --git a/iso/airootfs/usr/share/tonarchy/firefox/profile/addonStartup.json.lz4 b/iso/airootfs/usr/share/tonarchy/firefox/profile/addonStartup.json.lz4
new file mode 100644
index 0000000..016258a
Binary files /dev/null and b/iso/airootfs/usr/share/tonarchy/firefox/profile/addonStartup.json.lz4 differ
diff --git a/iso/airootfs/usr/share/tonarchy/firefox/profile/extension-settings.json b/iso/airootfs/usr/share/tonarchy/firefox/profile/extension-settings.json
new file mode 100644
index 0000000..4e8c579
--- /dev/null
+++ b/iso/airootfs/usr/share/tonarchy/firefox/profile/extension-settings.json
@@ -0,0 +1 @@
+{"version":3,"commands":{},"prefs":{"websites.hyperlinkAuditingEnabled":{"initialValue":{},"precedenceList":[{"id":"uBlock0@raymondhill.net","installDate":1757217118929,"value":false,"enabled":true}]},"network.networkPredictionEnabled":{"initialValue":{"network.prefetch-next":false,"network.http.speculative-parallel-limit":0,"network.dns.disablePrefetch":true},"precedenceList":[{"id":"uBlock0@raymondhill.net","installDate":1757217118929,"value":false,"enabled":true}]}},"url_overrides":{},"default_search":{}}
\ No newline at end of file
diff --git a/iso/airootfs/usr/share/tonarchy/firefox/profile/extensions.json b/iso/airootfs/usr/share/tonarchy/firefox/profile/extensions.json
new file mode 100644
index 0000000..47bcd05
--- /dev/null
+++ b/iso/airootfs/usr/share/tonarchy/firefox/profile/extensions.json
@@ -0,0 +1 @@
+{"schemaVersion":37,"addons":[{"id":"{4520dc08-80f4-4b2e-982a-c17af42e5e4d}","syncGUID":"{c0e20b74-a551-4e4f-b868-990f41a7c0b2}","version":"1.0","type":"theme","loader":null,"updateURL":null,"installOrigins":null,"manifestVersion":2,"optionsURL":null,"optionsType":null,"optionsBrowserStyle":true,"aboutURL":null,"defaultLocale":{"name":"Tokyo Night","creator":null,"developers":null,"translators":null,"contributors":null},"visible":true,"active":true,"userDisabled":false,"appDisabled":false,"embedderDisabled":false,"installDate":1757217151279,"updateDate":1757217151279,"applyBackgroundUpdates":1,"path":"/home/tony/.mozilla/firefox/cjaa927r.default/extensions/{4520dc08-80f4-4b2e-982a-c17af42e5e4d}.xpi","skinnable":false,"sourceURI":"https://addons.mozilla.org/firefox/downloads/file/3952418/tokyo_night_milav-1.0.xpi","releaseNotesURI":null,"softDisabled":false,"foreignInstall":false,"strictCompatibility":true,"locales":[],"targetApplications":[{"id":"toolkit@mozilla.org","minVersion":"53.0","maxVersion":"*"}],"targetPlatforms":[],"signedState":2,"signedTypes":[2,0],"signedDate":1653183292000,"seen":true,"dependencies":[],"userPermissions":null,"optionalPermissions":null,"requestedPermissions":null,"icons":{},"iconURL":null,"blocklistAttentionDismissed":false,"blocklistState":0,"blocklistURL":null,"startupData":null,"hidden":false,"installTelemetryInfo":{"source":"amo","sourceURL":"https://addons.mozilla.org/en-US/firefox/search/?q=tokyonight","method":"link"},"recommendationState":null,"rootURI":"jar:file:///home/tony/.mozilla/firefox/cjaa927r.default/extensions/%7B4520dc08-80f4-4b2e-982a-c17af42e5e4d%7D.xpi!/","location":"app-profile"},{"id":"formautofill@mozilla.org","syncGUID":"{e51e6ffe-1898-415c-823d-afc045d8ac22}","version":"1.0.1","type":"extension","loader":null,"updateURL":null,"installOrigins":null,"manifestVersion":2,"optionsURL":null,"optionsType":null,"optionsBrowserStyle":true,"aboutURL":null,"defaultLocale":{"name":"Form Autofill","creator":null,"developers":null,"translators":null,"contributors":null},"visible":true,"active":true,"userDisabled":false,"appDisabled":false,"embedderDisabled":false,"applyBackgroundUpdates":1,"path":null,"skinnable":false,"sourceURI":null,"releaseNotesURI":null,"softDisabled":false,"foreignInstall":false,"strictCompatibility":true,"locales":[],"targetApplications":[{"id":"toolkit@mozilla.org","minVersion":null,"maxVersion":null}],"targetPlatforms":[],"signedDate":null,"seen":true,"dependencies":[],"incognito":"spanning","userPermissions":{"permissions":[],"origins":[],"data_collection":[]},"optionalPermissions":{"permissions":[],"origins":[],"data_collection":[]},"requestedPermissions":{"permissions":[],"origins":[],"data_collection":[]},"icons":{},"iconURL":null,"blocklistAttentionDismissed":false,"blocklistState":0,"blocklistURL":null,"startupData":{},"hidden":true,"installTelemetryInfo":null,"recommendationState":null,"rootURI":"resource://builtin-addons/formautofill/","location":"app-builtin-addons"},{"id":"newtab@mozilla.org","syncGUID":"{e2c6e3e6-e7df-4a61-9541-1cb0166bf033}","version":"145.2.0","type":"extension","loader":null,"updateURL":null,"installOrigins":null,"manifestVersion":2,"optionsURL":null,"optionsType":null,"optionsBrowserStyle":true,"aboutURL":null,"defaultLocale":{"name":"New Tab","description":"","creator":null,"developers":null,"translators":null,"contributors":null},"visible":true,"active":true,"userDisabled":false,"appDisabled":false,"embedderDisabled":false,"applyBackgroundUpdates":1,"path":null,"skinnable":false,"sourceURI":null,"releaseNotesURI":null,"softDisabled":false,"foreignInstall":false,"strictCompatibility":true,"locales":[],"targetApplications":[{"id":"toolkit@mozilla.org","minVersion":"142.0a1","maxVersion":null}],"targetPlatforms":[],"signedDate":null,"seen":true,"dependencies":[],"incognito":"spanning","userPermissions":{"permissions":[],"origins":[],"data_collection":[]},"optionalPermissions":{"permissions":[],"origins":[],"data_collection":[]},"requestedPermissions":{"permissions":[],"origins":[],"data_collection":[]},"icons":{},"iconURL":null,"blocklistAttentionDismissed":false,"blocklistState":0,"blocklistURL":null,"startupData":{},"hidden":true,"installTelemetryInfo":null,"recommendationState":null,"rootURI":"resource://builtin-addons/newtab/","location":"app-builtin-addons"},{"id":"pictureinpicture@mozilla.org","syncGUID":"{08d94614-17e7-41dc-9e2e-f6c0c564efec}","version":"1.0.0","type":"extension","loader":null,"updateURL":null,"installOrigins":null,"manifestVersion":2,"optionsURL":null,"optionsType":null,"optionsBrowserStyle":true,"aboutURL":null,"defaultLocale":{"name":"Picture-In-Picture","description":"Fixes for web compatibility with Picture-in-Picture","creator":null,"developers":null,"translators":null,"contributors":null},"visible":true,"active":true,"userDisabled":false,"appDisabled":false,"embedderDisabled":false,"applyBackgroundUpdates":1,"path":null,"skinnable":false,"sourceURI":null,"releaseNotesURI":null,"softDisabled":false,"foreignInstall":false,"strictCompatibility":true,"locales":[],"targetApplications":[{"id":"toolkit@mozilla.org","minVersion":"88.0a1","maxVersion":null}],"targetPlatforms":[],"signedDate":null,"seen":true,"dependencies":[],"incognito":"spanning","userPermissions":{"permissions":[],"origins":[],"data_collection":[]},"optionalPermissions":{"permissions":[],"origins":[],"data_collection":[]},"requestedPermissions":{"permissions":[],"origins":[],"data_collection":[]},"icons":{},"iconURL":null,"blocklistAttentionDismissed":false,"blocklistState":0,"blocklistURL":null,"startupData":{},"hidden":true,"installTelemetryInfo":null,"recommendationState":null,"rootURI":"resource://builtin-addons/pictureinpicture/","location":"app-builtin-addons"},{"id":"addons-search-detection@mozilla.com","syncGUID":"{966b37c0-6cf3-4a9e-a8cb-28c00584d294}","version":"3.0.0","type":"extension","loader":null,"updateURL":null,"installOrigins":null,"manifestVersion":2,"optionsURL":null,"optionsType":null,"optionsBrowserStyle":true,"aboutURL":null,"defaultLocale":{"name":"Add-ons Search Detection","description":"","creator":null,"developers":null,"translators":null,"contributors":null},"visible":true,"active":true,"userDisabled":false,"appDisabled":false,"embedderDisabled":false,"applyBackgroundUpdates":1,"path":null,"skinnable":false,"sourceURI":null,"releaseNotesURI":null,"softDisabled":false,"foreignInstall":false,"strictCompatibility":true,"locales":[],"targetApplications":[{"id":"toolkit@mozilla.org","minVersion":null,"maxVersion":null}],"targetPlatforms":[],"signedDate":null,"seen":true,"dependencies":[],"incognito":"spanning","userPermissions":{"permissions":["telemetry","webRequest","webRequestBlocking"],"origins":["<all_urls>"],"data_collection":[]},"optionalPermissions":{"permissions":[],"origins":[],"data_collection":[]},"requestedPermissions":{"permissions":[],"origins":[],"data_collection":[]},"icons":{},"iconURL":null,"blocklistAttentionDismissed":false,"blocklistState":0,"blocklistURL":null,"startupData":{},"hidden":true,"installTelemetryInfo":null,"recommendationState":null,"rootURI":"resource://builtin-addons/search-detection/","location":"app-builtin-addons"},{"id":"webcompat@mozilla.org","syncGUID":"{4f72ddb6-7b6e-44fb-9a78-78a9c4950247}","version":"145.11.0","type":"extension","loader":null,"updateURL":null,"installOrigins":null,"manifestVersion":2,"optionsURL":null,"optionsType":null,"optionsBrowserStyle":true,"aboutURL":null,"defaultLocale":{"name":"Web Compatibility Interventions","description":"Urgent post-release fixes for web compatibility.","creator":null,"developers":null,"translators":null,"contributors":null},"visible":true,"active":true,"userDisabled":false,"appDisabled":false,"embedderDisabled":false,"applyBackgroundUpdates":1,"path":null,"skinnable":false,"sourceURI":null,"releaseNotesURI":null,"softDisabled":false,"foreignInstall":false,"strictCompatibility":true,"locales":[],"targetApplications":[{"id":"toolkit@mozilla.org","minVersion":"102.0","maxVersion":null}],"targetPlatforms":[],"signedDate":null,"seen":true,"dependencies":[],"incognito":"spanning","userPermissions":{"permissions":["cookies","mozillaAddons","scripting","tabs","webNavigation","webRequest","webRequestBlocking"],"origins":["<all_urls>"],"data_collection":[]},"optionalPermissions":{"permissions":[],"origins":[],"data_collection":[]},"requestedPermissions":{"permissions":[],"origins":[],"data_collection":[]},"icons":{},"iconURL":null,"blocklistAttentionDismissed":false,"blocklistState":0,"blocklistURL":null,"startupData":{"persistentListeners":{"webRequest":{"onBeforeRequest":[[{"incognito":null,"tabId":null,"types":["main_frame"],"urls":["*://login.microsoftonline.com/*","*://login.microsoftonline.us/*","*://steamcommunity.com/*","*://store.steampowered.com/*","*://help.steampowered.com/*","*://checkout.steampowered.com/*","*://steam.tv/*"],"windowId":null},["blocking"]],[{"incognito":null,"tabId":null,"types":["image"],"urls":["*://track.adform.net/Serving/TrackPoint/*","*://pixel.advertising.com/firefox-etp","*://*.advertising.com/*.js*","*://*.advertising.com/*","*://securepubads.g.doubleclick.net/gampad/*ad-blk*","*://pubads.g.doubleclick.net/gampad/*ad-blk*","*://securepubads.g.doubleclick.net/gampad/*xml_vmap1*","*://pubads.g.doubleclick.net/gampad/*xml_vmap1*","*://vast.adsafeprotected.com/vast*","*://securepubads.g.doubleclick.net/gampad/*xml_vmap2*","*://pubads.g.doubleclick.net/gampad/*xml_vmap2*","*://securepubads.g.doubleclick.net/gampad/*ad*","*://pubads.g.doubleclick.net/gampad/*ad*","*://www.facebook.com/platform/impression.php*","https://ads.stickyadstv.com/firefox-etp","*://ads.stickyadstv.com/auto-user-sync*","*://ads.stickyadstv.com/user-matching*","https://static.adsafeprotected.com/firefox-etp-pixel","*://*.adsafeprotected.com/*.gif*","*://*.adsafeprotected.com/*.png*","*://*.adsafeprotected.com/*.js*","*://*.adsafeprotected.com/*/adj*","*://*.adsafeprotected.com/*/imp/*","*://*.adsafeprotected.com/*/Serving/*","*://*.adsafeprotected.com/*/unit/*","*://*.adsafeprotected.com/jload","*://*.adsafeprotected.com/jload?*","*://*.adsafeprotected.com/jsvid","*://*.adsafeprotected.com/jsvid?*","*://*.adsafeprotected.com/mon*","*://*.adsafeprotected.com/tpl","*://*.adsafeprotected.com/tpl?*","*://*.adsafeprotected.com/services/pub*","*://*.adsafeprotected.com/*"],"windowId":null},["blocking"]],[{"incognito":null,"tabId":null,"types":["imageset"],"urls":["*://track.adform.net/Serving/TrackPoint/*","*://pixel.advertising.com/firefox-etp","*://*.advertising.com/*.js*","*://*.advertising.com/*","*://securepubads.g.doubleclick.net/gampad/*ad-blk*","*://pubads.g.doubleclick.net/gampad/*ad-blk*","*://securepubads.g.doubleclick.net/gampad/*xml_vmap1*","*://pubads.g.doubleclick.net/gampad/*xml_vmap1*","*://vast.adsafeprotected.com/vast*","*://securepubads.g.doubleclick.net/gampad/*xml_vmap2*","*://pubads.g.doubleclick.net/gampad/*xml_vmap2*","*://securepubads.g.doubleclick.net/gampad/*ad*","*://pubads.g.doubleclick.net/gampad/*ad*","*://www.facebook.com/platform/impression.php*","https://ads.stickyadstv.com/firefox-etp","*://ads.stickyadstv.com/auto-user-sync*","*://ads.stickyadstv.com/user-matching*","https://static.adsafeprotected.com/firefox-etp-pixel","*://*.adsafeprotected.com/*.gif*","*://*.adsafeprotected.com/*.png*","*://*.adsafeprotected.com/*.js*","*://*.adsafeprotected.com/*/adj*","*://*.adsafeprotected.com/*/imp/*","*://*.adsafeprotected.com/*/Serving/*","*://*.adsafeprotected.com/*/unit/*","*://*.adsafeprotected.com/jload","*://*.adsafeprotected.com/jload?*","*://*.adsafeprotected.com/jsvid","*://*.adsafeprotected.com/jsvid?*","*://*.adsafeprotected.com/mon*","*://*.adsafeprotected.com/tpl","*://*.adsafeprotected.com/tpl?*","*://*.adsafeprotected.com/services/pub*","*://*.adsafeprotected.com/*"],"windowId":null},["blocking"]],[{"incognito":null,"tabId":null,"types":["xmlhttprequest"],"urls":["*://track.adform.net/Serving/TrackPoint/*","*://pagead2.googlesyndication.com/pagead/*.js*fcd=true","*://pagead2.googlesyndication.com/pagead/js/*.js*fcd=true","*://pixel.advertising.com/firefox-etp","*://cdn.cmp.advertising.com/firefox-etp","*://*.advertising.com/*.js*","*://*.advertising.com/*","*://securepubads.g.doubleclick.net/gampad/*ad-blk*","*://pubads.g.doubleclick.net/gampad/*ad-blk*","*://securepubads.g.doubleclick.net/gampad/*xml_vmap1*","*://pubads.g.doubleclick.net/gampad/*xml_vmap1*","*://vast.adsafeprotected.com/vast*","*://securepubads.g.doubleclick.net/gampad/*xml_vmap2*","*://pubads.g.doubleclick.net/gampad/*xml_vmap2*","*://securepubads.g.doubleclick.net/gampad/*ad*","*://pubads.g.doubleclick.net/gampad/*ad*","*://www.facebook.com/platform/impression.php*","https://ads.stickyadstv.com/firefox-etp","*://ads.stickyadstv.com/auto-user-sync*","*://ads.stickyadstv.com/user-matching*","https://static.adsafeprotected.com/firefox-etp-pixel","https://static.adsafeprotected.com/firefox-etp-js","*://*.adsafeprotected.com/*.gif*","*://*.adsafeprotected.com/*.png*","*://*.adsafeprotected.com/*.js*","*://*.adsafeprotected.com/*/adj*","*://*.adsafeprotected.com/*/imp/*","*://*.adsafeprotected.com/*/Serving/*","*://*.adsafeprotected.com/*/unit/*","*://*.adsafeprotected.com/jload","*://*.adsafeprotected.com/jload?*","*://*.adsafeprotected.com/jsvid","*://*.adsafeprotected.com/jsvid?*","*://*.adsafeprotected.com/mon*","*://*.adsafeprotected.com/tpl","*://*.adsafeprotected.com/tpl?*","*://*.adsafeprotected.com/services/pub*","*://*.adsafeprotected.com/*"],"windowId":null},["blocking"]],[{"incognito":null,"tabId":null,"types":["image"],"urls":["https://smartblock.firefox.etp/facebook.svg","https://smartblock.firefox.etp/play.svg","https://smartblock.firefox.etp/instagram.svg","https://smartblock.firefox.etp/tiktok.svg","https://smartblock.firefox.etp/disqus.svg","https://smartblock.firefox.etp/x-logo.svg"],"windowId":null},["blocking"]],[{"incognito":null,"tabId":null,"types":["script"],"urls":["*://s7.addthis.com/icons/official-addthis-angularjs/current/dist/official-addthis-angularjs.min.js*","*://track.adform.net/serving/scripts/trackpoint/","*://track.adform.net/serving/scripts/trackpoint/async/","*://*.adnxs.com/*/ast.js*","*://*.adnxs.com/*/pb.js*","*://*.adnxs.com/*/prebid*","*://www.everestjs.net/static/st.v3.js*","*://static.adsafeprotected.com/vans-adapter-google-ima.js","*://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js","*://cdn.branch.io/branch-latest.min.js*","*://pub.doubleverify.com/signals/pub.js*","*://c.amazon-adsystem.com/aax2/apstag.js","*://aax.amazon-adsystem.com/e/dtb/bid/*/prebid*","*://auth.9c9media.ca/auth/main.js","*://static.chartbeat.com/js/chartbeat.js","*://static.chartbeat.com/js/chartbeat_video.js","*://static.criteo.net/js/ld/publishertag.js","*://libs.coremetrics.com/eluminate.js","*://connect.facebook.net/*/sdk.js*","*://connect.facebook.net/*/all.js*","*://secure.cdn.fastclick.net/js/cnvr-launcher/*/launcher-stub.min.js*","*://www.google-analytics.com/analytics.js*","*://www.google-analytics.com/gtm/js*","*://www.googletagmanager.com/gtm.js*","*://www.google-analytics.com/plugins/ua/ec.js","*://ssl.google-analytics.com/ga.js","*://s0.2mdn.net/instream/html5/ima3.js","*://imasdk.googleapis.com/js/sdkloader/ima3.js","*://www.googleadservices.com/pagead/conversion_async.js","*://www.googletagservices.com/tag/js/gpt.js*","*://pagead2.googlesyndication.com/tag/js/gpt.js*","*://pagead2.googlesyndication.com/gpt/pubads_impl_*.js*","*://securepubads.g.doubleclick.net/tag/js/gpt.js*","*://securepubads.g.doubleclick.net/gpt/pubads_impl_*.js*","*://script.ioam.de/iam.js","*://cdn.adsafeprotected.com/iasPET.1.js","*://static.adsafeprotected.com/iasPET.1.js","*://adservex.media.net/videoAds.js*","*://*.moatads.com/*/moatad.js*","*://*.moatads.com/*/moatapi.js*","*://*.moatads.com/*/moatheader.js*","*://*.moatads.com/*/yi.js*","*://*.imrworldwide.com/v60.js","*://cdn.optimizely.com/js/*.js","*://cdn.optimizely.com/public/*.js","*://id.rambler.ru/rambler-id-helper/auth_events.js","*://media.richrelevance.com/rrserver/js/1.2/p13n.js","*://www.gstatic.com/firebasejs/*/firebase-messaging.js*","*://js.maxmind.com/js/apis/geoip2/*/geoip2.js","*://s.webtrends.com/js/advancedLinkTracking.js","*://s.webtrends.com/js/webtrends.js","*://s.webtrends.com/js/webtrends.min.js","https://www.instagram.com/embed.js","https://platform.instagram.com/*/embeds.js","https://www.tiktok.com/embed.js","*://*.disqus.com/embed.js","*://openfpcdn.io/botd/v1","https://platform.twitter.com/widgets.js"],"windowId":null},["blocking"]]],"onBeforeSendHeaders":[[{"incognito":null,"tabId":null,"types":["sub_frame"],"urls":["*://trends.google.com/trends/embed*"],"windowId":null},["blocking","requestHeaders"]]],"onHeadersReceived":[[{"incognito":null,"tabId":null,"types":["sub_frame"],"urls":["*://trends.google.com/trends/embed*"],"windowId":null},["blocking","responseHeaders"]]]}}},"hidden":true,"installTelemetryInfo":null,"recommendationState":null,"rootURI":"resource://builtin-addons/webcompat/","location":"app-builtin-addons"},{"id":"ipp-activator@mozilla.com","syncGUID":"{ae140180-7269-4a85-91ef-1e3f0e0a8cf6}","version":"0.1","type":"extension","loader":null,"updateURL":null,"installOrigins":null,"manifestVersion":2,"optionsURL":null,"optionsType":null,"optionsBrowserStyle":true,"aboutURL":null,"defaultLocale":{"name":"IPP Activator","description":"A system add-on to activate IPP in 143","creator":null,"developers":null,"translators":null,"contributors":null},"visible":true,"active":true,"userDisabled":false,"appDisabled":false,"embedderDisabled":false,"applyBackgroundUpdates":1,"path":null,"skinnable":false,"sourceURI":null,"releaseNotesURI":null,"softDisabled":false,"foreignInstall":false,"strictCompatibility":true,"locales":[],"targetApplications":[{"id":"toolkit@mozilla.org","minVersion":"143.0","maxVersion":null}],"targetPlatforms":[],"signedDate":null,"seen":true,"dependencies":[],"incognito":"spanning","userPermissions":{"permissions":["tabs","cookies","webRequest"],"origins":["<all_urls>"],"data_collection":[]},"optionalPermissions":{"permissions":[],"origins":[],"data_collection":[]},"requestedPermissions":{"permissions":[],"origins":[],"data_collection":[]},"icons":{},"iconURL":null,"blocklistAttentionDismissed":false,"blocklistState":0,"blocklistURL":null,"startupData":{},"hidden":true,"installTelemetryInfo":null,"recommendationState":null,"rootURI":"resource://builtin-addons/ipp-activator/","location":"app-builtin-addons"},{"id":"data-leak-blocker@mozilla.com","syncGUID":"{7c93116e-12ec-4e4d-9c66-2eb57234b227}","version":"144.0.0","type":"extension","loader":null,"updateURL":null,"installOrigins":null,"manifestVersion":2,"optionsURL":null,"optionsType":null,"optionsBrowserStyle":true,"aboutURL":null,"defaultLocale":{"name":"Data Leak Blocker","description":"","creator":null,"developers":null,"translators":null,"contributors":null},"visible":true,"active":true,"userDisabled":false,"appDisabled":false,"embedderDisabled":false,"applyBackgroundUpdates":1,"path":null,"skinnable":false,"sourceURI":null,"releaseNotesURI":null,"softDisabled":false,"foreignInstall":false,"strictCompatibility":true,"locales":[],"targetApplications":[{"id":"toolkit@mozilla.org","minVersion":"139.0","maxVersion":null}],"targetPlatforms":[],"signedDate":null,"seen":true,"dependencies":[],"incognito":"spanning","userPermissions":{"permissions":["mozillaAddons"],"origins":[],"data_collection":[]},"optionalPermissions":{"permissions":[],"origins":[],"data_collection":[]},"requestedPermissions":{"permissions":[],"origins":[],"data_collection":[]},"icons":{},"iconURL":null,"blocklistAttentionDismissed":false,"blocklistState":0,"blocklistURL":null,"startupData":{},"hidden":true,"installTelemetryInfo":null,"recommendationState":null,"rootURI":"resource://builtin-addons/data-leak-blocker/","location":"app-builtin-addons"},{"id":"default-theme@mozilla.org","syncGUID":"{536114e4-1639-4ac8-aa02-c5b0016ae7b4}","version":"1.4.2","type":"theme","loader":null,"updateURL":null,"installOrigins":null,"manifestVersion":2,"optionsURL":null,"optionsType":null,"optionsBrowserStyle":true,"aboutURL":null,"defaultLocale":{"name":"System theme — auto","description":"Follow the operating system setting for buttons, menus, and windows.","creator":"Mozilla","developers":null,"translators":null,"contributors":null},"visible":true,"active":false,"userDisabled":true,"appDisabled":false,"embedderDisabled":false,"installDate":1757216887154,"applyBackgroundUpdates":1,"path":null,"skinnable":false,"sourceURI":null,"releaseNotesURI":null,"softDisabled":false,"foreignInstall":false,"strictCompatibility":true,"locales":[],"targetApplications":[{"id":"toolkit@mozilla.org","minVersion":null,"maxVersion":null}],"targetPlatforms":[],"signedDate":null,"seen":true,"dependencies":[],"userPermissions":null,"optionalPermissions":null,"requestedPermissions":null,"icons":{"32":"icon.svg"},"iconURL":null,"blocklistAttentionDismissed":false,"blocklistState":0,"blocklistURL":null,"startupData":null,"hidden":false,"installTelemetryInfo":null,"recommendationState":null,"rootURI":"resource://default-theme/","location":"app-builtin"},{"id":"firefox-compact-light@mozilla.org","syncGUID":"{eab4007f-be9d-4365-8aae-c65323dc9274}","version":"1.3.3","type":"theme","loader":null,"updateURL":null,"installOrigins":null,"manifestVersion":2,"optionsURL":null,"optionsType":null,"optionsBrowserStyle":true,"aboutURL":null,"defaultLocale":{"name":"Light","description":"A theme with a light color scheme.","creator":"Mozilla","developers":null,"translators":null,"contributors":null},"visible":true,"active":false,"userDisabled":true,"appDisabled":false,"embedderDisabled":false,"installDate":1757216888025,"applyBackgroundUpdates":1,"path":null,"skinnable":false,"sourceURI":null,"releaseNotesURI":null,"softDisabled":false,"foreignInstall":false,"strictCompatibility":true,"locales":[],"targetApplications":[{"id":"toolkit@mozilla.org","minVersion":null,"maxVersion":null}],"targetPlatforms":[],"signedDate":null,"seen":true,"dependencies":[],"userPermissions":null,"optionalPermissions":null,"requestedPermissions":null,"icons":{"32":"icon.svg"},"iconURL":null,"blocklistAttentionDismissed":false,"blocklistState":0,"blocklistURL":null,"startupData":null,"hidden":false,"installTelemetryInfo":null,"recommendationState":null,"rootURI":"resource://builtin-themes/light/","location":"app-builtin"},{"id":"firefox-compact-dark@mozilla.org","syncGUID":"{9e860bad-f025-48ca-9e3d-76a87d16515b}","version":"1.3.3","type":"theme","loader":null,"updateURL":null,"installOrigins":null,"manifestVersion":2,"optionsURL":null,"optionsType":null,"optionsBrowserStyle":true,"aboutURL":null,"defaultLocale":{"name":"Dark","description":"A theme with a dark color scheme.","creator":"Mozilla","developers":null,"translators":null,"contributors":null},"visible":true,"active":false,"userDisabled":true,"appDisabled":false,"embedderDisabled":false,"installDate":1757216888025,"applyBackgroundUpdates":1,"path":null,"skinnable":false,"sourceURI":null,"releaseNotesURI":null,"softDisabled":false,"foreignInstall":false,"strictCompatibility":true,"locales":[],"targetApplications":[{"id":"toolkit@mozilla.org","minVersion":null,"maxVersion":null}],"targetPlatforms":[],"signedDate":null,"seen":true,"dependencies":[],"userPermissions":null,"optionalPermissions":null,"requestedPermissions":null,"icons":{"32":"icon.svg"},"iconURL":null,"blocklistAttentionDismissed":false,"blocklistState":0,"blocklistURL":null,"startupData":null,"hidden":false,"installTelemetryInfo":null,"recommendationState":null,"rootURI":"resource://builtin-themes/dark/","location":"app-builtin"},{"id":"firefox-alpenglow@mozilla.org","syncGUID":"{27443336-e639-480e-a72f-15c8feafb2c1}","version":"1.5.1","type":"theme","loader":null,"updateURL":null,"installOrigins":null,"manifestVersion":2,"optionsURL":null,"optionsType":null,"optionsBrowserStyle":true,"aboutURL":null,"defaultLocale":{"name":"Firefox Alpenglow","description":"Use a colorful appearance for buttons, menus, and windows.","creator":"Mozilla","developers":null,"translators":null,"contributors":null},"visible":true,"active":false,"userDisabled":true,"appDisabled":false,"embedderDisabled":false,"installDate":1757216888025,"applyBackgroundUpdates":1,"path":null,"skinnable":false,"sourceURI":null,"releaseNotesURI":null,"softDisabled":false,"foreignInstall":false,"strictCompatibility":true,"locales":[],"targetApplications":[{"id":"toolkit@mozilla.org","minVersion":null,"maxVersion":null}],"targetPlatforms":[],"signedDate":null,"seen":true,"dependencies":[],"userPermissions":null,"optionalPermissions":null,"requestedPermissions":null,"icons":{"32":"icon.svg"},"iconURL":null,"blocklistAttentionDismissed":false,"blocklistState":0,"blocklistURL":null,"startupData":null,"hidden":false,"installTelemetryInfo":null,"recommendationState":null,"rootURI":"resource://builtin-themes/alpenglow/","location":"app-builtin"},{"id":"uBlock0@raymondhill.net","syncGUID":"{edf5ea1b-36af-4fae-8de6-701dc0520faf}","version":"1.68.0","type":"extension","loader":null,"updateURL":null,"installOrigins":null,"manifestVersion":2,"optionsURL":"dashboard.html","optionsType":3,"optionsBrowserStyle":false,"aboutURL":null,"defaultLocale":{"name":"uBlock Origin","description":"Finally, an efficient blocker. Easy on CPU and memory.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null},"visible":true,"active":true,"userDisabled":false,"appDisabled":false,"embedderDisabled":false,"installDate":1757217118929,"updateDate":1764908580349,"applyBackgroundUpdates":1,"path":"/home/tony/.mozilla/firefox/cjaa927r.default/extensions/uBlock0@raymondhill.net.xpi","skinnable":false,"sourceURI":"https://addons.mozilla.org/firefox/downloads/file/4629131/ublock_origin-1.68.0.xpi","releaseNotesURI":null,"softDisabled":false,"foreignInstall":false,"strictCompatibility":true,"locales":[{"name":"uBlock Origin","description":"Finally, an efficient blocker. Easy on CPU and memory.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["en"]},{"name":"uBlock Origin","description":"高効率ブロッカーついに登場。CPU とメモリーに負担をかけません。","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["ja"]},{"name":"uBlock Origin","description":"Lõpuks on valminud tõhus blokeerija. Protsessori- ja mälusõbralik.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["et"]},{"name":"uBlock Origin","description":"Enfin un blocador eficaç. Sollicita pauc lo CPU e la memòria","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["oc"]},{"name":"uBlock Origin","description":"O'r diwedd, rhwystrydd effeithlon sy'n gwell ar y CPU a'r cof.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["cy"]},{"name":"uBlock Origin","description":"Finalmente, um bloqueador eficiente. Leve para a CPU e a memória.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["pt-PT"]},{"name":"uBlock Origin","description":"మొత్తానికి RAM ఇంకా CPU పై తేలికయిన, ఒక సమర్థవంతమైన నిరోధిని.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["te"]},{"name":"uBlock Origin","description":"Un bloqueur de nuisances efficace, qui ménagera votre processeur et votre mémoire vive.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["fr"]},{"name":"uBlock Origin","description":"Akhirnya, pemblokir iklan yang efisien. Ringan penggunaan CPU dan memori.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["id"]},{"name":"uBlock Origin","description":"ਆਖਰਕਾਰ ਪ੍ਰਭਾਵੀ ਬਲੌਕਰ ਹੈ। CPU ਅਤੇ ਮੈਮੋਰੀ ਲਈ ਸੌਖਾ।","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["pa"]},{"name":"uBlock Origin","description":"Behingoz, blokeatzaile eraginkor bat. PUZ eta memorian arina.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["eu"]},{"name":"uBlock Origin","description":"Konečně efektivní blokovač. Nezatěžuje CPU a paměť.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["cs"]},{"name":"uBlock Origin","description":"Végre egy hatékony reklám- és követésblokkoló böngészőkhöz, amely kíméletes a processzorral és a memóriával.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["hu"]},{"name":"uBlock Origin","description":"একটি শক্তিশালী বিজ্ঞাপন প্রতিরোধক, অবশেষে তৈরী হল। যা সিপিইউ এবং মেমরির জন্য সহনীয়।","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["bn"]},{"name":"uBlock Origin","description":"Einlik, in effisjinte adblocker. Brûkt hast gjin prosessorkrêft of ûnthâld.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["fy"]},{"name":"uBlock Origin","description":"Най-накрая, ефективен блокер. Щадящ процесора и паметта.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["bg"]},{"name":"uBlock Origin","description":"Äntligen en effektiv blockerare. Lätt för både processor och minne.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["sv"]},{"name":"uBlock Origin","description":"Ugu dambeyntii, xannibaado hufan. Ku fudud oo ku saabsan CPU iyo xusuusta.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["so"]},{"name":"uBlock Origin","description":"Ефективний блокувальник реклами таки з’явився. Не навантажує процесор та пам'ять.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["uk"]},{"name":"uBlock Origin","description":"ಕೊನೆಗೆ, ಒಂದು ದಕ್ಷ ನಿರ್ಬಂಧಕ. ಮಿತವಾದ ಸಿಪಿಯೂ ಹಾಗು ಮೆಮೊರಿ ಬಳಿಕೇಒಂದಿಗೆ .","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["kn"]},{"name":"uBlock Origin","description":"آخر کار، ایک مؤثر اشتہار کو روکنے والا، یہ کم cpu اور میموری لیتا ہے.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["ur"]},{"name":"uBlock Origin","description":"Finfine rendimenta reklamoblokilo. Afabla por ĉefprocesoro kaj memoro.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["eo"]},{"name":"uBlock Origin","description":"Cuối cùng, đã có một công cụ chặn quảng cáo hiệu quả, tiêu tốn ít CPU và bộ nhớ.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["vi"]},{"name":"uBlock Origin","description":"وأخيراً, مانع اعلانات كفوء. خفيف على المعالج و الذاكرة.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["ar"]},{"name":"uBlock Origin","description":"이 부가 기능은 효율적인 차단기입니다. CPU와 메모리에 주는 부담이 적습니다.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["ko"]},{"name":"uBlock Origin","description":"Finalmente, un blocker efficiente. Leggero sulla CPU e sulla memoria.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["it"]},{"name":"uBlock Origin","description":"இறுதியாக, ஒரு திறமையான விளம்பரத் தடுப்பான். கணினியின் மையச் செயற்பகுதியின் மேலும் நினைவகத்தின் மேலும் இலகுவானது.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["ta"]},{"name":"uBlock Origin","description":"आख़िरकार, क्रोमियम-बेस्ड ब्राउज़रों के लिए एक कुशल अवरोधक। सीपीयू और मेमोरी पर कम भार के साथ।\n","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["hi"]},{"name":"uBlock Origin","description":"Pagaliau, efektyvus blokatorius, neapkraunantis nei procesoriaus, nei darbinės atminties.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["lt"]},{"name":"uBlock Origin","description":"Më në fund, një bllokues efikas që nuk e rëndon procesorin dhe memorien.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["sq"]},{"name":"uBlock Origin","description":"Конечно, ефикасен блокер. Лесен на CPU и меморија.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["mk"]},{"name":"uBlock Origin","description":"අවසානයේදී, මධ්ය සැකසුම් ඒකකය සහ මතකය අඩුවෙන් භාවිතා කරන කාර්යක්ෂම අවහිරකයක් ඇත.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["si"]},{"name":"uBlock Origin","description":"Endelig en effektiv blokkeringsutvidelse. Lavt CPU- og minnebruk.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["no"]},{"name":"uBlock Origin","description":"มาแล้ว! โปรแกรมบล็อกโฆษณาได้อย่างมีประสิทธิภาพ โดยที่ไม่กินซีพียูหรือแรม","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["th"]},{"name":"uBlock Origin","description":"როგორც იქნა, მძლავრი და შედეგიანი რეკლამების შემზღუდავი. ზოგავს CPU-ს და მეხსიერებას.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["ka"]},{"name":"uBlock Origin","description":"शेवटी, एक कार्यक्षम ब्लॉकर क्रोमियम आधारित ब्राउझरांसाठी. सीपीयू आणि मेमरी वर सोपे जातो.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["mr"]},{"name":"uBlock Origin","description":"Hatimaye, kizuizi kinachofaa. Nyepesi kwenye CPU na kumbukumbu.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["sw"]},{"name":"uBlock Origin","description":"Endelig en effektiv blokkeringsutvidelse. Lavt CPU- og minnebruk.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["nb"]},{"name":"uBlock Origin","description":"Axır ki, prosessor və yaddaş yükünü azaldan səmərəli bir əngəlləyici var.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["az"]},{"name":"uBlock Origin","description":"Ó fin, un bloqueador eficiente que non chupa toda a memoria e o procesador.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["gl"]},{"name":"uBlock Origin","description":"Finalment, un blocador eficient que utilitza pocs recursos de memòria i processador.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["ca"]},{"name":"uBlock Origin","description":"Finally, an efficient blocker. Easy on CPU and memory.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["en-GB"]},{"name":"uBlock Origin","description":"Konečne efektívny blokovač. Nezaťažuje CPU ani pamäť.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["sk"]},{"name":"uBlock Origin","description":"Коначно, ефикасан блокатор. Ниски процесорски и меморијски захтеви.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["sr"]},{"name":"uBlock Origin","description":"Endlich ein effizienter Blocker, der wenig Prozessorleistung und Arbeitsspeicher verbraucht.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["de"]},{"name":"uBlock Origin","description":"Тинех Интернет тишкерӳҫӗ валли хӑвӑрт та витӗмлӗ чаркӑч пур.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["cv"]},{"name":"uBlock Origin","description":"بالاخره، یک بلاکر کارآمد. کم حجم بر روی پردازنده و حافظه.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["fa"]},{"name":"uBlock Origin","description":"一款高效的网络请求过滤工具,占用极低的内存和 CPU。","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["zh-CN"]},{"name":"uBlock Origin","description":"അവസാനം, ഒരു കാര്യക്ഷമമായ ബ്ലോക്കര്. ലഘുവായ CPU, memory ഉപയോഗം.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["ml"]},{"name":"uBlock Origin","description":"Наконец-то, быстрый и эффективный блокировщик для браузеров.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["ru"]},{"name":"uBlock Origin","description":"Beidzot, efektīvs bloķētājs. Nepārslogo procesoru un atmiņu.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["lv"]},{"name":"uBlock Origin","description":"Končno, učinkovita, procesorju in pomnilniku prijazna razširitev za blokiranje oglasov.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["sl"]},{"name":"uBlock Origin","description":"Nareszcie skuteczny bloker charakteryzujący się niskim użyciem procesora i pamięci.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["pl"]},{"name":"uBlock Origin","description":"Mainam na pangharang sa content. Magaan sa CPU at memorya.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["fil"]},{"name":"uBlock Origin","description":"Erfin, ur stanker saotradurioù efedus hag a zouj d'ho reizhiad korvoiñ ha d'ho memor.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["br-FR"]},{"name":"uBlock Origin","description":"Konačno, efikasan blokator. Lak na CPU i memoriji.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["hr"]},{"name":"uBlock Origin","description":"Akhirnya, penyekat yang cekap. Tidak membebankan CPU dan memori.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["ms"]},{"name":"uBlock Origin","description":"Viimeinkin tehokas estotyökalu, joka ei kuormita prosessoria ja muistia.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["fi"]},{"name":"uBlock Origin","description":"Нарэшце, эфектыўны блакавальнік. Не нагружае працэсар і памяць.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["be"]},{"name":"uBlock Origin","description":"Վերջապե՛ս, արդյունավետ արգելափակիչ։ Խնայում է մշակիչը և հիշողությունը։","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["hy"]},{"name":"uBlock Origin","description":"Жарнамаларды жақсы өшіретін Addon'дардың бірі. Компьютердің қуатың аз алады.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["kk"]},{"name":"uBlock Origin","description":"În sfârșit, un blocant eficient. Are un impact mic asupra procesorului și memoriei.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["ro"]},{"name":"uBlock Origin","description":"અંતે, એક કાર્યક્ષમ અવરોધક. સીપીયુ અને મેમરી પર સરળ.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["gu"]},{"name":"uBlock Origin","description":"Por fin, un bloqueador eficiente con uso mínimo de procesador y memoria.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["es"]},{"name":"uBlock Origin","description":"終於有一款高效能的封鎖工具。對 CPU 和記憶體的占用極低。","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["zh-TW"]},{"name":"uBlock Origin","description":"Επιτέλους, ένας αποτελεσματικός blocker. Ελαφρύς για τον επεξεργαστή και τη μνήμη.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["el"]},{"name":"uBlock Origin","description":"סוף סוף, חוסם יעיל. קל על המעבד והזיכרון.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["he"]},{"name":"uBlock Origin","description":"Até que enfim, um bloqueador eficiente. Bem otimizado para CPU e memória.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["pt-BR"]},{"name":"uBlock Origin","description":"Endelig en effektiv blocker. Lavt CPU- og hukommelsesforbrug.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["da"]},{"name":"uBlock Origin","description":"Sonunda, etkili bir engelleyici. İşlemciyi ve belleği yormaz.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["tr"]},{"name":"uBlock Origin","description":"Eindelijk, een efficiënte adblocker. Gebruikt weinig processorkracht en geheugen.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["nl"]},{"name":"uBlock Origin","description":"Konačno, efikasan bloker. Štedljiv na procesoru i memoriji.","creator":"Raymond Hill & contributors","developers":null,"translators":null,"contributors":null,"locales":["bs"]}],"targetApplications":[{"id":"toolkit@mozilla.org","minVersion":"92.0","maxVersion":"*"}],"targetPlatforms":[],"signedState":2,"signedTypes":[2,1],"signedDate":1764775619000,"seen":true,"dependencies":[],"incognito":"spanning","userPermissions":{"permissions":["alarms","dns","menus","privacy","storage","tabs","unlimitedStorage","webNavigation","webRequest","webRequestBlocking"],"origins":["<all_urls>","http://*/*","https://*/*","file://*/*","https://easylist.to/*","https://*.fanboy.co.nz/*","https://filterlists.com/*","https://forums.lanik.us/*","https://github.com/*","https://*.github.io/*","https://github.com/uBlockOrigin/*","https://ublockorigin.github.io/*","https://*.reddit.com/r/uBlockOrigin/*"],"data_collection":["none"]},"optionalPermissions":{"permissions":[],"origins":[],"data_collection":[]},"requestedPermissions":{"permissions":[],"origins":[],"data_collection":[]},"icons":{"16":"img/ublock.svg","32":"img/ublock.svg","48":"img/ublock.svg","64":"img/ublock.svg","96":"img/ublock.svg","128":"img/ublock.svg"},"iconURL":null,"blocklistAttentionDismissed":false,"blocklistState":0,"blocklistURL":null,"startupData":{"persistentListeners":{"webRequest":{"onBeforeRequest":[[{"incognito":null,"tabId":null,"types":null,"urls":["moz-extension://a49b8822-5428-4b40-a099-a0a2462fa78b/web_accessible_resources/*"],"windowId":null},["blocking"]],[{"incognito":null,"tabId":null,"types":null,"urls":["http://*/*","https://*/*","ws://*/*","wss://*/*"],"windowId":null},["blocking"]]]}}},"hidden":false,"installTelemetryInfo":{"source":"amo","sourceURL":"https://addons.mozilla.org/en-US/firefox/search/?q=ublock%20origin","method":"link"},"recommendationState":{"validNotAfter":1922563619000,"validNotBefore":1764775619000,"states":["recommended-android","recommended"]},"rootURI":"jar:file:///home/tony/.mozilla/firefox/cjaa927r.default/extensions/uBlock0@raymondhill.net.xpi!/","location":"app-profile"},{"id":"addon@darkreader.org","syncGUID":"{28732445-196d-47e5-babd-7469490ebcd9}","version":"4.9.119","type":"extension","loader":null,"updateURL":null,"installOrigins":null,"manifestVersion":2,"optionsURL":null,"optionsType":null,"optionsBrowserStyle":true,"aboutURL":null,"defaultLocale":{"name":"Dark Reader","description":"Dark mode for every website. Take care of your eyes, use dark theme for night and daily browsing.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null},"visible":true,"active":true,"userDisabled":false,"appDisabled":false,"embedderDisabled":false,"installDate":1760672859705,"updateDate":1768479551951,"applyBackgroundUpdates":1,"path":"/home/tony/.mozilla/firefox/cjaa927r.default/extensions/addon@darkreader.org.xpi","skinnable":false,"sourceURI":"https://addons.mozilla.org/firefox/downloads/file/4665768/darkreader-4.9.119.xpi","releaseNotesURI":"https://addons.mozilla.org/en-US/firefox/addon/darkreader/versions/4.9.119/updateinfo/","softDisabled":false,"foreignInstall":false,"strictCompatibility":true,"locales":[{"name":"Dark Reader","description":"Dark mode for every website. Take care of your eyes, use dark theme for night and daily browsing.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["en"]},{"name":"Dark Reader","description":"あらゆるサイトにダークテーマを。夜間や毎日のブラウジングにDark Readerで目を気遣います。","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["ja"]},{"name":"Dark Reader","description":"Tema escuro para todos os websites. Cuide dos seus olhos, use o Dark Reader para navegação noturna e diária.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["pt-PT"]},{"name":"Dark Reader","description":"ప్రతి వెబ్సైట్కి ముదురు థీమ్. మీ కళ్లను కాపాడుకోండి, రాత్రి మరియు పగలు బ్రౌజింగ్ట్కి ముదురు థీమ్ ఉపయోగించండి.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["te"]},{"name":"Dark Reader","description":"Thème sombre pour tous les sites. Prenez soin de vos yeux, profitez d'un thème sombre pour naviguer de jour comme de nuit.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["fr"]},{"name":"Dark Reader","description":"Тъмен режим за всеки уебсайт. Погрижете се за очите си, използвайте тъмна тема за нощно и ежедневно сърфиране.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["bg"]},{"name":"Dark Reader","description":"Mode malam untuk semua situs web. Menjaga mata anda, menggunakan tema gelap untuk berselancar siang dan malam hari.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["id"]},{"name":"Dark Reader","description":"প্রত্যেক ওয়েবসাইটের জন্য ডার্কমোড। নিজ চোখের যত্ম নিন, নিত্যকার ব্রাউজিং এর জন্য ব্যবহার করুন ডার্ক থিম।","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["bn"]},{"name":"Dark Reader","description":"حالت تاریک برای همه سایت ها. مراقب چشمانتان باشید، برای وبگردی در شب یا روز از حالت تاریک استفاده کنید.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["fa-IR"]},{"name":"Dark Reader","description":"Mörkt läge på alla webbplatser. Ta hand om dina ögon och använd ett mörkt tema för att surfa på natten och dagen.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["sv"]},{"name":"Dark Reader","description":"Tmavý motiv pro každou stránku. Používejte Dark Reader pro celodenní prohlížení webu a šetřete tak své oči.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["cs"]},{"name":"Dark Reader","description":"Темний вигляд для кожного мережевого сайту. Піклуйтеся про свої очі, використовуйте темний вид для нічного та щоденного перегляду.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["uk"]},{"name":"Dark Reader","description":"الوضع المظلم لجميع المواقع. اعتن بعينيك، استعمل التنسيق الداكن للتصفح اليومي في الليل.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["ar"]},{"name":"Dark Reader","description":"සියළුම අඩවි සදහා අඳුරු ප්රකාරය. ඔබගේ නෙත් රැකගන්න, රාත්රී සහ දිවා කාලයේ දී වියමන අඩවි පිරික්සීමට අඳුරු තේමාව භාවිතා කරන්න.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["si"]},{"name":"Dark Reader","description":"Chế độ tối cho mọi trang web. Bảo vệ đôi mắt của bạn, sử dụng khi duyệt web vào ban đêm và hàng ngày.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["vi"]},{"name":"Dark Reader","description":"모든 웹사이트에 다크 모드를 적용합니다. 밤이나 일상적인 웹 브라우징 시 어두운 테마를 사용하여 눈을 보호하세요.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["ko"]},{"name":"Dark Reader","description":"Modo oscuro para cada sitio web. Cuide sus ojos, use el tema oscuro para la navegación nocturna y diaria.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["es-419"]},{"name":"Dark Reader","description":"Tema scuro per ogni sito. Proteggi i tuoi occhi usando il tema scuro mentre navighi, sia di giorno che di notte.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["it"]},{"name":"Dark Reader","description":"Mørkt tema for alle nettsteder. Ta vare på øynene, bruk Dark Reader for nettleseren, dag og kveld.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["no"]},{"name":"Dark Reader","description":"हर वेबसाइट के लिए डार्क थीम। अपनी आंखों की देखभाल करें, रात और हर रोज़ की ब्राउज़िंग के लिए डार्क रीडर का उपयोग करें।","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["hi"]},{"name":"Dark Reader","description":"Dunkler Modus für jede Website. Schonen Sie Ihre Augen und verwenden Sie Dark Reader für die Nacht und das tägliche Surfen.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["de"]},{"name":"Dark Reader","description":"เปลี่ยนเป็นโหมดมืดให้กับทุกๆเว็บเพื่อปกป้องสายตาของคุณ ใช้ธีมสีมืดสำหรับตอนกลางคืนและการท่องเว็บในชีวิตประจำวัน","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["th"]},{"name":"Dark Reader","description":"Dark mode for every website. Take care of your eyes, use dark theme for night and daily browsing.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["en-GB"]},{"name":"Dark Reader","description":"Tmavý režim pre každú stránku. Šetrite svoje oči a používajte tmavý motív po celý deň.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["sk"]},{"name":"Dark Reader","description":"Тамни режим за сваки сајт. Пазите на своје очи, користите тамну тему дању и ноћу.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["sr"]},{"name":"Dark Reader","description":"حالت تاریک برای همه سایت ها. مراقب چشمانتان باشید، برای وبگردی در شب یا روز از حالت تاریک استفاده کنید.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["fa"]},{"name":"Dark Reader","description":"Mod gelap untuk setiap laman web. Jaga mata anda, gunakan tema gelap untuk melayari laman web, malam dan siang.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["ms"]},{"name":"Dark Reader","description":"为每个网站启用暗色模式。呵护双眼,使用暗色主题进行夜间和日常浏览。","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["zh-CN"]},{"name":"Dark Reader","description":"Тёмная тема для каждого сайта. Берегите зрение, используйте Дарк Ридер для ночного или ежедневного просмотра веб-страниц.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["ru"]},{"name":"Dark Reader","description":"Mørk tilstand for alle hjemmesider. Beskyt dine øjne og brug mørke temaer for browsing on dagen og natten.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["da-DK"]},{"name":"Dark Reader","description":"Pozwala na korzystanie z trybu ciemnego na każdej stronie internetowej. Zadbaj o swój wzrok, używając ciemnego motywu do przeglądania w dzień i w nocy.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["pl"]},{"name":"Dark Reader","description":"Dark mode para sa lahat ng website. Alagaan ang iyong mga mata, gamitin ang dark theme para sa gabi at pang-araw-araw na browsing.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["fil"]},{"name":"Dark Reader","description":"Temă întunecată pentru orice site. Ai grijă de ochii tăi, folosește Dark Reader pentru cititul noaptea și de zi cu zi.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["ro"]},{"name":"Dark Reader","description":"Цёмная Тэма для кожнага сайта. Беражыце свае вочы, карыстайцеся Дарк Рыдарам для начнога ці штодзённага прагляду вэб-старонак.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["be"]},{"name":"Dark Reader","description":"Dark mode for every website. Take care of your eyes, use dark theme for night and daily browsing.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["en-US"]},{"name":"Dark Reader","description":"Σκούρα εμφάνιση για όλες τις ιστοσελίδες. Φροντίστε τα μάτια σας κάνοντας χρήση σκούρας εμφάνισης στο καθημερινό σας σερφάρισμα.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["el"]},{"name":"Dark Reader","description":"Tema oscuro para todos los sitios. Cuide sus ojos, utilice Dark Reader para navegar durante el día y la noche.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["es"]},{"name":"Dark Reader","description":"Tema escuro para todos os sites. Mantenha os seus olhos relaxados usando o tema escuro em sua navegação diária.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["pt-BR"]},{"name":"Dark Reader","description":"為每個網站提供深色模式。保護您的眼睛,使用 Dark Reader 進行夜間和日間瀏覽。","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["zh-TW"]},{"name":"Dark Reader","description":"מצב אפל לכל אתר. תשמור על העיניים שלך, השתמש בעיצוב כהה לגלישה בלילה וגם ביום.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["he"]},{"name":"Dark Reader","description":"Her web sitesi için koyu mod. Gözlerinize iyi bakın, gece ve günlük gezinti için koyu renk tema kullanın.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["tr"]},{"name":"Dark Reader","description":"Donkere modus voor elke website. Zorg goed voor je ogen, gebruik donkere modus voor gebruik in de nacht of zelfs overdag.","creator":"Alexander Shutau","developers":null,"translators":null,"contributors":null,"locales":["nl"]}],"targetApplications":[{"id":"toolkit@mozilla.org","minVersion":"78.0","maxVersion":"*"}],"targetPlatforms":[],"signedState":2,"signedTypes":[2,1],"signedDate":1768419338000,"seen":true,"dependencies":[],"incognito":"spanning","userPermissions":{"permissions":["alarms","contextMenus","storage","tabs","theme"],"origins":["<all_urls>"],"data_collection":[]},"optionalPermissions":{"permissions":[],"origins":[],"data_collection":[]},"requestedPermissions":{"permissions":[],"origins":[],"data_collection":[]},"icons":{"16":"icons/dr_16.png","48":"icons/dr_48.png","128":"icons/dr_128.png"},"iconURL":null,"blocklistAttentionDismissed":false,"blocklistState":0,"blocklistURL":null,"startupData":null,"hidden":false,"installTelemetryInfo":{"source":"amo","sourceURL":"https://addons.mozilla.org/en-US/firefox/search/?q=dark%20reader","method":"link"},"recommendationState":{"validNotAfter":1926207338000,"validNotBefore":1768419338000,"states":["recommended-android","recommended"]},"rootURI":"jar:file:///home/tony/.mozilla/firefox/cjaa927r.default/extensions/addon@darkreader.org.xpi!/","location":"app-profile"}]}
\ No newline at end of file
diff --git a/iso/airootfs/usr/share/tonarchy/firefox/profile/extensions/addon@darkreader.org.xpi b/iso/airootfs/usr/share/tonarchy/firefox/profile/extensions/addon@darkreader.org.xpi
new file mode 100644
index 0000000..5ffaa1a
Binary files /dev/null and b/iso/airootfs/usr/share/tonarchy/firefox/profile/extensions/addon@darkreader.org.xpi differ
diff --git a/iso/airootfs/usr/share/tonarchy/firefox/profile/extensions/uBlock0@raymondhill.net.xpi b/iso/airootfs/usr/share/tonarchy/firefox/profile/extensions/uBlock0@raymondhill.net.xpi
new file mode 100644
index 0000000..bd13d45
Binary files /dev/null and b/iso/airootfs/usr/share/tonarchy/firefox/profile/extensions/uBlock0@raymondhill.net.xpi differ
diff --git a/iso/airootfs/usr/share/tonarchy/firefox/profile/extensions/{4520dc08-80f4-4b2e-982a-c17af42e5e4d}.xpi b/iso/airootfs/usr/share/tonarchy/firefox/profile/extensions/{4520dc08-80f4-4b2e-982a-c17af42e5e4d}.xpi
new file mode 100644
index 0000000..ac8e617
Binary files /dev/null and b/iso/airootfs/usr/share/tonarchy/firefox/profile/extensions/{4520dc08-80f4-4b2e-982a-c17af42e5e4d}.xpi differ
diff --git a/iso/airootfs/usr/share/tonarchy/firefox/profile/prefs.js b/iso/airootfs/usr/share/tonarchy/firefox/profile/prefs.js
new file mode 100644
index 0000000..33627f8
--- /dev/null
+++ b/iso/airootfs/usr/share/tonarchy/firefox/profile/prefs.js
@@ -0,0 +1,379 @@
+// Mozilla User Preferences
+
+// DO NOT EDIT THIS FILE.
+//
+// If you make changes to this file while the application is running,
+// the changes will be overwritten when the application exits.
+//
+// To change a preference value, you can either:
+// - modify it via the UI (e.g. via about:config in the browser); or
+// - set it within a user.js file in your profile.
+
+user_pref("_user.js.parrot", "SUCCESS: No no he's not dead, he's, he's restin'!");
+user_pref("accessibility.typeaheadfind.flashBar", 0);
+user_pref("app.normandy.api_url", "");
+user_pref("app.normandy.enabled", false);
+user_pref("app.normandy.first_run", false);
+user_pref("app.normandy.migrationsApplied", 12);
+user_pref("app.normandy.user_id", "503dff39-ba43-4409-9901-d9ef5f40aca0");
+user_pref("app.shield.optoutstudies.enabled", false);
+user_pref("app.update.lastUpdateTime.addon-background-update-timer", 1768798932);
+user_pref("app.update.lastUpdateTime.browser-cleanup-thumbnails", 1768802543);
+user_pref("app.update.lastUpdateTime.recipe-client-addon-run", 1757216917);
+user_pref("app.update.lastUpdateTime.region-update-timer", 1768711476);
+user_pref("app.update.lastUpdateTime.rs-experiment-loader-timer", 1757216889);
+user_pref("app.update.lastUpdateTime.services-settings-poll-changes", 1768798932);
+user_pref("app.update.lastUpdateTime.suggest-ingest", 1757216888);
+user_pref("app.update.lastUpdateTime.xpi-signature-verification", 1768798932);
+user_pref("breakpad.reportURL", "");
+user_pref("browser.aboutConfig.showWarning", false);
+user_pref("browser.bookmarks.addedImportButton", true);
+user_pref("browser.bookmarks.restore_default_bookmarks", false);
+user_pref("browser.cache.disk.enable", false);
+user_pref("browser.contentblocking.category", "strict");
+user_pref("browser.contextual-services.contextId", "6d31957d-706c-4dbe-82e8-631328adbe91");
+user_pref("browser.contextual-services.contextId.timestamp-in-seconds", 1757216887);
+user_pref("browser.discovery.enabled", false);
+user_pref("browser.download.alwaysOpenPanel", false);
+user_pref("browser.download.always_ask_before_handling_new_types", true);
+user_pref("browser.download.lastDir", "/home/tony");
+user_pref("browser.download.manager.addToRecentDocs", false);
+user_pref("browser.download.panel.shown", true);
+user_pref("browser.download.start_downloads_in_tmp_dir", true);
+user_pref("browser.download.useDownloadDir", false);
+user_pref("browser.download.viewableInternally.typeWasRegistered.avif", true);
+user_pref("browser.download.viewableInternally.typeWasRegistered.webp", true);
+user_pref("browser.eme.ui.firstContentShown", true);
+user_pref("browser.engagement.ctrlTab.has-used", true);
+user_pref("browser.engagement.downloads-button.has-used", true);
+user_pref("browser.firefox-view.view-count", 5);
+user_pref("browser.formfill.enable", false);
+user_pref("browser.laterrun.bookkeeping.profileCreationTime", 1757216887);
+user_pref("browser.laterrun.bookkeeping.sessionCount", 1);
+user_pref("browser.link.open_newwindow.restriction", 0);
+user_pref("browser.migration.version", 161);
+user_pref("browser.ml.chat.nimbus", "ai-chatbot-page-summarization-mvp-treatment-a-callout-badge-rollout:treatment-a-callout-badge");
+user_pref("browser.ml.linkPreview.enabled", true);
+user_pref("browser.ml.linkPreview.nimbus", "link-previews-all-channel-rollout-without-onboarding:long-press-preview");
+user_pref("browser.ml.linkPreview.onboardingTimes", "1757217452534,0");
+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.newtabpage.activity-stream.default.sites", "");
+user_pref("browser.newtabpage.activity-stream.discoverystream.spoc.impressions", "{\"CAISCGluc3VyaWZ5\":[1757216926797],\"CAISCnNtYXJ0YXNzZXQ\":[1757216926800]}");
+user_pref("browser.newtabpage.activity-stream.feeds.telemetry", false);
+user_pref("browser.newtabpage.activity-stream.impressionId", "{29b88f9d-14a6-41b9-ad00-046a31c5cce7}");
+user_pref("browser.newtabpage.activity-stream.showSponsored", false);
+user_pref("browser.newtabpage.activity-stream.showSponsoredCheckboxes", false);
+user_pref("browser.newtabpage.activity-stream.showSponsoredTopSites", false);
+user_pref("browser.newtabpage.activity-stream.telemetry", false);
+user_pref("browser.newtabpage.enabled", false);
+user_pref("browser.newtabpage.storageVersion", 1);
+user_pref("browser.pageActions.persistedActions", "{\"ids\":[\"bookmark\"],\"idsInUrlbar\":[\"bookmark\"],\"idsInUrlbarPreProton\":[],\"version\":1}");
+user_pref("browser.pagethumbnails.storage_version", 3);
+user_pref("browser.places.speculativeConnect.enabled", false);
+user_pref("browser.policies.applied", true);
+user_pref("browser.preferences.experimental.hidden", true);
+user_pref("browser.privatebrowsing.forceMediaMemoryCache", true);
+user_pref("browser.proton.toolbar.version", 3);
+user_pref("browser.region.update.updated", 1768711477);
+user_pref("browser.safebrowsing.downloads.remote.enabled", false);
+user_pref("browser.safebrowsing.provider.mozilla.lastupdatetime", "1768797638793");
+user_pref("browser.safebrowsing.provider.mozilla.nextupdatetime", "1768819238793");
+user_pref("browser.search.region", "US");
+user_pref("browser.search.separatePrivateDefault.ui.enabled", true);
+user_pref("browser.search.serpEventTelemetryCategorization.regionEnabled", true);
+user_pref("browser.search.suggest.enabled", false);
+user_pref("browser.search.totalSearches", 100);
+user_pref("browser.sessionstore.privacy_level", 2);
+user_pref("browser.sessionstore.upgradeBackup.latestBuildID", "20251124145406");
+user_pref("browser.shell.didSkipDefaultBrowserCheckOnFirstRun", true);
+user_pref("browser.shell.mostRecentDateSetAsDefault", "1768797638");
+user_pref("browser.shell.mostRecentDefaultPromptSeen", "1763614177");
+user_pref("browser.shell.shortcutFavicons", false);
+user_pref("browser.shopping.experience2023.enabled", false);
+user_pref("browser.startup.couldRestoreSession.count", 2);
+user_pref("browser.startup.homepage", "about:blank");
+user_pref("browser.startup.homepage_override.buildID", "20250827004350");
+user_pref("browser.startup.homepage_override.mstone", "ignore");
+user_pref("browser.startup.lastColdStartupCheck", 1768797639);
+user_pref("browser.startup.page", 0);
+user_pref("browser.tabs.crashReporting.sendReport", false);
+user_pref("browser.tabs.searchclipboardfor.middleclick", false);
+user_pref("browser.termsofuse.prefMigrationCheck", true);
+user_pref("browser.theme.toolbar-theme", 0);
+user_pref("browser.topsites.contile.cacheValidFor", 10800);
+user_pref("browser.topsites.contile.lastFetch", 1757216888);
+user_pref("browser.translations.mostRecentTargetLanguages", "en");
+user_pref("browser.uiCustomization.state", "{\"placements\":{\"widget-overflow-fixed-list\":[],\"unified-extensions-area\":[\"addon_darkreader_org-browser-action\"],\"nav-bar\":[\"back-button\",\"forward-button\",\"stop-reload-button\",\"customizableui-special-spring1\",\"vertical-spacer\",\"urlbar-container\",\"customizableui-special-spring2\",\"downloads-button\",\"fxa-toolbar-menu-button\",\"unified-extensions-button\",\"ublock0_raymondhill_net-browser-action\"],\"toolbar-menubar\":[\"menubar-items\"],\"TabsToolbar\":[\"firefox-view-button\",\"tabbrowser-tabs\",\"new-tab-button\",\"alltabs-button\"],\"vertical-tabs\":[],\"PersonalToolbar\":[\"import-button\",\"personal-bookmarks\"]},\"seen\":[\"developer-button\",\"screenshot-button\",\"ublock0_raymondhill_net-browser-action\",\"addon_darkreader_org-browser-action\"],\"dirtyAreaCache\":[\"nav-bar\",\"vertical-tabs\",\"PersonalToolbar\",\"toolbar-menubar\",\"TabsToolbar\",\"unified-extensions-area\"],\"currentVersion\":23,\"newElementCount\":3}");
+user_pref("browser.uitour.enabled", false);
+user_pref("browser.urlbar.addons.featureGate", false);
+user_pref("browser.urlbar.amp.featureGate", false);
+user_pref("browser.urlbar.lastUrlbarSearchSeconds", 1768712692);
+user_pref("browser.urlbar.mdn.featureGate", false);
+user_pref("browser.urlbar.placeholderName", "Google");
+user_pref("browser.urlbar.placeholderName.private", "Google");
+user_pref("browser.urlbar.pocket.featureGate", false);
+user_pref("browser.urlbar.quickactions.timesShownOnboardingLabel", 3);
+user_pref("browser.urlbar.quicksuggest.enabled", false);
+user_pref("browser.urlbar.quicksuggest.migrationVersion", 3);
+user_pref("browser.urlbar.showSearchTerms.enabled", false);
+user_pref("browser.urlbar.speculativeConnect.enabled", false);
+user_pref("browser.urlbar.suggest.quicksuggest.nonsponsored", false);
+user_pref("browser.urlbar.suggest.quicksuggest.sponsored", false);
+user_pref("browser.urlbar.suggest.searches", false);
+user_pref("browser.urlbar.trending.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.xul.error_pages.expert_bad_cert", true);
+user_pref("captchadetection.hasUnsubmittedData", false);
+user_pref("captchadetection.lastSubmission", 1768797);
+user_pref("captivedetect.canonicalURL", "");
+user_pref("datareporting.dau.cachedUsageProfileGroupID", "5a16e813-bb30-4f58-a198-7a0f40281e23");
+user_pref("datareporting.dau.cachedUsageProfileID", "a32db8e3-76b7-4574-a7b4-008e86d1cef6");
+user_pref("datareporting.healthreport.uploadEnabled", false);
+user_pref("datareporting.policy.dataSubmissionEnabled", false);
+user_pref("datareporting.policy.dataSubmissionPolicyAcceptedVersion", 2);
+user_pref("datareporting.policy.dataSubmissionPolicyNotifiedTime", "1757216888255");
+user_pref("devtools.debugger.pending-selected-location", "{\"url\":\"https://tony.dev-leasecalcs.com/app/public/js/google_maps_react_dashboard.js\",\"line\":17,\"column\":54}");
+user_pref("devtools.debugger.prefs-schema-version", 11);
+user_pref("devtools.debugger.remote-enabled", false);
+user_pref("devtools.everOpened", true);
+user_pref("devtools.netmonitor.columnsData", "[{\"name\":\"override\",\"minWidth\":20,\"width\":2},{\"name\":\"status\",\"minWidth\":30,\"width\":6.67},{\"name\":\"method\",\"minWidth\":30,\"width\":6.67},{\"name\":\"domain\",\"minWidth\":30,\"width\":13.33},{\"name\":\"file\",\"minWidth\":30,\"width\":33.33},{\"name\":\"url\",\"minWidth\":30,\"width\":25},{\"name\":\"initiator\",\"minWidth\":30,\"width\":13.33},{\"name\":\"type\",\"minWidth\":30,\"width\":6.67},{\"name\":\"transferred\",\"minWidth\":30,\"width\":13.33},{\"name\":\"contentSize\",\"minWidth\":30,\"width\":6.67},{\"name\":\"waterfall\",\"minWidth\":150,\"width\":15}]");
+user_pref("devtools.netmonitor.msg.visibleColumns", "[\"data\",\"time\"]");
+user_pref("devtools.netmonitor.requestfilter", "?c=");
+user_pref("devtools.responsive.reloadNotification.enabled", false);
+user_pref("devtools.selfxss.count", 5);
+user_pref("devtools.toolbox.host", "right");
+user_pref("devtools.toolbox.previousHost", "bottom");
+user_pref("devtools.toolbox.selectedTool", "webconsole");
+user_pref("devtools.toolbox.splitconsole.open", true);
+user_pref("devtools.toolsidebar-height.inspector", 350);
+user_pref("devtools.toolsidebar-width.inspector", 945);
+user_pref("devtools.toolsidebar-width.inspector.splitsidebar", 225);
+user_pref("distribution.iniFile.exists.appversion", "145.0.2");
+user_pref("distribution.iniFile.exists.value", true);
+user_pref("distribution.nixos.bookmarksProcessed", true);
+user_pref("doh-rollout.doneFirstRun", true);
+user_pref("doh-rollout.home-region", "US");
+user_pref("doh-rollout.skipHeuristicsCheck", true);
+user_pref("dom.disable_window_move_resize", true);
+user_pref("dom.forms.autocomplete.formautofill", true);
+user_pref("dom.push.userAgentID", "66291c2c10064d2dbdbafbf8a1fdb527");
+user_pref("dom.security.https_only_mode", true);
+user_pref("dom.security.https_only_mode_ever_enabled", true);
+user_pref("dom.security.https_only_mode_send_http_background_request", false);
+user_pref("extensions.activeThemeID", "{4520dc08-80f4-4b2e-982a-c17af42e5e4d}");
+user_pref("extensions.blocklist.pingCountVersion", -1);
+user_pref("extensions.colorway-builtin-themes-cleanup", 1);
+user_pref("extensions.databaseSchema", 37);
+user_pref("extensions.enabledScopes", 5);
+user_pref("extensions.getAddons.cache.lastUpdate", 1768798933);
+user_pref("extensions.getAddons.databaseSchema", 6);
+user_pref("extensions.getAddons.showPane", false);
+user_pref("extensions.htmlaboutaddons.recommendations.enabled", false);
+user_pref("extensions.lastAppBuildId", "20251124145406");
+user_pref("extensions.lastAppVersion", "145.0.2");
+user_pref("extensions.lastPlatformVersion", "145.0.2");
+user_pref("extensions.pendingOperations", false);
+user_pref("extensions.pictureinpicture.enable_picture_in_picture_overrides", true);
+user_pref("extensions.postDownloadThirdPartyPrompt", false);
+user_pref("extensions.quarantinedDomains.list", "autoatendimento.bb.com.br,ibpf.sicredi.com.br,ibpj.sicredi.com.br,internetbanking.caixa.gov.br,www.ib12.bradesco.com.br,www2.bancobrasil.com.br");
+user_pref("extensions.signatureCheckpoint", 1);
+user_pref("extensions.ui.dictionary.hidden", true);
+user_pref("extensions.ui.extension.hidden", false);
+user_pref("extensions.ui.lastCategory", "addons://list/extension");
+user_pref("extensions.ui.locale.hidden", true);
+user_pref("extensions.ui.mlmodel.hidden", true);
+user_pref("extensions.ui.sitepermission.hidden", true);
+user_pref("extensions.ui.theme.hidden", false);
+user_pref("extensions.webcompat-reporter.enabled", false);
+user_pref("extensions.webcompat.enable_shims", true);
+user_pref("extensions.webcompat.perform_injections", true);
+user_pref("extensions.webextensions.ExtensionStorageIDB.migrated.addon@darkreader.org", true);
+user_pref("extensions.webextensions.ExtensionStorageIDB.migrated.uBlock0@raymondhill.net", true);
+user_pref("extensions.webextensions.uuids", "{\"formautofill@mozilla.org\":\"3a75cde3-2a4f-4d6b-ba14-555e91ad1946\",\"newtab@mozilla.org\":\"05068616-d81c-44c6-b0cf-126f29c730d2\",\"pictureinpicture@mozilla.org\":\"c8887260-0a28-4988-b79b-6151f7866bb6\",\"addons-search-detection@mozilla.com\":\"cb4c9012-b35a-4111-918e-8bd219ed595a\",\"webcompat@mozilla.org\":\"9a310967-e580-48bf-b3e8-4eafebbc122d\",\"default-theme@mozilla.org\":\"1d1bd0a9-ea1a-42d0-952b-dbb4029a7684\",\"uBlock0@raymondhill.net\":\"a49b8822-5428-4b40-a099-a0a2462fa78b\",\"{4520dc08-80f4-4b2e-982a-c17af42e5e4d}\":\"a7ed3039-88ce-4403-9bf7-df7f9ac23887\",\"ipp-activator@mozilla.com\":\"47f59e63-7583-4845-addb-6b53cc45cfe9\",\"addon@darkreader.org\":\"ba7b2aec-cb92-4f80-ab65-fffaaf462ef9\",\"data-leak-blocker@mozilla.com\":\"1b949891-d037-435a-a4d8-066fec00e9c5\"}");
+user_pref("gecko.handlerService.defaultHandlersVersion", 1);
+user_pref("geo.provider.ms-windows-location", false);
+user_pref("geo.provider.use_corelocation", false);
+user_pref("geo.provider.use_geoclue", false);
+user_pref("idle.lastDailyNotification", 1768798805);
+user_pref("layout.css.prefers-color-scheme.content-override", 0);
+user_pref("media.eme.enabled", true);
+user_pref("media.gmp-gmpopenh264.abi", "x86_64-gcc3");
+user_pref("media.gmp-gmpopenh264.hashValue", "f5246bf14d038adf4ce0c4360262ab722bc3de4220f047c3d542b4c564074b4877dc8659e3125c5171c749e7ce93f20cc63777eb5e1539e960670cbc5f30ac85");
+user_pref("media.gmp-gmpopenh264.lastDownload", 1757216918);
+user_pref("media.gmp-gmpopenh264.lastInstallStart", 1757216917);
+user_pref("media.gmp-gmpopenh264.lastUpdate", 1757216918);
+user_pref("media.gmp-gmpopenh264.version", "2.6.0");
+user_pref("media.gmp-manager.buildID", "20251124145406");
+user_pref("media.gmp-manager.lastCheck", 1768797742);
+user_pref("media.gmp-manager.lastEmptyCheck", 1768797742);
+user_pref("media.gmp-widevinecdm.abi", "x86_64-gcc3");
+user_pref("media.gmp-widevinecdm.hashValue", "421214210a09a9f9ed8ce482ef857f1c2b29ce1739240d1ec99a61caa3d80db3393752275722bdf5f503489f12a753215fe8a0c82de3aca23780d4ffe5792eb1");
+user_pref("media.gmp-widevinecdm.lastDownload", 1764829310);
+user_pref("media.gmp-widevinecdm.lastInstallStart", 1764829310);
+user_pref("media.gmp-widevinecdm.lastUpdate", 1764829311);
+user_pref("media.gmp-widevinecdm.version", "4.10.2934.0");
+user_pref("media.gmp.storage.version.observed", 1);
+user_pref("media.memory_cache_max_size", 65536);
+user_pref("media.peerconnection.ice.default_address_only", true);
+user_pref("media.peerconnection.ice.proxy_only_if_behind_proxy", true);
+user_pref("media.videocontrols.picture-in-picture.video-toggle.first-seen-secs", 1757217471);
+user_pref("media.videocontrols.picture-in-picture.video-toggle.has-used", true);
+user_pref("network.IDN_show_punycode", true);
+user_pref("network.auth.subresource-http-auth-allow", 1);
+user_pref("network.captive-portal-service.enabled", false);
+user_pref("network.connectivity-service.enabled", false);
+user_pref("network.cookie.CHIPS.lastMigrateDatabase", 2);
+user_pref("network.dns.disablePrefetch", true);
+user_pref("network.dns.disablePrefetchFromHTTPS", true);
+user_pref("network.file.disable_unc_paths", true);
+user_pref("network.gio.supported-protocols", "");
+user_pref("network.http.referer.XOriginTrimmingPolicy", 2);
+user_pref("network.http.referer.disallowCrossSiteRelaxingDefault.top_navigation", true);
+user_pref("network.http.speculative-parallel-limit", 0);
+user_pref("network.prefetch-next", false);
+user_pref("network.proxy.socks_remote_dns", true);
+user_pref("nimbus.migrations.after-remote-settings-update", 0);
+user_pref("nimbus.migrations.after-store-initialized", 2);
+user_pref("nimbus.migrations.init-started", 0);
+user_pref("nimbus.profileId", "cf6c6da9-2999-494c-9f14-260aec63ffd1");
+user_pref("pdfjs.enableAltText", true);
+user_pref("pdfjs.enableAltTextForEnglish", true);
+user_pref("pdfjs.enableScripting", false);
+user_pref("pdfjs.enabledCache.state", true);
+user_pref("pdfjs.migrationVersion", 2);
+user_pref("permissions.manager.defaultsUrl", "");
+user_pref("places.database.lastMaintenance", 1768551931);
+user_pref("print_printer", "Mozilla Save to PDF");
+user_pref("privacy.annotate_channels.strict_list.enabled", true);
+user_pref("privacy.bounceTrackingProtection.hasMigratedUserActivationData", true);
+user_pref("privacy.bounceTrackingProtection.mode", 1);
+user_pref("privacy.clearHistory.cookiesAndStorage", false);
+user_pref("privacy.clearHistory.formdata", true);
+user_pref("privacy.clearOnShutdown.cookies", false);
+user_pref("privacy.clearOnShutdown.offlineApps", true);
+user_pref("privacy.clearOnShutdown_v2.downloads", true);
+user_pref("privacy.clearOnShutdown_v2.formdata", true);
+user_pref("privacy.clearSiteData.browsingHistoryAndDownloads", true);
+user_pref("privacy.clearSiteData.cookiesAndStorage", false);
+user_pref("privacy.clearSiteData.formdata", true);
+user_pref("privacy.clearSiteData.historyFormDataAndDownloads", true);
+user_pref("privacy.cpd.cookies", false);
+user_pref("privacy.fingerprintingProtection", true);
+user_pref("privacy.history.custom", true);
+user_pref("privacy.purge_trackers.date_in_cookie_database", "0");
+user_pref("privacy.purge_trackers.last_purge", "1768798805370");
+user_pref("privacy.query_stripping.enabled", true);
+user_pref("privacy.query_stripping.enabled.pbmode", true);
+user_pref("privacy.resistFingerprinting.block_mozAddonManager", true);
+user_pref("privacy.sanitize.clearOnShutdown.hasMigratedToNewPrefs3", true);
+user_pref("privacy.sanitize.pending", "[{\"id\":\"newtab-container\",\"itemsToClear\":[],\"options\":{}}]");
+user_pref("privacy.sanitize.timeSpan", 0);
+user_pref("privacy.spoof_english", 1);
+user_pref("privacy.trackingprotection.allow_list.hasMigratedCategoryPrefs", true);
+user_pref("privacy.trackingprotection.consentmanager.skip.pbmode.enabled", false);
+user_pref("privacy.trackingprotection.emailtracking.enabled", true);
+user_pref("privacy.trackingprotection.enabled", true);
+user_pref("privacy.trackingprotection.socialtracking.enabled", true);
+user_pref("privacy.userContext.enabled", true);
+user_pref("privacy.userContext.ui.enabled", true);
+user_pref("privacy.window.maxInnerWidth", 1600);
+user_pref("security.OCSP.require", true);
+user_pref("security.cert_pinning.enforcement_level", 2);
+user_pref("security.csp.reporting.enabled", false);
+user_pref("security.ssl.require_safe_negotiation", true);
+user_pref("security.ssl.treat_unsafe_negotiation_as_broken", true);
+user_pref("security.tls.enable_0rtt_data", false);
+user_pref("services.settings.blocklists.addons-bloomfilters.last_check", 1768799936);
+user_pref("services.settings.blocklists.gfx.last_check", 1768799936);
+user_pref("services.settings.clock_skew_seconds", -3559);
+user_pref("services.settings.last_etag", "\"1768795026964\"");
+user_pref("services.settings.last_update_seconds", 1768802491);
+user_pref("services.settings.main.addons-data-leak-blocker-domains.last_check", 1768799936);
+user_pref("services.settings.main.addons-manager-settings.last_check", 1768799936);
+user_pref("services.settings.main.anti-tracking-url-decoration.last_check", 1768799936);
+user_pref("services.settings.main.bounce-tracking-protection-exceptions.last_check", 1768799936);
+user_pref("services.settings.main.cfr.last_check", 1768799936);
+user_pref("services.settings.main.cookie-banner-rules-list.last_check", 1768799936);
+user_pref("services.settings.main.devtools-compatibility-browsers.last_check", 1768799936);
+user_pref("services.settings.main.devtools-devices.last_check", 1768799936);
+user_pref("services.settings.main.doh-config.last_check", 1768799936);
+user_pref("services.settings.main.doh-providers.last_check", 1768799936);
+user_pref("services.settings.main.fingerprinting-protection-overrides.last_check", 1768799936);
+user_pref("services.settings.main.fxmonitor-breaches.last_check", 1768799936);
+user_pref("services.settings.main.fxrelay-denylist.last_check", 1768799936);
+user_pref("services.settings.main.hijack-blocklists.last_check", 1768799936);
+user_pref("services.settings.main.language-dictionaries.last_check", 1768799936);
+user_pref("services.settings.main.message-groups.last_check", 1768799936);
+user_pref("services.settings.main.moz-essential-domain-fallbacks.last_check", 1768799936);
+user_pref("services.settings.main.newtab-wallpapers-v2.last_check", 1768799936);
+user_pref("services.settings.main.nimbus-desktop-experiments.last_check", 1768799936);
+user_pref("services.settings.main.nimbus-secure-experiments.last_check", 1768799936);
+user_pref("services.settings.main.normandy-recipes-capabilities.last_check", 1768799936);
+user_pref("services.settings.main.partitioning-exempt-urls.last_check", 1768799936);
+user_pref("services.settings.main.password-recipes.last_check", 1768799936);
+user_pref("services.settings.main.password-rules.last_check", 1768799936);
+user_pref("services.settings.main.personality-provider-models.last_check", 1768799936);
+user_pref("services.settings.main.personality-provider-recipe.last_check", 1768799936);
+user_pref("services.settings.main.query-stripping.last_check", 1768799936);
+user_pref("services.settings.main.remote-permissions.last_check", 1768799936);
+user_pref("services.settings.main.search-categorization.last_check", 1768799936);
+user_pref("services.settings.main.search-config-icons.last_check", 1768799936);
+user_pref("services.settings.main.search-config-overrides-v2.last_check", 1768799936);
+user_pref("services.settings.main.search-config-v2.last_check", 1768799936);
+user_pref("services.settings.main.search-default-override-allowlist.last_check", 1768799936);
+user_pref("services.settings.main.search-telemetry-v2.last_check", 1768799936);
+user_pref("services.settings.main.sites-classification.last_check", 1768799936);
+user_pref("services.settings.main.third-party-cookie-blocking-exempt-urls.last_check", 1768799936);
+user_pref("services.settings.main.tippytop.last_check", 1768799936);
+user_pref("services.settings.main.top-sites.last_check", 1768799936);
+user_pref("services.settings.main.tracking-protection-lists.last_check", 1768799936);
+user_pref("services.settings.main.translations-models-v2.last_check", 1768799936);
+user_pref("services.settings.main.translations-models.last_check", 1768799936);
+user_pref("services.settings.main.translations-wasm.last_check", 1768799936);
+user_pref("services.settings.main.url-classifier-exceptions.last_check", 1768799936);
+user_pref("services.settings.main.url-classifier-skip-urls.last_check", 1768799936);
+user_pref("services.settings.main.url-parser-default-unknown-schemes-interventions.last_check", 1768799936);
+user_pref("services.settings.main.urlbar-persisted-search-terms.last_check", 1768799936);
+user_pref("services.settings.main.webcompat-interventions.last_check", 1768799936);
+user_pref("services.settings.main.websites-with-shared-credential-backends.last_check", 1768799936);
+user_pref("services.settings.security-state.cert-revocations.last_check", 1768799936);
+user_pref("services.settings.security-state.intermediates.last_check", 1768799936);
+user_pref("services.settings.security-state.onecrl.last_check", 1768799936);
+user_pref("services.sync.clients.lastSync", "0");
+user_pref("services.sync.declinedEngines", "");
+user_pref("services.sync.engine.addresses.available", true);
+user_pref("services.sync.globalScore", 0);
+user_pref("services.sync.nextSync", 0);
+user_pref("sidebar.backupState", "{\"command\":\"viewBookmarksSidebar\",\"panelOpen\":false,\"launcherExpanded\":false,\"launcherVisible\":false}");
+user_pref("sidebar.notification.badge.aichat", true);
+user_pref("sidebar.old-sidebar.has-used", true);
+user_pref("sidebar.visibility", "hide-sidebar");
+user_pref("signon.autofillForms", false);
+user_pref("signon.formlessCapture.enabled", false);
+user_pref("signon.rustMirror.migrationNeeded", true);
+user_pref("storage.vacuum.last.content-prefs.sqlite", 1768191418);
+user_pref("storage.vacuum.last.index", 2);
+user_pref("storage.vacuum.last.places.sqlite", 1768089765);
+user_pref("toolkit.coverage.endpoint.base", "");
+user_pref("toolkit.coverage.opt-out", true);
+user_pref("toolkit.profiles.storeID", "e916b44e");
+user_pref("toolkit.startup.last_success", 1768797638);
+user_pref("toolkit.telemetry.archive.enabled", false);
+user_pref("toolkit.telemetry.bhrPing.enabled", false);
+user_pref("toolkit.telemetry.cachedClientID", "2e63b480-e99c-46a4-a471-aba904ff57dd");
+user_pref("toolkit.telemetry.cachedProfileGroupID", "38d6c495-7b84-481b-95e9-8995076c37df");
+user_pref("toolkit.telemetry.coverage.opt-out", true);
+user_pref("toolkit.telemetry.firstShutdownPing.enabled", false);
+user_pref("toolkit.telemetry.newProfilePing.enabled", false);
+user_pref("toolkit.telemetry.previousBuildID", "20250827004350");
+user_pref("toolkit.telemetry.reportingpolicy.firstRun", false);
+user_pref("toolkit.telemetry.server", "data:,");
+user_pref("toolkit.telemetry.shutdownPingSender.enabled", false);
+user_pref("toolkit.telemetry.unified", false);
+user_pref("toolkit.telemetry.updatePing.enabled", false);
+user_pref("toolkit.winRegisterApplicationRestart", false);
+user_pref("trailhead.firstrun.didSeeAboutWelcome", true);
+user_pref("widget.non-native-theme.use-theme-accent", false);
diff --git a/iso/airootfs/usr/share/tonarchy/firefox/profile/user.js b/iso/airootfs/usr/share/tonarchy/firefox/profile/user.js
new file mode 100644
index 0000000..2a553d4
--- /dev/null
+++ b/iso/airootfs/usr/share/tonarchy/firefox/profile/user.js
@@ -0,0 +1,1303 @@
+/******
+* name: arkenfox user.js
+* date: 13 January 2025
+* version: 133
+* urls: https://github.com/arkenfox/user.js [repo]
+* : https://arkenfox.github.io/gui/ [interactive]
+* license: MIT: https://github.com/arkenfox/user.js/blob/master/LICENSE.txt
+
+* README:
+
+ 1. Consider using Tor Browser if it meets your needs or fits your threat model
+ * https://2019.www.torproject.org/about/torusers.html
+ 2. Read the entire wiki
+ * https://github.com/arkenfox/user.js/wiki
+ 3. If you skipped step 2, return to step 2
+ 4. Make changes in a user-overrides.js
+ * There are often trade-offs and conflicts between security vs privacy vs anti-tracking
+ and these need to be balanced against functionality & convenience & breakage
+ * Some site breakage and unintended consequences will happen. Everyone's experience will differ
+ e.g. some user data is erased on exit (section 2800), change this to suit your needs
+ * While not 100% definitive, search for "[SETUP" tags
+ 5. Some tag info
+ [SETUP-SECURITY] it's one item, read it
+ [SETUP-WEB] can cause some websites to break
+ [SETUP-CHROME] changes how Firefox itself behaves (i.e. not directly website related)
+ 6. Override Recipes: https://github.com/arkenfox/user.js/issues/1080
+
+* RELEASES: https://github.com/arkenfox/user.js/releases
+
+ * Use the arkenfox release that matches your Firefox version
+ - DON'T wait for arkenfox to update Firefox, nothing major changes these days
+ * Each release
+ - run prefsCleaner to reset prefs made inactive, including deprecated (9999)
+ * ESR
+ - It is recommended to not use the updater, or you will get a later version which may cause issues.
+ So you should manually append your overrides (and keep a copy), and manually update when you
+ change ESR releases (arkenfox is already past that release)
+ - If you decide to keep updating, then the onus is on you - also see section 9999
+
+* INDEX:
+
+ 0100: STARTUP
+ 0200: GEOLOCATION
+ 0300: QUIETER FOX
+ 0400: SAFE BROWSING
+ 0600: BLOCK IMPLICIT OUTBOUND
+ 0700: DNS / DoH / PROXY / SOCKS
+ 0800: LOCATION BAR / SEARCH BAR / SUGGESTIONS / HISTORY / FORMS
+ 0900: PASSWORDS
+ 1000: DISK AVOIDANCE
+ 1200: HTTPS (SSL/TLS / OCSP / CERTS / HPKP)
+ 1600: REFERERS
+ 1700: CONTAINERS
+ 2000: PLUGINS / MEDIA / WEBRTC
+ 2400: DOM (DOCUMENT OBJECT MODEL)
+ 2600: MISCELLANEOUS
+ 2700: ETP (ENHANCED TRACKING PROTECTION)
+ 2800: SHUTDOWN & SANITIZING
+ 4000: FPP (fingerprintingProtection)
+ 4500: OPTIONAL RFP (resistFingerprinting)
+ 5000: OPTIONAL OPSEC
+ 5500: OPTIONAL HARDENING
+ 6000: DON'T TOUCH
+ 7000: DON'T BOTHER
+ 8000: DON'T BOTHER: FINGERPRINTING
+ 9000: NON-PROJECT RELATED
+ 9999: DEPRECATED / RENAMED
+
+******/
+
+/* START: internal custom pref to test for syntax errors
+ * [NOTE] Not all syntax errors cause parsing to abort i.e. reaching the last debug pref
+ * no longer necessarily means that all prefs have been applied. Check the console right
+ * after startup for any warnings/error messages related to non-applied prefs
+ * [1] https://blog.mozilla.org/nnethercote/2018/03/09/a-new-preferences-parser-for-firefox/ ***/
+user_pref("_user.js.parrot", "START: Oh yes, the Norwegian Blue... what's wrong with it?");
+
+/* 0000: disable about:config warning ***/
+user_pref("browser.aboutConfig.showWarning", false);
+
+/*** [SECTION 0100]: STARTUP ***/
+user_pref("_user.js.parrot", "0100 syntax error: the parrot's dead!");
+/* 0102: set startup page [SETUP-CHROME]
+ * 0=blank, 1=home, 2=last visited page, 3=resume previous session
+ * [NOTE] Session Restore is cleared with history (2811), and not used in Private Browsing mode
+ * [SETTING] General>Startup>Restore previous session ***/
+user_pref("browser.startup.page", 0);
+/* 0103: set HOME+NEWWINDOW page
+ * about:home=Firefox Home (default, see 0105), custom URL, about:blank
+ * [SETTING] Home>New Windows and Tabs>Homepage and new windows ***/
+user_pref("browser.startup.homepage", "about:blank");
+/* 0104: set NEWTAB page
+ * true=Firefox Home (default, see 0105), false=blank page
+ * [SETTING] Home>New Windows and Tabs>New tabs ***/
+user_pref("browser.newtabpage.enabled", false);
+/* 0105: disable sponsored content on Firefox Home (Activity Stream)
+ * [SETTING] Home>Firefox Home Content ***/
+user_pref("browser.newtabpage.activity-stream.showSponsored", false); // [FF58+]
+user_pref("browser.newtabpage.activity-stream.showSponsoredTopSites", false); // [FF83+] Shortcuts>Sponsored shortcuts
+/* 0106: clear default topsites
+ * [NOTE] This does not block you from adding your own ***/
+user_pref("browser.newtabpage.activity-stream.default.sites", "");
+
+/*** [SECTION 0200]: GEOLOCATION ***/
+user_pref("_user.js.parrot", "0200 syntax error: the parrot's definitely deceased!");
+/* 0202: disable using the OS's geolocation service ***/
+user_pref("geo.provider.ms-windows-location", false); // [WINDOWS]
+user_pref("geo.provider.use_corelocation", false); // [MAC]
+user_pref("geo.provider.use_geoclue", false); // [FF102+] [LINUX]
+
+/*** [SECTION 0300]: QUIETER FOX ***/
+user_pref("_user.js.parrot", "0300 syntax error: the parrot's not pinin' for the fjords!");
+/** RECOMMENDATIONS ***/
+/* 0320: disable recommendation pane in about:addons (uses Google Analytics) ***/
+user_pref("extensions.getAddons.showPane", false); // [HIDDEN PREF]
+/* 0321: disable recommendations in about:addons' Extensions and Themes panes [FF68+] ***/
+user_pref("extensions.htmlaboutaddons.recommendations.enabled", false);
+/* 0322: disable personalized Extension Recommendations in about:addons and AMO [FF65+]
+ * [NOTE] This pref has no effect when Health Reports (0331) are disabled
+ * [SETTING] Privacy & Security>Firefox Data Collection & Use>Allow Firefox to make personalized extension recommendations
+ * [1] https://support.mozilla.org/kb/personalized-extension-recommendations ***/
+user_pref("browser.discovery.enabled", false);
+/* 0323: disable shopping experience [FF116+]
+ * [1] https://bugzilla.mozilla.org/show_bug.cgi?id=1840156#c0 ***/
+user_pref("browser.shopping.experience2023.enabled", false); // [DEFAULT: false]
+
+/** TELEMETRY ***/
+/* 0330: disable new data submission [FF41+]
+ * If disabled, no policy is shown or upload takes place, ever
+ * [1] https://bugzilla.mozilla.org/1195552 ***/
+user_pref("datareporting.policy.dataSubmissionEnabled", false);
+/* 0331: disable Health Reports
+ * [SETTING] Privacy & Security>Firefox Data Collection & Use>Allow Firefox to send technical... data ***/
+user_pref("datareporting.healthreport.uploadEnabled", false);
+/* 0332: disable telemetry
+ * The "unified" pref affects the behavior of the "enabled" pref
+ * - If "unified" is false then "enabled" controls the telemetry module
+ * - If "unified" is true then "enabled" only controls whether to record extended data
+ * [NOTE] "toolkit.telemetry.enabled" is now LOCKED to reflect prerelease (true) or release builds (false) [2]
+ * [1] https://firefox-source-docs.mozilla.org/toolkit/components/telemetry/telemetry/internals/preferences.html
+ * [2] https://medium.com/georg-fritzsche/data-preference-changes-in-firefox-58-2d5df9c428b5 ***/
+user_pref("toolkit.telemetry.unified", false);
+user_pref("toolkit.telemetry.enabled", false); // see [NOTE]
+user_pref("toolkit.telemetry.server", "data:,");
+user_pref("toolkit.telemetry.archive.enabled", false);
+user_pref("toolkit.telemetry.newProfilePing.enabled", false); // [FF55+]
+user_pref("toolkit.telemetry.shutdownPingSender.enabled", false); // [FF55+]
+user_pref("toolkit.telemetry.updatePing.enabled", false); // [FF56+]
+user_pref("toolkit.telemetry.bhrPing.enabled", false); // [FF57+] Background Hang Reporter
+user_pref("toolkit.telemetry.firstShutdownPing.enabled", false); // [FF57+]
+/* 0333: disable Telemetry Coverage
+ * [1] https://blog.mozilla.org/data/2018/08/20/effectively-measuring-search-in-firefox/ ***/
+user_pref("toolkit.telemetry.coverage.opt-out", true); // [HIDDEN PREF]
+user_pref("toolkit.coverage.opt-out", true); // [FF64+] [HIDDEN PREF]
+user_pref("toolkit.coverage.endpoint.base", "");
+/* 0335: disable Firefox Home (Activity Stream) telemetry ***/
+user_pref("browser.newtabpage.activity-stream.feeds.telemetry", false);
+user_pref("browser.newtabpage.activity-stream.telemetry", false);
+
+/** STUDIES ***/
+/* 0340: disable Studies
+ * [SETTING] Privacy & Security>Firefox Data Collection & Use>Allow Firefox to install and run studies ***/
+user_pref("app.shield.optoutstudies.enabled", false);
+/* 0341: disable Normandy/Shield [FF60+]
+ * Shield is a telemetry system that can push and test "recipes"
+ * [1] https://mozilla.github.io/normandy/ ***/
+user_pref("app.normandy.enabled", false);
+user_pref("app.normandy.api_url", "");
+
+/** CRASH REPORTS ***/
+/* 0350: disable Crash Reports ***/
+user_pref("breakpad.reportURL", "");
+user_pref("browser.tabs.crashReporting.sendReport", false); // [FF44+]
+ // user_pref("browser.crashReports.unsubmittedCheck.enabled", false); // [FF51+] [DEFAULT: false]
+/* 0351: enforce no submission of backlogged Crash Reports [FF58+]
+ * [SETTING] Privacy & Security>Firefox Data Collection & Use>Allow Firefox to send backlogged crash reports ***/
+user_pref("browser.crashReports.unsubmittedCheck.autoSubmit2", false); // [DEFAULT: false]
+
+/** OTHER ***/
+/* 0360: disable Captive Portal detection
+ * [1] https://www.eff.org/deeplinks/2017/08/how-captive-portals-interfere-wireless-security-and-privacy ***/
+user_pref("captivedetect.canonicalURL", "");
+user_pref("network.captive-portal-service.enabled", false); // [FF52+]
+/* 0361: disable Network Connectivity checks [FF65+]
+ * [1] https://bugzilla.mozilla.org/1460537 ***/
+user_pref("network.connectivity-service.enabled", false);
+
+/*** [SECTION 0400]: SAFE BROWSING (SB)
+ SB has taken many steps to preserve privacy. If required, a full url is never sent
+ to Google, only a part-hash of the prefix, hidden with noise of other real part-hashes.
+ Firefox takes measures such as stripping out identifying parameters and since SBv4 (FF57+)
+ doesn't even use cookies. (#Turn on browser.safebrowsing.debug to monitor this activity)
+
+ [1] https://feeding.cloud.geek.nz/posts/how-safe-browsing-works-in-firefox/
+ [2] https://wiki.mozilla.org/Security/Safe_Browsing
+ [3] https://support.mozilla.org/kb/how-does-phishing-and-malware-protection-work
+ [4] https://educatedguesswork.org/posts/safe-browsing-privacy/
+***/
+user_pref("_user.js.parrot", "0400 syntax error: the parrot's passed on!");
+/* 0401: disable SB (Safe Browsing)
+ * [WARNING] Do this at your own risk! These are the master switches
+ * [SETTING] Privacy & Security>Security>... Block dangerous and deceptive content ***/
+ // user_pref("browser.safebrowsing.malware.enabled", false);
+ // user_pref("browser.safebrowsing.phishing.enabled", false);
+/* 0402: disable SB checks for downloads (both local lookups + remote)
+ * This is the master switch for the safebrowsing.downloads* prefs (0403, 0404)
+ * [SETTING] Privacy & Security>Security>... "Block dangerous downloads" ***/
+ // user_pref("browser.safebrowsing.downloads.enabled", false);
+/* 0403: disable SB checks for downloads (remote)
+ * To verify the safety of certain executable files, Firefox may submit some information about the
+ * file, including the name, origin, size and a cryptographic hash of the contents, to the Google
+ * Safe Browsing service which helps Firefox determine whether or not the file should be blocked
+ * [SETUP-SECURITY] If you do not understand this, or you want this protection, then override this ***/
+user_pref("browser.safebrowsing.downloads.remote.enabled", false);
+ // user_pref("browser.safebrowsing.downloads.remote.url", ""); // Defense-in-depth
+/* 0404: disable SB checks for unwanted software
+ * [SETTING] Privacy & Security>Security>... "Warn you about unwanted and uncommon software" ***/
+ // user_pref("browser.safebrowsing.downloads.remote.block_potentially_unwanted", false);
+ // user_pref("browser.safebrowsing.downloads.remote.block_uncommon", false);
+/* 0405: disable "ignore this warning" on SB warnings [FF45+]
+ * If clicked, it bypasses the block for that session. This is a means for admins to enforce SB
+ * [TEST] see https://github.com/arkenfox/user.js/wiki/Appendix-A-Test-Sites#-mozilla
+ * [1] https://bugzilla.mozilla.org/1226490 ***/
+ // user_pref("browser.safebrowsing.allowOverride", false);
+
+/*** [SECTION 0600]: BLOCK IMPLICIT OUTBOUND [not explicitly asked for - e.g. clicked on] ***/
+user_pref("_user.js.parrot", "0600 syntax error: the parrot's no more!");
+/* 0601: disable link prefetching
+ * [1] https://developer.mozilla.org/docs/Web/HTTP/Link_prefetching_FAQ ***/
+user_pref("network.prefetch-next", false);
+/* 0602: disable DNS prefetching
+ * [1] https://developer.mozilla.org/docs/Web/HTTP/Headers/X-DNS-Prefetch-Control ***/
+user_pref("network.dns.disablePrefetch", true);
+user_pref("network.dns.disablePrefetchFromHTTPS", true);
+/* 0603: disable predictor / prefetching ***/
+user_pref("network.predictor.enabled", false);
+user_pref("network.predictor.enable-prefetch", false); // [FF48+] [DEFAULT: false]
+/* 0604: disable link-mouseover opening connection to linked server
+ * [1] https://news.slashdot.org/story/15/08/14/2321202/how-to-quash-firefoxs-silent-requests ***/
+user_pref("network.http.speculative-parallel-limit", 0);
+/* 0605: disable mousedown speculative connections on bookmarks and history [FF98+] ***/
+user_pref("browser.places.speculativeConnect.enabled", false);
+/* 0610: enforce no "Hyperlink Auditing" (click tracking)
+ * [1] https://www.bleepingcomputer.com/news/software/major-browsers-to-prevent-disabling-of-click-tracking-privacy-risk/ ***/
+ // user_pref("browser.send_pings", false); // [DEFAULT: false]
+
+/*** [SECTION 0700]: DNS / DoH / PROXY / SOCKS ***/
+user_pref("_user.js.parrot", "0700 syntax error: the parrot's given up the ghost!");
+/* 0702: set the proxy server to do any DNS lookups when using SOCKS
+ * e.g. in Tor, this stops your local DNS server from knowing your Tor destination
+ * as a remote Tor node will handle the DNS request
+ * [1] https://trac.torproject.org/projects/tor/wiki/doc/TorifyHOWTO/WebBrowsers ***/
+user_pref("network.proxy.socks_remote_dns", true);
+/* 0703: disable using UNC (Uniform Naming Convention) paths [FF61+]
+ * [SETUP-CHROME] Can break extensions for profiles on network shares
+ * [1] https://bugzilla.mozilla.org/1413868 ***/
+user_pref("network.file.disable_unc_paths", true); // [HIDDEN PREF]
+/* 0704: disable GIO as a potential proxy bypass vector
+ * Gvfs/GIO has a set of supported protocols like obex, network, archive, computer,
+ * dav, cdda, gphoto2, trash, etc. From FF87-117, by default only sftp was accepted
+ * [1] https://bugzilla.mozilla.org/1433507
+ * [2] https://en.wikipedia.org/wiki/GVfs
+ * [3] https://en.wikipedia.org/wiki/GIO_(software) ***/
+user_pref("network.gio.supported-protocols", ""); // [HIDDEN PREF] [DEFAULT: "" FF118+]
+/* 0705: disable proxy direct failover for system requests [FF91+]
+ * [WARNING] Default true is a security feature against malicious extensions [1]
+ * [SETUP-CHROME] If you use a proxy and you trust your extensions
+ * [1] https://blog.mozilla.org/security/2021/10/25/securing-the-proxy-api-for-firefox-add-ons/ ***/
+ // user_pref("network.proxy.failover_direct", false);
+/* 0706: disable proxy bypass for system request failures [FF95+]
+ * RemoteSettings, UpdateService, Telemetry [1]
+ * [WARNING] If false, this will break the fallback for some security features
+ * [SETUP-CHROME] If you use a proxy and you understand the security impact
+ * [1] https://bugzilla.mozilla.org/buglist.cgi?bug_id=1732792,1733994,1733481 ***/
+ // user_pref("network.proxy.allow_bypass", false);
+/* 0710: enable DNS-over-HTTPS (DoH) [FF60+]
+ * 0=default, 2=increased (TRR (Trusted Recursive Resolver) first), 3=max (TRR only), 5=off (no rollout)
+ * see "doh-rollout.home-region": USA 2019, Canada 2021, Russia/Ukraine 2022 [3]
+ * [SETTING] Privacy & Security>DNS over HTTPS
+ * [1] https://hacks.mozilla.org/2018/05/a-cartoon-intro-to-dns-over-https/
+ * [2] https://wiki.mozilla.org/Security/DOH-resolver-policy
+ * [3] https://support.mozilla.org/kb/firefox-dns-over-https
+ * [4] https://www.eff.org/deeplinks/2020/12/dns-doh-and-odoh-oh-my-year-review-2020 ***/
+ // user_pref("network.trr.mode", 3);
+/* 0712: set DoH provider
+ * The custom uri is the value shown when you "Choose provider>Custom>"
+ * [NOTE] If you USE custom then "network.trr.uri" should be set the same
+ * [SETTING] Privacy & Security>DNS over HTTPS>Increased/Max>Choose provider ***/
+ // user_pref("network.trr.uri", "https://example.dns");
+ // user_pref("network.trr.custom_uri", "https://example.dns");
+
+/*** [SECTION 0800]: LOCATION BAR / SEARCH BAR / SUGGESTIONS / HISTORY / FORMS ***/
+user_pref("_user.js.parrot", "0800 syntax error: the parrot's ceased to be!");
+/* 0801: disable location bar making speculative connections [FF56+]
+ * [1] https://bugzilla.mozilla.org/1348275 ***/
+user_pref("browser.urlbar.speculativeConnect.enabled", false);
+/* 0802: disable location bar contextual suggestions
+ * [NOTE] The UI is controlled by the .enabled pref
+ * [SETTING] Search>Address Bar>Suggestions from...
+ * [1] https://blog.mozilla.org/data/2021/09/15/data-and-firefox-suggest/ ***/
+user_pref("browser.urlbar.quicksuggest.enabled", false); // [FF92+]
+user_pref("browser.urlbar.suggest.quicksuggest.nonsponsored", false); // [FF95+]
+user_pref("browser.urlbar.suggest.quicksuggest.sponsored", false); // [FF92+]
+/* 0803: disable live search suggestions
+ * [NOTE] Both must be true for live search to work in the location bar
+ * [SETUP-CHROME] Override these if you trust and use a privacy respecting search engine
+ * [SETTING] Search>Show search suggestions | Show search suggestions in address bar results ***/
+user_pref("browser.search.suggest.enabled", false);
+user_pref("browser.urlbar.suggest.searches", false);
+/* 0805: disable urlbar trending search suggestions [FF118+]
+ * [SETTING] Search>Search Suggestions>Show trending search suggestions (FF119) ***/
+user_pref("browser.urlbar.trending.featureGate", false);
+/* 0806: disable urlbar suggestions ***/
+user_pref("browser.urlbar.addons.featureGate", false); // [FF115+]
+user_pref("browser.urlbar.fakespot.featureGate", false); // [FF130+] [DEFAULT: false]
+user_pref("browser.urlbar.mdn.featureGate", false); // [FF117+] [HIDDEN PREF]
+user_pref("browser.urlbar.pocket.featureGate", false); // [FF116+] [DEFAULT: false]
+user_pref("browser.urlbar.weather.featureGate", false); // [FF108+] [DEFAULT: false]
+user_pref("browser.urlbar.yelp.featureGate", false); // [FF124+]
+/* 0807: disable urlbar clipboard suggestions [FF118+] ***/
+ // user_pref("browser.urlbar.clipboard.featureGate", false);
+/* 0808: disable recent searches [FF120+]
+ * [NOTE] Recent searches are cleared with history (2811)
+ * [1] https://support.mozilla.org/kb/search-suggestions-firefox ***/
+ // user_pref("browser.urlbar.recentsearches.featureGate", false);
+/* 0810: disable search and form history
+ * [NOTE] We also clear formdata on exit (2811)
+ * [SETUP-WEB] Be aware that autocomplete form data can be read by third parties [1][2]
+ * [SETTING] Privacy & Security>History>Custom Settings>Remember search and form history
+ * [1] https://blog.mindedsecurity.com/2011/10/autocompleteagain.html
+ * [2] https://bugzilla.mozilla.org/381681 ***/
+user_pref("browser.formfill.enable", false);
+/* 0815: disable tab-to-search [FF85+]
+ * Alternatively, you can exclude on a per-engine basis by unchecking them in Options>Search
+ * [SETTING] Search>Address Bar>When using the address bar, suggest>Search engines ***/
+ // user_pref("browser.urlbar.suggest.engines", false);
+/* 0820: disable coloring of visited links
+ * [SETUP-HARDEN] Bulk rapid history sniffing was mitigated in 2010 [1][2]. Slower and more expensive
+ * redraw timing attacks were largely mitigated in FF77+ [3]. Using RFP (4501) further hampers timing
+ * attacks. Don't forget clearing history on exit (2811). However, social engineering [2#limits][4][5]
+ * and advanced targeted timing attacks could still produce usable results
+ * [1] https://developer.mozilla.org/docs/Web/CSS/Privacy_and_the_:visited_selector
+ * [2] https://dbaron.org/mozilla/visited-privacy
+ * [3] https://bugzilla.mozilla.org/1632765
+ * [4] https://earthlng.github.io/testpages/visited_links.html (see github wiki APPENDIX A on how to use)
+ * [5] https://lcamtuf.blogspot.com/2016/08/css-mix-blend-mode-is-bad-for-keeping.html ***/
+ // user_pref("layout.css.visited_links_enabled", false);
+/* 0830: enable separate default search engine in Private Windows and its UI setting
+ * [SETTING] Search>Default Search Engine>Choose a different default search engine for Private Windows only ***/
+user_pref("browser.search.separatePrivateDefault", true); // [FF70+]
+user_pref("browser.search.separatePrivateDefault.ui.enabled", true); // [FF71+]
+
+/*** [SECTION 0900]: PASSWORDS
+ [1] https://support.mozilla.org/kb/use-primary-password-protect-stored-logins-and-pas
+***/
+user_pref("_user.js.parrot", "0900 syntax error: the parrot's expired!");
+/* 0903: disable auto-filling username & password form fields
+ * can leak in cross-site forms *and* be spoofed
+ * [NOTE] Username & password is still available when you enter the field
+ * [SETTING] Privacy & Security>Logins and Passwords>Autofill logins and passwords
+ * [1] https://freedom-to-tinker.com/2017/12/27/no-boundaries-for-user-identities-web-trackers-exploit-browser-login-managers/
+ * [2] https://homes.esat.kuleuven.be/~asenol/leaky-forms/ ***/
+user_pref("signon.autofillForms", false);
+/* 0904: disable formless login capture for Password Manager [FF51+] ***/
+user_pref("signon.formlessCapture.enabled", false);
+/* 0905: limit (or disable) HTTP authentication credentials dialogs triggered by sub-resources [FF41+]
+ * hardens against potential credentials phishing
+ * 0 = don't allow sub-resources to open HTTP authentication credentials dialogs
+ * 1 = don't allow cross-origin sub-resources to open HTTP authentication credentials dialogs
+ * 2 = allow sub-resources to open HTTP authentication credentials dialogs (default) ***/
+user_pref("network.auth.subresource-http-auth-allow", 1);
+/* 0906: enforce no automatic authentication on Microsoft sites [FF91+] [WINDOWS 10+]
+ * [SETTING] Privacy & Security>Logins and Passwords>Allow Windows single sign-on for...
+ * [1] https://support.mozilla.org/kb/windows-sso ***/
+ // user_pref("network.http.windows-sso.enabled", false); // [DEFAULT: false]
+/* 0907: enforce no automatic authentication on Microsoft sites [FF131+] [MAC]
+ * On macOS, SSO only works on corporate devices ***/
+ // user_pref("network.http.microsoft-entra-sso.enabled", false); // [DEFAULT: false]
+
+/*** [SECTION 1000]: DISK AVOIDANCE ***/
+user_pref("_user.js.parrot", "1000 syntax error: the parrot's gone to meet 'is maker!");
+/* 1001: disable disk cache
+ * [NOTE] We also clear cache on exit (2811)
+ * [SETUP-CHROME] If you think disk cache helps perf, then feel free to override this ***/
+user_pref("browser.cache.disk.enable", false);
+/* 1002: set media cache in Private Browsing to in-memory and increase its maximum size
+ * [NOTE] MSE (Media Source Extensions) are already stored in-memory in PB ***/
+user_pref("browser.privatebrowsing.forceMediaMemoryCache", true); // [FF75+]
+user_pref("media.memory_cache_max_size", 65536);
+/* 1003: disable storing extra session data [SETUP-CHROME]
+ * define on which sites to save extra session data such as form content, cookies and POST data
+ * 0=everywhere, 1=unencrypted sites, 2=nowhere ***/
+user_pref("browser.sessionstore.privacy_level", 2);
+/* 1005: disable automatic Firefox start and session restore after reboot [FF62+] [WINDOWS]
+ * [1] https://bugzilla.mozilla.org/603903 ***/
+user_pref("toolkit.winRegisterApplicationRestart", false);
+/* 1006: disable favicons in shortcuts [WINDOWS]
+ * URL shortcuts use a cached randomly named .ico file which is stored in your
+ * profile/shortcutCache directory. The .ico remains after the shortcut is deleted
+ * If set to false then the shortcuts use a generic Firefox icon ***/
+user_pref("browser.shell.shortcutFavicons", false);
+
+/*** [SECTION 1200]: HTTPS (SSL/TLS / OCSP / CERTS / HPKP)
+ Your cipher and other settings can be used in server side fingerprinting
+ [TEST] https://www.ssllabs.com/ssltest/viewMyClient.html
+ [TEST] https://browserleaks.com/ssl
+ [TEST] https://ja3er.com/
+ [1] https://www.securityartwork.es/2017/02/02/tls-client-fingerprinting-with-bro/
+***/
+user_pref("_user.js.parrot", "1200 syntax error: the parrot's a stiff!");
+/** SSL (Secure Sockets Layer) / TLS (Transport Layer Security) ***/
+/* 1201: require safe negotiation
+ * Blocks connections to servers that don't support RFC 5746 [2] as they're potentially vulnerable to a
+ * MiTM attack [3]. A server without RFC 5746 can be safe from the attack if it disables renegotiations
+ * but the problem is that the browser can't know that. Setting this pref to true is the only way for the
+ * browser to ensure there will be no unsafe renegotiations on the channel between the browser and the server
+ * [SETUP-WEB] SSL_ERROR_UNSAFE_NEGOTIATION: is it worth overriding this for that one site?
+ * [STATS] SSL Labs (May 2024) reports over 99.7% of top sites have secure renegotiation [4]
+ * [1] https://wiki.mozilla.org/Security:Renegotiation
+ * [2] https://datatracker.ietf.org/doc/html/rfc5746
+ * [3] https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3555
+ * [4] https://www.ssllabs.com/ssl-pulse/ ***/
+user_pref("security.ssl.require_safe_negotiation", true);
+/* 1206: disable TLS1.3 0-RTT (round-trip time) [FF51+]
+ * This data is not forward secret, as it is encrypted solely under keys derived using
+ * the offered PSK. There are no guarantees of non-replay between connections
+ * [1] https://github.com/tlswg/tls13-spec/issues/1001
+ * [2] https://www.rfc-editor.org/rfc/rfc9001.html#name-replay-attacks-with-0-rtt
+ * [3] https://blog.cloudflare.com/tls-1-3-overview-and-q-and-a/ ***/
+user_pref("security.tls.enable_0rtt_data", false);
+
+/** OCSP (Online Certificate Status Protocol)
+ [1] https://scotthelme.co.uk/revocation-is-broken/
+ [2] https://blog.mozilla.org/security/2013/07/29/ocsp-stapling-in-firefox/
+***/
+/* 1211: enforce OCSP fetching to confirm current validity of certificates
+ * 0=disabled, 1=enabled (default), 2=enabled for EV certificates only
+ * OCSP (non-stapled) leaks information about the sites you visit to the CA (cert authority)
+ * It's a trade-off between security (checking) and privacy (leaking info to the CA)
+ * [NOTE] This pref only controls OCSP fetching and does not affect OCSP stapling
+ * [SETTING] Privacy & Security>Security>Certificates>Query OCSP responder servers...
+ * [1] https://en.wikipedia.org/wiki/Ocsp ***/
+user_pref("security.OCSP.enabled", 1); // [DEFAULT: 1]
+/* 1212: set OCSP fetch failures (non-stapled, see 1211) to hard-fail
+ * [SETUP-WEB] SEC_ERROR_OCSP_SERVER_ERROR
+ * When a CA cannot be reached to validate a cert, Firefox just continues the connection (=soft-fail)
+ * Setting this pref to true tells Firefox to instead terminate the connection (=hard-fail)
+ * It is pointless to soft-fail when an OCSP fetch fails: you cannot confirm a cert is still valid (it
+ * could have been revoked) and/or you could be under attack (e.g. malicious blocking of OCSP servers)
+ * [1] https://blog.mozilla.org/security/2013/07/29/ocsp-stapling-in-firefox/
+ * [2] https://www.imperialviolet.org/2014/04/19/revchecking.html ***/
+user_pref("security.OCSP.require", true);
+
+/** CERTS / HPKP (HTTP Public Key Pinning) ***/
+/* 1223: enable strict PKP (Public Key Pinning)
+ * 0=disabled, 1=allow user MiTM (default; such as your antivirus), 2=strict
+ * [SETUP-WEB] MOZILLA_PKIX_ERROR_KEY_PINNING_FAILURE ***/
+user_pref("security.cert_pinning.enforcement_level", 2);
+/* 1224: enable CRLite [FF73+]
+ * 0 = disabled
+ * 1 = consult CRLite but only collect telemetry
+ * 2 = consult CRLite and enforce both "Revoked" and "Not Revoked" results
+ * 3 = consult CRLite and enforce "Not Revoked" results, but defer to OCSP for "Revoked" (default)
+ * [1] https://bugzilla.mozilla.org/buglist.cgi?bug_id=1429800,1670985,1753071
+ * [2] https://blog.mozilla.org/security/tag/crlite/ ***/
+user_pref("security.remote_settings.crlite_filters.enabled", true);
+user_pref("security.pki.crlite_mode", 2);
+
+/** MIXED CONTENT ***/
+/* 1241: disable insecure passive content (such as images) on https pages ***/
+ // user_pref("security.mixed_content.block_display_content", true); // Defense-in-depth (see 1244)
+/* 1244: enable HTTPS-Only mode in all windows
+ * When the top-level is HTTPS, insecure subresources are also upgraded (silent fail)
+ * [SETTING] to add site exceptions: Padlock>HTTPS-Only mode>On (after "Continue to HTTP Site")
+ * [SETTING] Privacy & Security>HTTPS-Only Mode (and manage exceptions)
+ * [TEST] http://example.com [upgrade]
+ * [TEST] http://httpforever.com/ | http://http.rip [no upgrade] ***/
+user_pref("dom.security.https_only_mode", true); // [FF76+]
+ // user_pref("dom.security.https_only_mode_pbm", true); // [FF80+]
+/* 1245: enable HTTPS-Only mode for local resources [FF77+] ***/
+ // user_pref("dom.security.https_only_mode.upgrade_local", true);
+/* 1246: disable HTTP background requests [FF82+]
+ * When attempting to upgrade, if the server doesn't respond within 3 seconds, Firefox sends
+ * a top-level HTTP request without path in order to check if the server supports HTTPS or not
+ * This is done to avoid waiting for a timeout which takes 90 seconds
+ * [1] https://bugzilla.mozilla.org/buglist.cgi?bug_id=1642387,1660945 ***/
+user_pref("dom.security.https_only_mode_send_http_background_request", false);
+
+/** UI (User Interface) ***/
+/* 1270: display warning on the padlock for "broken security" (if 1201 is false)
+ * Bug: warning padlock not indicated for subresources on a secure page! [2]
+ * [1] https://wiki.mozilla.org/Security:Renegotiation
+ * [2] https://bugzilla.mozilla.org/1353705 ***/
+user_pref("security.ssl.treat_unsafe_negotiation_as_broken", true);
+/* 1272: display advanced information on Insecure Connection warning pages
+ * only works when it's possible to add an exception
+ * i.e. it doesn't work for HSTS discrepancies (https://subdomain.preloaded-hsts.badssl.com/)
+ * [TEST] https://expired.badssl.com/ ***/
+user_pref("browser.xul.error_pages.expert_bad_cert", true);
+
+/*** [SECTION 1600]: REFERERS
+ full URI: https://example.com:8888/foo/bar.html?id=1234
+ scheme+host+port+path: https://example.com:8888/foo/bar.html
+ scheme+host+port: https://example.com:8888
+ [1] https://feeding.cloud.geek.nz/posts/tweaking-referrer-for-privacy-in-firefox/
+***/
+user_pref("_user.js.parrot", "1600 syntax error: the parrot rests in peace!");
+/* 1602: control the amount of cross-origin information to send [FF52+]
+ * 0=send full URI (default), 1=scheme+host+port+path, 2=scheme+host+port ***/
+user_pref("network.http.referer.XOriginTrimmingPolicy", 2);
+
+/*** [SECTION 1700]: CONTAINERS ***/
+user_pref("_user.js.parrot", "1700 syntax error: the parrot's bit the dust!");
+/* 1701: enable Container Tabs and its UI setting [FF50+]
+ * [SETTING] General>Tabs>Enable Container Tabs
+ * https://wiki.mozilla.org/Security/Contextual_Identity_Project/Containers ***/
+user_pref("privacy.userContext.enabled", true);
+user_pref("privacy.userContext.ui.enabled", true);
+/* 1702: set behavior on "+ Tab" button to display container menu on left click [FF74+]
+ * [NOTE] The menu is always shown on long press and right click
+ * [SETTING] General>Tabs>Enable Container Tabs>Settings>Select a container for each new tab ***/
+ // user_pref("privacy.userContext.newTabContainerOnLeftClick.enabled", true);
+/* 1703: set external links to open in site-specific containers [FF123+]
+ * [SETUP-WEB] Depending on your container extension(s) and their settings
+ * true=Firefox will not choose a container (so your extension can)
+ * false=Firefox will choose the container/no-container (default)
+ * [1] https://bugzilla.mozilla.org/1874599 ***/
+ // user_pref("browser.link.force_default_user_context_id_for_external_opens", true);
+
+/*** [SECTION 2000]: PLUGINS / MEDIA / WEBRTC ***/
+user_pref("_user.js.parrot", "2000 syntax error: the parrot's snuffed it!");
+/* 2002: force WebRTC inside the proxy [FF70+] ***/
+user_pref("media.peerconnection.ice.proxy_only_if_behind_proxy", true);
+/* 2003: force a single network interface for ICE candidates generation [FF42+]
+ * When using a system-wide proxy, it uses the proxy interface
+ * [1] https://developer.mozilla.org/docs/Web/API/RTCIceCandidate
+ * [2] https://wiki.mozilla.org/Media/WebRTC/Privacy ***/
+user_pref("media.peerconnection.ice.default_address_only", true);
+/* 2004: force exclusion of private IPs from ICE candidates [FF51+]
+ * [SETUP-HARDEN] This will protect your private IP even in TRUSTED scenarios after you
+ * grant device access, but often results in breakage on video-conferencing platforms ***/
+ // user_pref("media.peerconnection.ice.no_host", true);
+/* 2020: disable GMP (Gecko Media Plugins)
+ * [1] https://wiki.mozilla.org/GeckoMediaPlugins ***/
+ // user_pref("media.gmp-provider.enabled", false);
+
+/*** [SECTION 2400]: DOM (DOCUMENT OBJECT MODEL) ***/
+user_pref("_user.js.parrot", "2400 syntax error: the parrot's kicked the bucket!");
+/* 2402: prevent scripts from moving and resizing open windows ***/
+user_pref("dom.disable_window_move_resize", true);
+
+/*** [SECTION 2600]: MISCELLANEOUS ***/
+user_pref("_user.js.parrot", "2600 syntax error: the parrot's run down the curtain!");
+/* 2603: remove temp files opened from non-PB windows with an external application
+ * [1] https://bugzilla.mozilla.org/buglist.cgi?bug_id=302433,1738574 ***/
+user_pref("browser.download.start_downloads_in_tmp_dir", true); // [FF102+]
+user_pref("browser.helperApps.deleteTempFileOnExit", true);
+/* 2606: disable UITour backend so there is no chance that a remote page can use it ***/
+user_pref("browser.uitour.enabled", false);
+ // user_pref("browser.uitour.url", ""); // Defense-in-depth
+/* 2608: reset remote debugging to disabled
+ * [1] https://gitlab.torproject.org/tpo/applications/tor-browser/-/issues/16222 ***/
+user_pref("devtools.debugger.remote-enabled", false); // [DEFAULT: false]
+/* 2615: disable websites overriding Firefox's keyboard shortcuts [FF58+]
+ * 0 (default) or 1=allow, 2=block
+ * [SETTING] to add site exceptions: Ctrl+I>Permissions>Override Keyboard Shortcuts ***/
+ // user_pref("permissions.default.shortcuts", 2);
+/* 2616: remove special permissions for certain mozilla domains [FF35+]
+ * [1] resource://app/defaults/permissions ***/
+user_pref("permissions.manager.defaultsUrl", "");
+/* 2619: use Punycode in Internationalized Domain Names to eliminate possible spoofing
+ * [SETUP-WEB] Might be undesirable for non-latin alphabet users since legitimate IDN's are also punycoded
+ * [TEST] https://www.xn--80ak6aa92e.com/ (www.apple.com)
+ * [1] https://wiki.mozilla.org/IDN_Display_Algorithm
+ * [2] https://en.wikipedia.org/wiki/IDN_homograph_attack
+ * [3] https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=punycode+firefox
+ * [4] https://www.xudongz.com/blog/2017/idn-phishing/ ***/
+user_pref("network.IDN_show_punycode", true);
+/* 2620: enforce PDFJS, disable PDFJS scripting
+ * This setting controls if the option "Display in Firefox" is available in the setting below
+ * and by effect controls whether PDFs are handled in-browser or externally ("Ask" or "Open With")
+ * [WHY] pdfjs is lightweight, open source, and secure: the last exploit was June 2015 [1]
+ * It doesn't break "state separation" of browser content (by not sharing with OS, independent apps).
+ * It maintains disk avoidance and application data isolation. It's convenient. You can still save to disk.
+ * [NOTE] JS can still force a pdf to open in-browser by bundling its own code
+ * [SETUP-CHROME] You may prefer a different pdf reader for security/workflow reasons
+ * [SETTING] General>Applications>Portable Document Format (PDF)
+ * [1] https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=pdf.js+firefox ***/
+user_pref("pdfjs.disabled", false); // [DEFAULT: false]
+user_pref("pdfjs.enableScripting", false); // [FF86+]
+/* 2624: disable middle click on new tab button opening URLs or searches using clipboard [FF115+] */
+user_pref("browser.tabs.searchclipboardfor.middleclick", false); // [DEFAULT: false NON-LINUX]
+/* 2630: disable content analysis by DLP (Data Loss Prevention) agents
+ * DLP agents are background processes on managed computers that allow enterprises to monitor locally running
+ * applications for data exfiltration events, which they can allow/block based on customer defined DLP policies.
+ * 0=Block all requests, 1=Warn on all requests (which lets the user decide), 2=Allow all requests
+ * [1] https://github.com/chromium/content_analysis_sdk */
+user_pref("browser.contentanalysis.enabled", false); // [FF121+] [DEFAULT: false]
+user_pref("browser.contentanalysis.default_result", 0); // [FF127+] [DEFAULT: 0]
+
+/** DOWNLOADS ***/
+/* 2651: enable user interaction for security by always asking where to download
+ * [SETUP-CHROME] On Android this blocks longtapping and saving images
+ * [SETTING] General>Downloads>Always ask you where to save files ***/
+user_pref("browser.download.useDownloadDir", false);
+/* 2652: disable downloads panel opening on every download [FF96+] ***/
+user_pref("browser.download.alwaysOpenPanel", false);
+/* 2653: disable adding downloads to the system's "recent documents" list ***/
+user_pref("browser.download.manager.addToRecentDocs", false);
+/* 2654: enable user interaction for security by always asking how to handle new mimetypes [FF101+]
+ * [SETTING] General>Files and Applications>What should Firefox do with other files ***/
+user_pref("browser.download.always_ask_before_handling_new_types", true);
+
+/** EXTENSIONS ***/
+/* 2660: limit allowed extension directories
+ * 1=profile, 2=user, 4=application, 8=system, 16=temporary, 31=all
+ * The pref value represents the sum: e.g. 5 would be profile and application directories
+ * [SETUP-CHROME] Breaks usage of files which are installed outside allowed directories
+ * [1] https://archive.is/DYjAM ***/
+user_pref("extensions.enabledScopes", 5); // [HIDDEN PREF]
+ // user_pref("extensions.autoDisableScopes", 15); // [DEFAULT: 15]
+/* 2661: disable bypassing 3rd party extension install prompts [FF82+]
+ * [1] https://bugzilla.mozilla.org/buglist.cgi?bug_id=1659530,1681331 ***/
+user_pref("extensions.postDownloadThirdPartyPrompt", false);
+/* 2662: disable webextension restrictions on certain mozilla domains (you also need 4503) [FF60+]
+ * [1] https://bugzilla.mozilla.org/buglist.cgi?bug_id=1384330,1406795,1415644,1453988 ***/
+ // user_pref("extensions.webextensions.restrictedDomains", "");
+
+/*** [SECTION 2700]: ETP (ENHANCED TRACKING PROTECTION) ***/
+user_pref("_user.js.parrot", "2700 syntax error: the parrot's joined the bleedin' choir invisible!");
+/* 2701: enable ETP Strict Mode [FF86+]
+ * ETP Strict Mode enables Total Cookie Protection (TCP)
+ * [NOTE] Adding site exceptions disables all ETP protections for that site and increases the risk of
+ * cross-site state tracking e.g. exceptions for SiteA and SiteB means PartyC on both sites is shared
+ * [1] https://blog.mozilla.org/security/2021/02/23/total-cookie-protection/
+ * [SETTING] to add site exceptions: Urlbar>ETP Shield
+ * [SETTING] to manage site exceptions: Options>Privacy & Security>Enhanced Tracking Protection>Manage Exceptions ***/
+user_pref("browser.contentblocking.category", "strict"); // [HIDDEN PREF]
+/* 2702: disable ETP web compat features [FF93+]
+ * [SETUP-HARDEN] Includes skip lists, heuristics (SmartBlock) and automatic grants
+ * Opener and redirect heuristics are granted for 30 days, see [3]
+ * [1] https://blog.mozilla.org/security/2021/07/13/smartblock-v2/
+ * [2] https://hg.mozilla.org/mozilla-central/rev/e5483fd469ab#l4.12
+ * [3] https://developer.mozilla.org/docs/Web/Privacy/State_Partitioning#storage_access_heuristics ***/
+ // user_pref("privacy.antitracking.enableWebcompat", false);
+
+/*** [SECTION 2800]: SHUTDOWN & SANITIZING ***/
+user_pref("_user.js.parrot", "2800 syntax error: the parrot's bleedin' demised!");
+/* 2810: enable Firefox to clear items on shutdown
+ * [NOTE] In FF129+ clearing "siteSettings" on shutdown (2811), or manually via site data (2820) and
+ * via history (2830), will no longer remove sanitize on shutdown "cookie and site data" site exceptions (2815)
+ * [SETTING] Privacy & Security>History>Custom Settings>Clear history when Firefox closes | Settings ***/
+user_pref("privacy.sanitize.sanitizeOnShutdown", false);
+
+/** SANITIZE ON SHUTDOWN: IGNORES "ALLOW" SITE EXCEPTIONS | v2 migration is FF128+ ***/
+/* 2811: set/enforce what items to clear on shutdown (if 2810 is true) [SETUP-CHROME]
+ * [NOTE] If "history" is true, downloads will also be cleared ***/
+user_pref("privacy.clearOnShutdown.cache", true); // [DEFAULT: true]
+user_pref("privacy.clearOnShutdown_v2.cache", true); // [FF128+] [DEFAULT: true]
+user_pref("privacy.clearOnShutdown.downloads", true); // [DEFAULT: true]
+user_pref("privacy.clearOnShutdown.formdata", true); // [DEFAULT: true]
+user_pref("privacy.clearOnShutdown.history", true); // [DEFAULT: true]
+user_pref("privacy.clearOnShutdown_v2.historyFormDataAndDownloads", true); // [FF128+] [DEFAULT: true]
+ // user_pref("privacy.clearOnShutdown.siteSettings", false); // [DEFAULT: false]
+ // user_pref("privacy.clearOnShutdown_v2.siteSettings", false); // [FF128+] [DEFAULT: false]
+/* 2812: set Session Restore to clear on shutdown (if 2810 is true) [FF34+]
+ * [NOTE] Not needed if Session Restore is not used (0102) or it is already cleared with history (2811)
+ * [NOTE] If true, this prevents resuming from crashes (also see 5008) ***/
+ // user_pref("privacy.clearOnShutdown.openWindows", true);
+
+/** SANITIZE ON SHUTDOWN: RESPECTS "ALLOW" SITE EXCEPTIONS FF103+ | v2 migration is FF128+ ***/
+/* 2815: set "Cookies" and "Site Data" to clear on shutdown (if 2810 is true) [SETUP-CHROME]
+ * [NOTE] Exceptions: A "cookie" permission also controls "offlineApps" (see note below). For cross-domain logins,
+ * add exceptions for both sites e.g. https://www.youtube.com (site) + https://accounts.google.com (single sign on)
+ * [NOTE] "offlineApps": Offline Website Data: localStorage, service worker cache, QuotaManager (IndexedDB, asm-cache)
+ * [NOTE] "sessions": Active Logins (has no site exceptions): refers to HTTP Basic Authentication [1], not logins via cookies
+ * [WARNING] Be selective with what sites you "Allow", as they also disable partitioning (1767271)
+ * [SETTING] to add site exceptions: Ctrl+I>Permissions>Cookies>Allow (when on the website in question)
+ * [SETTING] to manage site exceptions: Options>Privacy & Security>Permissions>Settings
+ * [1] https://en.wikipedia.org/wiki/Basic_access_authentication ***/
+user_pref("privacy.clearOnShutdown.cookies", false); // Cookies
+user_pref("privacy.clearOnShutdown.offlineApps", true); // Site Data
+user_pref("privacy.clearOnShutdown.sessions", true); // Active Logins [DEFAULT: true]
+user_pref("privacy.clearOnShutdown_v2.cookiesAndStorage", true); // Cookies, Site Data, Active Logins [FF128+]
+
+/** SANITIZE SITE DATA: IGNORES "ALLOW" SITE EXCEPTIONS ***/
+/* 2820: set manual "Clear Data" items [SETUP-CHROME] [FF128+]
+ * Firefox remembers your last choices. This will reset them when you start Firefox
+ * [SETTING] Privacy & Security>Browser Privacy>Cookies and Site Data>Clear Data ***/
+user_pref("privacy.clearSiteData.cache", true);
+user_pref("privacy.clearSiteData.cookiesAndStorage", false); // keep false until it respects "allow" site exceptions
+user_pref("privacy.clearSiteData.historyFormDataAndDownloads", true);
+ // user_pref("privacy.clearSiteData.siteSettings", false);
+
+/** SANITIZE HISTORY: IGNORES "ALLOW" SITE EXCEPTIONS | clearHistory migration is FF128+ ***/
+/* 2830: set manual "Clear History" items, also via Ctrl-Shift-Del [SETUP-CHROME]
+ * Firefox remembers your last choices. This will reset them when you start Firefox
+ * [NOTE] Regardless of what you set "downloads" to, as soon as the dialog
+ * for "Clear Recent History" is opened, it is synced to the same as "history"
+ * [SETTING] Privacy & Security>History>Custom Settings>Clear History ***/
+user_pref("privacy.cpd.cache", true); // [DEFAULT: true]
+user_pref("privacy.clearHistory.cache", true);
+user_pref("privacy.cpd.formdata", true); // [DEFAULT: true]
+user_pref("privacy.cpd.history", true); // [DEFAULT: true]
+ // user_pref("privacy.cpd.downloads", true); // not used, see note above
+user_pref("privacy.clearHistory.historyFormDataAndDownloads", true);
+user_pref("privacy.cpd.cookies", false);
+user_pref("privacy.cpd.sessions", true); // [DEFAULT: true]
+user_pref("privacy.cpd.offlineApps", false); // [DEFAULT: false]
+user_pref("privacy.clearHistory.cookiesAndStorage", false);
+ // user_pref("privacy.cpd.openWindows", false); // Session Restore
+ // user_pref("privacy.cpd.passwords", false);
+ // user_pref("privacy.cpd.siteSettings", false);
+ // user_pref("privacy.clearHistory.siteSettings", false);
+
+/** SANITIZE MANUAL: TIMERANGE ***/
+/* 2840: set "Time range to clear" for "Clear Data" (2820) and "Clear History" (2830)
+ * Firefox remembers your last choice. This will reset the value when you start Firefox
+ * 0=everything, 1=last hour, 2=last two hours, 3=last four hours, 4=today
+ * [NOTE] Values 5 (last 5 minutes) and 6 (last 24 hours) are not listed in the dropdown,
+ * which will display a blank value, and are not guaranteed to work ***/
+user_pref("privacy.sanitize.timeSpan", 0);
+
+/*** [SECTION 4000]: FPP (fingerprintingProtection)
+ RFP (4501) overrides FPP
+
+ In FF118+ FPP is on by default in private windows (4001) and in FF119+ is controlled
+ by ETP (2701). FPP will also use Remote Services in future to relax FPP protections
+ on a per site basis for compatibility (4004).
+
+ https://searchfox.org/mozilla-central/source/toolkit/components/resistfingerprinting/RFPTargetsDefault.inc
+
+ [NOTE] RFPTargets + granular overrides are somewhat experimental and may produce unexpected results
+ - e.g. FrameRate can only be controlled per process, not per origin
+
+ 1826408 - restrict fonts to system (kBaseFonts + kLangPackFonts) (Windows, Mac, some Linux)
+ https://searchfox.org/mozilla-central/search?path=StandardFonts*.inc
+ 1858181 - subtly randomize canvas per eTLD+1, per session and per window-mode (FF120+)
+***/
+user_pref("_user.js.parrot", "4000 syntax error: the parrot's bereft of life!");
+/* 4001: enable FPP in PB mode [FF114+]
+ * [NOTE] In FF119+, FPP for all modes (7016) is enabled with ETP Strict (2701) ***/
+ // user_pref("privacy.fingerprintingProtection.pbmode", true); // [DEFAULT: true FF118+]
+/* 4002: set global FPP overrides [FF114+]
+ * uses "RFPTargets" [1] which despite the name these are not used by RFP
+ * e.g. "+AllTargets,-CSSPrefersColorScheme,-JSDateTimeUTC" = all targets but allow prefers-color-scheme and do not change timezone
+ * e.g. "-AllTargets,+CanvasRandomization,+JSDateTimeUTC" = no targets but do use FPP canvas and change timezone
+ * [NOTE] Not supported by arkenfox. Either use RFP or FPP at defaults
+ * [1] https://searchfox.org/mozilla-central/source/toolkit/components/resistfingerprinting/RFPTargets.inc ***/
+ // user_pref("privacy.fingerprintingProtection.overrides", "");
+/* 4003: set granular FPP overrides
+ * JSON format: e.g."[{\"firstPartyDomain\": \"netflix.com\", \"overrides\": \"-CanvasRandomization,-FrameRate,\"}]"
+ * [NOTE] Not supported by arkenfox. Either use RFP or FPP at defaults ***/
+ // user_pref("privacy.fingerprintingProtection.granularOverrides", "");
+/* 4004: disable remote FPP overrides [FF127+] ***/
+ // user_pref("privacy.fingerprintingProtection.remoteOverrides.enabled", false);
+
+/*** [SECTION 4500]: OPTIONAL RFP (resistFingerprinting)
+ RFP overrides FPP (4000)
+
+ FF128+ Arkenfox by default uses FPP (automatically enabled with ETP Strict). For most people
+ this is all you need. To use RFP instead, add RFP (4501) to your overrides, and optionally
+ add letterboxing (4504), spoof_english (4506), and webgl (4520).
+
+ RFP is an all-or-nothing buy in: you cannot pick and choose what parts you want
+ [TEST] https://arkenfox.github.io/TZP/tzp.html
+
+ [WARNING] DO NOT USE extensions to alter RFP protected metrics
+
+ 418986 - limit window.screen & CSS media queries (FF41)
+ 1360039 - spoof navigator.hardwareConcurrency as 2 (FF55)
+ FF56
+ 1333651 - spoof User Agent & Navigator API
+ version: android version spoofed as ESR (FF119 or lower)
+ OS: JS spoofed as Windows 10, OS 10.15, Android 10, or Linux | HTTP Headers spoofed as Windows or Android
+ 1369319 - disable device sensor API
+ 1369357 - disable site specific zoom
+ 1337161 - hide gamepads from content
+ 1372072 - spoof network information API as "unknown" when dom.netinfo.enabled = true
+ 1333641 - reduce fingerprinting in WebSpeech API
+ FF57
+ 1369309 - spoof media statistics
+ 1382499 - reduce screen co-ordinate fingerprinting in Touch API
+ 1217290 & 1409677 - enable some fingerprinting resistance for WebGL
+ 1354633 - limit MediaError.message to a whitelist
+ FF58+
+ 1372073 - spoof/block fingerprinting in MediaDevices API (FF59)
+ Spoof: enumerate devices as one "Internal Camera" and one "Internal Microphone"
+ Block: suppresses the ondevicechange event
+ 1039069 - warn when language prefs are not set to "en*" (FF59)
+ 1222285 & 1433592 - spoof keyboard events and suppress keyboard modifier events (FF59)
+ Spoofing mimics the content language of the document. Currently it only supports en-US.
+ Modifier events suppressed are SHIFT and both ALT keys. Chrome is not affected.
+ 1337157 - disable WebGL debug renderer info (FF60)
+ 1459089 - disable OS locale in HTTP Accept-Language headers (ANDROID) (FF62)
+ 1479239 - return "no-preference" with prefers-reduced-motion (FF63)
+ 1363508 & 1826051 - spoof/suppress Pointer Events (FF64, FF132)
+ 1492766 - spoof pointerEvent.pointerid (FF65)
+ 1485266 - disable exposure of system colors to CSS or canvas (FF67)
+ 1494034 - return "light" with prefers-color-scheme (FF67)
+ 1564422 - spoof audioContext outputLatency (FF70)
+ 1595823 - return audioContext sampleRate as 44100 (FF72)
+ 1607316 - spoof pointer as coarse and hover as none (ANDROID) (FF74)
+ 1621433 - randomize canvas (previously FF58+ returned an all-white canvas) (FF78)
+ 1506364 - return "no-preference" with prefers-contrast (FF80)
+ 1653987 - limit font visibility to bundled and "Base Fonts" (Windows, Mac, some Linux) (FF80)
+ 1461454 - spoof smooth=true and powerEfficient=false for supported media in MediaCapabilities (FF82)
+ 531915 - use fdlibm's sin, cos and tan in jsmath (FF93, ESR91.1)
+ 1756280 - enforce navigator.pdfViewerEnabled as true and plugins/mimeTypes as hard-coded values (FF100-115)
+ 1692609 - reduce JS timing precision to 16.67ms (previously FF55+ was 100ms) (FF102)
+ 1422237 - return "srgb" with color-gamut (FF110)
+ 1794628 - return "none" with inverted-colors (FF114)
+ 1787790 - normalize system fonts (FF128)
+ 1835987 - spoof timezone as Atlantic/Reykjavik (previously FF55+ was UTC) (FF128)
+ 1834307 - always use smooth scrolling (FF132)
+ 1918202 - spoof screen orientation based on spoofed screen size and platform (FF132)
+ previously it always returned landscape-primary and an angle of 0 (FF50+)
+ 1390465 - load all subtitles in WebVTT (Video Text Tracks) (FF133)
+ 1873382 - make spoofed devicePixelRatio and CSS media queries match (FF133)
+ previously FF41+ devicePixelRatio was hardcoded as 1 and FF127+ as 2
+ previously FF41+ CSS media queries were spoofed as zoom level at a devicePixelRatio of 1
+***/
+user_pref("_user.js.parrot", "4500 syntax error: the parrot's popped 'is clogs");
+/* 4501: enable RFP
+ * [NOTE] pbmode applies if true and the original pref is false
+ * [SETUP-WEB] RFP can cause some website breakage: mainly canvas, use a canvas site exception via the urlbar.
+ * RFP also has a few side effects: mainly that timezone is GMT, and websites will prefer light theme ***/
+ // user_pref("privacy.resistFingerprinting", true); // [FF41+]
+ // user_pref("privacy.resistFingerprinting.pbmode", true); // [FF114+]
+/* 4502: set RFP new window size max rounded values [FF55+]
+ * [SETUP-CHROME] sizes round down in hundreds: width to 200s and height to 100s, to fit your screen
+ * [1] https://bugzilla.mozilla.org/1330882 ***/
+user_pref("privacy.window.maxInnerWidth", 1600);
+user_pref("privacy.window.maxInnerHeight", 900);
+/* 4503: disable mozAddonManager Web API [FF57+]
+ * [NOTE] To allow extensions to work on AMO, you also need 2662
+ * [1] https://bugzilla.mozilla.org/buglist.cgi?bug_id=1384330,1406795,1415644,1453988 ***/
+user_pref("privacy.resistFingerprinting.block_mozAddonManager", true);
+/* 4504: enable letterboxing [FF67+]
+ * Dynamically resizes the inner window by applying margins in stepped ranges [2]
+ * If you use the dimension pref, then it will only apply those resolutions.
+ * The format is "width1xheight1, width2xheight2, ..." (e.g. "800x600, 1000x1000")
+ * [SETUP-WEB] This is independent of RFP (4501). If you're not using RFP, or you are but
+ * dislike the margins, then flip this pref, keeping in mind that it is effectively fingerprintable
+ * [WARNING] DO NOT USE: the dimension pref is only meant for testing
+ * [1] https://bugzilla.mozilla.org/1407366
+ * [2] https://hg.mozilla.org/mozilla-central/rev/7211cb4f58ff#l5.13 ***/
+ // user_pref("privacy.resistFingerprinting.letterboxing", true); // [HIDDEN PREF]
+ // user_pref("privacy.resistFingerprinting.letterboxing.dimensions", ""); // [HIDDEN PREF]
+/* 4505: disable RFP by domain [FF91+]
+ * [NOTE] Working examples: "arkenfox.github.io", "*github.io"
+ * Non-working examples: "https://arkenfox.github.io", "github.io", "*arkenfox.github.io" ***/
+ // user_pref("privacy.resistFingerprinting.exemptedDomains", "*.example.invalid");
+/* 4506: disable RFP spoof english prompt [FF59+]
+ * 0=prompt, 1=disabled, 2=enabled
+ * [NOTE] When changing from value 2, preferred languages ('intl.accept_languages') is not reset.
+ * [SETUP-WEB] when enabled, sets 'en-US, en' for displaying pages and 'en-US' as locale.
+ * [SETTING] General>Language>Choose your preferred language for displaying pages>Choose>Request English... ***/
+user_pref("privacy.spoof_english", 1);
+/* 4510: disable using system colors
+ * [SETTING] General>Language and Appearance>Fonts and Colors>Colors>Use system colors ***/
+user_pref("browser.display.use_system_colors", false); // [DEFAULT: false NON-WINDOWS]
+/* 4511: disable using system accent colors ***/
+user_pref("widget.non-native-theme.use-theme-accent", false); // [DEFAULT: false WINDOWS]
+/* 4512: enforce links targeting new windows to open in a new tab instead
+ * 1=most recent window or tab, 2=new window, 3=new tab
+ * Stops malicious window sizes and some screen resolution leaks.
+ * You can still right-click a link and open in a new window
+ * [SETTING] General>Tabs>Open links in tabs instead of new windows
+ * [TEST] https://arkenfox.github.io/TZP/tzp.html#screen
+ * [1] https://gitlab.torproject.org/tpo/applications/tor-browser/-/issues/9881 ***/
+user_pref("browser.link.open_newwindow", 3); // [DEFAULT: 3]
+/* 4513: set all open window methods to abide by "browser.link.open_newwindow" (4512)
+ * [1] https://searchfox.org/mozilla-central/source/dom/tests/browser/browser_test_new_window_from_content.js ***/
+user_pref("browser.link.open_newwindow.restriction", 0);
+/* 4520: disable WebGL (Web Graphics Library) ***/
+ // user_pref("webgl.disabled", true);
+
+/*** [SECTION 5000]: OPTIONAL OPSEC
+ Disk avoidance, application data isolation, eyeballs...
+***/
+user_pref("_user.js.parrot", "5000 syntax error: the parrot's taken 'is last bow");
+/* 5001: start Firefox in PB (Private Browsing) mode
+ * [NOTE] In this mode all windows are "private windows" and the PB mode icon is not displayed
+ * [NOTE] The P in PB mode can be misleading: it means no "persistent" disk state such as history,
+ * caches, searches, cookies, localStorage, IndexedDB etc (which you can achieve in normal mode).
+ * In fact, PB mode limits or removes the ability to control some of these, and you need to quit
+ * Firefox to clear them. PB is best used as a one off window (Menu>New Private Window) to provide
+ * a temporary self-contained new session. Close all private windows to clear the PB session.
+ * [SETTING] Privacy & Security>History>Custom Settings>Always use private browsing mode
+ * [1] https://wiki.mozilla.org/Private_Browsing
+ * [2] https://support.mozilla.org/kb/common-myths-about-private-browsing ***/
+ // user_pref("browser.privatebrowsing.autostart", true);
+/* 5002: disable memory cache
+ * capacity: -1=determine dynamically (default), 0=none, n=memory capacity in kibibytes ***/
+ // user_pref("browser.cache.memory.enable", false);
+ // user_pref("browser.cache.memory.capacity", 0);
+/* 5003: disable saving passwords
+ * [NOTE] This does not clear any passwords already saved
+ * [SETTING] Privacy & Security>Logins and Passwords>Ask to save logins and passwords for websites ***/
+ // user_pref("signon.rememberSignons", false);
+/* 5004: disable permissions manager from writing to disk [FF41+] [RESTART]
+ * [NOTE] This means any permission changes are session only
+ * [1] https://bugzilla.mozilla.org/967812 ***/
+ // user_pref("permissions.memory_only", true); // [HIDDEN PREF]
+/* 5005: disable intermediate certificate caching [FF41+] [RESTART]
+ * [NOTE] This affects login/cert/key dbs. The effect is all credentials are session-only.
+ * Saved logins and passwords are not available. Reset the pref and restart to return them ***/
+ // user_pref("security.nocertdb", true);
+/* 5006: disable favicons in history and bookmarks
+ * [NOTE] Stored as data blobs in favicons.sqlite, these don't reveal anything that your
+ * actual history (and bookmarks) already do. Your history is more detailed, so
+ * control that instead; e.g. disable history, clear history on exit, use PB mode
+ * [NOTE] favicons.sqlite is sanitized on Firefox close ***/
+ // user_pref("browser.chrome.site_icons", false);
+/* 5007: exclude "Undo Closed Tabs" in Session Restore ***/
+ // user_pref("browser.sessionstore.max_tabs_undo", 0);
+/* 5008: disable resuming session from crash
+ * [TEST] about:crashparent ***/
+ // user_pref("browser.sessionstore.resume_from_crash", false);
+/* 5009: disable "open with" in download dialog [FF50+]
+ * Application data isolation [1]
+ * [1] https://bugzilla.mozilla.org/1281959 ***/
+ // user_pref("browser.download.forbid_open_with", true);
+/* 5010: disable location bar suggestion types
+ * [SETTING] Search>Address Bar>When using the address bar, suggest ***/
+ // user_pref("browser.urlbar.suggest.history", false);
+ // user_pref("browser.urlbar.suggest.bookmark", false);
+ // user_pref("browser.urlbar.suggest.openpage", false);
+ // user_pref("browser.urlbar.suggest.topsites", false); // [FF78+]
+/* 5011: disable location bar dropdown
+ * This value controls the total number of entries to appear in the location bar dropdown ***/
+ // user_pref("browser.urlbar.maxRichResults", 0);
+/* 5012: disable location bar autofill
+ * [1] https://support.mozilla.org/kb/address-bar-autocomplete-firefox#w_url-autocomplete ***/
+ // user_pref("browser.urlbar.autoFill", false);
+/* 5013: disable browsing and download history
+ * [NOTE] We also clear history and downloads on exit (2811)
+ * [SETTING] Privacy & Security>History>Custom Settings>Remember browsing and download history ***/
+ // user_pref("places.history.enabled", false);
+/* 5014: disable Windows jumplist [WINDOWS] ***/
+ // user_pref("browser.taskbar.lists.enabled", false);
+ // user_pref("browser.taskbar.lists.frequent.enabled", false);
+ // user_pref("browser.taskbar.lists.recent.enabled", false);
+ // user_pref("browser.taskbar.lists.tasks.enabled", false);
+/* 5016: discourage downloading to desktop
+ * 0=desktop, 1=downloads (default), 2=custom
+ * [SETTING] To set your custom default "downloads": General>Downloads>Save files to ***/
+ // user_pref("browser.download.folderList", 2);
+/* 5017: disable Form Autofill
+ * If .supportedCountries includes your region (browser.search.region) and .supported
+ * is "detect" (default), then the UI will show. Stored data is not secure, uses JSON
+ * [SETTING] Privacy & Security>Forms and Autofill>Autofill addresses
+ * [1] https://wiki.mozilla.org/Firefox/Features/Form_Autofill ***/
+ // user_pref("extensions.formautofill.addresses.enabled", false); // [FF55+]
+ // user_pref("extensions.formautofill.creditCards.enabled", false); // [FF56+]
+/* 5018: limit events that can cause a pop-up ***/
+ // user_pref("dom.popup_allowed_events", "click dblclick mousedown pointerdown");
+/* 5019: disable page thumbnail collection ***/
+ // user_pref("browser.pagethumbnails.capturing_disabled", true); // [HIDDEN PREF]
+/* 5020: disable Windows native notifications and use app notications instead [FF111+] [WINDOWS] ***/
+ // user_pref("alerts.useSystemBackend.windows.notificationserver.enabled", false);
+/* 5021: disable location bar using search
+ * Don't leak URL typos to a search engine, give an error message instead
+ * Examples: "secretplace,com", "secretplace/com", "secretplace com", "secret place.com"
+ * [NOTE] This does not affect explicit user action such as using search buttons in the
+ * dropdown, or using keyword search shortcuts you configure in options (e.g. "d" for DuckDuckGo) ***/
+ // user_pref("keyword.enabled", false);
+
+/*** [SECTION 5500]: OPTIONAL HARDENING
+ Not recommended. Overriding these can cause breakage and performance issues,
+ they are mostly fingerprintable, and the threat model is practically nonexistent
+***/
+user_pref("_user.js.parrot", "5500 syntax error: this is an ex-parrot!");
+/* 5501: disable MathML (Mathematical Markup Language) [FF51+]
+ * [1] https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=mathml ***/
+ // user_pref("mathml.disabled", true); // 1173199
+/* 5502: disable in-content SVG (Scalable Vector Graphics) [FF53+]
+ * [1] https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=firefox+svg ***/
+ // user_pref("svg.disabled", true); // 1216893
+/* 5503: disable graphite
+ * [1] https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=firefox+graphite
+ * [2] https://en.wikipedia.org/wiki/Graphite_(SIL) ***/
+ // user_pref("gfx.font_rendering.graphite.enabled", false);
+/* 5504: disable asm.js [FF22+]
+ * [1] http://asmjs.org/
+ * [2] https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=asm.js
+ * [3] https://rh0dev.github.io/blog/2017/the-return-of-the-jit/ ***/
+ // user_pref("javascript.options.asmjs", false);
+/* 5505: disable Ion and baseline JIT to harden against JS exploits [RESTART]
+ * [NOTE] When both Ion and JIT are disabled, and trustedprincipals
+ * is enabled, then Ion can still be used by extensions (1599226)
+ * [1] https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=firefox+jit
+ * [2] https://microsoftedge.github.io/edgevr/posts/Super-Duper-Secure-Mode/ ***/
+ // user_pref("javascript.options.ion", false);
+ // user_pref("javascript.options.baselinejit", false);
+ // user_pref("javascript.options.jit_trustedprincipals", true); // [FF75+] [HIDDEN PREF]
+/* 5506: disable WebAssembly [FF52+]
+ * Vulnerabilities [1] have increasingly been found, including those known and fixed
+ * in native programs years ago [2]. WASM has powerful low-level access, making
+ * certain attacks (brute-force) and vulnerabilities more possible
+ * [STATS] ~0.2% of websites, about half of which are for cryptomining / malvertising [2][3]
+ * [1] https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=wasm
+ * [2] https://spectrum.ieee.org/tech-talk/telecom/security/more-worries-over-the-security-of-web-assembly
+ * [3] https://www.zdnet.com/article/half-of-the-websites-using-webassembly-use-it-for-malicious-purposes ***/
+ // user_pref("javascript.options.wasm", false);
+/* 5507: disable rendering of SVG OpenType fonts ***/
+ // user_pref("gfx.font_rendering.opentype_svg.enabled", false);
+/* 5508: disable all DRM content (EME: Encryption Media Extension)
+ * Optionally hide the UI setting which also disables the DRM prompt
+ * [SETTING] General>DRM Content>Play DRM-controlled content
+ * [TEST] https://bitmovin.com/demos/drm
+ * [1] https://www.eff.org/deeplinks/2017/10/drms-dead-canary-how-we-just-lost-web-what-we-learned-it-and-what-we-need-do-next ***/
+ // user_pref("media.eme.enabled", false);
+ // user_pref("browser.eme.ui.enabled", false);
+/* 5509: disable IPv6 if using a VPN
+ * This is an application level fallback. Disabling IPv6 is best done at an OS/network
+ * level, and/or configured properly in system wide VPN setups.
+ * [NOTE] PHP defaults to IPv6 with "localhost". Use "php -S 127.0.0.1:PORT"
+ * [SETUP-WEB] PR_CONNECT_RESET_ERROR
+ * [TEST] https://ipleak.org/
+ * [1] https://www.internetsociety.org/tag/ipv6-security/ (Myths 2,4,5,6) ***/
+ // user_pref("network.dns.disableIPv6", true);
+/* 5510: control when to send a cross-origin referer
+ * 0=always (default), 1=only if base domains match, 2=only if hosts match
+ * [NOTE] Will cause breakage: older modems/routers and some sites e.g banks, vimeo, icloud, instagram ***/
+ // user_pref("network.http.referer.XOriginPolicy", 2);
+/* 5511: set DoH bootstrap address [FF89+]
+ * Firefox uses the system DNS to initially resolve the IP address of your DoH server.
+ * When set to a valid, working value that matches your "network.trr.uri" (0712) Firefox
+ * won't use the system DNS. If the IP doesn't match then DoH won't work ***/
+ // user_pref("network.trr.bootstrapAddr", "10.0.0.1"); // [HIDDEN PREF]
+
+/*** [SECTION 6000]: DON'T TOUCH ***/
+user_pref("_user.js.parrot", "6000 syntax error: the parrot's 'istory!");
+/* 6001: enforce Firefox blocklist
+ * [WHY] It includes updates for "revoked certificates"
+ * [1] https://blog.mozilla.org/security/2015/03/03/revoking-intermediate-certificates-introducing-onecrl/ ***/
+user_pref("extensions.blocklist.enabled", true); // [DEFAULT: true]
+/* 6002: enforce no referer spoofing
+ * [WHY] Spoofing can affect CSRF (Cross-Site Request Forgery) protections ***/
+user_pref("network.http.referer.spoofSource", false); // [DEFAULT: false]
+/* 6004: enforce a security delay on some confirmation dialogs such as install, open/save
+ * [1] https://www.squarefree.com/2004/07/01/race-conditions-in-security-dialogs/ ***/
+user_pref("security.dialog_enable_delay", 1000); // [DEFAULT: 1000]
+/* 6008: enforce no First Party Isolation [FF51+]
+ * [WARNING] Replaced with network partitioning (FF85+) and TCP (2701), and enabling FPI
+ * disables those. FPI is no longer maintained except at Tor Project for Tor Browser's config ***/
+user_pref("privacy.firstparty.isolate", false); // [DEFAULT: false]
+/* 6009: enforce SmartBlock shims (about:compat) [FF81+]
+ * [1] https://blog.mozilla.org/security/2021/03/23/introducing-smartblock/ ***/
+user_pref("extensions.webcompat.enable_shims", true); // [HIDDEN PREF] [DEFAULT: true]
+/* 6010: enforce no TLS 1.0/1.1 downgrades
+ * [TEST] https://tls-v1-1.badssl.com:1010/ ***/
+user_pref("security.tls.version.enable-deprecated", false); // [DEFAULT: false]
+/* 6011: enforce disabling of Web Compatibility Reporter [FF56+]
+ * Web Compatibility Reporter adds a "Report Site Issue" button to send data to Mozilla
+ * [WHY] To prevent wasting Mozilla's time with a custom setup ***/
+user_pref("extensions.webcompat-reporter.enabled", false); // [DEFAULT: false]
+/* 6012: enforce Quarantined Domains [FF115+]
+ * [WHY] https://support.mozilla.org/kb/quarantined-domains */
+user_pref("extensions.quarantinedDomains.enabled", true); // [DEFAULT: true]
+/* 6050: prefsCleaner: previously active items removed from arkenfox 115-127 ***/
+ // user_pref("accessibility.force_disabled", "");
+ // user_pref("browser.urlbar.dnsResolveSingleWordsAfterSearch", "");
+ // user_pref("geo.provider.network.url", "");
+ // user_pref("geo.provider.network.logging.enabled", "");
+ // user_pref("geo.provider.use_gpsd", "");
+ // user_pref("network.protocol-handler.external.ms-windows-store", "");
+ // user_pref("privacy.partition.always_partition_third_party_non_cookie_storage", "");
+ // user_pref("privacy.partition.always_partition_third_party_non_cookie_storage.exempt_sessionstorage", "");
+ // user_pref("privacy.partition.serviceWorkers", "");
+
+/*** [SECTION 7000]: DON'T BOTHER ***/
+user_pref("_user.js.parrot", "7000 syntax error: the parrot's pushing up daisies!");
+/* 7001: disable APIs
+ * Location-Aware Browsing, Full Screen
+ * [WHY] The API state is easily fingerprintable.
+ * Geo is behind a prompt (7002). Full screen requires user interaction ***/
+ // user_pref("geo.enabled", false);
+ // user_pref("full-screen-api.enabled", false);
+/* 7002: set default permissions
+ * Location, Camera, Microphone, Notifications [FF58+] Virtual Reality [FF73+]
+ * 0=always ask (default), 1=allow, 2=block
+ * [WHY] These are fingerprintable via Permissions API, except VR. Just add site
+ * exceptions as allow/block for frequently visited/annoying sites: i.e. not global
+ * [SETTING] to add site exceptions: Ctrl+I>Permissions>
+ * [SETTING] to manage site exceptions: Options>Privacy & Security>Permissions>Settings ***/
+ // user_pref("permissions.default.geo", 0);
+ // user_pref("permissions.default.camera", 0);
+ // user_pref("permissions.default.microphone", 0);
+ // user_pref("permissions.default.desktop-notification", 0);
+ // user_pref("permissions.default.xr", 0); // Virtual Reality
+/* 7003: disable non-modern cipher suites [1]
+ * [WHY] Passive fingerprinting. Minimal/non-existent threat of downgrade attacks
+ * [1] https://browserleaks.com/ssl ***/
+ // user_pref("security.ssl3.ecdhe_ecdsa_aes_128_sha", false);
+ // user_pref("security.ssl3.ecdhe_ecdsa_aes_256_sha", false);
+ // user_pref("security.ssl3.ecdhe_rsa_aes_128_sha", false);
+ // user_pref("security.ssl3.ecdhe_rsa_aes_256_sha", false);
+ // user_pref("security.ssl3.rsa_aes_128_gcm_sha256", false); // no PFS
+ // user_pref("security.ssl3.rsa_aes_256_gcm_sha384", false); // no PFS
+ // user_pref("security.ssl3.rsa_aes_128_sha", false); // no PFS
+ // user_pref("security.ssl3.rsa_aes_256_sha", false); // no PFS
+/* 7004: control TLS versions
+ * [WHY] Passive fingerprinting and security ***/
+ // user_pref("security.tls.version.min", 3); // [DEFAULT: 3]
+ // user_pref("security.tls.version.max", 4);
+/* 7005: disable SSL session IDs [FF36+]
+ * [WHY] Passive fingerprinting and perf costs. These are session-only
+ * and isolated with network partitioning (FF85+) and/or containers ***/
+ // user_pref("security.ssl.disable_session_identifiers", true);
+/* 7007: referers
+ * [WHY] Only cross-origin referers (1602, 5510) matter ***/
+ // user_pref("network.http.sendRefererHeader", 2);
+ // user_pref("network.http.referer.trimmingPolicy", 0);
+/* 7008: set the default Referrer Policy [FF59+]
+ * 0=no-referer, 1=same-origin, 2=strict-origin-when-cross-origin, 3=no-referrer-when-downgrade
+ * [WHY] Defaults are fine. They can be overridden by a site-controlled Referrer Policy ***/
+ // user_pref("network.http.referer.defaultPolicy", 2); // [DEFAULT: 2]
+ // user_pref("network.http.referer.defaultPolicy.pbmode", 2); // [DEFAULT: 2]
+/* 7010: disable HTTP Alternative Services [FF37+]
+ * [WHY] Already isolated with network partitioning (FF85+) ***/
+ // user_pref("network.http.altsvc.enabled", false);
+/* 7011: disable website control over browser right-click context menu
+ * [WHY] Just use Shift-Right-Click ***/
+ // user_pref("dom.event.contextmenu.enabled", false);
+/* 7012: disable icon fonts (glyphs) and local fallback rendering
+ * [WHY] Breakage, font fallback is equivalency, also RFP
+ * [1] https://bugzilla.mozilla.org/789788
+ * [2] https://gitlab.torproject.org/legacy/trac/-/issues/8455 ***/
+ // user_pref("gfx.downloadable_fonts.enabled", false); // [FF41+]
+ // user_pref("gfx.downloadable_fonts.fallback_delay", -1);
+/* 7013: disable Clipboard API
+ * [WHY] Fingerprintable. Breakage. Cut/copy/paste require user
+ * interaction, and paste is limited to focused editable fields ***/
+ // user_pref("dom.event.clipboardevents.enabled", false);
+/* 7014: disable System Add-on updates
+ * [WHY] It can compromise security. System addons ship with prefs, use those ***/
+ // user_pref("extensions.systemAddon.update.enabled", false); // [FF62+]
+ // user_pref("extensions.systemAddon.update.url", ""); // [FF44+]
+/* 7015: enable the DNT (Do Not Track) HTTP header
+ * [WHY] DNT is enforced with Tracking Protection which is used in ETP Strict (2701) ***/
+ // user_pref("privacy.donottrackheader.enabled", true);
+/* 7016: customize ETP settings
+ * [NOTE] FPP (fingerprintingProtection) is ignored when RFP (4501) is enabled
+ * [WHY] Arkenfox only supports strict (2701) which sets these at runtime ***/
+ // user_pref("network.cookie.cookieBehavior", 5); // [DEFAULT: 5]
+ // user_pref("network.cookie.cookieBehavior.optInPartitioning", true); // [ETP FF132+]
+ // user_pref("network.http.referer.disallowCrossSiteRelaxingDefault", true);
+ // user_pref("network.http.referer.disallowCrossSiteRelaxingDefault.top_navigation", true); // [FF100+]
+ // user_pref("privacy.bounceTrackingProtection.mode", 1); // [FF131+] [ETP FF133+]
+ // user_pref("privacy.fingerprintingProtection", true); // [FF114+] [ETP FF119+]
+ // user_pref("privacy.partition.network_state.ocsp_cache", true); // [DEFAULT: true FF123+]
+ // user_pref("privacy.query_stripping.enabled", true); // [FF101+]
+ // user_pref("privacy.trackingprotection.enabled", true);
+ // user_pref("privacy.trackingprotection.socialtracking.enabled", true);
+ // user_pref("privacy.trackingprotection.cryptomining.enabled", true); // [DEFAULT: true]
+ // user_pref("privacy.trackingprotection.fingerprinting.enabled", true); // [DEFAULT: true]
+/* 7017: disable service workers
+ * [WHY] Already isolated with TCP (2701) behind a pref (2710) ***/
+ // user_pref("dom.serviceWorkers.enabled", false);
+/* 7018: disable Web Notifications [FF22+]
+ * [WHY] Web Notifications are behind a prompt (7002)
+ * [1] https://blog.mozilla.org/en/products/firefox/block-notification-requests/ ***/
+ // user_pref("dom.webnotifications.enabled", false);
+/* 7019: disable Push Notifications [FF44+]
+ * [WHY] Website "push" requires subscription, and the API is required for CRLite (1224)
+ * [NOTE] To remove all subscriptions, reset "dom.push.userAgentID"
+ * [1] https://support.mozilla.org/kb/push-notifications-firefox ***/
+ // user_pref("dom.push.enabled", false);
+/* 7020: disable WebRTC (Web Real-Time Communication)
+ * [WHY] Firefox desktop uses mDNS hostname obfuscation and the private IP is never exposed until
+ * required in TRUSTED scenarios; i.e. after you grant device (microphone or camera) access
+ * [TEST] https://browserleaks.com/webrtc
+ * [1] https://groups.google.com/g/discuss-webrtc/c/6stQXi72BEU/m/2FwZd24UAQAJ
+ * [2] https://datatracker.ietf.org/doc/html/draft-ietf-mmusic-mdns-ice-candidates#section-3.1.1 ***/
+ // user_pref("media.peerconnection.enabled", false);
+/* 7021: enable GPC (Global Privacy Control) in non-PB windows
+ * [WHY] Passive and active fingerprinting. Mostly redundant with Tracking Protection
+ * in ETP Strict (2701) and sanitizing on close (2800s) ***/
+ // user_pref("privacy.globalprivacycontrol.enabled", true);
+
+/*** [SECTION 8000]: DON'T BOTHER: FINGERPRINTING
+ [WHY] They are insufficient to help anti-fingerprinting and do more harm than good
+ [WARNING] DO NOT USE with RFP. RFP already covers these and they can interfere
+***/
+user_pref("_user.js.parrot", "8000 syntax error: the parrot's crossed the Jordan");
+/* 8001: prefsCleaner: reset items useless for anti-fingerprinting ***/
+ // user_pref("browser.display.use_document_fonts", "");
+ // user_pref("browser.zoom.siteSpecific", "");
+ // user_pref("device.sensors.enabled", "");
+ // user_pref("dom.enable_performance", "");
+ // user_pref("dom.enable_resource_timing", "");
+ // user_pref("dom.gamepad.enabled", "");
+ // user_pref("dom.maxHardwareConcurrency", "");
+ // user_pref("dom.w3c_touch_events.enabled", "");
+ // user_pref("dom.webaudio.enabled", "");
+ // user_pref("font.system.whitelist", "");
+ // user_pref("general.appname.override", "");
+ // user_pref("general.appversion.override", "");
+ // user_pref("general.buildID.override", "");
+ // user_pref("general.oscpu.override", "");
+ // user_pref("general.platform.override", "");
+ // user_pref("general.useragent.override", "");
+ // user_pref("media.navigator.enabled", "");
+ // user_pref("media.ondevicechange.enabled", "");
+ // user_pref("media.video_stats.enabled", "");
+ // user_pref("media.webspeech.synth.enabled", "");
+ // user_pref("ui.use_standins_for_native_colors", "");
+ // user_pref("webgl.enable-debug-renderer-info", "");
+
+/*** [SECTION 9000]: NON-PROJECT RELATED ***/
+user_pref("_user.js.parrot", "9000 syntax error: the parrot's cashed in 'is chips!");
+/* 9001: disable welcome notices ***/
+user_pref("browser.startup.homepage_override.mstone", "ignore"); // [HIDDEN PREF]
+/* 9002: disable General>Browsing>Recommend extensions/features as you browse [FF67+] ***/
+user_pref("browser.newtabpage.activity-stream.asrouter.userprefs.cfr.addons", false);
+user_pref("browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features", false);
+/* 9004: disable search terms [FF110+]
+ * [SETTING] Search>Search Bar>Use the address bar for search and navigation>Show search terms instead of URL... ***/
+user_pref("browser.urlbar.showSearchTerms.enabled", false);
+
+/*** [SECTION 9999]: DEPRECATED / RENAMED ***/
+user_pref("_user.js.parrot", "9999 syntax error: the parrot's shuffled off 'is mortal coil!");
+/* ESR115.x still uses all the following prefs
+// [NOTE] replace the * with a slash in the line above to re-enable active ones
+// FF116
+// 4506: set RFP's font visibility level (1402) [FF94+]
+ // [-] https://bugzilla.mozilla.org/1838415
+ // user_pref("layout.css.font-visibility.resistFingerprinting", 1); // [DEFAULT: 1]
+// FF117
+// 1221: disable Windows Microsoft Family Safety cert [FF50+] [WINDOWS]
+ // 0=disable detecting Family Safety mode and importing the root
+ // 1=only attempt to detect Family Safety mode (don't import the root)
+ // 2=detect Family Safety mode and import the root
+ // [1] https://gitlab.torproject.org/tpo/applications/tor-browser/-/issues/21686
+ // [-] https://bugzilla.mozilla.org/1844908
+user_pref("security.family_safety.mode", 0);
+// 7018: disable service worker Web Notifications [FF44+]
+ // [WHY] Web Notifications are behind a prompt (7002)
+ // [1] https://blog.mozilla.org/en/products/firefox/block-notification-requests/
+ // [-] https://bugzilla.mozilla.org/1842457
+ // user_pref("dom.webnotifications.serviceworker.enabled", false);
+// FF118
+// 1402: limit font visibility (Windows, Mac, some Linux) [FF94+]
+ // Uses hardcoded lists with two parts: kBaseFonts + kLangPackFonts [1], bundled fonts are auto-allowed
+ // In normal windows: uses the first applicable: RFP over TP over Standard
+ // In Private Browsing windows: uses the most restrictive between normal and private
+ // 1=only base system fonts, 2=also fonts from optional language packs, 3=also user-installed fonts
+ // [1] https://searchfox.org/mozilla-central/search?path=StandardFonts*.inc
+ // [-] https://bugzilla.mozilla.org/1847599
+ // user_pref("layout.css.font-visibility.private", 1);
+ // user_pref("layout.css.font-visibility.standard", 1);
+ // user_pref("layout.css.font-visibility.trackingprotection", 1);
+// 2623: disable permissions delegation [FF73+]
+ // Currently applies to cross-origin geolocation, camera, mic and screen-sharing
+ // permissions, and fullscreen requests. Disabling delegation means any prompts
+ // for these will show/use their correct 3rd party origin
+ // [1] https://groups.google.com/forum/#!topic/mozilla.dev.platform/BdFOMAuCGW8/discussion
+ // [-] https://bugzilla.mozilla.org/1697151
+ // user_pref("permissions.delegation.enabled", false);
+// FF119
+// 0211: use en-US locale regardless of the system or region locale
+ // [SETUP-WEB] May break some input methods e.g xim/ibus for CJK languages [1]
+ // [1] https://bugzilla.mozilla.org/buglist.cgi?bug_id=867501,1629630
+ // [-] https://bugzilla.mozilla.org/1846224
+ // user_pref("javascript.use_us_english_locale", true); // [HIDDEN PREF]
+// 0711: disable skipping DoH when parental controls are enabled [FF70+]
+ // [-] https://bugzilla.mozilla.org/1586941
+user_pref("network.dns.skipTRR-when-parental-control-enabled", false);
+// FF123
+// 0334: disable PingCentre telemetry (used in several System Add-ons) [FF57+]
+ // Defense-in-depth: currently covered by 0331
+ // [-] https://bugzilla.mozilla.org/1868988
+user_pref("browser.ping-centre.telemetry", false);
+// FF126
+// 9003: disable What's New toolbar icon [FF69+]
+ // [-] https://bugzilla.mozilla.org/1724300
+user_pref("browser.messaging-system.whatsNewPanel.enabled", false);
+// FF127
+ // 2630: disable content analysis by DLP (Data Loss Prevention) agents - replaced by default_result
+ // [-] https://bugzilla.mozilla.org/1880314
+user_pref("browser.contentanalysis.default_allow", false);
+// 4511: enforce non-native widget theme
+ // Security: removes/reduces system API calls, e.g. win32k API [1]
+ // Fingerprinting: provides a uniform look and feel across platforms [2]
+ // [1] https://bugzilla.mozilla.org/1381938
+ // [2] https://bugzilla.mozilla.org/1411425
+ // [-] https://bugzilla.mozilla.org/1848899
+user_pref("widget.non-native-theme.enabled", true); // [DEFAULT: true]
+// ***/
+
+/* ESR128.x still uses all the following prefs
+// [NOTE] replace the * with a slash in the line above to re-enable active ones
+// FF132
+/* 2617: remove webchannel whitelist
+ // [-] https://bugzilla.mozilla.org/1275612
+ // user_pref("webchannel.allowObject.urlWhitelist", "");
+// ***/
+
+/* END: internal custom pref to test for syntax errors ***/
+user_pref("_user.js.parrot", "SUCCESS: No no he's not dead, he's, he's restin'!");
diff --git a/iso/airootfs/usr/share/tonarchy/firefox/profiles.ini b/iso/airootfs/usr/share/tonarchy/firefox/profiles.ini
new file mode 100644
index 0000000..a103bcb
--- /dev/null
+++ b/iso/airootfs/usr/share/tonarchy/firefox/profiles.ini
@@ -0,0 +1,9 @@
+[General]
+StartWithLastProfile=1
+Version=2
+
+[Profile0]
+Name=default
+IsRelative=1
+Path=default
+Default=1
diff --git a/iso/airootfs/usr/share/tonarchy/rofi/config.rasi b/iso/airootfs/usr/share/tonarchy/rofi/config.rasi
new file mode 100644
index 0000000..488136c
--- /dev/null
+++ b/iso/airootfs/usr/share/tonarchy/rofi/config.rasi
@@ -0,0 +1,29 @@
+configuration{
+ modi: ["drun", "window", "run"];
+ icon-theme: "Papirus-Dark";
+ show-icons: true;
+ terminal: "alacritty";
+ drun-display-format: "{icon} {name}";
+ location: 0;
+ disable-history: false;
+ sidebar-mode: false;
+ display-drun: " ";
+ display-run: " ";
+ display-window: " ";
+
+ //adding vim keybindings
+ kb-row-up: "Up,Control+k";
+ kb-row-left: "Left,Control+h";
+ kb-row-right: "Right,Control+l";
+ kb-row-down: "Down,Control+j";
+
+ kb-accept-entry: "Control+z,Control+y,Return,KP_Enter";
+
+ //fixing up
+ kb-remove-to-eol: "";
+ kb-move-char-back: "Control+b";
+ kb-remove-char-back: "BackSpace";
+ kb-move-char-forward: "Control+f";
+ kb-mode-complete: "Control+o";
+}
+@theme "tokyonight.rasi"
diff --git a/iso/airootfs/usr/share/tonarchy/rofi/tokyonight.rasi b/iso/airootfs/usr/share/tonarchy/rofi/tokyonight.rasi
new file mode 100644
index 0000000..bd64a99
--- /dev/null
+++ b/iso/airootfs/usr/share/tonarchy/rofi/tokyonight.rasi
@@ -0,0 +1,137 @@
+/*
+ * Tokyonight colorscheme (big icons) for rofi
+ * User: w8ste
+ */
+
+
+// define colors etc.
+* {
+ bg: #24283b;
+ hv: #9274ca;
+ primary: #444b6a; // TokyoNight bright black
+ ug: #0B2447;
+ font: "Monospace 11";
+ background-color: @bg;
+ //dark: @bg;
+ border: 0px;
+ kl: #7aa2f7;
+ black: #000000;
+
+ transparent: rgba(46,52,64,0);
+}
+
+// defines different aspects of the window
+window {
+ width: 700;
+ /*since line wont work with height, i comment it out
+ if you rather control the size via height
+ just comment it out */
+ //height: 500;
+
+ orientation: horizontal;
+ location: center;
+ anchor: center;
+ transparency: "screenshot";
+ border-color: @transparent;
+ border: 0px;
+ border-radius: 6px;
+ spacing: 0;
+ children: [ mainbox ];
+}
+
+mainbox {
+ spacing: 0;
+ children: [ inputbar, message, listview ];
+}
+
+inputbar {
+ color: @kl;
+ padding: 11px;
+ border: 3px 3px 2px 3px;
+ border-color: @primary;
+ border-radius: 6px 6px 0px 0px;
+}
+
+message {
+ padding: 0;
+ border-color: @primary;
+ border: 0px 1px 1px 1px;
+}
+
+entry, prompt, case-indicator {
+ text-font: inherit;
+ text-color: inherit;
+}
+
+entry {
+ cursor: pointer;
+}
+
+prompt {
+ margin: 0px 5px 0px 0px;
+}
+
+listview {
+ layout: vertical;
+ //spacing: 5px;
+ padding: 8px;
+ lines: 7;
+ columns: 2;
+ border: 0px 3px 3px 3px;
+ border-radius: 0px 0px 6px 6px;
+ border-color: @primary;
+ dynamic: false;
+}
+
+element {
+ padding: 2px;
+ vertical-align: 1;
+ color: @kl;
+ font: inherit;
+}
+
+element-text {
+ background-color: inherit;
+ text-color: inherit;
+ vertical-align: 0.5;
+}
+
+element selected.normal {
+ color: @black;
+ background-color: @hv;
+}
+
+element normal active {
+ background-color: @hv;
+ color: @black;
+}
+
+element-icon {
+ background-color: inherit;
+ text-color: inherit;
+ size: 2.5em;
+}
+
+element normal urgent {
+ background-color: @primary;
+}
+
+element selected active {
+ background: @hv;
+ foreground: @bg;
+}
+
+button {
+ padding: 6px;
+ color: @primary;
+ horizonatal-align: 0.5;
+
+ border: 2px 0px 2px 2px;
+ border-radius: 4px 0px 0px 4px;
+ border-color: @primary;
+}
+
+button selected normal {
+ border: 2px 0px 2px 2px;
+ border-color: @primary;
+}
diff --git a/iso/airootfs/usr/share/tonarchy/xfce4/desktop/accels.scm b/iso/airootfs/usr/share/tonarchy/xfce4/desktop/accels.scm
new file mode 100644
index 0000000..c9f68a8
--- /dev/null
+++ b/iso/airootfs/usr/share/tonarchy/xfce4/desktop/accels.scm
@@ -0,0 +1,47 @@
+; xfdesktop GtkAccelMap rc-file -*- scheme -*-
+; this file is an automated accelerator map dump
+;
+; (gtk_accel_path "<Actions>/XfceDesktop/primary-menu-2" "Menu")
+; (gtk_accel_path "<Actions>/XfdesktopFileIconManager/open-with-other" "")
+; (gtk_accel_path "<Actions>/XfdesktopIconView/activate-3" "Return")
+; (gtk_accel_path "<Actions>/XfdesktopFileIconManager/properties-3" "<Alt>KP_Enter")
+; (gtk_accel_path "<Actions>/XfdesktopFileIconManager/trash" "Delete")
+; (gtk_accel_path "<Actions>/XfceDesktop/next-background" "")
+; (gtk_accel_path "<Actions>/XfdesktopFileIconManager/cut-2" "")
+; (gtk_accel_path "<Actions>/XfdesktopFileIconManager/cut" "<Primary>x")
+; (gtk_accel_path "<Actions>/XfdesktopIconView/unselect-all" "Escape")
+; (gtk_accel_path "<Actions>/XfdesktopFileIconManager/copy-2" "<Primary>Insert")
+; (gtk_accel_path "<Actions>/XfdesktopIconView/activate" "space")
+; (gtk_accel_path "<Actions>/XfdesktopIconView/activate-2" "KP_Space")
+; (gtk_accel_path "<Actions>/XfdesktopFileIconManager/open" "<Primary>o")
+; (gtk_accel_path "<Actions>/XfdesktopIconView/select-all" "<Primary>a")
+; (gtk_accel_path "<Actions>/XfdesktopFileIconManager/properties-2" "<Alt>ISO_Enter")
+; (gtk_accel_path "<Actions>/XfdesktopFileIconManager/empty-trash" "")
+; (gtk_accel_path "<Actions>/XfdesktopFileIconManager/open-trash" "")
+; (gtk_accel_path "<Actions>/XfdesktopFileIconManager/trash-3" "")
+; (gtk_accel_path "<Actions>/XfdesktopFileIconManager/properties" "<Alt>Return")
+; (gtk_accel_path "<Actions>/XfdesktopFileIconManager/copy" "<Primary>c")
+; (gtk_accel_path "<Actions>/XfceDesktop/reload-2" "Reload")
+; (gtk_accel_path "<Actions>/XfdesktopFileIconManager/delete-3" "")
+; (gtk_accel_path "<Actions>/XfdesktopFileIconManager/trash-2" "KP_Delete")
+; (gtk_accel_path "<Actions>/XfceDesktop/reload" "<Primary>r")
+; (gtk_accel_path "<Actions>/XfdesktopFileIconManager/paste-into-folder" "")
+; (gtk_accel_path "<Actions>/XfdesktopFileIconManager/paste-2" "<Shift>Insert")
+; (gtk_accel_path "<Actions>/XfceDesktop/secondary-menu" "<Primary><Shift>F10")
+; (gtk_accel_path "<Actions>/XfdesktopFileIconManager/delete-2" "<Shift>KP_Delete")
+; (gtk_accel_path "<Actions>/XfdesktopIconView/toggle-cursor-2" "<Primary>KP_Space")
+; (gtk_accel_path "<Actions>/XfceDesktop/reload-1" "F5")
+; (gtk_accel_path "<Actions>/XfdesktopFileIconManager/open-filesystem" "")
+; (gtk_accel_path "<Actions>/XfdesktopIconView/activate-5" "KP_Enter")
+; (gtk_accel_path "<Actions>/XfceDesktop/primary-menu" "<Shift>F10")
+; (gtk_accel_path "<Actions>/XfdesktopFileIconManager/create-document" "")
+; (gtk_accel_path "<Actions>/XfdesktopFileIconManager/create-folder" "<Primary><Shift>n")
+; (gtk_accel_path "<Actions>/XfdesktopIconView/toggle-cursor" "<Primary>space")
+; (gtk_accel_path "<Actions>/XfdesktopFileIconManager/toggle-show-hidden" "<Primary>h")
+; (gtk_accel_path "<Actions>/XfdesktopFileIconManager/open-home" "<Alt>Home")
+; (gtk_accel_path "<Actions>/XfdesktopIconView/activate-4" "ISO_Enter")
+; (gtk_accel_path "<Actions>/XfdesktopFileIconManager/delete" "<Shift>Delete")
+; (gtk_accel_path "<Actions>/XfdesktopFileIconManager/paste" "<Primary>v")
+; (gtk_accel_path "<Actions>/XfdesktopFileIconManager/rename" "F2")
+; (gtk_accel_path "<Actions>/XfdesktopIconView/arrange-icons" "")
+; (gtk_accel_path "<Actions>/XfceDesktop/secondary-menu-2" "<Primary>Menu")
diff --git a/iso/airootfs/usr/share/tonarchy/xfce4/desktop/icons.screen0.yaml b/iso/airootfs/usr/share/tonarchy/xfce4/desktop/icons.screen0.yaml
new file mode 100644
index 0000000..5abf43d
--- /dev/null
+++ b/iso/airootfs/usr/share/tonarchy/xfce4/desktop/icons.screen0.yaml
@@ -0,0 +1,23 @@
+#
+# DO NOT EDIT THIS FILE WHILE XFDESKTOP IS RUNNING
+#
+configs:
+- level: 0
+ monitors:
+ - id: "bfcbb767e4ae5aefeabbf8fe3b89cbf6f633e165"
+ display_name: "Chimei Innolux Corporation 0x1417 (eDP-1)"
+ geometry:
+ x: 0
+ y: 0
+ width: 1920
+ height: 1200
+ icons:
+ "/home/tony":
+ row: 0
+ col: 0
+ "/":
+ row: 1
+ col: 0
+ "trash:///":
+ row: 2
+ col: 0
diff --git a/iso/airootfs/usr/share/tonarchy/xfce4/xfce4-screenshooter b/iso/airootfs/usr/share/tonarchy/xfce4/xfce4-screenshooter
new file mode 100644
index 0000000..b8704c8
--- /dev/null
+++ b/iso/airootfs/usr/share/tonarchy/xfce4/xfce4-screenshooter
@@ -0,0 +1,12 @@
+app=/nix/store/rryzli57rm1i4wyyv26yj537xgvyllvk-brave-1.85.111/bin/brave
+custom_action_command=none
+last_user=
+last_extension=png
+show_in_folder=false
+screenshot_dir=file:///home/tony/Pictures
+action=2
+delay=0
+region=2
+show_mouse=1
+show_border=1
+
diff --git a/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/displays.xml b/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/displays.xml
new file mode 100644
index 0000000..d48d1ce
--- /dev/null
+++ b/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/displays.xml
@@ -0,0 +1,7 @@
+<?xml version="1.1" encoding="UTF-8"?>
+
+<channel name="displays" version="1.0">
+ <property name="ActiveProfile" type="string" value="Default"/>
+ <property name="Notify" type="int" value="1"/>
+ <property name="AutoEnableProfiles" type="int" value="3"/>
+</channel>
diff --git a/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/keyboards.xml b/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/keyboards.xml
new file mode 100644
index 0000000..b6758de
--- /dev/null
+++ b/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/keyboards.xml
@@ -0,0 +1,10 @@
+<?xml version="1.1" encoding="UTF-8"?>
+
+<channel name="keyboards" version="1.0">
+ <property name="Default" type="empty">
+ <property name="KeyRepeat" type="empty">
+ <property name="Delay" type="int" value="201"/>
+ <property name="Rate" type="int" value="38"/>
+ </property>
+ </property>
+</channel>
diff --git a/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/thunar.xml b/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/thunar.xml
new file mode 100644
index 0000000..8da6326
--- /dev/null
+++ b/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/thunar.xml
@@ -0,0 +1,10 @@
+<?xml version="1.1" encoding="UTF-8"?>
+
+<channel name="thunar" version="1.0">
+ <property name="last-view" type="string" value="ThunarIconView"/>
+ <property name="last-icon-view-zoom-level" type="string" value="THUNAR_ZOOM_LEVEL_100_PERCENT"/>
+ <property name="last-window-width" type="int" value="1132"/>
+ <property name="last-window-height" type="int" value="816"/>
+ <property name="last-window-maximized" type="bool" value="false"/>
+ <property name="last-separator-position" type="int" value="170"/>
+</channel>
diff --git a/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfce4-appfinder.xml b/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfce4-appfinder.xml
new file mode 100644
index 0000000..3e9fd53
--- /dev/null
+++ b/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfce4-appfinder.xml
@@ -0,0 +1,46 @@
+<?xml version="1.1" encoding="UTF-8"?>
+
+<channel name="xfce4-appfinder" version="1.0">
+ <property name="actions" type="array">
+ <value type="int" value="5"/>
+ <value type="int" value="4"/>
+ <value type="int" value="3"/>
+ <value type="int" value="2"/>
+ <value type="int" value="1"/>
+ <property name="action-5" type="empty">
+ <property name="type" type="int" value="0"/>
+ <property name="pattern" type="string" value="/"/>
+ <property name="command" type="string" value="exo-open --launch FileManager %S"/>
+ <property name="save" type="bool" value="false"/>
+ </property>
+ <property name="action-4" type="empty">
+ <property name="type" type="int" value="0"/>
+ <property name="pattern" type="string" value="#"/>
+ <property name="command" type="string" value="exo-open --launch TerminalEmulator man %s"/>
+ <property name="save" type="bool" value="false"/>
+ </property>
+ <property name="action-3" type="empty">
+ <property name="type" type="int" value="0"/>
+ <property name="pattern" type="string" value="!w"/>
+ <property name="command" type="string" value="exo-open --launch WebBrowser http://en.wikipedia.org/wiki/%s"/>
+ <property name="save" type="bool" value="false"/>
+ </property>
+ <property name="action-2" type="empty">
+ <property name="type" type="int" value="0"/>
+ <property name="pattern" type="string" value="$"/>
+ <property name="command" type="string" value="exo-open --launch TerminalEmulator %s"/>
+ <property name="save" type="bool" value="true"/>
+ </property>
+ <property name="action-1" type="empty">
+ <property name="type" type="int" value="1"/>
+ <property name="pattern" type="string" value="^(file|http|https):\/\/(.*)$"/>
+ <property name="command" type="string" value="exo-open \0"/>
+ <property name="save" type="bool" value="false"/>
+ </property>
+ </property>
+ <property name="last" type="empty">
+ <property name="window-height" type="int" value="422"/>
+ <property name="window-width" type="int" value="580"/>
+ <property name="pane-position" type="int" value="180"/>
+ </property>
+</channel>
diff --git a/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml b/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml
new file mode 100644
index 0000000..6ddb3db
--- /dev/null
+++ b/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml
@@ -0,0 +1,54 @@
+<?xml version="1.1" encoding="UTF-8"?>
+
+<channel name="xfce4-desktop" version="1.0">
+ <property name="last-settings-migration-version" type="uint" value="1"/>
+ <property name="backdrop" type="empty">
+ <property name="screen0" type="empty">
+ <property name="monitorVirtual-1" type="empty">
+ <property name="workspace0" type="empty">
+ <property name="last-image" type="string" value="/usr/share/wallpapers/wall1.jpg"/>
+ </property>
+ </property>
+ <property name="monitoreDP-1" type="empty">
+ <property name="workspace0" type="empty">
+ <property name="last-image" type="string" value="/usr/share/wallpapers/wall1.jpg"/>
+ </property>
+ </property>
+ <property name="monitorHDMI-1" type="empty">
+ <property name="workspace0" type="empty">
+ <property name="last-image" type="string" value="/usr/share/wallpapers/wall1.jpg"/>
+ </property>
+ </property>
+ <property name="monitorHDMI-2" type="empty">
+ <property name="workspace0" type="empty">
+ <property name="last-image" type="string" value="/usr/share/wallpapers/wall1.jpg"/>
+ </property>
+ </property>
+ <property name="monitorDP-1" type="empty">
+ <property name="workspace0" type="empty">
+ <property name="last-image" type="string" value="/usr/share/wallpapers/wall1.jpg"/>
+ </property>
+ </property>
+ <property name="monitorDP-2" type="empty">
+ <property name="workspace0" type="empty">
+ <property name="last-image" type="string" value="/usr/share/wallpapers/wall1.jpg"/>
+ </property>
+ </property>
+ <property name="monitorVGA-1" type="empty">
+ <property name="workspace0" type="empty">
+ <property name="last-image" type="string" value="/usr/share/wallpapers/wall1.jpg"/>
+ </property>
+ </property>
+ </property>
+ </property>
+ <property name="desktop-menu" type="empty">
+ <property name="show" type="bool" value="true"/>
+ </property>
+ <property name="last" type="empty">
+ <property name="window-width" type="int" value="672"/>
+ <property name="window-height" type="int" value="547"/>
+ </property>
+ <property name="desktop-icons" type="empty">
+ <property name="show-hidden-files" type="bool" value="false"/>
+ </property>
+</channel>
diff --git a/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml b/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml
new file mode 100644
index 0000000..b376f95
--- /dev/null
+++ b/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml
@@ -0,0 +1,199 @@
+<?xml version="1.1" encoding="UTF-8"?>
+
+<channel name="xfce4-keyboard-shortcuts" version="1.0">
+ <property name="commands" type="empty">
+ <property name="default" type="empty">
+ <property name="<Alt>F1" type="empty"/>
+ <property name="<Alt>F2" type="empty">
+ <property name="startup-notify" type="empty"/>
+ </property>
+ <property name="<Alt>F3" type="empty">
+ <property name="startup-notify" type="empty"/>
+ </property>
+ <property name="<Primary><Alt>Delete" type="empty"/>
+ <property name="<Primary><Alt>l" type="empty"/>
+ <property name="<Primary><Alt>t" type="empty"/>
+ <property name="XF86Display" type="empty"/>
+ <property name="<Super>p" type="empty"/>
+ <property name="<Primary>Escape" type="empty"/>
+ <property name="XF86WWW" type="empty"/>
+ <property name="HomePage" type="empty"/>
+ <property name="XF86Mail" type="empty"/>
+ <property name="Print" type="empty"/>
+ <property name="<Alt>Print" type="empty"/>
+ <property name="<Shift>Print" type="empty"/>
+ <property name="<Super>e" type="empty"/>
+ <property name="<Primary><Alt>f" type="empty"/>
+ <property name="<Primary><Alt>Escape" type="empty"/>
+ <property name="<Primary><Shift>Escape" type="empty"/>
+ <property name="<Super>r" type="empty">
+ <property name="startup-notify" type="empty"/>
+ </property>
+ <property name="<Alt><Super>s" type="empty"/>
+ </property>
+ <property name="custom" type="empty">
+ <property name="<Alt>F2" type="string" value="xfce4-appfinder --collapsed">
+ <property name="startup-notify" type="bool" value="true"/>
+ </property>
+ <property name="<Alt>Print" type="string" value="xfce4-screenshooter -w"/>
+ <property name="<Super>r" type="string" value="xfce4-appfinder -c">
+ <property name="startup-notify" type="bool" value="true"/>
+ </property>
+ <property name="XF86WWW" type="string" value="exo-open --launch WebBrowser"/>
+ <property name="XF86Mail" type="string" value="exo-open --launch MailReader"/>
+ <property name="<Alt>F3" type="string" value="xfce4-appfinder">
+ <property name="startup-notify" type="bool" value="true"/>
+ </property>
+ <property name="Print" type="string" value="xfce4-screenshooter"/>
+ <property name="<Primary>Escape" type="string" value="xfdesktop --menu"/>
+ <property name="<Shift>Print" type="string" value="xfce4-screenshooter -r"/>
+ <property name="<Primary><Alt>Delete" type="string" value="xfce4-session-logout"/>
+ <property name="<Alt><Super>s" type="string" value="orca"/>
+ <property name="<Primary><Alt>t" type="string" value="exo-open --launch TerminalEmulator"/>
+ <property name="<Primary><Alt>f" type="string" value="thunar"/>
+ <property name="<Primary><Alt>l" type="string" value="xflock4"/>
+ <property name="<Alt>F1" type="string" value="xfce4-popup-applicationsmenu"/>
+ <property name="<Super>p" type="string" value="xfce4-display-settings --minimal"/>
+ <property name="<Primary><Shift>Escape" type="string" value="xfce4-taskmanager"/>
+ <property name="<Super>e" type="string" value="thunar"/>
+ <property name="<Primary><Alt>Escape" type="string" value="xkill"/>
+ <property name="HomePage" type="string" value="exo-open --launch WebBrowser"/>
+ <property name="XF86Display" type="string" value="xfce4-display-settings --minimal"/>
+ <property name="override" type="bool" value="true"/>
+ <property name="<Super>d" type="string" value="rofi -show drun"/>
+ <property name="<Super>Return" type="string" value="alacritty"/>
+ </property>
+ </property>
+ <property name="xfwm4" type="empty">
+ <property name="default" type="empty">
+ <property name="<Alt>Insert" type="empty"/>
+ <property name="Escape" type="empty"/>
+ <property name="Left" type="empty"/>
+ <property name="Right" type="empty"/>
+ <property name="Up" type="empty"/>
+ <property name="Down" type="empty"/>
+ <property name="<Alt>Tab" type="empty"/>
+ <property name="<Alt><Shift>Tab" type="empty"/>
+ <property name="<Alt>Delete" type="empty"/>
+ <property name="<Primary><Alt>Down" type="empty"/>
+ <property name="<Primary><Alt>Left" type="empty"/>
+ <property name="<Shift><Alt>Page_Down" type="empty"/>
+ <property name="<Alt>F4" type="empty"/>
+ <property name="<Alt>F6" type="empty"/>
+ <property name="<Alt>F7" type="empty"/>
+ <property name="<Alt>F8" type="empty"/>
+ <property name="<Alt>F9" type="empty"/>
+ <property name="<Alt>F10" type="empty"/>
+ <property name="<Alt>F11" type="empty"/>
+ <property name="<Alt>F12" type="empty"/>
+ <property name="<Primary><Shift><Alt>Left" type="empty"/>
+ <property name="<Primary><Alt>End" type="empty"/>
+ <property name="<Primary><Alt>Home" type="empty"/>
+ <property name="<Primary><Shift><Alt>Right" type="empty"/>
+ <property name="<Primary><Shift><Alt>Up" type="empty"/>
+ <property name="<Primary><Alt>KP_1" type="empty"/>
+ <property name="<Primary><Alt>KP_2" type="empty"/>
+ <property name="<Primary><Alt>KP_3" type="empty"/>
+ <property name="<Primary><Alt>KP_4" type="empty"/>
+ <property name="<Primary><Alt>KP_5" type="empty"/>
+ <property name="<Primary><Alt>KP_6" type="empty"/>
+ <property name="<Primary><Alt>KP_7" type="empty"/>
+ <property name="<Primary><Alt>KP_8" type="empty"/>
+ <property name="<Primary><Alt>KP_9" type="empty"/>
+ <property name="<Alt>space" type="empty"/>
+ <property name="<Shift><Alt>Page_Up" type="empty"/>
+ <property name="<Primary><Alt>Right" type="empty"/>
+ <property name="<Primary><Alt>d" type="empty"/>
+ <property name="<Primary><Alt>Up" type="empty"/>
+ <property name="<Super>Tab" type="empty"/>
+ <property name="<Primary>F1" type="empty"/>
+ <property name="<Primary>F2" type="empty"/>
+ <property name="<Primary>F3" type="empty"/>
+ <property name="<Primary>F4" type="empty"/>
+ <property name="<Primary>F5" type="empty"/>
+ <property name="<Primary>F6" type="empty"/>
+ <property name="<Primary>F7" type="empty"/>
+ <property name="<Primary>F8" type="empty"/>
+ <property name="<Primary>F9" type="empty"/>
+ <property name="<Primary>F10" type="empty"/>
+ <property name="<Primary>F11" type="empty"/>
+ <property name="<Primary>F12" type="empty"/>
+ <property name="<Super>KP_Left" type="empty"/>
+ <property name="<Super>KP_Right" type="empty"/>
+ <property name="<Super>KP_Down" type="empty"/>
+ <property name="<Super>KP_Up" type="empty"/>
+ <property name="<Super>KP_Page_Up" type="empty"/>
+ <property name="<Super>KP_Home" type="empty"/>
+ <property name="<Super>KP_End" type="empty"/>
+ <property name="<Super>KP_Next" type="empty"/>
+ </property>
+ <property name="custom" type="empty">
+ <property name="<Primary>F12" type="string" value="workspace_12_key"/>
+ <property name="<Primary><Alt>Down" type="string" value="down_workspace_key"/>
+ <property name="<Primary><Alt>End" type="string" value="move_window_next_workspace_key"/>
+ <property name="<Primary><Shift><Alt>Left" type="string" value="move_window_left_key"/>
+ <property name="Right" type="string" value="right_key"/>
+ <property name="<Shift><Alt>Page_Down" type="string" value="lower_window_key"/>
+ <property name="<Primary><Shift><Alt>Right" type="string" value="move_window_right_key"/>
+ <property name="<Primary><Alt>Right" type="string" value="right_workspace_key"/>
+ <property name="<Alt>F6" type="string" value="stick_window_key"/>
+ <property name="<Primary>F11" type="string" value="workspace_11_key"/>
+ <property name="<Alt>Delete" type="string" value="del_workspace_key"/>
+ <property name="<Primary><Alt>d" type="string" value="show_desktop_key"/>
+ <property name="<Super>KP_Page_Up" type="string" value="tile_up_right_key"/>
+ <property name="<Alt>F7" type="string" value="move_window_key"/>
+ <property name="<Alt>space" type="string" value="popup_menu_key"/>
+ <property name="<Super>KP_Home" type="string" value="tile_up_left_key"/>
+ <property name="Escape" type="string" value="cancel_key"/>
+ <property name="<Super>KP_Next" type="string" value="tile_down_right_key"/>
+ <property name="<Shift><Alt>Page_Up" type="string" value="raise_window_key"/>
+ <property name="<Primary><Alt>Home" type="string" value="move_window_prev_workspace_key"/>
+ <property name="<Primary><Alt>Left" type="string" value="left_workspace_key"/>
+ <property name="<Alt>F12" type="string" value="above_key"/>
+ <property name="<Primary><Shift><Alt>Up" type="string" value="move_window_up_key"/>
+ <property name="<Alt>F8" type="string" value="resize_window_key"/>
+ <property name="<Super>KP_End" type="string" value="tile_down_left_key"/>
+ <property name="<Primary><Alt>Up" type="string" value="up_workspace_key"/>
+ <property name="<Alt>F9" type="string" value="hide_window_key"/>
+ <property name="<Primary>F10" type="string" value="workspace_10_key"/>
+ <property name="Left" type="string" value="left_key"/>
+ <property name="<Alt>Insert" type="string" value="add_workspace_key"/>
+ <property name="override" type="bool" value="true"/>
+ <property name="<Super>q" type="string" value="close_window_key"/>
+ <property name="Down" type="string" value="down_key"/>
+ <property name="Up" type="string" value="up_key"/>
+ <property name="<Super>f" type="string" value="maximize_window_key"/>
+ <property name="<Super>Up" type="string" value="tile_up_key"/>
+ <property name="<Super>Down" type="string" value="tile_down_key"/>
+ <property name="<Super>Left" type="string" value="tile_left_key"/>
+ <property name="<Super>Right" type="string" value="tile_right_key"/>
+ <property name="<Super>2" type="string" value="workspace_2_key"/>
+ <property name="<Super>1" type="string" value="workspace_1_key"/>
+ <property name="<Super>3" type="string" value="workspace_3_key"/>
+ <property name="<Super>4" type="string" value="workspace_4_key"/>
+ <property name="<Super>5" type="string" value="workspace_5_key"/>
+ <property name="<Super>6" type="string" value="workspace_6_key"/>
+ <property name="<Shift><Super>exclam" type="string" value="move_window_workspace_1_key"/>
+ <property name="<Shift><Super>at" type="string" value="move_window_workspace_2_key"/>
+ <property name="<Shift><Super>numbersign" type="string" value="move_window_workspace_3_key"/>
+ <property name="<Shift><Super>dollar" type="string" value="move_window_workspace_4_key"/>
+ <property name="<Shift><Super>percent" type="string" value="move_window_workspace_5_key"/>
+ <property name="<Shift><Super>asciicircum" type="string" value="move_window_workspace_6_key"/>
+ <property name="<Shift><Super>ampersand" type="string" value="move_window_workspace_7_key"/>
+ <property name="<Shift><Super>asterisk" type="string" value="move_window_workspace_8_key"/>
+ <property name="<Shift><Super>parenleft" type="string" value="move_window_workspace_9_key"/>
+ <property name="<Super>Tab" type="string" value="next_workspace_key"/>
+ <property name="<Shift><Super>ISO_Left_Tab" type="string" value="prev_workspace_key"/>
+ <property name="<Super>7" type="string" value="workspace_7_key"/>
+ <property name="<Super>8" type="string" value="workspace_8_key"/>
+ <property name="<Super>9" type="string" value="workspace_9_key"/>
+ <property name="<Shift><Super>f" type="string" value="fullscreen_key"/>
+ <property name="<Super>j" type="string" value="cycle_windows_key"/>
+ <property name="<Super>k" type="string" value="cycle_reverse_windows_key"/>
+ </property>
+ </property>
+ <property name="providers" type="array">
+ <value type="string" value="commands"/>
+ <value type="string" value="xfwm4"/>
+ </property>
+</channel>
diff --git a/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfce4-notifyd.xml b/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfce4-notifyd.xml
new file mode 100644
index 0000000..d67d43b
--- /dev/null
+++ b/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfce4-notifyd.xml
@@ -0,0 +1,10 @@
+<?xml version="1.1" encoding="UTF-8"?>
+
+<channel name="xfce4-notifyd" version="1.0">
+ <property name="log-max-size-enabled" type="bool" value="true"/>
+ <property name="applications" type="empty">
+ <property name="known_applications" type="array">
+ <value type="string" value="xfce4-power-manager"/>
+ </property>
+ </property>
+</channel>
diff --git a/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfce4-panel.xml b/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfce4-panel.xml
new file mode 100644
index 0000000..9e53bc3
--- /dev/null
+++ b/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfce4-panel.xml
@@ -0,0 +1,102 @@
+<?xml version="1.1" encoding="UTF-8"?>
+
+<channel name="xfce4-panel" version="1.0">
+ <property name="configver" type="int" value="2"/>
+ <property name="panels" type="array">
+ <value type="int" value="1"/>
+ <property name="dark-mode" type="bool" value="true"/>
+ <property name="panel-1" type="empty">
+ <property name="position" type="string" value="p=8;x=960;y=1183"/>
+ <property name="length" type="double" value="100"/>
+ <property name="position-locked" type="bool" value="true"/>
+ <property name="icon-size" type="uint" value="29"/>
+ <property name="size" type="uint" value="31"/>
+ <property name="plugin-ids" type="array">
+ <value type="int" value="11"/>
+ <value type="int" value="4"/>
+ <value type="int" value="5"/>
+ <value type="int" value="2"/>
+ <value type="int" value="3"/>
+ <value type="int" value="6"/>
+ <value type="int" value="7"/>
+ <value type="int" value="8"/>
+ <value type="int" value="9"/>
+ <value type="int" value="10"/>
+ </property>
+ <property name="background-style" type="uint" value="0"/>
+ <property name="mode" type="uint" value="0"/>
+ </property>
+ </property>
+ <property name="plugins" type="empty">
+ <property name="plugin-2" type="string" value="tasklist">
+ <property name="grouping" type="uint" value="1"/>
+ <property name="show-labels" type="bool" value="false"/>
+ <property name="flat-buttons" type="bool" value="false"/>
+ <property name="show-handle" type="bool" value="false"/>
+ <property name="show-tooltips" type="bool" value="false"/>
+ <property name="sort-order" type="uint" value="1"/>
+ </property>
+ <property name="plugin-3" type="string" value="separator">
+ <property name="expand" type="bool" value="true"/>
+ <property name="style" type="uint" value="2"/>
+ </property>
+ <property name="plugin-4" type="string" value="pager">
+ <property name="rows" type="uint" value="1"/>
+ <property name="miniature-view" type="bool" value="false"/>
+ <property name="numbering" type="bool" value="false"/>
+ <property name="workspace-scrolling" type="bool" value="true"/>
+ <property name="wrap-workspaces" type="bool" value="false"/>
+ </property>
+ <property name="plugin-5" type="string" value="separator">
+ <property name="style" type="uint" value="1"/>
+ <property name="expand" type="bool" value="false"/>
+ </property>
+ <property name="plugin-6" type="string" value="systray">
+ <property name="square-icons" type="bool" value="true"/>
+ <property name="known-legacy-items" type="array">
+ <value type="string" value="wi-fi network connection “imaginaryi” active: imaginaryi (69%)"/>
+ <value type="string" value="wi-fi network connection “imaginaryi” active: imaginaryi (63%)"/>
+ </property>
+ <property name="known-items" type="array">
+ <value type="string" value="chrome_status_icon_1"/>
+ </property>
+ </property>
+ <property name="plugin-7" type="string" value="separator">
+ <property name="style" type="uint" value="0"/>
+ </property>
+ <property name="plugin-8" type="string" value="clock">
+ <property name="mode" type="uint" value="2"/>
+ </property>
+ <property name="plugin-9" type="string" value="separator">
+ <property name="style" type="uint" value="0"/>
+ </property>
+ <property name="plugin-10" type="string" value="actions"/>
+ <property name="plugin-11" type="string" value="whiskermenu">
+ <property name="button-icon" type="string" value="/usr/share/tonarchy/favicon.png"/>
+ <property name="menu-width" type="int" value="499"/>
+ <property name="launcher-icon-size" type="int" value="1"/>
+ <property name="category-show-name" type="bool" value="true"/>
+ <property name="launcher-show-tooltip" type="bool" value="true"/>
+ <property name="launcher-show-description" type="bool" value="true"/>
+ <property name="view-mode" type="int" value="2"/>
+ <property name="launcher-show-name" type="bool" value="false"/>
+ <property name="favorites" type="array">
+ </property>
+ <property name="recent" type="array">
+ <value type="string" value="xfce-settings-manager.desktop"/>
+ <value type="string" value="Alacritty.desktop"/>
+ <value type="string" value="xfce-keyboard-settings.desktop"/>
+ <value type="string" value="rofi.desktop"/>
+ <value type="string" value="dev.zed.Zed.desktop"/>
+ </property>
+ <property name="position-categories-alternate" type="bool" value="true"/>
+ <property name="position-categories-horizontal" type="bool" value="false"/>
+ <property name="position-profile-alternate" type="bool" value="true"/>
+ <property name="position-search-alternate" type="bool" value="false"/>
+ <property name="position-commands-alternate" type="bool" value="false"/>
+ <property name="profile-shape" type="int" value="0"/>
+ <property name="button-single-row" type="bool" value="false"/>
+ <property name="default-category" type="int" value="2"/>
+ </property>
+ </property>
+</channel>
diff --git a/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfce4-power-manager.xml b/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfce4-power-manager.xml
new file mode 100644
index 0000000..be9b2e3
--- /dev/null
+++ b/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfce4-power-manager.xml
@@ -0,0 +1,8 @@
+<?xml version="1.1" encoding="UTF-8"?>
+
+<channel name="xfce4-power-manager" version="1.0">
+ <property name="xfce4-power-manager" type="empty">
+ <property name="brightness-switch-restore-on-exit" type="int" value="1"/>
+ <property name="brightness-switch" type="int" value="0"/>
+ </property>
+</channel>
diff --git a/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfce4-settings-editor.xml b/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfce4-settings-editor.xml
new file mode 100644
index 0000000..61f92f8
--- /dev/null
+++ b/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfce4-settings-editor.xml
@@ -0,0 +1,9 @@
+<?xml version="1.1" encoding="UTF-8"?>
+
+<channel name="xfce4-settings-editor" version="1.0">
+ <property name="last" type="empty">
+ <property name="window-width" type="int" value="624"/>
+ <property name="window-height" type="int" value="450"/>
+ <property name="paned-position" type="int" value="180"/>
+ </property>
+</channel>
diff --git a/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfce4-settings-manager.xml b/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfce4-settings-manager.xml
new file mode 100644
index 0000000..7b23a35
--- /dev/null
+++ b/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfce4-settings-manager.xml
@@ -0,0 +1,8 @@
+<?xml version="1.1" encoding="UTF-8"?>
+
+<channel name="xfce4-settings-manager" version="1.0">
+ <property name="last" type="empty">
+ <property name="window-width" type="int" value="824"/>
+ <property name="window-height" type="int" value="500"/>
+ </property>
+</channel>
diff --git a/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfwm4.xml b/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfwm4.xml
new file mode 100644
index 0000000..5402b65
--- /dev/null
+++ b/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xfwm4.xml
@@ -0,0 +1,94 @@
+<?xml version="1.1" encoding="UTF-8"?>
+
+<channel name="xfwm4" version="1.0">
+ <property name="general" type="empty">
+ <property name="workspace_names" type="array">
+ <value type="string" value="1"/>
+ <value type="string" value="2"/>
+ <value type="string" value="3"/>
+ <value type="string" value="4"/>
+ <value type="string" value="5"/>
+ <value type="string" value="Workspace 6"/>
+ <value type="string" value="Workspace 7"/>
+ </property>
+ <property name="workspace_count" type="int" value="5"/>
+ <property name="activate_action" type="string" value="bring"/>
+ <property name="borderless_maximize" type="bool" value="true"/>
+ <property name="box_move" type="bool" value="false"/>
+ <property name="box_resize" type="bool" value="false"/>
+ <property name="button_layout" type="string" value="O|SHMC"/>
+ <property name="button_offset" type="int" value="0"/>
+ <property name="button_spacing" type="int" value="0"/>
+ <property name="click_to_focus" type="bool" value="true"/>
+ <property name="cycle_apps_only" type="bool" value="false"/>
+ <property name="cycle_draw_frame" type="bool" value="true"/>
+ <property name="cycle_raise" type="bool" value="false"/>
+ <property name="cycle_hidden" type="bool" value="true"/>
+ <property name="cycle_minimum" type="bool" value="true"/>
+ <property name="cycle_minimized" type="bool" value="false"/>
+ <property name="cycle_preview" type="bool" value="true"/>
+ <property name="cycle_tabwin_mode" type="int" value="0"/>
+ <property name="cycle_workspaces" type="bool" value="false"/>
+ <property name="double_click_action" type="string" value="maximize"/>
+ <property name="double_click_distance" type="int" value="5"/>
+ <property name="double_click_time" type="int" value="250"/>
+ <property name="easy_click" type="string" value="Alt"/>
+ <property name="focus_delay" type="int" value="250"/>
+ <property name="focus_hint" type="bool" value="true"/>
+ <property name="focus_new" type="bool" value="true"/>
+ <property name="frame_opacity" type="int" value="100"/>
+ <property name="frame_border_top" type="int" value="0"/>
+ <property name="full_width_title" type="bool" value="true"/>
+ <property name="horiz_scroll_opacity" type="bool" value="false"/>
+ <property name="inactive_opacity" type="int" value="100"/>
+ <property name="maximized_offset" type="int" value="0"/>
+ <property name="mousewheel_rollup" type="bool" value="true"/>
+ <property name="move_opacity" type="int" value="100"/>
+ <property name="placement_mode" type="string" value="center"/>
+ <property name="placement_ratio" type="int" value="20"/>
+ <property name="popup_opacity" type="int" value="100"/>
+ <property name="prevent_focus_stealing" type="bool" value="false"/>
+ <property name="raise_delay" type="int" value="250"/>
+ <property name="raise_on_click" type="bool" value="true"/>
+ <property name="raise_on_focus" type="bool" value="false"/>
+ <property name="raise_with_any_button" type="bool" value="true"/>
+ <property name="repeat_urgent_blink" type="bool" value="false"/>
+ <property name="resize_opacity" type="int" value="100"/>
+ <property name="scroll_workspaces" type="bool" value="true"/>
+ <property name="shadow_delta_height" type="int" value="0"/>
+ <property name="shadow_delta_width" type="int" value="0"/>
+ <property name="shadow_delta_x" type="int" value="0"/>
+ <property name="shadow_delta_y" type="int" value="-3"/>
+ <property name="shadow_opacity" type="int" value="50"/>
+ <property name="show_app_icon" type="bool" value="false"/>
+ <property name="show_dock_shadow" type="bool" value="true"/>
+ <property name="show_frame_shadow" type="bool" value="true"/>
+ <property name="show_popup_shadow" type="bool" value="false"/>
+ <property name="snap_resist" type="bool" value="false"/>
+ <property name="snap_to_border" type="bool" value="true"/>
+ <property name="snap_to_windows" type="bool" value="false"/>
+ <property name="snap_width" type="int" value="10"/>
+ <property name="vblank_mode" type="string" value="auto"/>
+ <property name="theme" type="string" value="Default"/>
+ <property name="tile_on_move" type="bool" value="true"/>
+ <property name="title_alignment" type="string" value="center"/>
+ <property name="title_font" type="string" value="Iosevka Nerd Font Propo Heavy Oblique 12"/>
+ <property name="title_horizontal_offset" type="int" value="0"/>
+ <property name="titleless_maximize" type="bool" value="false"/>
+ <property name="title_shadow_active" type="string" value="false"/>
+ <property name="title_shadow_inactive" type="string" value="false"/>
+ <property name="title_vertical_offset_active" type="int" value="0"/>
+ <property name="title_vertical_offset_inactive" type="int" value="0"/>
+ <property name="toggle_workspaces" type="bool" value="false"/>
+ <property name="unredirect_overlays" type="bool" value="true"/>
+ <property name="urgent_blink" type="bool" value="false"/>
+ <property name="use_compositing" type="bool" value="true"/>
+ <property name="wrap_cycle" type="bool" value="true"/>
+ <property name="wrap_layout" type="bool" value="true"/>
+ <property name="wrap_resistance" type="int" value="10"/>
+ <property name="wrap_windows" type="bool" value="false"/>
+ <property name="wrap_workspaces" type="bool" value="false"/>
+ <property name="zoom_desktop" type="bool" value="true"/>
+ <property name="zoom_pointer" type="bool" value="true"/>
+ </property>
+</channel>
diff --git a/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml b/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml
new file mode 100644
index 0000000..4dc2518
--- /dev/null
+++ b/iso/airootfs/usr/share/tonarchy/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml
@@ -0,0 +1,42 @@
+<?xml version="1.1" encoding="UTF-8"?>
+
+<channel name="xsettings" version="1.0">
+ <property name="Net" type="empty">
+ <property name="ThemeName" type="string" value="Adwaita-dark"/>
+ <property name="IconThemeName" type="string" value="Adwaita"/>
+ <property name="DoubleClickTime" type="empty"/>
+ <property name="DoubleClickDistance" type="empty"/>
+ <property name="DndDragThreshold" type="empty"/>
+ <property name="CursorBlink" type="empty"/>
+ <property name="CursorBlinkTime" type="empty"/>
+ <property name="SoundThemeName" type="empty"/>
+ <property name="EnableEventSounds" type="empty"/>
+ <property name="EnableInputFeedbackSounds" type="empty"/>
+ </property>
+ <property name="Xft" type="empty">
+ <property name="DPI" type="empty"/>
+ <property name="Antialias" type="empty"/>
+ <property name="Hinting" type="empty"/>
+ <property name="HintStyle" type="empty"/>
+ <property name="RGBA" type="empty"/>
+ </property>
+ <property name="Gtk" type="empty">
+ <property name="CanChangeAccels" type="empty"/>
+ <property name="ColorPalette" type="empty"/>
+ <property name="FontName" type="string" value="Iosevka Nerd Font Ultra-Bold 16"/>
+ <property name="MonospaceFontName" type="empty"/>
+ <property name="IconSizes" type="empty"/>
+ <property name="KeyThemeName" type="empty"/>
+ <property name="MenuImages" type="empty"/>
+ <property name="ButtonImages" type="empty"/>
+ <property name="MenuBarAccel" type="empty"/>
+ <property name="CursorThemeName" type="empty"/>
+ <property name="CursorThemeSize" type="empty"/>
+ <property name="DecorationLayout" type="string" value="icon,menu:minimize,maximize,close"/>
+ <property name="DialogsUseHeader" type="empty"/>
+ <property name="TitlebarMiddleClick" type="empty"/>
+ </property>
+ <property name="Gdk" type="empty">
+ <property name="WindowScalingFactor" type="int" value="1"/>
+ </property>
+</channel>
diff --git a/iso/airootfs/usr/share/wallpapers/wall1.jpg b/iso/airootfs/usr/share/wallpapers/wall1.jpg
new file mode 100644
index 0000000..b242f2f
Binary files /dev/null and b/iso/airootfs/usr/share/wallpapers/wall1.jpg differ
diff --git a/tonarchy.c b/tonarchy.c
index 9071b59..91f191d 100644
--- a/tonarchy.c
+++ b/tonarchy.c
@@ -1,9 +1,22 @@
#include "tonarchy.h"
+#include <string.h>
static FILE *log_file = NULL;
static const char *level_strings[] = {"DEBUG", "INFO", "WARN", "ERROR"};
static struct termios orig_termios;
+enum Install_Option {
+ BEGINNER = 0,
+ SUCKLESS = 1,
+ OXIDIZED = 2
+};
+
+static const char *XFCE_PACKAGES = "base base-devel linux linux-firmware linux-headers networkmanager git vim neovim curl wget htop btop man-db man-pages openssh sudo xorg-server xorg-xinit xfce4 xfce4-goodies xfce4-session xfce4-whiskermenu-plugin thunar thunar-archive-plugin file-roller firefox alacritty vlc evince eog fastfetch rofi ttf-iosevka-nerd";
+
+static const char *SUCKLESS_PACKAGES = "base base-devel linux linux-firmware linux-headers networkmanager git vim neovim curl wget htop man-db man-pages openssh sudo xorg-server xorg-xinit xorg-xsetroot xorg-xrandr libx11 libxft libxinerama firefox picom xclip xwallpaper ttf-jetbrains-mono-nerd slock maim rofi alsa-utils pulseaudio pulseaudio-alsa pavucontrol";
+
+static const char *OXWM_PACKAGES = "base base-devel linux linux-firmware linux-headers networkmanager git vim neovim curl wget htop btop man-db man-pages openssh sudo xorg-server xorg-xinit firefox alacritty vlc evince eog cargo ttf-iosevka-nerd";
+
void logger_init(const char *log_path) {
log_file = fopen(log_path, "a");
if (log_file) {
@@ -22,14 +35,20 @@ void logger_close(void) {
}
}
-void log_msg(LogLevel level, const char *fmt, ...) {
+void log_msg(Log_Level level, const char *fmt, ...) {
if (!log_file) return;
time_t now = time(NULL);
struct tm *t = localtime(&now);
- fprintf(log_file, "[%02d:%02d:%02d] [%s] ",
- t->tm_hour, t->tm_min, t->tm_sec, level_strings[level]);
+ fprintf(
+ log_file,
+ "[%02d:%02d:%02d] [%s] ",
+ t->tm_hour,
+ t->tm_min,
+ t->tm_sec,
+ level_strings[level]
+ );
va_list args;
va_start(args, fmt);
@@ -170,7 +189,7 @@ int make_clean_install(const char *build_dir) {
return chroot_exec_fmt("cd %s && make clean install", build_dir);
}
-int create_user_dotfile(const char *username, const DotFile *dotfile) {
+int create_user_dotfile(const char *username, const Dotfile *dotfile) {
char full_path[512];
snprintf(full_path, sizeof(full_path), "%s/home/%s/%s", CHROOT_PATH, username, dotfile->filename);
@@ -187,7 +206,7 @@ int create_user_dotfile(const char *username, const DotFile *dotfile) {
return 1;
}
-int setup_systemd_override(const SystemdOverride *override) {
+int setup_systemd_override(const Systemd_Override *override) {
char dir_path[1024];
char file_path[2048];
@@ -207,7 +226,11 @@ int setup_systemd_override(const SystemdOverride *override) {
}
for (size_t i = 0; i < override->entry_count; i++) {
- fprintf(fp, "%s=%s\n", override->entries[i].key, override->entries[i].value);
+ if (override->entries[i].value[0] == '\0') {
+ fprintf(fp, "%s\n", override->entries[i].key);
+ } else {
+ fprintf(fp, "%s=%s\n", override->entries[i].key, override->entries[i].value);
+ }
}
fclose(fp);
@@ -215,19 +238,6 @@ int setup_systemd_override(const SystemdOverride *override) {
return 1;
}
-static void set_cinnamon_package(Packages *pkg) {
- pkg->cinnamon_package = "base base-devel linux linux-firmware linux-headers networkmanager git vim neovim curl wget htop btop man-db man-pages openssh sudo cinnamon cinnamon-translations nemo nemo-fileroller gnome-terminal lightdm lightdm-gtk-greeter file-roller firefox alacritty vlc evince eog gedit";
-}
-
-static void set_suckless_package(Packages *pkg) {
- pkg->suckless_package = "base base-devel linux linux-firmware linux-headers networkmanager git vim neovim curl wget htop man-db man-pages openssh sudo xorg-server xorg-xinit xorg-xsetroot xorg-xrandr libx11 libxft libxinerama firefox picom xclip xwallpaper ttf-jetbrains-mono-nerd slock maim rofi alsa-utils pulseaudio pulseaudio-alsa pavucontrol";
-}
-
-static void sserror(int x) {
- if (x != 1) {
- exit(1);
- }
-}
static void disable_raw_mode(void) {
tcsetattr(STDIN_FILENO, TCSAFLUSH, &orig_termios);
@@ -355,6 +365,13 @@ void show_message(const char *message) {
sleep(2);
}
+typedef struct {
+ const char *label;
+ const char *value;
+ const char *default_display;
+ int is_password;
+} Tui_Field;
+
static void draw_form(
const char *username,
const char *password,
@@ -373,91 +390,39 @@ static void draw_form(
int logo_start = (cols - 70) / 2;
int form_row = 10;
- printf("\033[%d;%dH", form_row, logo_start);
- printf("\033[37mSetup your system:\033[0m");
-
+ printf(ANSI_CURSOR_POS ANSI_WHITE "Setup your system:" ANSI_RESET, form_row, logo_start);
form_row += 2;
- if (current_field == 0) {
- printf("\033[%d;%dH\033[1;34m>\033[0m ", form_row, logo_start);
- } else {
- printf("\033[%d;%dH ", form_row, logo_start);
- }
- printf("\033[37mUsername: \033[0m");
- if (strlen(username) > 0) {
- printf("\033[32m%s\033[0m", username);
- } else if (current_field != 0) {
- printf("\033[90m[not set]\033[0m");
- }
-
- form_row++;
-
- if (current_field == 1) {
- printf("\033[%d;%dH\033[1;34m>\033[0m ", form_row, logo_start);
- } else {
- printf("\033[%d;%dH ", form_row, logo_start);
- }
- printf("\033[37mPassword: \033[0m");
- if (strlen(password) > 0) {
- printf("\033[32m%s\033[0m", "********");
- } else if (current_field != 1) {
- printf("\033[90m[not set]\033[0m");
- }
-
- form_row++;
-
- if (current_field == 2) {
- printf("\033[%d;%dH\033[1;34m>\033[0m ", form_row, logo_start);
- } else {
- printf("\033[%d;%dH ", form_row, logo_start);
- }
- printf("\033[37mConfirm Password: \033[0m");
- if (strlen(confirmed_password) > 0) {
- printf("\033[32m%s\033[0m", "********");
- } else if (current_field != 2) {
- printf("\033[90m[not set]\033[0m");
- }
-
- form_row++;
-
- if (current_field == 3) {
- printf("\033[%d;%dH\033[1;34m>\033[0m ", form_row, logo_start);
- } else {
- printf("\033[%d;%dH ", form_row, logo_start);
- }
- printf("\033[37mHostname: \033[0m");
- if (strlen(hostname) > 0) {
- printf("\033[32m%s\033[0m", hostname);
- } else if (current_field != 3) {
- printf("\033[90mtonarchy\033[0m");
- }
+ Tui_Field fields[] = {
+ {"Username", username, NULL, 0},
+ {"Password", password, NULL, 1},
+ {"Confirm Password", confirmed_password, NULL, 1},
+ {"Hostname", hostname, "tonarchy", 0},
+ {"Keyboard", keyboard, "us", 0},
+ {"Timezone", timezone, NULL, 0},
+ };
+ int num_fields = (int)(sizeof(fields) / sizeof(fields[0]));
- form_row++;
+ for (int i = 0; i < num_fields; i++) {
+ printf(ANSI_CURSOR_POS, form_row + i, logo_start);
- if (current_field == 4) {
- printf("\033[%d;%dH\033[1;34m>\033[0m ", form_row, logo_start);
- } else {
- printf("\033[%d;%dH ", form_row, logo_start);
- }
- printf("\033[37mKeyboard: \033[0m");
- if (strlen(keyboard) > 0) {
- printf("\033[32m%s\033[0m", keyboard);
- } else if (current_field != 4) {
- printf("\033[90mus\033[0m");
- }
+ if (current_field == i) {
+ printf(ANSI_BLUE_BOLD ">" ANSI_RESET " ");
+ } else {
+ printf(" ");
+ }
- form_row++;
+ printf(ANSI_WHITE "%s: " ANSI_RESET, fields[i].label);
- if (current_field == 5) {
- printf("\033[%d;%dH\033[1;34m>\033[0m ", form_row, logo_start);
- } else {
- printf("\033[%d;%dH ", form_row, logo_start);
- }
- printf("\033[37mTimezone: \033[0m");
- if (strlen(timezone) > 0) {
- printf("\033[32m%s\033[0m", timezone);
- } else if (current_field != 5) {
- printf("\033[90m[not set]\033[0m");
+ if (strlen(fields[i].value) > 0) {
+ printf(ANSI_GREEN "%s" ANSI_RESET, fields[i].is_password ? "********" : fields[i].value);
+ } else if (current_field != i) {
+ if (fields[i].default_display) {
+ printf(ANSI_GRAY "%s" ANSI_RESET, fields[i].default_display);
+ } else {
+ printf(ANSI_GRAY "[not set]" ANSI_RESET);
+ }
+ }
}
fflush(stdout);
@@ -1146,6 +1111,11 @@ static int configure_system_impl(
"Failed to enable NetworkManager"
);
+ CHECK_OR_FAIL(
+ chroot_exec("systemctl enable dbus"),
+ "Failed to enable dbus"
+ );
+
if (use_dm) {
CHECK_OR_FAIL(
chroot_exec("systemctl enable lightdm"),
@@ -1197,7 +1167,7 @@ static int install_bootloader(const char *disk) {
return 1;
}
-static int configure_cinnamon_keybinds(const char *username) {
+static int configure_xfce(const char *username) {
char cmd[4096];
int rows, cols;
get_terminal_size(&rows, &cols);
@@ -1206,39 +1176,108 @@ static int configure_cinnamon_keybinds(const char *username) {
draw_logo(cols);
int logo_start = (cols - 70) / 2;
- printf("\033[%d;%dH\033[37mConfiguring Cinnamon...\033[0m", 10, logo_start);
+ printf("\033[%d;%dH\033[37mConfiguring XFCE...\033[0m", 10, logo_start);
fflush(stdout);
create_directory("/mnt/usr/share/wallpapers", 0755);
system("cp /usr/share/wallpapers/wall1.jpg /mnt/usr/share/wallpapers/wall1.jpg");
- snprintf(cmd, sizeof(cmd),
- "arch-chroot /mnt sudo -u %s dbus-run-session bash -c '\n"
- "dconf write /org/cinnamon/desktop/keybindings/custom-keybindings/custom0/binding \"[\\\"<Super>Return\\\"]\"\n"
- "dconf write /org/cinnamon/desktop/keybindings/custom-keybindings/custom0/command \"\\\"alacritty\\\"\"\n"
- "dconf write /org/cinnamon/desktop/keybindings/custom-keybindings/custom0/name \"\\\"Terminal\\\"\"\n"
- "dconf write /org/cinnamon/desktop/keybindings/custom-keybindings/custom1/binding \"[\\\"<Super>b\\\"]\"\n"
- "dconf write /org/cinnamon/desktop/keybindings/custom-keybindings/custom1/command \"\\\"firefox\\\"\"\n"
- "dconf write /org/cinnamon/desktop/keybindings/custom-keybindings/custom1/name \"\\\"Browser\\\"\"\n"
- "dconf write /org/cinnamon/desktop/keybindings/custom-keybindings/custom2/binding \"[\\\"<Super>e\\\"]\"\n"
- "dconf write /org/cinnamon/desktop/keybindings/custom-keybindings/custom2/command \"\\\"nemo\\\"\"\n"
- "dconf write /org/cinnamon/desktop/keybindings/custom-keybindings/custom2/name \"\\\"File Manager\\\"\"\n"
- "dconf write /org/cinnamon/desktop/keybindings/custom-list \"[\\\"custom0\\\", \\\"custom1\\\", \\\"custom2\\\"]\"\n"
- "dconf write /org/cinnamon/desktop/keybindings/wm/close \"[\\\"<Super>q\\\", \\\"<Alt>F4\\\"]\"\n"
- "dconf write /org/cinnamon/desktop/keybindings/wm/toggle-fullscreen \"[\\\"<Super>f\\\"]\"\n"
- "dconf write /org/cinnamon/desktop/keybindings/wm/push-tile-left \"[\\\"<Super>Left\\\"]\"\n"
- "dconf write /org/cinnamon/desktop/keybindings/wm/push-tile-right \"[\\\"<Super>Right\\\"]\"\n"
- "dconf write /org/cinnamon/desktop/background/picture-uri \"\\\"file:///usr/share/wallpapers/wall1.jpg\\\"\"\n"
- "dconf write /org/cinnamon/desktop/background/picture-options \"\\\"zoom\\\"\"\n"
- "'",
- username);
+ create_directory("/mnt/usr/share/tonarchy", 0755);
+ system("cp /usr/share/tonarchy/favicon.png /mnt/usr/share/tonarchy/favicon.png");
- if (system(cmd) != 0) {
- show_message("Warning: Failed to configure keybinds (can be done manually)");
- return 1;
+ snprintf(cmd, sizeof(cmd), "/mnt/home/%s/.mozilla/firefox/default", username);
+ create_directory(cmd, 0755);
+ snprintf(cmd, sizeof(cmd), "cp -r /usr/share/tonarchy/firefox/profile/* /mnt/home/%s/.mozilla/firefox/default/", username);
+ system(cmd);
+ snprintf(cmd, sizeof(cmd), "cp /usr/share/tonarchy/firefox/profiles.ini /mnt/home/%s/.mozilla/firefox/", username);
+ system(cmd);
+ snprintf(cmd, sizeof(cmd), "cp /usr/share/tonarchy/firefox/installs.ini /mnt/home/%s/.mozilla/firefox/", username);
+ system(cmd);
+ snprintf(cmd, sizeof(cmd), "arch-chroot /mnt chown -R %s:%s /home/%s/.mozilla", username, username, username);
+ system(cmd);
+
+ snprintf(cmd, sizeof(cmd), "/mnt/home/%s/.config", username);
+ create_directory(cmd, 0755);
+
+ snprintf(cmd, sizeof(cmd), "cp -r /usr/share/tonarchy/xfce4 /mnt/home/%s/.config/xfce4", username);
+ system(cmd);
+
+ snprintf(cmd, sizeof(cmd), "cp -r /usr/share/tonarchy/alacritty /mnt/home/%s/.config/alacritty", username);
+ system(cmd);
+
+ snprintf(cmd, sizeof(cmd), "cp -r /usr/share/tonarchy/rofi /mnt/home/%s/.config/rofi", username);
+ system(cmd);
+
+ snprintf(cmd, sizeof(cmd), "arch-chroot /mnt chown -R %s:%s /home/%s/.config", username, username, username);
+ system(cmd);
+
+ char nvim_path[256];
+ snprintf(nvim_path, sizeof(nvim_path), "/home/%s/.config/nvim", username);
+ git_clone_as_user(username, "https://github.com/tonybanters/nvim", nvim_path);
+ snprintf(cmd, sizeof(cmd), "arch-chroot /mnt chown -R %s:%s /home/%s/.config/nvim", username, username, username);
+ system(cmd);
+
+ Dotfile dotfiles[] = {
+ {
+ ".xinitrc",
+ "exec startxfce4\n",
+ 0755
+ },
+ {
+ ".bash_profile",
+ "if [ -z $DISPLAY ] && [ $XDG_VTNR = 1 ]; then\n"
+ " exec startx\n"
+ "fi\n",
+ 0644
+ },
+ {
+ ".bashrc",
+ "export PATH=\"$HOME/.local/bin:$PATH\"\n"
+ "export EDITOR=\"nvim\"\n"
+ "\n"
+ "alias ls='ls --color=auto'\n"
+ "alias la='ls -a'\n"
+ "alias ll='ls -la'\n"
+ "alias ..='cd ..'\n"
+ "alias ...='cd ../..'\n"
+ "alias grep='grep --color=auto'\n"
+ "\n"
+ "export PS1=\"\\[\\e[38;5;75m\\]\\u@\\h \\[\\e[38;5;113m\\]\\w \\[\\e[38;5;189m\\]\\$ \\[\\e[0m\\]\"\n",
+ 0644
+ }
+ };
+
+ for (size_t i = 0; i < sizeof(dotfiles) / sizeof(dotfiles[0]); i++) {
+ if (!create_user_dotfile(username, &dotfiles[i])) {
+ LOG_ERROR("Failed to create dotfile: %s", dotfiles[i].filename);
+ return 0;
+ }
+ }
+
+ char autologin_exec[512];
+ snprintf(autologin_exec, sizeof(autologin_exec),
+ "ExecStart=-/sbin/agetty -o \"-p -f -- \\\\u\" --noclear --autologin %s %%I $TERM",
+ username);
+
+ Config_Entry autologin_entries[] = {
+ {"[Service]", ""},
+ {"ExecStart=", ""},
+ {autologin_exec, ""}
+ };
+
+ Systemd_Override autologin = {
+ "getty@tty1.service",
+ "getty@tty1.service.d",
+ "autologin.conf",
+ autologin_entries,
+ 3
+ };
+
+ if (!setup_systemd_override(&autologin)) {
+ LOG_ERROR("Failed to setup autologin");
+ return 0;
}
- show_message("Cinnamon keybinds configured!");
return 1;
}
@@ -1256,7 +1295,7 @@ static int install_suckless_tools(const char *username) {
LOG_INFO("Starting suckless tools installation for user: %s", username);
- GitRepo repos[] = {
+ Git_Repo repos[] = {
{"https://github.com/tonybanters/dwm", "dwm", "/home/%s/dwm"},
{"https://github.com/tonybanters/st", "st", "/home/%s/st"},
{"https://github.com/tonybanters/dmenu", "dmenu", "/home/%s/dmenu"},
@@ -1291,7 +1330,7 @@ static int install_suckless_tools(const char *username) {
create_directory("/mnt/usr/share/wallpapers", 0755);
system("cp /usr/share/wallpapers/wall1.jpg /mnt/usr/share/wallpapers/wall1.jpg");
- DotFile dotfiles[] = {
+ Dotfile dotfiles[] = {
{
".xinitrc",
"xwallpaper --zoom /usr/share/wallpapers/wall1.jpg &\n"
@@ -1320,13 +1359,13 @@ static int install_suckless_tools(const char *username) {
"ExecStart=-/sbin/agetty -o \"-p -f -- \\\\u\" --noclear --autologin %s %%I $TERM",
username);
- ConfigEntry autologin_entries[] = {
+ Config_Entry autologin_entries[] = {
{"[Service]", ""},
- {"ExecStart", ""},
+ {"ExecStart=", ""},
{autologin_exec, ""}
};
- SystemdOverride autologin = {
+ Systemd_Override autologin = {
"getty@tty1.service",
"getty@tty1.service.d",
"autologin.conf",
@@ -1362,9 +1401,9 @@ int main(void) {
}
const char *levels[] = {
- "Beginner (Cinnamon desktop - perfect for starters)",
+ "Beginner (XFCE desktop - perfect for starters)",
"Tony-Suckless (dwm + minimal setup)",
- "Expert (Coming soon...)"
+ "Oxidized (OXWM Beta)"
};
int level = select_from_menu(levels, 3);
@@ -1385,60 +1424,18 @@ int main(void) {
LOG_INFO("Selected disk: %s", disk);
- if (level == 0) {
- Packages pkg = {0};
- sserror(partition_disk(disk));
- set_cinnamon_package(&pkg);
-
- sserror(install_packages_impl(pkg.cinnamon_package));
- sserror(configure_system_impl(username, password, hostname, keyboard, timezone, disk, 1));
- sserror(install_bootloader(disk));
-
- configure_cinnamon_keybinds(username);
-
- clear_screen();
- int rows, cols;
- get_terminal_size(&rows, &cols);
- draw_logo(cols);
-
- int logo_start = (cols - 70) / 2;
- printf("\033[%d;%dH\033[1;32mInstallation complete!\033[0m", 10, logo_start);
- printf("\033[%d;%dH\033[37mPress Enter to reboot...\033[0m", 12, logo_start);
- fflush(stdout);
-
- enable_raw_mode();
- char c;
- read(STDIN_FILENO, &c, 1);
- disable_raw_mode();
- system("eject -m /dev/sr0 2>/dev/null");
- system("reboot");
- } else if (level == 1) {
- Packages pkg = {0};
- sserror(partition_disk(disk));
- set_suckless_package(&pkg);
-
- sserror(install_packages_impl(pkg.suckless_package));
- sserror(configure_system_impl(username, password, hostname, keyboard, timezone, disk, 0));
- sserror(install_bootloader(disk));
-
+ if (level == BEGINNER) {
+ CHECK_OR_FAIL(partition_disk(disk), "Failed to partition disk");
+ CHECK_OR_FAIL(install_packages_impl(XFCE_PACKAGES), "Failed to install packages");
+ CHECK_OR_FAIL(configure_system_impl(username, password, hostname, keyboard, timezone, disk, 0), "Failed to configure system");
+ CHECK_OR_FAIL(install_bootloader(disk), "Failed to install bootloader");
+ configure_xfce(username);
+ } else if (level == SUCKLESS) {
+ CHECK_OR_FAIL(partition_disk(disk), "Failed to partition disk");
+ CHECK_OR_FAIL(install_packages_impl(SUCKLESS_PACKAGES), "Failed to install packages");
+ CHECK_OR_FAIL(configure_system_impl(username, password, hostname, keyboard, timezone, disk, 0), "Failed to configure system");
+ CHECK_OR_FAIL(install_bootloader(disk), "Failed to install bootloader");
install_suckless_tools(username);
-
- clear_screen();
- int rows, cols;
- get_terminal_size(&rows, &cols);
- draw_logo(cols);
-
- int logo_start = (cols - 70) / 2;
- printf("\033[%d;%dH\033[1;32mInstallation complete!\033[0m", 10, logo_start);
- printf("\033[%d;%dH\033[37mPress Enter to reboot...\033[0m", 12, logo_start);
- fflush(stdout);
-
- enable_raw_mode();
- char c;
- read(STDIN_FILENO, &c, 1);
- disable_raw_mode();
- system("eject -m /dev/sr0 2>/dev/null");
- system("reboot");
} else {
clear_screen();
int rows, cols;
@@ -1446,17 +1443,35 @@ int main(void) {
draw_logo(cols);
int logo_start = (cols - 70) / 2;
- printf("\033[%d;%dH\033[1;33mExpert mode coming soon!\033[0m", 10, logo_start);
- printf("\033[%d;%dH\033[37mThis mode will allow full customization of your installation.\033[0m", 12, logo_start);
- printf("\033[%d;%dH\033[37mPress any key to exit...\033[0m", 14, logo_start);
+ printf("\033[%d;%dH\033[1;33mOXWM mode coming soon!\033[0m", 10, logo_start);
+ printf("\033[%d;%dH\033[37mPress any key to exit...\033[0m", 12, logo_start);
fflush(stdout);
enable_raw_mode();
char c;
read(STDIN_FILENO, &c, 1);
disable_raw_mode();
+ logger_close();
+ return 0;
}
+ clear_screen();
+ int rows, cols;
+ get_terminal_size(&rows, &cols);
+ draw_logo(cols);
+
+ int logo_start = (cols - 70) / 2;
+ printf("\033[%d;%dH\033[1;32mInstallation complete!\033[0m", 10, logo_start);
+ printf("\033[%d;%dH\033[37mPress Enter to reboot...\033[0m", 12, logo_start);
+ fflush(stdout);
+
+ enable_raw_mode();
+ char c;
+ read(STDIN_FILENO, &c, 1);
+ disable_raw_mode();
+ system("eject -m /dev/sr0 2>/dev/null");
+ system("reboot");
+
LOG_INFO("Tonarchy installer finished");
logger_close();
return 0;
diff --git a/tonarchy.h b/tonarchy.h
index 9e98b89..47d81dd 100644
--- a/tonarchy.h
+++ b/tonarchy.h
@@ -21,78 +21,52 @@
#define CHROOT_PATH "/mnt"
#define MAX_CMD_SIZE 4096
-typedef enum {
- LEVEL_BEGINNER,
- LEVEL_INTERMEDIATE,
- LEVEL_ADVANCED
-} install_level;
-
-typedef enum {
- DE_CINNAMON,
- DE_HYPRLAND,
- DE_GNOME,
- DE_KDE,
- DE_SWAY,
- DE_NONE
-} desktop_env;
-
-typedef enum {
- DISPLAY_WAYLAND,
- DISPLAY_XORG,
- DISPLAY_BOTH
-} display_server;
+#define ANSI_ESC "\033["
+#define ANSI_RESET ANSI_ESC "0m"
+#define ANSI_BOLD ANSI_ESC "1m"
+#define ANSI_WHITE ANSI_ESC "37m"
+#define ANSI_GREEN ANSI_ESC "32m"
+#define ANSI_GRAY ANSI_ESC "90m"
+#define ANSI_BLUE ANSI_ESC "34m"
+#define ANSI_BLUE_BOLD ANSI_ESC "1;34m"
+#define ANSI_CURSOR_POS ANSI_ESC "%d;%dH"
typedef enum {
LOG_LEVEL_DEBUG,
LOG_LEVEL_INFO,
LOG_LEVEL_WARN,
LOG_LEVEL_ERROR
-} LogLevel;
-
-typedef struct {
- install_level level;
- desktop_env de;
- display_server display;
- bool use_custom_dotfiles;
- char dotfiles_url[512];
- bool install_docker;
- bool install_dev_tools;
- bool install_gaming;
-} install_config;
+} Log_Level;
typedef struct {
const char *repo_url;
const char *name;
const char *build_dir;
-} GitRepo;
+} Git_Repo;
typedef struct {
const char *filename;
const char *content;
mode_t permissions;
-} DotFile;
+} Dotfile;
typedef struct {
const char *key;
const char *value;
-} ConfigEntry;
+} Config_Entry;
typedef struct {
const char *service_name;
const char *drop_in_dir;
const char *drop_in_file;
- ConfigEntry *entries;
+ Config_Entry *entries;
size_t entry_count;
-} SystemdOverride;
+} Systemd_Override;
-typedef struct {
- char *cinnamon_package;
- char *suckless_package;
-} Packages;
void logger_init(const char *log_path);
void logger_close(void);
-void log_msg(LogLevel level, const char *fmt, ...);
+void log_msg(Log_Level level, const char *fmt, ...);
#define LOG_DEBUG(...) log_msg(LOG_LEVEL_DEBUG, __VA_ARGS__)
#define LOG_INFO(...) log_msg(LOG_LEVEL_INFO, __VA_ARGS__)
@@ -109,8 +83,8 @@ int chroot_exec_as_user(const char *username, const char *cmd);
int chroot_exec_as_user_fmt(const char *username, const char *fmt, ...);
int git_clone_as_user(const char *username, const char *repo_url, const char *dest_path);
int make_clean_install(const char *build_dir);
-int create_user_dotfile(const char *username, const DotFile *dotfile);
-int setup_systemd_override(const SystemdOverride *override);
+int create_user_dotfile(const char *username, const Dotfile *dotfile);
+int setup_systemd_override(const Systemd_Override *override);
void show_message(const char *message);