(Cross-posted from http://evilbrainjono.net)

I wrote a Thunderbird add-on to make the email interface I’ve always wanted — one that helps me remember to stay in touch with people I really care about, instead of always distracting me with the newest incoming trivia.

The add-on is called Lovebird and you can download it here.

lovebird screenshot (with fake names)

the names in this screenshot have been changed to protect the innocent

The rest of this post is about the philosophy behind Lovebird and why I designed it the way I did.



It looks like Google has finally pulled the plug on the old GMail UI. There’s no more “revert to the old look temporarily” button, so I guess they’re finally forcing us laggards onto the new theme. I’ve been a mostly happy GMail user since the very early days, but I strongly dislike the new UI.

As far as i can tell, this redesign is just change for the sake of change. I can’t see a single improvement! But I can spot three distinct un-provements *:


A modal dialog box is the software designer making a claim that the software cannot do anything else until the user makes a decision. Upon closer examination, this claim is almost never justified. It’s usually a case of developer arrogance: developers assuming that because they have to care about some edge case in the software control flow, the user should have to care about it too.

There’s a particularly egregious example in Thunderbird 7.0 which I’ve seen a lot of lately because I’ve been composing a lot of emails offline.

I’ll be on the train or something, happily offline, typing an email in Thunderbird for later sending, and suddenly I’m interrupted by this:

Modal dialog box asking whether to retry saving a draft

Email composition, interrupted. Train of thought, destroyed. Input window, blocked. I cannot continue until I’ve processed what the software is asking me and made a decision.

Alright, Thunderbird, what’s the problem? Oh, you couldn’t save my draft to my mail server? Gee, I wonder why. Maybe because I’m not connected to the internet. There’s no reason I would expect you to be able to save a draft right now.

The correct behavior would be for Thunderbird to keep checking, silently, for an internet connection, and to save the draft to the server as soon as a connection becomes available again. But there’s no button for that, so I click “Cancel”.

Warning message telling me that the draft could not be saved

Argh! Another one! What is it this time?

…An error message telling me my draft could not be saved. Thunderbird, I just told you to stop trying to save my draft. Why are you using an error message to report that you’re doing as I told you? That’s not an error, that’s the expected result of the button I just clicked. Why are you telling me anything at all? Why are you putting another dialog box in my way instead of just letting me get back to my email?

Jef Raskin used to call these “Monolog boxes” — they’re like dialog boxes except there’s no dialogue because the software isn’t asking me for any information. It’s just complaining to me and then making me click a button to acknowledge that I heard its complaint.

So that’s a modal dialog box followed by a modal monolog box just to tell me something I already knew, which is that I’m offline so of course drafts can’t be saved. And this pointless ritual recurs every ten minutes or so when Thunderbird tries to save my draft. If I’m composing multiple emails at the same time, I have to dismiss these pointless dialogs for every composition window!

The way to fix this interface is quite simple. There’s no reason to interrupt the user to report on the status of saving the draft. Thunderbird should allow me to keep typing my email while it displays a discreet warning message — off in the corner of the window, perhaps — to the effect of “This draft has not been backed up.” Even that much is arguably unnecessary, because the right thing to do in this case is obvious: back up the draft to my hard drive, and then sync it to my email server when an internet connection becomes available again. This can be done without any user input at all.

When the right thing to do is obvious, software should just quietly do it. It shouldn’t interrupt me to ask my permission or complain about problems.

I don’t usually write about politics here, but there is a terrible Internet censorship bill that the United States congress is threatening to turn into law. Called PROTECTIP in the Senate, and SOPA in the House, it would create a nationwide blacklist of sites that ISPs are required to block at the DNS level. This is intended to be used to fight copyright infringement, but there is no trial required; the site gets blocked just on the say-so of a copyright holder. So it circumvents due process of law and basically opens up every site on the internet to censorship and legal intimidation. It also does away with the safe harbor provisions of the DMCA — making a website responsible for any copyright infringement committed by any of its users — so sites based on user-generated content will be hit especially hard.

Everyone in the United States who cares about Mozilla’s mission of internet freedom should help to oppose the passage of this bill. For the rest of the world, well, unfortunately there’s little you can do directly, even though your website could be blocked from the US under the law.

Several internet organizations declared Wednesday the 16th “American Censorship Day” and used it to launch the counteroffensive. Mozilla put a snippet on our home page with a black censor bar over the Firefox logo to point people at an action page. Our webdev team did a bang-up job of putting that together really fast. Thank you webdev!

Meanwhile, Tumblr alone geneated over 87,000 calls to congress in one day.

I called both senators and my congresswoman on Wednesday and was surprised how fast it was to get through and leave a message with a staffer. They don’t keep you on hold forever like the bank or the telephone company. The staffers will take your message for the congressperson politely and without arguing.

I also wrote a letter that I sent to Senator Boxer, Senator Feinstein, and Congresswoman Eshoo. Here it is; if you like it, please feel free to use it as a basis for your own letter to your senators/congressperson.

Dear [Senator Boxer/Senator Feinstein/Congresswoman Eshoo],
I’m a citizen of California and a professional in the Internet industry. I’m writing to express my alarm and dismay at the “PROTECT IP” act that went through the senate judiciary committee this week, and its House version, “SOPA”. I strongly urge you to either oppose it or to introduce some changes.

I understand the need to enforce copyright law, but the way the bills are currently written, they give too much power to copyright holders and to the Attorney General to ban websites from the Internet without due process of law. I fear these powers will be used for blacklisting and censorship of completely legal and legitimate websites. SOPA/PROTECT IP needs to be modified to ensure that it is only used to go after lawbreakers. Operators of legitimate websites need to have a chance to defend themselves before being blacklisted off the internet.

As I understand the bills, they would empower the Attorney General, at the request of copyright holders, to put websites on a blacklist which all ISPs would be required to block, and to do this without any adversarial hearing.

As an American who believes in free speech, I don’t think our government should be building a national blacklist to block websites from american citizens AT ALL. That’s the sort of thing I would expect to see China or Iran imposing on its citizens, and I would expect the United States of America to be criticizing them for it — not building one of our own!

But if you think that copyright infringement is so serious that we need to resort to building the Great Firewall of America to fight it, then at least give the accused site owners the right to a trial before kicking them off of the internet. Otherwise, if we give the Attorney General the power to unilaterally ban sites without trial, what guarantee do we have that this power will be used only for fighting copyright infringement? It’s a small step from there to political censorship of any foreign sites the U.S. governemnt doesn’t want citizens to see.

The site owner should have the right to a trial before the government censors their site from the internet. The burden of proof needs to be on the accuser and the accused needs a chance to defend themselves in court. That’s the only way we can be sure this power is used only for its intended purpose of enforcing copyright law and doesn’t become a tool of censorship.

Besides free speech issues, as someone who works in the internet industry, I’m alarmed at how much legal risk this bill creates for website owners. PROTECT IP/SOPA would make website owners like me liable for any copyright infringement done by our users. Under PROTECT IP/ SOPA a single file posted to a site by a single user would be enough for an entire internet domain to be blacklisted and all its funding cut off. And all of this just on the word of the copyright owner — they wouldn’t even have to prove in court that their copyright had been violated!

I had been planning to use the Internet to launch a startup company of my own, but how can I do so knowing that my entire company could be wiped off the internet by the actions of a single malicious or ignorant user? There’s no way that Facebook, Twitter, YouTube, Blogger, Wikipedia, or any number of other internet success stories ever could have gotten off the ground under such a law. They relied on the safe harbor provision of the DMCA, which gives sites acting in good faith a chance to comply with the copyright holder’s wishes and remove infringing files before being threatened with legal action. This compromise has worked well for the last 15 years while the Internet has flourished. SOPA/PIPA would end safe harbor and increase the legal risk beyond what small businesses could bear.

Internet businesses are one of the few sectors launching successful startup companies and creating jobs in this grim economic climate, but SOPA/PIPA would shut all that down — or drive entrepreneurs to build their companies overseas.

We can protect the rights of copyright holders while still maintaining a free Internet. SOPA/PIPA must be modified to ensure that it will be used only for fighting copyright infringement and will not be abused for censorship, repression, or harassment of legitimate sites and legal content.

[Senator/Congresswoman], please either add such protections to the bill, or vote against it.

Thank you.

— Jonathan Xia
Palo Alto, California
November 2011

We may be starting to turn the tide. There are hopeful signs. The EFF is cautiously optimistic. The Business Software Alliance, which previously supported the bill, is now backpedaling. And here’s a roundup of progress against SOPA.

But the fight is far from over. The Senate is threatening to bring the PROTECTIP act to the floor on Tuesday. So that’s the next round of the fight. Mozilla’s trying to get everybody to call their senators on Tuesday the 29th (tomorrow). Please sign up here!

The results of the Test Pilot Mobile Heatmap study are now up in a post at the User Research blog. Read it and see how different browsing patterns are on mobile compared to desktop Firefox!

I’ll be in London from Thursday to Monday presenting on HTML 5 game development at the Mozilla Festival.

I’ve been working on an HTML 5 side-scroller, as yet unnamed. The plan is to have the game skeleton pretty solid before my session, and then have participants in the session hack on it, add features to it, and flesh it out. That way the participants can get to work on the fun parts of game development, like creating monsters and power-ups, instead of spending the whole session setting up boilerplate code and debugging their event handlers.

The code for the game is on GitHub and there is a playable version hosted on my site. It uses BrowserID for the login. You can give it a try right now — log in and try making a level with the level editor, or play one of the existing levels and try to beat the best time! If you find bugs, please report them in GitHub. Thanks!

The way the “reply-all” button works in Thunderbird is noticably worse than the way it works in GMail.

The difference might seem trivial, but the GMail version saves me a lot of aggravation, because the following scenario happens at least twice a day:

I hit “reply” and start writing an email. A few sentences in, I discover that the message I’m writing applies to all the people in the original thread, not just the sender. I want to change my “reply” to a “reply all”.

In GMail if I hit “reply all”, it does the right thing: adds the addresses of the other people on the thread to my composition already in progress.

Screenshot of reply-all button in GMail

In Thunderbird (as of version 7.0.1), the Reply and Reply All buttons spawn new windows. If I switch from a “Reply” composition window back to the main window and hit “Reply All”, I get a brand-new composition window. To save what I’ve already written, I have to copy-paste my words from the original window to the new one, then close the first window.

Screenshot of Thunderbird's reply-all button

It’s just a few extra steps, but it’s annoying in a way that disrupts my train of thought, which should be focused on the content of my writing, not the mechanics of sending it.

It would be nice to get the GMail reply-all behavior in Thunderbird. But it would be even nicer if designers everywhere could more consistently embrace the design principle behind the GMail reply-all button. That principle is:

Let me change my mind without having to start over.

We need to recognize that humans change their minds about what they want all the time. If I’m on Step Four and I realize I should have gone right instead of left at Step One, I should not have to re-enter the same information for Steps Two and Three. And yet too many interfaces (I’m thinking multi-stage web forms, “setup wizards”, and the like) still force users to make decisions in an arbitrary sequence dictated by the implementation details of the code.

Doing it right is more work for the programmer, of course. The implementation must be more complex. You can't simplify by throwing away data related to paths not immediately taken. But respecting the reality that users change their minds is more important than cutting corners in your code.

I’ve been having some wrist issues lately, so I’ve switched to an ergonomic split keyboard (and made an appointment with an orthopedist). I’m also trying to cut way down on my mouse usage; since I mouse with my right hand and that’s the wrist with worse problems, the mouse is my prime suspect.

But how to navigate the web without using a mouse?

Turns out that many mouse navigation actions can be replaced by the plethora of undocumented keyboard shortcuts hiding inside Firefox. Here are the ones I’ve found most useful; maybe some will prove useful to you too.

(On a Mac, replace “ctrl” with “cmd” in all the following examples.)

  • To follow a link via the keyboard: Hit the forward-slash key to enter Quick Search mode. Start typing the text of the link. The first few letters are usually enough. Once the link is highlighted, hit enter.
  • To go back: Backspace/delete key.
  • To enter a url: ctrl-L to focus the awesome bar, then start typing; optionally use the down arrow – or better yet, the tab key – to select a suggestion, and then hit enter to go to the selected url. (I find the tab key much easier to hit from the home row than the down-arrow key, and they both move down through awesome bar suggestions.)
  • To do a search: ctrl-K to focus the search box. I typically hit ctrl-T for a new tab, then ctrl-K to focus the search box, then type my search term, then hit enter to do the search.
  • To go to a bookmark: typing “* keyword” into the awesome bar – asterisk, then a space, then the keyword – will filter the awesome bar suggestions to show only bookmarks matching the keyword. You can think of the asterisk as representing the bookmark star icon. The whole interaction is ctrl-T for new tab, ctrl-L to focus the bar, asterisk, space, keyword, tab to select the bookmark, enter key to go to it. Sounds like a lot of work, but for me it’s still faster than hunting through my labyrinthine bookmark menu with the mouse.
  • To switch to a tab: much like the asterisk filter for bookmarks, a percent sign will restrict awesome bar matches to currently open tabs. “% keyword” will show only the open tabs that match (by url or page title) the keyword. E.g. I often use “% bug” to show all my Bugzilla tabs. So ctrl-L to focus the bar, percent space keyword, tab key to select the right suggestion, enter key to focus the tab. Again, I actually find this faster than hunting for tabs with the mouse.
  • There are many more filters besides * and %, too. You can find them documented at Mozillazine.
  • Another way to switch to a tab is by its position: ctrl-1 focuses the leftmost tab, ctrl-2 the second leftmost, etc. I generally don’t find this as useful as switching by names, but it can be great for app tabs, if you always have the same app tabs open in the same order. So for example ctrl-1 for me will always be WordPress, ctrl-3 will be my Zimbra calendar, ctrl-7 is the Test Pilot mercurial repo, etc.

What all these keyboard interfaces have in common is that they’re based on recall, not recognition — they work best if you know exactly what you want, and can call it by name. They’re not very good for things you’re used to recognizing by icon or by spatial location (e.g. if you’re used to getting to a certain page by clicking the second link in your bookmark bar, you’d have some adjustment to do.)

(Not Firefox related, but I’ve also mapped the ctrl key to the caps lock on my keyboard, which makes using Emacs a lot more pleasant, since I no longer have to do contortions with my left pinky to trigger commands there.)

Anybody have any more keyboard navigation tips to share? (Or tips for fighting RSI?) The comments are open.

"Official Bottom 95% of All Web Sites" badge

One thing I don’t like at all about Silicon Valley culture is its monomaniacal focus on Hugeness: on the very biggest companies and websites.

Living in said valley, we get bombarded with news and gossip about what Google, Facebook, Twitter, Apple, and a couple of others are doing (Yahoo and Microsoft, no longer considered “cool”, are slowly dropping off the list.) The tech press acts like the Internet is defined by the actions of these few companies. Whatever they’re doing, everybody else had better copy it, or risk irrelevance. You don’t matter unless you’ve got hundreds of millions of users and are raking in billions of dollars of advertising money.

(I imagine even Google and Facebook must feel the pressure to copy Google and Facebook! Why else do they keep trying so hard to break into each others’ markets?)

Part of Silicon Valley culture is the assumption that the destiny of every company or website is to become huge or to fail: those are the only two options. Global reach, with tens or hundreds of millions of users, is the only definition of success. Venture capitalists are known to base their gambles upon the idea that the profits from one one breakaway hit will pay for the losses from twenty flops. The breakaway hits are what they’re after; a modest but sustainably profitable company is not.

There are structural reasons for this attitude. The lack of barriers to competition on the web means no longer do you just have your neighbors to compete with. You have to compete with everyone in the world. That means that if company X offers something even 1% better than its competition, it can rapidly become a global near-monopoly. And so many web-based activities have network effects — sites like LinkedIn, eBay, etc. become more useful the more other people are using them, so success tends to snowball.

I feel this attitude misses something important. It misses what made the web so interesting in the first place. Think back to 1995 (if you’ve been on the internet that long). What was so exciting about the emerging medium? What was it that pulled you in for the first time?


A user on the Test Pilot discussion forum wrote:

“I didn’t join the big brother “test-pilot” but had to comment on how invasive this research will really be to the average user. Everything you type, always, whether sent or saved, will be saved on a database. If you have a webcam and you agreed to the test pilot thing, mozilla can use your camera to see what is going on. It sounds absurd, but it
is simple for a computer to identify certain things and bring the more important images to the front, however, your actions will be recorded whether they are flagged as a hazard or not. just put a bit of electrical tape over the lens when you aren’t using the camera.

I hate being watched….Peace”

It would be easy to dismiss this person as paranoid. (If we wanted to spy on you, why would we go to the trouble of announcing a data collection program and inviting people to voluntarily join it?) but actually, he is absolutely right to be concerned about his privacy and absolutely right to be skeptical of the motives of the organizations writing his software.

No, Test Pilot does not collect video data or connect to your webcam in any way. (I don’t even know how I would connect a Test Pilot study to a webcam! The user is accusing me of being a much better programmer than I actually am.) It does not record any words that you type, either. Certain studies have recorded certain very specific keystrokes, in order to tell whether a user is using keyboard shortcuts for Firefox menu items, for example, or whether they’re using the Enter key in the URL bar. We published a privacy policy and we have stuck to the rules of that privacy policy. And each study gives you, before you agree to upload anything, the chance to review the collected data for yourself.

The user who posted the above message has already decided that he doesn’t trust us, so I doubt I can convince him that we’ve stuck to our privacy policy.

But, as Levar Burton used to say on Reading Rainbow, you don’t have to take my word for it.

All of the Test Pilot studies are open-source, as is Firefox itself, as is the Test Pilot extension that bridges the two. Anyone who likes can examine the source code for themselves.

Now not every user will have the time, inclination, or ability to read through that source code. But not every user has to; all it takes is one whistleblower to look at the source code and tell everybody “hey, it looks like this study here is doing something fishy”.

So here’s the link to the source code of every single Test Pilot study. And here’s the link to the source code of the Test Pilot extension that runs them.

Go ahead! Read through that code. Look for the functions that secretly turn on your webcam and log the words you type. (There aren’t any.) Flag anything that looks fishy, wrong, or that looks like it might go outside the privacy policy. Please! We’ve got nothing to hide. I would welcome that sort of code review. I would consider it a personal favor from you to me to help us improve the quality and security of Test Pilot code.

This is an underappreciated benefit of open source. With closed-source software, you have to take a company’s word that they aren’t doing anything fishy with your machine. An open source project can’t hide that kind of thing from its users. Sharing the code keeps us honest.

Next Page »