<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Giorgi Kishmareia</title>
    <description>The latest articles on Forem by Giorgi Kishmareia (@q1sh101).</description>
    <link>https://forem.com/q1sh101</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F300343%2Ff6b39379-deda-4dbb-a430-7aba09d23367.jpg</url>
      <title>Forem: Giorgi Kishmareia</title>
      <link>https://forem.com/q1sh101</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/q1sh101"/>
    <language>en</language>
    <item>
      <title>hifox: Deterministic Firefox Hardening as an Enforcement Workflow</title>
      <dc:creator>Giorgi Kishmareia</dc:creator>
      <pubDate>Thu, 26 Mar 2026 16:00:26 +0000</pubDate>
      <link>https://forem.com/q1sh101/show-dev-hifox-firefox-hardening-with-autoconfig-drift-detection-and-isolated-webapps-g3h</link>
      <guid>https://forem.com/q1sh101/show-dev-hifox-firefox-hardening-with-autoconfig-drift-detection-and-isolated-webapps-g3h</guid>
      <description>&lt;p&gt;&lt;code&gt;hifox&lt;/code&gt; is a Linux-first Firefox hardening framework that treats a Git repo as the source of truth and the browser as a deployment target. Instead of stopping at a static config, it generates enforced runtime config, verifies drift, surfaces update changes, and isolates webapps into separate profiles with selective unlocks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/q1sh101/hifox" rel="noopener noreferrer"&gt;https://github.com/q1sh101/hifox&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyjed7rtvl2kn9jcbp3ai.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyjed7rtvl2kn9jcbp3ai.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem
&lt;/h3&gt;

&lt;p&gt;You spend time hardening Firefox.&lt;/p&gt;

&lt;p&gt;Then the browser updates, a file drifts, or an exception gets added for a real app.&lt;/p&gt;

&lt;p&gt;How do you know the browser that is running still matches the hardening you intended?&lt;/p&gt;

&lt;p&gt;Most Firefox hardening setups stop at a static &lt;code&gt;user.js&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That is useful, but it leaves a real gap between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the hardening you meant to have&lt;/li&gt;
&lt;li&gt;the browser that is actually running&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Files drift. Browser updates add new prefs. Exceptions for real apps slowly pile up. Over time, the setup becomes harder to trust because it is no longer obvious whether the live browser still matches the model in your head.&lt;/p&gt;

&lt;p&gt;That is the problem &lt;code&gt;hifox&lt;/code&gt; is trying to solve.&lt;/p&gt;

&lt;h3&gt;
  
  
  What hifox changes
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;hifox&lt;/code&gt; treats Firefox hardening as an enforcement workflow, not just a config dump.&lt;/p&gt;

&lt;p&gt;The basic model is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;keep the repo as the source of truth&lt;/li&gt;
&lt;li&gt;generate the effective Firefox config from that repo&lt;/li&gt;
&lt;li&gt;deploy it into Firefox&lt;/li&gt;
&lt;li&gt;verify that the live browser still matches it&lt;/li&gt;
&lt;li&gt;watch for drift and react if integrity breaks&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In practice, that means &lt;code&gt;hifox&lt;/code&gt; does not rely mainly on a static &lt;code&gt;user.js&lt;/code&gt;.&lt;br&gt;
It generates &lt;code&gt;autoconfig.cfg&lt;/code&gt;, enforces base rules with &lt;code&gt;lockPref()&lt;/code&gt;, uses &lt;code&gt;policies.json&lt;/code&gt; where Firefox policy support is the right layer, and keeps the deployed browser tied back to the repo.&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;A static config is easy to copy once and forget.&lt;br&gt;
An enforcement workflow is designed to keep the browser in the state you intended.&lt;/p&gt;

&lt;p&gt;The runtime side of &lt;code&gt;hifox&lt;/code&gt; is built around a simple loop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;deploy&lt;/code&gt; pushes the generated hardening into Firefox&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;verify&lt;/code&gt; checks important prefs and deployed files against the repo&lt;/li&gt;
&lt;li&gt;watcher and timer layers catch tampering, deletion, or silent drift&lt;/li&gt;
&lt;li&gt;if integrity breaks, Firefox can be stopped and a notification can be raised instead of silently continuing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is also an update-detection angle that mattered a lot to me.&lt;/p&gt;

&lt;p&gt;Firefox updates can add or change prefs quietly.&lt;br&gt;
&lt;code&gt;hifox&lt;/code&gt; generates a full pref dump on startup, compares that against the repo copy, and surfaces meaningful changes back into version control. That turns "Firefox changed something internally" into a visible &lt;code&gt;git diff&lt;/code&gt; that can be reviewed and acted on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why isolated webapps matter
&lt;/h3&gt;

