Switching to Firefox from Firefox (and Chrome)
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:
- Click on a corrupted tab as that page loaded loaded (not before, not after).
- 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.
- Click on the Back button and hold to display the history.
- Select the entry for the current page, which would show the correct information.
- 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:
https://granted.dev/
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:
- Export the list from Cyberfox.
- Import it in Firefox. This completely overwrites existing bookmarks, but I had only just installed it anyway.
- Install the Bookmark Dupes extension.
- Open the extension and run a search.
- Wait 5–10 minutes for it to discover all the bookmarks and duplicates (presumably because they had just been imported).
- Delete all the duplicates.
- 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:
- Install a separate copy of Portable Firefox 57 to perform the migration in.
- Start it using the hack to run multiple instances of Firefox.
- Disable auto-updating.
- Close it.
- Copy places.sqlite from the old profile into the new profile (overwriting the new, empty one).
- Restart the new profile.
- Allow the builtin updater to automatically install Firefox 72.
- Restart.
- 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:
- As I said before, Multi-Account Containers are indispensable.
- I can launch a different profile alongside the main one from within the browser itself (by visiting about:profiles), so the lightweight profile I use for web development is never more than a couple of clicks away.
- User scripts ought to be a core feature in every browser.
- (Per-site) User styles too, of course. I can write them so easily in this newer version because of
the lack of delays or crashes, not to mention the lack of inexplicable CSS issues.[5] (I
do miss Stylish automatically completing
!important
, though.) - Tree Style Tab is the tab management extension I always wanted but never knew I did. This should be how browsers operate by default. I don’t need ‘tab groups’ or other ways of organizing tabs since the tree structure is such an intuitive and obvious approach.
- Unlike Chrome, Firefox won’t neuter ad-blocking extensions.
- Link Status Redux is a terrific extension.
- Along with the previous point, being able to see the full URL of a link as soon as I hover over it—in contrast to Chrome waiting a few seconds until it’s sure I want to see the full thing—is a small yet critical improvement.
- The unified menu for extension shortcuts that I only found about by accident from a tip in the Stylus options dialog. The only hitch is that it doesn’t prevent all double assignments (for example, I can assign a command to Alt + Shift + T, but discover afterwards that it triggers the Tools menu.)
- Saving a tree of tabs as bookmarks and using the Open All as a Tree feature is a godsend for sets of pages that I use together but won’t have open all the time. I do wish I could tell them to open in a specific container, though.
- I can set up a keyword for a site, use it a few times, and then just type in the thing I searched for to find it in my history instead of having to use the full keyword-based search every time.
- I am eternally grateful for the ability to prevent YouTube videos from autoplaying unless I open them on YouTube itself.
Odds and ends
- The Edit With Emacs extension doesn’t seem to work, and drastically slows complex pages.
- Initially, my biggest enemy were the habits and reflexes I developed over the years, like when I wanted to watch a video and my instinct was to copy the URL to open it in Chrome instead of just playing it right there or opening it in a new Firefox tab or window. The unfamiliar order of items in the context menus and the inability to hide useless items kept catching me out, too.
- Turning on Tab Session Manager’s automatic restore feature alongside Tree Style Tab caused it to restore tabs one at a time with no hierarchy. This is apparently part of how it works, as there’s an option to add a delay between tabs that needs to be increased in case of issues. I disabled the automatic restoration so TST can handle it.
- Granting microphone and camera permissions to video conferencing sites often causes the browser to crash outright. It only happened the first time with Zoom, Slack, and Microsoft Teams, but Google Meet keeps crashing.
- Screen sharing is problematic as well. Between this and the last point, I’m still sometimes using Chrome for calls.
- I sometimes miss Chrome’s automatic OpenSearch handling, but Firefox’s explicit keywords are better.
- Memory usage fluctuates a lot, but it definitely needs more thanks to the increased complexity and
multi-process model. However, it’s hard to pin down its profile, especially since loading tabs is
deferred until they’re activated. Here are a few examples:
- Cyberfox 52 with around 170 tabs open (all loaded): using 3 GB.
- Firefox 105 with 296 tabs open (maybe 50% loaded): using 9 GB.
- Firefox 105 with 204 tabs open (all loaded): using 12 GB but staying fully responsive and both exiting and restarting quickly.
- Firefox 106 with 355 tabs open (over 100 loaded): using 3 GB.
- Firefox 106 with 284 tabs open (approximately 40 loaded): using 7.7 GB.
- I can select a range of 93 tabs, reload all of them simultaneously, and see the last one finish within six seconds, with each tab staying perfectly responsive and normal in the mean time.
- Stylus correctly handles
iframe
s from other domains on a page!
- At which point it must have been called Phoenix, since the new name came in 2004.↩
- 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.↩
- A crucial part of my browsing experience that I preserved beyond its browser-sanctioned life with yet another extension.↩
- 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.↩
- 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.↩