anyMail, Mozilla, Programming, Thunderbird, Toby


Unlike most of my posts, this one isn’t about some new software I’ve written; it’s about some old software I’ve written.

In 2002, like any other college student out on his own for the first time, I decided to write my own e-mail client.

What – you haven’t written your own e-mail client? You will. As a complement to both Letts’ Law (“All programs evolve until they can send email”) and Zawinski’s Law (“Every program attempts to expand until it can read mail.”), I propose Finke’s Law: “All programmers will write their own mail client (and later regret it).”

I named my webmail client Toby and used it as my primary client for three years; once it was stable enough for other people to use, I started publishing updates on SourceForge (back before GitHub became the new SourceForge). Toby was my first legitimate open-source project.

Toby Web Mail, in its heyday, Outlook Express was a big influence. Also, the Pokemon cards were my brother’s.

In 2004, I needed a few more credits to finish my degree in Computer Science, and I opted to do an independent study under Joseph Konstan. (Professor Konstan was one of the only profs at the University of Minnesota at that time who had some involvement in Web software; the other one that I knew of was John Riedl, who was already the head of the fledgling Software Project class that I was a part of, which is a topic for another post.) For my project, I decided to refine my mail client, using IBM’s Remail prototype as a roadmap.

Over that semester, I rewrote Toby and branded it as anyMail. I don’t remember why I called it anyMail, but it was probably because it could connect to any IMAP or POP3 mail account. Clever.

Some of the features I planned on integrating into anyMail were inspired (read: stolen) from the very-new (at that time) Gmail; specifically, labels (instead of folders), the concept of “archiving”, and an entirely AJAX-based system for loading messages (although at that time, the term “AJAX” hadn’t been coined yet). However, one feature that I beat Google to was my own version of Priority Inbox. From my project proposal:

I intend to implement: [...] Automatic sorting of incoming mail into different categories, such as read, unread, un-replied to, messages from people the user has replied to in the past, messages likely to be spam, messages from people in the user’s address book, etc. I feel that one of the largest areas for improvement in current Web mail clients is that of automatic information sorting and presentation.

(Of course, I wasn’t the first to ever think of this concept. Microsoft has prior art dating to the late ’90s.)

A concept I implemented from IBM’s Remail was thread arcs. Thread arcs are a way to visually represent a conversation using circles and arcs:

The hollow circles are messages sent by the user; the solid circles are replies. Clicking on a circle loads the corresponding message. Neat, but not terribly useful.

As far as I know, I was the only person to have implemented thread arcs outside of the Remail prototype at that time. They’ve gotten around by now; there is even a Thunderbird add-on that generates them.

So, fast-forward to a couple of days ago, where I had blissfully forgotten about the hundreds of hours I spent writing code to parse multipart e-mail. I was searching through my e-mail for something unrelated, and I happened across a conversation between myself and Rob Malda; I was applying for a job at Slashdot, and I had sent him a link to anyMail as a part of my application. The URL was dead, so I did the reasonable thing: hunted down a copy of the source code, upload it to that server, and get it to work.

Here goes nothing.

And it did work! After ten minutes of creating the necessary database tables and an email address to use for testing (I didn’t want to inadvertently wipe the contents of an important account – I trust my code, but I don’t trust trust it), I logged in and had a working instance of anyMail before me:

I played around, sent and received a few e-mails to confirm functionality, and was mostly pleased with how well anyMail held up.

The only flaw I found was that attachments didn’t get sent. That might be a misconfiguration my Web host though.

This was amazing to me. The last time I used anyMail, it was in Firefox 1.0, and it still works in Firefox 11 and Chrome Umpteen, without the benefit of a JavaScript library like jQuery doing the heavy lifting of cross-browser compatibility. It was also written in an environment with PHP < 4.3, and ran mostly without issue under PHP 5.2.

