Unbookmarking the Future of Browsing

I am needy:

  • I want to remember URLs. Bookmarking is too manual and akin to throwing URLs in the sarlacc pit. The user-interface pieces around bookmarking have not changed in a decade. No, the awesomebar is not a good tool for this. I don’t even come close to being able to recall what I want the awesomebar to recall. I need to be ambiently prompted in a way that is visual and has context.
  • I need to be able to focus on a given task, project or idea. A single sea of tabs doesn’t help at all. I want blinders. I want an environment. Task immersion.
  • I need to be able to categorize URLs into groups, such that the whole group is easily accessible. Trees and menus can go to hell, along with the RSI, eye-strain and visual boredom they provide.
  • I need to be able to switch contexts quickly and easily. Eg: From bug triage to perf to dashboards to music, etc.
  • I don’t want to leave the browser. Windows are super heavyweight feeling and come along with all kinds of operating system baggage: visual, interaction, performance, etc.

I realized recently that a pattern had emerged in my browser usage that meets a bunch of these needs:

  • I use Firefox’s Panorama feature to manage groups of tabs. I have groups for a bunch of work areas, and for Food, Music, Design, JavaScript, Health, and many more. This provides task-specific browser contexts, as well as keyboard shortcuts for switching contexts with ease.
  • I set up Firefox to restore my session every time it starts. This way my groups persist, and all the URLs in each group are loaded with their cookies and other session data ready to go when I need them.
  • I have “Don’t load tabs until selected” checked, so that Firefox does all this with as little memory as possible – the web pages in all the tabs in all the groups aren’t loaded until I actually use them.
  • I restart the browser a couple of times per day to keep memory use slim, which in turn keeps the browser responsive. Restarting is super fast and responsive because I have “Don’t load tabs until selected” (see previous point).

This is the happiest I’ve been with any browser in years. However, there are still a bunch of pain points. I want SO much more.

  • I want to tag URLs without bookmarking them. The bookmark concept just gets in the way. It’s an unnecessary unit of psychological weight. It’s a vestigial metaphor of days gone by.
  • I want to open a tab group by typing the name of the group in the URL bar.
  • I want to add URLs to multiple groups easily, similar to tagging. I’d like to do it via the keyboard.
  • I want to send the current tab to a different group (or groups) using only the keyboard.
  • I want app tabs that are specific to a given group, and some that are global.
  • I want to switch quickly from an app tab back to the last non-app tab I was at. Or be able to peek quickly at an app tab without losing my context in the current set of tabs.
  • I want to switch quickly back to the last tab I was at. (Eg: When I open a new tab, and get sent to the end of the current set of tabs). OR be able to have new tabs open immediately to the right of the current tab, with linked parentage.
  • I’m tired of sites being browsers inside a browser. And I don’t want “site-specific” browsers – I want a “me-specific” browser, for local or dynamic content.
  • Firefox creates the <tab> elements for hidden tabs when restoring the session. It would re/start even faster and use even less memory if the XUL elements for hidden tabs were not created until the group itself was opened.
  • As I work, memory use increases and responsiveness decreases, since I keep visiting more and more tabs. If I haven’t visited a tab in a while, Firefox should unload it. If I haven’t visited a group in a while, Firefox should completely unload the whole group, session content *and* XUL elements.
  • A downside of the “Don’t load tabs until selected” option is that tab content is not ready and waiting when you select the tab. The web content has to load and the session data for the tab must be restored. Firefox should pre-load tabs that are adjacent to the active tab. This feature, combined with the dormant-izing of tabs described above would result in a decent balance of instant-gratification availability and responsiveness and resource frugality.

One idea I had was a merging of tagging and groups: The groups in Panorama would be comprised of the set of tags that exist. This would result in nice integration bits like search-by-tag in the awesomebar being equivalent to search-in-group. It also might mean that we’ll need to make Panorama “bigger” – maybe allow it to be zoomed, or make it an infinite canvas.

An idea for navigating dynamic content is to merge feeds and groups. Imagine you have a BBC group, which has the BBC feed as it’s source. The set of “tabs” in that group are the items in the feed. If you open the group, all the URLs in the feed are loaded into tabs (but not *really* loaded if you restore-on-demand).

Anyways, it’s interesting to think about how to prototype some of these ideas in an add-on or a collection of them. I’m sure some of the items above already exist as add-ons.

I realize that I’m not a “typical user”. However, after almost 6 years of browser-making, I’m pretty damn sure that there is no such person. I do not believe that the one-size-fits-all browser is the future. When adding a feature or fixing a bug, we shouldn’t have to choose between grandma and the geeks. In order to stay relevant in a highly-personalized future, we should strive to ensure that Firefox is pliable enough that we who make it are not restricted by it, and more importantly we must ensure that add-on developers are free to mash-up and remix and experiment the f*ck out of it.


Dormancy: Freeing up memory from unused tabs

Dormancy ‘retires’ tabs that have gone unused for a while, freeing up that memory. It then restores the tabs to life when accessed.

