I believe I started using Mozilla Firefox around version 0.6 in 2002.[1] I must have been using Internet Explorer 6 before that, so Firefox was a revelation. Here was a browser that wasn’t actively hostile towards the Internet, with an overriding focus on usability, flexibility, and web standards (a subject I was gaining a passion for around the same time). I dallied with other browsers over the years (Maxthon and Opera being the two I spent the most time with), both before and after, but it was Firefox I always returned to. The XUL model provided an endlessly flexible and versatile foundation for extensions: I quickly had 15–20 of them that I simply couldn’t live without.

The problem with flexibility

Unfortunately, over time, my extension– and user script–loving ways exacted a toll. Extensions could reach into nearly any part of the browser and change anything. This wasn’t a problem if you only had one or two installed, but for someone like myself who wanted control over everything from which scripts were executed to what the context menu displayed, the browser started to struggle under its own weight. Responsiveness became a thing of the past. Many sessions with several hundred open tabs were lost to crashes, leading to much screaming and painstaking reconstruction from the history panel.

Even when sessions did restore correctly, the tabs were throttled so no more than three loaded simultaneously; this was an annoyance in its own right since they loaded so slowly compared to any other browser. Indeed, one of the reflexes I developed was to hold Ctrl + Page Down to activate a row of tabs at a time, forcing all of them to load simultaneously, go back to the first one, and press Escape on each one after the page title appeared. I would later have to refresh any that I needed to view in that session.

For a period of somewhere between a few months and a couple of years, Firefox would crash on almost every exit, sometimes silently. This corrupted my session in a very strange way: the next time I opened the browser, a random portion (anywhere from a tenth to three-fourths) of the restored tabs would have a new current history entry (after the one they were supposed to have), always the same entry taken from the first tab in a specific session saved years ago. There was no pattern to what caused the crashes or which tabs were corrupted.

Once that bug morphed into an infrequent irritation, another sort of occasional session corruption reared its head. The telltale sign this time was that a random portion of the restored tabs would show ‘New Tab’ in the title, because their previous history had been overwritten with the same entry mentioned earlier and their current history entry had been overwritten with a blank entry… but not entirely. I’d have to rush through these steps while they were being restored three at a time:

  1. Click on a corrupted tab as that page loaded loaded (not before, not after).
  2. Wait for the page title[2] to appear, signalling that the page was loading. Without this step, Firefox would stop on a blank page and the tab’s history might disappear entirely on the next load.
  3. Click on the Back button and hold to display the history.
  4. Select the entry for the current page, which would show the correct information.
  5. Find the next corrupted tab and repeat the process.

I had to do this before all the tabs were fully loaded or I might be unable to spot the corrupted amongst the correctly-restored tabs. I became adept at noticing and undoing the problem, but the repetition led me to write a small tool for rotating backups and run it religiously every single time I exited Firefox so I always had several pristine sessions, ready to restore in case of emergencies.

Of course, even setting aside those session-related problems, Firefox simply couldn’t handle the combination of all the extensions, several years of history,[3] and never fewer than a hundred open tabs. Every click or key press took significant time to register. I could ‘queue up’ several input events by pressing multiple keys and watch them execute one by one.

Some sites failed in novel ways: Feedly and Inoreader, for instance, both had keyboard shortcuts for navigation that would work only sporadically. I would have to press j five times in order to move forward, but I always had to be careful, because every now and then they would respond instantly, causing me to overshoot my target. Meanwhile, Reddit couldn’t show usernames on posts or comments.

My bookmarks and history were a mess: when I added a single bookmark to a site, it would silently be multiplied to between two and six identical bookmarks. The history was similarly filled with duplicates.

Even the interface for customizing the button layout didn’t quite work right. It always required trial and error to make my changes stick by waiting for any sort of signal that they had been saved.

The Cyberfox phase

One of the great crises of 2017 was the implementation of Firefox Electrolysis, which replaced XUL extensions with drastically limited WebExtensions. I completely understand the rationale: the overly permissive extant model was unsustainable. It posed a fundamental, insurmountable obstacle to improving the architecture of the browser, which was an imperative in the face of the much more complex and capable web of the 2010s. I can’t fault that sort of considered improvement. My only overriding concern was: how could I replace all the extensions I needed? For example, to this day, Tab Mix Plus has a long list of outstanding prerequisites. How would I do without what I viewed as the basic features of a browser?

I believe it was in 2016 (the year Electrolysis was initially released) that I found a fork of Firefox called Cyberfox, which preserved the old model and UI. It was everything I wanted: a recognizable interface and support for all the extensions I wanted to use. I installed it, switched, and chugged along with some trepidation.

Later the same year, it was announced that there would be no further development. This is how I ended up using a derivative of Firefox 52 ESR (Extended Support Release) for the next five years.

Coping, sadly

I stuck to my guns. The web moved on. More and more websites stopped working with what was very quickly an antiquated version of the Gecko engine. Cyberfox’s performance remained unchanged—true, it didn’t worsen, but it couldn’t improve. I turned to Google Chrome.

At first, I used Chrome infrequently, when I needed to open something quickly or open a specific site that Cyberfox could no longer handle. In a matter of a few months, though, it had attained equal importance to Cyberfox in my daily browsing. It was so much easier to open the comparatively svelte and responsive Chrome to visit a single site than to wait for Cyberfox to load all my tabs or even just open a new window. I did start leaving more tabs open in Chrome than I should, but always few enough that it was still quick to start and responsive thereafter. (The fact that it wouldn’t load tabs until they were activated made a big difference; the fact that tabs would lose all identifying information if you had too many of them imposed a limit on how many I could usefully open.)