The other thing that surprised me was how consistent my coding style has been over the last eight years. Even though I was shocked and appalled by the gaping security holes (XSS, CSRF, and SQL injection issues were all present) and disgusted by the number of synchronous XHR calls, I was pleased to recognize the code as mine. I don’t specifically remember writing it, but I can tell by the formatting, variable names, and structure that it was formed by my hand.

I spent a few minutes cleaning up the code — some basic protection against XSS and SQL injection — and uploaded it to GitHub. I don’t expect anyone to use it (and I hope nobody does, at least not without modification), but I’m keeping it around so I can look back on it and learn from my mistakes. But hey, if you need a class to generate thread arcs in PHP or an email client that works in Firefox 1.0, you know where to look.

Update: Toby is no longer supported. I recommend using RoundCube Webmail instead.

Christmas, Life

Our 2011 Christmas Letter

Dear close personal friend or requisite family member,

It’s been a banner year for the Finke household. (By which I mean: Christina took up banner making as a hobby and graced each of our family milestones with an ornate commemorative pennant.) Here’s a rundown of those banner-worthy occasions:

In January, Christina and I took a trip to Palo Alto, CA and then drove up the West Coast to see our friend Leah and her husband Jacob in Oregon. Highlights of the trip included eating at our first Vietnamese restaurant, seeing the Stanford campus, and not being in Minnesota in January.

In February, Gabriel had his first bloody nose. It looked bad, but you should have seen the other guy! (The other guy was a stepstool.)

Alternate version of the previous paragraph: In February, Gabriel got his first bloody nose by hitting his face on a stool. Better than getting your first bloody stool by hitting your face on a nose, am I right??

In March, we bought a piano. You might recall that we already had a piano a few years ago; the difference between this one and that one is that this one was not free, and that one was free for a reason.

In April, our second son Henry Gideon was born. He weighed 8 lbs. 8 oz. and was 19½ inches long. He has since gotten heavier and taller, and he plans to continue on that path.

In May, Gabriel drank some cologne, and we had to call poison control. Fortunately, he didn’t drink enough to need medical attention, but his burps still smell like a summer breeze.

In June, we went camping with Christina’s family and friends. Christina had fun. Gabriel had fun. Gideon had fun. I had hot dogs.

In July, Christina held a garage sale that probably broke records for gross revenue. Why she was selling gross things I’ll never know!

August, a.k.a. September: nothing happened.

In October, Christina and Gideon went up north with some friends of Christina’s, leaving Gabriel and me home for our first Men’s Weekend. This is where I put a cliche about the house falling apart when Christina isn’t home for a few days.

In November, I accepted a job offer from a company called Automattic, which does something with computers and Internet I think? Christina is still working part-time at GE, doing things with numbers maybe?

In December, Gabriel accomplished the incredible feat of finishing potty training. Our potty can now sit, stay, roll over, and speak.

BONUS MAD LIBS PORTION: Gabriel picked up a few new skills this year, mainly playing guitar, drumming, and   verb  ing. He also thinks that   nouns   are really   adjective  !

Merry Christmas,
Chris, Christina, Gabriel, and Gideon

Browser Add-ons, Flock, Mozilla, Mozilla Add-ons, Mozilla Firefox, Mozilla Firefox for Mobile, Netscape Navigator, Software, URL Fixer

URL Fixer Has Been Acquired

URL Fixer, one of the first add-ons I wrote for Firefox, has been acquired! It is now being managed by the team at

URL Fixer was inspired in 2006 by this Firefox bug report. Since then, it has been a featured add-on on the Mozilla Add-ons Gallery, it was one of the first add-ons to be compatible with Mobile Firefox, and it placed in the Extend Firefox 2 contest. It used to be compatible with both SeaMonkey and Flock (remember Flock?); its functionality was included in Netscape Navigator 9, and it was at one point under consideration to be included in Firefox 3.

URL Fixer has also been the subject of several experiments: it was the source of the statistics I used in my examination of what people type in the address bar, and it was the add-on I used to test the feasibility of selling a freemium browser add-on.

