You can spend an afternoon hardening Firefox and still lose confidence in the result a week later. \n \n The browser updates. A preference changes silently. A file gets replaced. A real-world exception gets added for something like Discord or Spotify. Eventually, the question stops being "did I harden Firefox?" and becomes "is the browser that is running still the browser I think I hardened?" \n \n That is the gap I kept running into. \n \n Most Firefox hardening setups are built around a static user.js. That is a useful starting point, but it is not the whole problem. A static config gives you a snapshot of intent. It does not automatically give you confidence that the deployed browser still matches that intent after updates, drift, and operational changes. \n \n That is why I built `hifox`. \n \n `hifox` is a Linux-first Firefox hardening framework, but the important part is not the word "framework." The important part is the model behind it: treat a Git repo as the source of truth and Firefox as a deployment target. \n \n In implementation terms, that means Bash orchestration around Firefox AutoConfig, lockPref(), policies.json, generated pref dumps, and systemd --user verification/watch layers. \n \n That sounds simple, but it changes the way hardening is approached. \n \n Instead of viewing browser hardening as "write some prefs once and hope they stick," `hifox` treats it as a workflow: \n \n 1. define rules in the repo \n 2. generate the effective runtime configuration \n 3. deploy it into Firefox \n 4. verify that the live browser still matches the repo \n 5. watch for drift and react when integrity breaks \n \n That is the core idea. \n \n In practical terms, `hifox` does not rely mainly on `user.js`. It generates `autoconfig.cfg`, uses `lockPref()` for high-priority enforcement, uses `policies.json` for features that belong in Firefox's policy layer, and keeps the deployed state tied back to the repo. The point is not to have "more config." The point is to have a declared model that can actually be checked and re-applied. \n \n This distinction matters because static hardening tends to fail operationally, not theoretically. \n \n On day one, your config looks strict and intentional. On day thirty, you may no longer know: \n whether the most important prefs are still lockedwhether deployed files still match what is in version controlwhether Firefox updates introduced new prefs you never reviewedwhether app-specific exceptions quietly weakened the whole setup \n \n `hifox` is an attempt to make those questions answerable. \n \n The runtime side is built around a simple loop. `deploy` pushes generated hardening into Firefox. `verify` checks important prefs and deployed files against the repo. File watchers and timer-based checks look for drift. If integrity breaks badly enough, Firefox can be stopped and the user can be notified instead of silently continuing in a degraded state. \n \n That last point is one of the main philosophical differences. \n \n A lot of hardening setups assume that silent failure is acceptable. I do not think that is a great trade. If the browser is no longer in the state you intended, "it still opens" is not a sufficient success condition. \n \n Another piece I cared about was update visibility. \n \n Browser updates are one of the hardest parts of maintaining a hardened setup because they can shift the ground under you. New preferences appear. Old ones change behavior. Some become irrelevant. Some become more important than before. If you are only looking at a handwritten config file, you can miss those changes for a long time. \n \n `hifox` addresses that by generating a full pref dump at startup and comparing it against the repo copy. When the dump changes, that change can flow back into version control and show up as an explicit `git diff`. That turns browser churn into something reviewable. \n \n For me, that was a major design goal: if Firefox changes, I want the hardening workflow to surface that change clearly rather than bury it. \n \n The other major design goal was separating "main browser" usage from "app-like browser" usage. \n \n In normal browser life, everything gets mixed into one profile: tabs, cookies, permissions, auth state, device access, autoplay exceptions, media permissions, and random site-specific loosenings. Over time that shared profile becomes difficult to reason about because the exception surface is no longer small. \n \n `hifox` takes a different route. It uses isolated Firefox profiles as webapps. \n \n That means the main profile can stay maximally locked, while app-style profiles can selectively unlock only what they truly need. A Discord profile can restore mic, camera, and WebRTC. A Spotify profile can restore DRM. Another webapp can get exactly its own exceptions and nothing more. \n \n The result is not just cleaner organization. It changes the security posture of browser usage. \n \n Instead of one giant browser profile accumulating everything, you get separate state containers with separate permission surfaces while still staying inside one Firefox runtime and one enforcement model. \n \n That is the part of the project I think is easy to underestimate. Isolated webapps are not just a convenience feature. They are a way to keep exceptions explicit, local, and reviewable. \n \n To be clear, this is not a claim that Firefox becomes "secure" in any absolute sense. \n \n `hifox` is not a defense against browser exploits, kernel exploits, or a compromised operating system. It is not a silver bullet and it is not a universal standard every Firefox user should adopt unchanged. \n \n Its goal is narrower: \n \n - make hardening deterministic \n - reduce silent drift \n - expose update-driven changes \n - keep exceptions visible \n - keep the running browser closer to the declared model \n \n The current scope is also intentionally narrow. `hifox` is Linux-only and built around Bash, Firefox AutoConfig, `policies.json`, and `systemd --user`. I am not trying to present it as a cross-platform enterprise product. I am trying to solve a specific operational problem well. \n \n So the real thesis behind the project is this: \n \n Firefox hardening gets more useful when you stop treating it as a static file problem and start treating it as a deploy, verify, and integrity problem. \n \n That is what `hifox` is trying to operationalize. \n \n Further reading:Intro to Digital Fingerprints: Understanding, Manipulating, and Defending Against Online TrackingThe “Connection Not Private” Warning ExplainedMozilla AutoConfig documentationFirefox enterprise policies reference\:::tipCheck out hifox on GitHub: https://github.com/q1sh101/hifox:::\\\\