Congrats to the Touchstone Team

Props to the Touchstone team for receiving funding, getting a glowing TechCrunch reception and generally heading in a positive direction.

Touchstone is an “Attention Management Engine” – it’s a combo of Growl, RSS aggregator, and Widget system. The trick is that it tries to be intelligent about what it notifies you, and how it does it. Critical messages appear in your cursor trail(!), less critical in a ticker or a “toast” systray popup.

For most of us, Moore’s Law ceased to be useful about five-eight years ago. Unless you’re playing the latest 3D games, you’re still doing the same things you were doing when CPUs was 20 times slower and storage was 20 times smaller. Other than keeping more windows and browser tabs open (granted, that’s nice), modern apps and OS’s do precious little with those extra CPU cycles. Spotlight, though a usability failure, shows Apple at least gets it – I think the idea was to accumulate info about your hard drive during idle momnts. (The reality is different.)

Touchstone gets it too. I think we’ll see attention management engines like this get more intelligent as time goes on. But at the same time, Touchstone does let you set your own preferences, and this is key for intelligent systems. A hybrid approach ,where the computer monitors and builds up info about the user’s preferences, whims, and so on, but also exposes that model to the user and allows them to tweak it. This hybrid approach is encapsulated in the story for Lazy Registration:

It’s Saturday afternoon, and Stuart is busy planning the evening’s activities. He visits a band listings website, where he clicks on a map to zoom into his local area. Even though he’s never visited the site before, a profile is already being constructed, which he can see on the top of the site. At this stage, the profile guesses at his location based on his actions so far. As he browses some of the jazz bands, the profile starts to show an increasing preference for jazz bands, and some of the ads reflect that. Since the jazz thing is a one-off idea, he goes in to his profile and tweaks some of those genre preferences, but leaves the location alone as that was correctly guessed. Finally, he decides to make a booking, at which point he establishes a password for future access to the same profile and also his address, which is posted back to the profile.

Anyway, well done Chris, Ashley, and the Touchstone team! When I say that some VC makes sense and some doesn’t, this is exactly the kind of situation where it makes sense to inject funds and build something big. The Touchstone team needs to reach out to developers to build Touchstone adaptors (I really think they should be called widgets, even though it’s not a widget engine) and build awareness among users. Right now, developers must use .Net, so hopefully they’ll expand their adpator platform to be more like Dashboard/Yahoo/MS widgets etc, allowing development in HTML/JS. Right now, Touchstone is Windows-only. There’s no standard like Growl on Windows, and Touchstone has every chance of becoming that standard – it would allow Growlish behaviour and a whole lot more.

Dynamic Favicons

Favicons should ideally be easy to manipulate, as easy as manipulating the web page’s UI. (Favicons are the little website icons you see in the address bar, browser tabs, etc.) For example, a chat app like Meebo could signal that your buddy’s trying to contact you, a mail app like GMail could indicate You Have Mail!

I’ve found surprisingly little info on this – is anyone doing it? Anyway, I’ve been wanting to play around with this for a while and having recently submitted the final book draft (post pending), I finally had some spare time to play with it. Fortunately, it turns out to be perfectly feasible – it seems that Firefox and Opera both use <link> tags to determine favico, and this can be changed dynamically to satisfaction. The only gotcha is that you can’t try to be too efficient – if you reuse an existing link object and overwrite its href property, the browsers won’t pay any attention. so you simply have to remove the existing link tag and add back a new one with the new icon URL. Unfortunately, IE and Safari don’t seem to use the link technique at all – I think they just use the “favicon.ico” file. If you know of a way their icons could be dynamically manipulated, please mail me or add a comment here.

So I’ve created a library, favicon.js, that lets you manipulate favicons with a single call – changeFavicon("theIconUrl.ico");. You can also set the document title, changeFavicon("theIconUrl.ico", "Hi Everybody!"), which just sets document.title. There are a couple of demos and a brief FAQ:

Ajaxify favicon demo

Implementation Details. Here’s the favicon.js code as it stands, all 32 lines of it :-).


  1. var favicon = {
  3. change: function(iconURL) {
  4.   if (arguments.length==2) {
  5.     document.title = optionalDocTitle;
  6.   }
  7.   this.addLink(iconURL, "icon");
  8.   this.addLink(iconURL, "shortcut icon");
  9. },
  11. addLink: function(iconURL, relValue) {
  12.   var link = document.createElement("link");
  13.   link.type = "image/x-icon";
  14.   link.rel = relValue;
  15.   link.href = iconURL;
  16.   this.removeLinkIfExists(relValue);
  17.   this.docHead.appendChild(link);
  18. },
  20. removeLinkIfExists: function(relValue) {
  21.   var links = this.docHead.getElementsByTagName("link");
  22.   for (var i=0; i&lt;links .length; i++) {
  23.     var link = links[i];
  24.     if (link.type=="image/x-icon" && link.rel==relValue) {
  25.       this.docHead.removeChild(link);
  26.       return; // Assuming only one match at most.
  27.     }
  28.   }
  29. },
  31. docHead:document.getElementsByTagName("head")[0]
  32. }

Update (Two Days Later)

Crikey! Dugg and on Delicious Popular. And, well, Ajaxian too ;-). Digg is interesting … The last time I submitted my own story to digg, it got precisely two diggs (thanks to the other guy!). This time, I didn’t bother. Is there a moral here?

New, improved, with animate(). Most people get dynamic favicons, but some people have said this whole thing is about animation, about as useful as a blink tag, etc. Okay, that kind of misses the main point, which is about notifying the user while a tab is in the background. The FAQ makes it pretty clear that animated icons was a kind of afterthought (actually, it only occurred to me after I created the cycling demo – changing according to a timer was simply the easiest way to update a background tab, since there’s no chat functionality needed or anything like that). But, you know, when a simple idea like that causes seems so wrong to some people, there’s probably wheels in it. And while I did say animated GIFs are possibly more elegant in the FAQ, it since occurred to me that it’s a bit of a hassle for the casual developer to make an animated GIF. You also get the benefit of compatibility with Opera (and maybe others?). So I’ve added an animate() method, only 8 more lines in all, that lets you cycle through a sequence of images. I expect to post it over the weekend. Mmm…Eye Candy!