The new team in charge of URL Fixer recently released version 4, which you can install without needing to restart Firefox; I’m looking forward to seeing what other improvements they make and in what direction they take the add-on. Please note: support questions should no longer go to me; please send them to

AOL, Automattic, Blogging

Tturn, Tturn, Tturn

As Pete Seeger and King Solomon wrote, “To everything there is a season: A time to be born, a time to die; a time to plant, a time to start a new job at a new company.”

In that spirit, I’ve left AOL in order to join the team at Automattic. Not everyone has heard of Automattic, but almost everyone has heard of their flagship service,

At Automattic, I’m a part of the Theme Team: a group of very attractive people with highly specialized skills in the realm of “Making your blog look good.” That’s a daunting task when you’re trying to cater to millions and millions of bloggers (and millions and millions and millions more readers), but I’m enjoying the challenge.

Browser, Google Chrome, Ideas, Internet Explorer, Life, Mozilla, Programming, Safari

An API for Browser Screenshots

What do the following screenshots all have in common?

From Amazon’s Cloud Reader Installation:

From the University of Virigina’s guide to setting proxy settings in Firefox:

From HootSuite’s TwitterBar acquisition announcement:

From Tecca’s Guide to Internet Explorer:

That’s right: they all include portions of browser chrome. (Chrome 13, Firefox 3, Firefox 4 for Windows, and Internet Explorer 9, I believe.)

What else do these screenshots have in common? They will all one day be out of date (if they aren’t already). As soon as Google modifies their extension installation dialog, or Mozilla changes their proxy settings tab, or the Firefox address bar gets a new background color, these screenshots will no longer accurately represent the interaction through which they’re meant to guide the user.

A Modest Proposal

I propose that this problem of stale browser screenshots could be alleviated by the creation of a Web service that exists solely to serve semi-dynamic screenshots of browser chrome. Allow me to explain with examples.

The Amazon screenshot above could be replaced with a call like this:

<img src="" />

Or the TwitterBar image could use this URL instead:

<img src=",icon&icon=" />

(Note the idea of being able to merge existing images into the screenshots.)

The IE add-ons dialog screenshot could just as easily call this URL:

<img src="" />

The API would automatically use the user’s user-agent to determine what browser, version, and platform to show in the screenshot (although these could also be specified manually, as seen in the IE example). If images from the exact current version aren’t available, the most recent version could be used instead.

I think that with a couple dozen high-resolution, high-quality screenshots of the various windows and dialogs in each major browser version on each major platform combined with metadata defining the position of key elements in those screenshots (e.g., the home button, the address bar, the History menu), 90%+ of the browser-specific screenshots on the Web could be replaced by calls to this service.

What do you think?

Is this a solution in search of a problem, or is it a legitimately useful idea? I think it would be worth its development costs just for organizations like Mozilla or Google to use in order to populate their help documents with screenshots that would always be up to date. Tell me what you think in the comments below.

Browser Add-ons, Extend Firefox, FireFound, Mozilla, Mozilla Firefox

FireFound Shutting Down

FireFound is a Firefox add-on and companion Web service that I wrote for the Extend Firefox 3.5 competition in 2009. It allows users to track their device’s location via Firefox’s then-new geolocation API; additional features include the ability to view a device’s location history on the website and the ability to turn on a “killswitch” that would clear your browsing data (history, saved passwords, etc.) if someone opened your browser and could not provide your chosen password. It was the first add-on of its kind, and it has been well-received.

That being said, FireFound will be shutting down on April 1, 2012. I don’t have the time to keep it compatible with the newest Firefox and Firefox Mobile releases, nor can I keep up with the feature requests and bug reports.

FireFound users who would like to save a copy of their location data can, as always, export their data by logging in and clicking the “Download” button on the “My Data” page. Any users who have pre-paid for a Premium account past April 1 will be given a prorated refund.

For those looking for a suitable replacement, I recommend Prey. It’s an open-source implementation of a similar idea, but it runs at the operating system level rather than inside the browser, so it’s always on.