&lt;p&gt;Another part I cared about was separating the main browser profile from app-like browser usage.&lt;/p&gt;

&lt;p&gt;The default profile can stay maximally locked.&lt;br&gt;
Then app-style profiles can selectively unlock only what they actually need.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a Discord profile can re-enable mic, camera, and WebRTC&lt;/li&gt;
&lt;li&gt;a Spotify profile can re-enable DRM&lt;/li&gt;
&lt;li&gt;everything else stays under the same hardening model unless you explicitly relax it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gives a different shape than normal browser usage.&lt;/p&gt;

&lt;p&gt;Instead of one giant profile where tabs, cookies, permissions, and exceptions all accumulate together, &lt;code&gt;hifox&lt;/code&gt; uses isolated Firefox profiles as webapps. Each one gets its own state, its own permission surface, and its own override rules while still sharing the same Firefox runtime.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it is not
&lt;/h3&gt;

&lt;p&gt;The goal is not to claim that Firefox becomes "secure" in any absolute sense.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;hifox&lt;/code&gt; is not a defense against browser exploits, kernel exploits, or a compromised OS.&lt;br&gt;
It is also not trying to be a universal hardening standard for everyone.&lt;/p&gt;

&lt;p&gt;The goal is narrower and more practical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;make Firefox hardening deterministic&lt;/li&gt;
&lt;li&gt;reduce silent drift&lt;/li&gt;
&lt;li&gt;make changes auditable&lt;/li&gt;
&lt;li&gt;keep exceptions explicit&lt;/li&gt;
&lt;li&gt;keep the running browser closer to the declared model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Current scope is intentionally narrow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linux only&lt;/li&gt;
&lt;li&gt;Flatpak Firefox and standard Firefox&lt;/li&gt;
&lt;li&gt;Bash, Firefox autoconfig, &lt;code&gt;policies.json&lt;/code&gt;, and &lt;code&gt;systemd --user&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The core thesis
&lt;/h3&gt;

&lt;p&gt;So the main idea is simple:&lt;/p&gt;

&lt;p&gt;Firefox hardening gets much more interesting once you stop treating it as a static file problem and start treating it as a deploy, verify, and integrity problem.&lt;/p&gt;

&lt;p&gt;That is what &lt;code&gt;hifox&lt;/code&gt; is.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/q1sh101/hifox" rel="noopener noreferrer"&gt;https://github.com/q1sh101/hifox&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>firefox</category>
      <category>linux</category>
      <category>security</category>
    </item>
    <item>
      <title>Your bundle didn't suddenly get bigger. You just never saw it change.</title>
      <dc:creator>Giorgi Kishmareia</dc:creator>
      <pubDate>Wed, 21 Jan 2026 20:43:17 +0000</pubDate>
      <link>https://forem.com/q1sh101/your-bundle-didnt-suddenly-get-bigger-you-just-never-saw-it-change-3il4</link>
      <guid>https://forem.com/q1sh101/your-bundle-didnt-suddenly-get-bigger-you-just-never-saw-it-change-3il4</guid>
      <description>&lt;p&gt;Most bundle size regressions don’t come from bad code. They come from small, reasonable decisions that add up quietly.&lt;/p&gt;

&lt;p&gt;A helper here. One more dependency there. Everything makes sense in isolation.&lt;/p&gt;

&lt;p&gt;This kept bothering me, not because I don’t care about size, but because managing it properly always meant extra setup, extra rules, extra friction.&lt;/p&gt;

&lt;p&gt;What actually helped wasn’t optimizing harder. It was seeing size changes automatically, at the exact moment code is reviewed.&lt;/p&gt;

&lt;p&gt;When size becomes part of the pull request, behavior shifts naturally. No enforcement. No policing. Just visibility and better decisions.&lt;/p&gt;

&lt;p&gt;I built this because the problem wouldn’t go away. If it helps you even a little, that’s already a win.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/q1sh101/build-size-diff" rel="noopener noreferrer"&gt;https://github.com/q1sh101/build-size-diff&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdod2z1m77wq0djwsoxui.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdod2z1m77wq0djwsoxui.png" alt=" " width="800" height="851"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/q1sh101/build-size-diff" rel="noopener noreferrer"&gt;https://github.com/q1sh101/build-size-diff&lt;/a&gt;&lt;/p&gt;

</description>
      <category>githubactions</category>
      <category>javascript</category>
      <category>opensource</category>
      <category>performance</category>
    </item>
  </channel>
</rss>