While Firefox 9 adds restore-on-demand for users that restore their session by default, many users will never benefit from it. This add-on targets users who don’t restore session, but do have long-running instances of Firefox and many tabs. This might land as a core feature in Firefox 9 (https://bugzilla.mozilla.org/show_bug.cgi?id=675539).

NOTE: This is highly experimental, has only been tested on the Nightly builds, and probably will destroy your session. You’ve been warned.

Tabs are considered inactive when they haven’t been selected in longer than 5 minutes. To change that, set this pref to a value in milliseconds:

* extensions.dormancy.TabDormancyAgeMs

Tabs are checked for inactivity every 5 minutes. To change this, set this pref to a value in milliseconds:

* extensions.dormancy.TabCheckIntervalMs

Known bugs:

  • Awesomebar entry for dormant tabs shows data URI
  • Sometimes dormant tabs have no title and no favicon



Source code

Github+Bugzilla Add-on Updated

I updated the add-on to either show which bug it’ll add the patch to, or link to the Enter Bug page on Bugzilla. If you choose to create a new bug, the Bugzilla page will open in a new tab.

The “new bug” scenario is still far too bumpy, requiring you to go to a new tab, get the new bug number, go back to the pull request page, update the pull request title, and then reload the page. Maybe in the next version we could put the new bug page in a panel in the current tab, and then automatically submit the attachment after the bug is created?


Screenshot of bug detected:

Screenshot of no bug detected:

Github + Bugzilla (an Addon for Firefox 4)

We use Github for the source code of the Firefox Add-on SDK (aka Jetpack). We use Bugzilla to track bugs and feature development. These two systems do not play nicely together.

One especially annoying aspect of the workflow we use for the Add-on SDK is that it’s a pain to submit a change in a way that satisfies both the Github and Bugzilla workflows. On Github you need to create a branch for your change, push it to Github, then go the page for the branch and submit a “pull request”, informing the forkees that you have changes you’d like merged into the main repository. On Bugzilla, the typical process is to attach a diff of your changes to a bug, and request review from a specific person.

Atul Varma improved things with a great idea: Submit an HTML file as a bug attachment, which points to the pull-request page on Github. He added a feature to Pybugzilla that, given a pull-request URL and bug id, would generate the HTML file and submit it as an attachment to the bug. We now had something that was attached to a bug, that a reviewer could r+ or r-, making it easy for anyone following along to know where things were at, while allowing the code review itself to be done inline on Github.

However, using the tool isn’t easy. You have to do your development work, then go to the Github page to make the pull request, then go back to the command line to construct the correct invocation of the command, then back to the Bugzilla page to request review from someone.

So I wrote an add-on to reduce the number of steps. With the Github Bugzilla Tweaks add-on, there’s now a button the Github pull-request page that allows you to submit the request as an attachment on a bug in one-click:

To make it work, just title your pull request starting with “bug ######”, replacing # with the bug id from Bugzilla. The add-on logs into Bugzilla with the stored credentials found in the Firefox password manager.


Source code.

cmd: Quick Command Execution for Firefox 4

Cmd allows you to quickly execute Firefox’s built-in commands via a small keyboard-activated panel. While many of the browser commands might have keyboard shortcuts, I often do not remember them. Now I don’t have to. This add-on allows me to just type the first few characters and hit enter. This add-on does not require a browser restart.


Source code.

Usage and features:

  • Launch cmd with control+shift+;. In the next release this will be configurable via a preference.
  • Start typing to see matching commands.
  • Hit the tab key to cycle through multiple matches (shift+tab to cycle backwards). Example: type “pre” and hit tab a bunch of times.
  • Hit enter to select the current match.
  • Hit escape to hide cmd without selecting a command.
  • The last executed command is shown by default.

The available commands are based on all existing menu items and registered keyboard shortcuts that reference <command> elements in the browser.

What I use it for:

  • Executing commands without having to know their keyboard shortcut.
  • Bookmarking without having to click the star, while having it default to Unsorted Bookmarks.
  • Quickly getting to the About page, to check for nightly updates.

Some commands don’t work, like “Subscribe to page”. I would really like this command to work. Perhaps in the future I’ll add an API for creating new commands. This tool will never compare to the extreme power of visual command tools like Ubiquity. However it’s a very lightweight way to access built-in commands without needing to remember their shortcuts, or using the mouse.

Building Add-ons with Jetpack, Flightdeck and… Vim.

AddonEditor is an add-on for Firefox that allows you to use an external editor when building add-ons with the Add-ons Builder (aka Flightdeck). Yeah, say that 10 times fast.

While Skywriter (aka Bespin) is nice, it’s just not [insert your favorite editor here]. So I stole the code from the Ubiquity project for loading an external app as editor, and converted it to a CommonJS module for Jetpack (which I’ve listed on the Jetpack Modules page). I built an add-on using Jetpack’s page-mod module to add buttons to the Add-on Builder for loading a file in an external editor:

When you click the button the first time, you’re prompted with a file-open dialog. Select the editor application of your choice, and the file will open in it. From then on, your chosen editor will automatically load files when you click the button. To clear your choice, choose the other button.

Install AddonEditor. Requires Firefox 4 Beta 7 or newer.

Clone and make your own, based on AddonEditor. I built it using Jetpack 0.10, which isn’t released yet. However, I don’t think it takes advantage of anything new, so it might be test-able from the Builder. But the Builder is giving errors when I hit the “test” button (which I’ve reported to Zalun), so I can’t tell for sure yet.


  • I’ve only tested on Linux. Let me know in the comments if it works or doesn’t for you.
  • Terminal apps not liked, apparently: /usr/bin/vim hangs Firefox completely. /usr/bin/gvim works fine.
  • The UI augmentation to Flightdeck probably made Zalun puke. It should probably just be an option in the context menu or something. Except that you’d never find it. Ideas?