(If you’re interested in taking over FireFound, e-mail me at If you’d just like to run your own instance of FireFound, all of the code is open-source.)

FireFound was shut down on April 1, 2012.

Mozilla, Mozilla Firefox, Mozilla Firefox for Mobile, Programming, Technology, URL Fixer

What do people type in the address bar?

Earlier this year, I added a feature to URL Fixer (a browser add-on that fixes errors in URLs that you type in the address bar) that collects anonymous usage stats from users who opt in in order to help improve the ways that URL Fixer corrects typos; the collected data includes domains that are typed in the URL bar as well as the locale (language/country) of the user who typed them.

I now have six months of data, and I’ve run some statistical analysis on it in order to share some interesting stats with you. (If I were more creative, I would make an infographic out of this information.) Note that this data does not include bookmarked links or links that users click on in websites. It is strictly domains that have been typed directly into the address bar.

Care to guess the most commonly typed domain? That’s right: It was typed almost three times as often as the second most popular domain,

The top 10 domains account for 20% of all typed domains. 9% 1.1% 0.5% 3.3% 0.6% 0.5% 3.3% 0.6% 1.1% 0.6%

The most popular TLD for typed domains is .com, followed by .org, .net, and .de.

.com 63%
.org 4%
.net 4%
.de 4%
.ru 2%
.hu 1%
.fr 1% 1%
.br 1%

The top 17 TLD typos are all variations of .com. In order of frequency, they are .com\, .ocm, .con, .cmo, .copm, .xom, “.com,”, .vom, .comn, .com’, “.co,”, .comj, .coim, .cpm, .colm, .conm, and .coom.

The website that appears to benefit the most from users mistyping a legitimate URL is (count the o’s). It’s a scammy website set up to make you think that you have been chosen as a “Facebook Winner.” However, it is only typed once for every 7,930 times that someone correctly types ( and are runners-up in this category, albeit with much less scammy sites in place than

49.5% of domains are typed with a leading “www.”.

The most popular domains:, (a Russian social network), and

The only locales where neither Google nor Facebook control the most popular domain are ru-RU (Russia –, fi-FI (Finland –, a gaming website), ko-KR (Korea –, an e-sports website), and zh-CN (China –

How does domain length correlate with typing frequency?

Domain Length vs Frequency Graph

(Facebook is to thank for the spike at 12 characters.)

How about alphabetical order? Has the old trick of choosing a site name early in the alphabet in order to show up above the fold on DMOZ had any lasting effect?

Facebook and Google certainly make their letters stand out, but there doesn’t appear to be a correlation between the first letter of the domain and its popularity.

None of the domains with more than a 0.0005% share are unregistered, indicating that this kind of usage data would not be very useful to a scammer or phisher looking for new domain names.

Funny, Google, Life

Offline Mode

Last year, I went on a Caribbean cruise with my wife and her family. I had a great time, but the downside to seven days aboard a floating resort in sparkling blue water is that the Internet access is prohibitively expensive: during that week, I was completely offline for the first time since my family first signed up with AOL in 1997, and this made me realize that I rely on search engines to answer the questions that life raises far more than I suspected. I’m sure that, to my wife, “Offline Chris” seems much less knowledgable than “Online Chris.”

Presented below without comment is a list of searches I would have performed if I could have; I don’t think it will be turned into one of those Google commercials any time soon, but it’s a pretty concise summary of our trip. See if you can infer anything about our trip; post your guesses in the comments.

  • define:Kirschwasser
  • How many people on Carnival Valor
  • define:vichyssoise
  • How many people have tattoos?
  • Capital of Belize
  • Denver channel 4 anchor
  • How to get cork out of bottle
  • Anteater bite
  • Tetracycline
  • Treat infection
  • Capuchin monkey
  • 10 knots in mi/hr
  • BWI cayman
  • Honduras ca
  • iTunes hey baby
  • Satellite Internet speeds
  • Office webisodes
  • Jack Welch
  • iTunes Brand New Day
  • Convert KW to HP