Despite the noticeable difference in responsiveness, I can’t say I ever liked using Chrome. The growing Chromium monoculture is worrisome. (I briefly considered Brave, but it too uses Chromium.) The emphasis on Google products and the constant data collection deeply bothered me. More practically, I made it a point to exercise restraint when it came to extensions,[4] so although I had a fast and reliable browser, it was much less capable.

I checked all my Firefox extensions every 6–12 months to see if I could switch. Alas, I could never find a way to achieve the same experience as in Cyberfox. I carried on with the inferior browser.

The big change

This past October, someone by the name Chompy commented on the DSI Discord:

Recently found this super awesome tool. If your [sic] using AWS, use this with Firefox multi-containers add-on (open multiple profiles in containers without needing to login on the browser, uses your aws-cli creds). OSS as well:

My reaction was to wonder why I hadn’t switched to Firefox in all this time. I grumbled to them as usual about how I’d love to switch entirely but couldn’t use all my old extensions, and brought up how I use Firefox and Chrome in tandem. The ensuing discussion turned out to be the final push I needed to abandon Chrome.

I downloaded and installed the latest Firefox version. (The installer annoyed me by allowing hardly any customization, but that was a small issue.) I started it up and checked my addons. Most of them were compatible by this point! The only major obstacle was Tab Mix Plus. I sighed and was resigning myself to not being able to fully leave Cyberfox behind, as well as exploring a mental flowchart of when to use the new version and when not to… until I remembered an extension I’d heard about called Tree Style Tab.

Vertical tabs both made sense and didn’t make sense to me. I installed the extension. I tried it. I was an instant convert. In fact, the tree structure made one of my other most-wanted extensions (which copied history over to new tabs) almost redundant. At long last, I could leave Cyberfox behind!

It took a day or so to set things up mostly to my satisfaction. Fortunately, the default UI is customizable enough to undo its Chrome mimicry, allowing the title bar to regain its usefulness. Multi-Account Containers alone was worth the price of admission: where in Chrome I’d permanently have a regular window and an Incognito window open to allow using two accounts on GitHub (with no way to add a third), this extension let me isolate sites to my heart’s content. I initially installed Temporary Containers as well, but I noticed small bugs and found reports of incompatibilities; MAC was more or less enough on its own for the moment.

Handling bookmarks

Migrating 17,000 bookmarks was convoluted thanks to the duplicates and other errors:

  1. Export the list from Cyberfox.
  2. Import it in Firefox. This completely overwrites existing bookmarks, but I had only just installed it anyway.
  3. Install the Bookmark Dupes extension.
  4. Open the extension and run a search.
  5. Wait 5–10 minutes for it to discover all the bookmarks and duplicates (presumably because they had just been imported).
  6. Delete all the duplicates.
  7. Wait 5–10 minutes for the deletion to be effected.

That gave me the full list, as far as I can tell, with no errors, and I could safely delete the extension afterwards. The final count was roughly 11,000.

Importing user scripts and user styles

Although I relied on Greasemonkey and Stylish to customize the websites I visit regularly, I didn’t have too many user scripts, so I updated them by hand and imported them into Tampermonkey (the modern equivalent to Greasemonkey). The user styles were another matter. I had over a hundred of them, and I needed to import them into Stylus, a fork of Stylish without tracking. Fortunately, there’s an old extension to export Stylish styles in a Stylus-compatible format that allowed me to import them all.

Precious, precious history

I was most concerned about keeping my history. I did consider omitting it, but letting go of seven or more years of browser history without a second thought seems foolish. I spent a while trying to understand what I’d need to do. I would have been happy to write a script to update the old SQLite database to Firefox’s newest format, but the two were different enough that I couldn’t even begin to understand what it would require. Instead, I took a cue from a Reddit comment:

  1. Install a separate copy of Portable Firefox 57 to perform the migration in.
  2. Start it using the hack to run multiple instances of Firefox.
  3. Disable auto-updating.
  4. Close it.
  5. Copy places.sqlite from the old profile into the new profile (overwriting the new, empty one).
  6. Restart the new profile.
  7. Allow the builtin updater to automatically install Firefox 72.
  8. Restart.
  9. Allow the builtin updater to automatically install Firefox 105.

The next question was how to merge this fully up-to-date places.sqlite into my main profile. I thought I’d use Firefox Sync, but in my testing, I could only see a bit of my main history after syncing. Another comment said Sync only copies over the last two months of history, so I wrote it off as an unviable method.

I asked for help. u/fsau directed me to Firefox Sync. I told them about what I understood to be the limit. They pointed out that Sync copies everything. I was confused about why I had seen different behaviour until I realized it wasn’t Sync truncating my history but the receiving Firefox. I tried it again with history expiration set very high on the receiving instance, et voilà ! The receiving instance had my full history.

How do I love thee, Firefox? Let me count list the ways

I’m reminded every day I use Firefox that I owe Chompy an enormous debt for having prompted me to return to the fold. Here are some things about Firefox that I don’t know how I did without:

Odds and ends

  1. At which point it must have been called Phoenix, since the new name came in 2004.
  2. I wonder whether DIY Photography ever noticed how taken I appeared to be with Transcendent Photos Of Two Siberian Huskies Playing On A Frozen Lake, reading it not once but tens of times a day for years. Indeed, the first two words of the title are seared into my brain at this point.
  3. A crucial part of my browsing experience that I preserved beyond its browser-sanctioned life with yet another extension.
  4. Not that that was a short list: uBlock Origin, DuckDuckGo Essentials, LastPass, Edit With Emacs, HTTPS Everywhere, TinEye Reverse Image Search, and the React/Redux development tools for work. Oh, and the Reddit Enhancement Suite, since I was spending more and more time there.
  5. An example: before, on Ars Technica, I could edit the user styles, but the CSS panel was blank. In other cases, my custom rules simply wouldn’t take effect on the page, and would even be missing from the panel.