The Non-Visual Web

Looking Forward

7 years on from Ajax, we have our JavaScript-fu down and the APIs we could ever have dreamt of are baked into the desktop browsers of note. So what’s next for the web? The latest 5×5 podcast with Jason Grigsby is illuminating on future trends (as well as being a must-listen for all its practical advice):

Episode Homepage

Here I want to outline a few specific features which will challenge the boundaries of the web as we know it. And then I’ll explain how the web community can meet those challenges.

Tip of the Iceberg

In 2009, I gave a talk at London Web Standards on eight features of HTML5 you won’t see, features such as offline storage, geolocation, and history API.

That’s the tip of the iceberg of the tip of the iceberg. An example in this podcast is walking down the street and having your phone’s navigation system vibrate once if you should turn left, twice if you turn right. Another example mentioned in the podcast is a JavaScript vehicle API! webinos.vehicle.addEventListener (webinos.vehicle.NavigationEvent.DESTINATION_REACHED, handleDestinations, false); Checking fuel level, engine condition, etc. via a high-level API. And of course, there’s the whole medium of sound…this post was kicked off by a podcast after all!

The web has traditionally been a visual medium. As Jen Simmons observes here, even when it’s not visual, we use the word “Screen Reader” to emphasise its visual foundations. While it’s moved from text to images to fancy graphics and multimedia, those things are still visual elements on the page. Yet all of the above are not about elements on the page. That’s where technology is headed. So is it even sensible to handle these things through the web?

Model-View Separation

On a technical level, what makes the web incredibly powerful is the DOM concept. DOM is sync’d to UI. Update the DOM and it changes the user-interface. Change the UI and the DOM updates. The programmer doesn’t have to facilitate this bidirectional sync; it just happens.

Really, on a technical level, this is an incredibly important and overlooked aspect of HTML5. Too many HTML5 APIs are pure JavaScript functions and ignore the DOM altogether. For the web to thrive, vehicle APIs should not just be webinos.vehicle.addEventListener. The vehicle itself should be part of the DOM. If that sounds too domain-specific, that’s okay, because look at the work of Web Components. These guys are bringing about a world where anyone, or any community, can create a first-class <x-vehicle> element with its own look-and-feel.

Open Standards

Of course, at a higher level, the web is about open standards. That’s really what sets it apart from iOS, Android, and .Net. There’s no single vendor in charge. Something like the Java Virtual Machine comes close, but the web stack stands out as a more balanced control system. If there are to be standards for things like vehicle APIs, the web is attractive as the best stab at a neutral ground with real developer buy-in.

For this reason, the web can successfully move beyond the visual medium without losing what makes it the web in the first place.

The Tragedy and Triumph of Podcasts

It’s now about 6 years since I discovered podcasts while listening to a pre-podcast podcast, The Gillmor Gang. It’s everything I ever wanted from radio talkback – niche topics, on-demand listening, access anywhere, rich metadata, and no music – I’ve chosen to listen to talkback for a reason (Hello Australian Broadcasting Corporation).

A perfect storm of iPods, massive bandwidth, and feed religion made podcasts possible, and they are still going on strong. However, they’ve never taken off in the mainstream, and you can’t say they haven’t had a fair chance. Apple’s inclusion of podcasts in iTunes and iOS makes them pretty darn accsessible if people want them, yet many people aren’t using them. Having informally surveyed a few people, I’ve found they aren’t actually aware how easy iTunes made it to subscribe to podcasts, so there’s more work to be done there. But I think if there was enough word-of-mouth publicity, people would be using it to subscribe. It’s not harder than uploading photos for example. (I do have many reservations about iTunes, but those are more for advanced users.)

Podcasts haven’t taken off in much the same was as RSS and feeds and news readers have never taken off. Or have they? I recently heard Jon Udell speaking on the topic (on a podcast-or-other, not his own one) and he made the point that we expected everyone would wake up in the morning and open up their reader of feeds they’d subscribed to. Didn’t happen. But feeds did happen, social feeds, in the form of Facebook, Twitter, FourSquare, Buzz, and so on. Anyway, those don’t really translate to podcasts, not yet anyway. If Huffduffer let you subscribe to all your friends’ feeds, it would be possible, at least in a geeky niche community anyway.

My main point here is to highlight a few things that haven’t happened for podcasts, and would make them better and just a bit more popular if they did. I’m not arguing these things would make podcasts wildly popular; consider this mostly a wishlist and some pointers to a few trends:

Hardware: So we have these networked devices right? The most prominent at this time being iPhone and iPad, but they still don’t sync over the cloud. Using Android recently, I’ve come to appreciate how nice it is to sync podcasts in the background, over the air. Latest podcasts are just there. Downside being, you have to use an expensive phone, which is a problem for gym and running, and also a drain on that precious battery life. While in the US, I recently picked up an Ibiza Rhapsody player, a bargain at $44 for an 8GB player which automatically connects and syncs. Would be even better if I could sign up to the Rhapsody service in the UK, but not gonna happen. The neat thing is it has podcasts built in, and lets me sync them over the fly. Downside is it doesn’t have a keyboard, so if I want a feed not in the default list, I have to type it manually using the one-at-a-time, left-right-left-right, character entry. Now I’ve been waiting for someone to release a mini Android device, so I was blitzkrieged to hear This Week In Google mention a new line of Archos “tablets”, including a 3.2″ device. Which will be perfect for gym and running, allowing me to switch between podcasts and Spotify, with both of those things syncing over the air, and at $150, cheap enough to risk overzealous destruction :). Can you say Drool.

Cloud OPML: It’s awesome we have a standard like OPML, a simple way to declare a list of feeds, AKA Reading Lists. (Technically, reading lists are a subset of OPML, but OPML is the term commonly used, so I’ll keep using it here.) However, in both podcast and feedreader world, there’s an extremely weird tendency to assume OPML lives on your hard drive. Many newsreaders and podcatchers allow you to import and export to and from OPML…but they assume OPML lives on your hard drive, not in the cloud!!! Why? I have no idea. The whole concept is inherently cloud, so it makes no sense. I just want to stick my list of podcasts on a server somewhere, and when I start using a new client, it downloads them for me. As a consequence, I’ve manually entered my subscriptions dozens of times over the years. This is especially important for mobile devices – especially ones without a keyboard – like the Rhapsody player I mentioned above. Podcatcher/Feed-reader developers, I urge you to pull down subscriptions from OPML resources in the sky…and to offer users the ability to publish their subscriptions that way too!

Archives: Sadly, podcasts don’t live on the same way blog post do. This is sad because many podcasts are reference material, not just latest news. Take a podcast like the excellent History According to Bob. Over the years, he’s produced hundreds of fine recordings on all manner of ancient and recent history. But subscribe to his podcast, and you’ll only be able to backtrack 8 episodes. Now I chose Bob as an example because he actually offers older podcasts for DVD purchase, but most podcasters would be fine to let people get hold of old podcasts; they just have no way to actually make it practical. History is not the only topic; there are podcasts about movies, science, economics, software engineering…where a 2004 podcast would be just as relevant today, if only you could get hold of it. Some podcasts include every single episode in the feed, but then certain clients will end up pulling down gigabytes of data when each user subscribes. As a user, your best best is to scour archives – if they exist – and use something like huffduffer to aggregate them. But that’s still painful and not something every user will do. Odeo was on the right track, by building up a long list of all podcasts ever produced on each feed, whether in the current feed or not. But Odeo spawned Twitter and Odeo sadly isn’t.

Integrate with Music Players: Call it, “if you can’t beat them, join them”, but I would love to see the music services embrace podcasts. Spotify, for example, has a great interface for choosing songs on the fly as well as subscribing to playlists; it could easily be extended to podcasts to become a one-stop-shop for your listening needs. Playdio is an interesting move in this direction, allowing people to record talk tracks in between music tracks, and their contact form mentions podcasts, so maybe there is hope. Still, I wish Spotify et al would just bake podcasts into the player and be done with it. And considering the social features these things are starting to have, it could actually be quite powerful.

Social: There’s not really much you can do to find out what friends are listening to and all that cal. There’s Amigofish, but it would be nice to see it baked into the players directly.

True, music will probably be in first place for the foreseeable future, mirroring reality, but its needs have already been met, much more so than talk formats, where there really hasn’t been much innovation since 2004.

BashPodder mod – add podcasts to iTunes

As a podcatcher (among other things), iTunes sucks. Badly. iPodder is nicer, mainly because I can keep my follow list in the cloud at PodNova. However, it (or the combination with podnova) often ends up downloading gigs of old stuff, on some particular feeds. Worse, it consumes obscene quantities of memory and CPU, with its UI being unresponsive to the point of being unusable, like 30 second or more delays for each gesture. This is on an early macbook.

Anyway, I decided to rectify the situation and go back to bashpodder, a tiny shell script which proves the point that a podcatcher need not be grandiose, nor a resource gobbler. It’s also cool as it’s easily customisable for anyone with some bash-fu. I modded it a few years back to keep my follow list in the cloud. (I believe clouds were called “servers” back then.)

I’ve recently modded bashpodder to add files to iTunes. Yes, I still like iTunes and I definitely like the i* players which are, for most intents and purposes, constrained to the universe of iTunes. As for it’s podcatcher, not cool. The interface for exploring podcasts is cumbersome, and the result, the downloaded podcasts, are not handle with care. For example, if you download podcasts with iTunes, it marks them out specially as podcasts, and there’s no way to, say, delete all podcasts older than a week. If they’re normal tracks added from an external catcher, they’re just regular MP3s and you can do what you like with them. And you can’t keep your follow list in the cloud!

So here’s bashpodder modified to add to itunes. (The itunes part I added is the HERE doc section beginning with /usr/bin/osascript. You could easily extend it to, say, tag podcasts from certain feeds with a certain album name.)

Click on “Plain Text” and cut-and-paste it into a shell file. Easiest would be to download the several files required for bashpodder (there should be a mod to make it just a single self-modifying file), and replace contents with that below.


  1. #!/bin/bash
  2. # By Linc 10/1/2004
  3. # Find the latest script at
  4. # Revision 1.2 09/14/2006 - Many Contributers!
  5. # If you use this and have made improvements or have comments
  6. # drop me an email at linc dot fessenden at gmail dot com
  7. # I'd appreciate it!
  9. # Make script crontab friendly:
  10. cd $(dirname $0)
  12. # datadir is the directory you want podcasts saved to:
  13. datadir=$(date +%Y-%m-%d)
  15. # create datadir if necessary:
  16. mkdir -p $datadir
  18. # Delete any temp file:
  19. rm -f temp.log
  21. # Read the bp.conf file and wget any url not already in the podcast.log file:
  22. while read feed
  23.   do
  24.   podcast=`echo $feed | cut -f 1 -d ' '`
  25.   echo $podcast
  26.   file=$(xsltproc parse_enclosure.xsl $podcast 2> /dev/null || wget -q $podcast -O - | tr 'r' 'n' | tr ' " | sed -n 's/.*url="([^"]*)".*/1/p')
  27.   for url in $file ; do
  28.     echo "Retrieving $url"
  29.     echo $url >> temp.log
  30.     if ! grep "$url" podcast.log > /dev/null
  31.       then
  32.       # wget -t 10 -U BashPodder -c -q -O $datadir/$(echo "$url" | awk -F'/' {'print $NF'} | awk -F'=' {'print $NF'} | awk -F'?' {'print $1'}) "$url"
  33.       outpath=$datadir/$(echo "$url" | awk -F'/' {'print $NF'} | awk -F'=' {'print $NF'} | awk -F'?' {'print $1'})
  34.       curl --retry 10 -C - $url > $outpath
  35.       fullpath=`pwd`/"$outpath"
  36.       /usr/bin/osascript <<-EOF
  37.         tell application "iTunes"
  38.           set posix_path to "$fullpath"
  39.           set mac_path to posix_path as POSIX file
  40.           set new_track to add mac_path
  41.           set genre of new_track to "*Podcast"
  42.         end tell
  43. EOF
  44.     fi
  45.     done
  46.   done < bp.conf
  47. # Move dynamically created log file to permanent log file:
  48. cat podcast.log >> temp.log
  49. sort temp.log | uniq > podcast.log
  50. rm temp.log
  51. # Create an m3u playlist:
  52. ls $datadir | grep -v m3u > $datadir/podcast.m3u

All my [email protected] are Belong to Me!!!

Hosting, Podcast

In the past day, I’ve pulled down all my podcast mp3 files from libsyn and updated all the posts to point to my domain instead of libsyn. Hence the major feed refresh on the blog and podcast, sorry if that hit you subscribers. (Is anyone still subscribed to the podcast?)

This is a big relief.

Having the podcasts hosted on my own domain gives me slightly more incentive to start podcasting again. Also, having PodPress installed has been a great help too. My next priority, though, is to upgrade WordPress, so I can get some modern features like auto-backup.

Libsyn has been a fine service, but really my Dreamhost account is all I really need now – given how much storage and bandwidth modern hosting accounts provide – and it’s nice to have direct file system access to all the podcasts too.

Wishlist: A Skype Recorder in the Cloud

Conspicuous by its absence is a recording function in Skype. However, Skype competitor Gizmo has it and there are lots of third-party apps too. But what we really need is a skype recorder in the cloud.It’s pretty obvious when you think about it. Most of the time when a conversation is recorded, you want to stick it somewhere and the best place to stick it is on a server where you can share it among all the callers, podcast it, etc. I call you and then I call a third party, an automated software agent I’ll call Ace (“He’s Ace, Ace the Recording Dude, and he Records all my Skype calls. Ace, you’re so Ace.” If you want an acronym we’ll make him Ace the Artificial Call Entity).

Now Ace is a congenial guy, so the moment I call, he picks up and starts recording. The resulting MP3 (or Wave if I paid for the premium service) includes the names of callers and the date in its name and/or metadata. Furthermore, when the call ends, Ace initiates a chat to grab some extra metadata. The first question might be if it’s for a podcast? Then what genre is it? Any album art?

One objection may be what if Ace goes down? But Ace could easily output a waveform to tell you what he’s recording, using Comet, Flash, or an optional desktop widget.

Some of you are thinking “but I need it locally to edit it”. Well that argument doesn’t apply if it’s just a business conversation you need to keep on record for instance, but okay if it’s a podcast, then you might want to. Me, I can’t stand editing audio…I can record two more podcasts in the time it takes me to manually tweak an individual episode. And it must be said that Audacity is dog-slow even on a Macbook Pro, and it doesn’t output to MP3 last time I checked as there’s no lamelib for Intel or something. Having it on the server makes it easy to run an automated cleansing script against it. It also makes it nice and easy to outsource the tasks of cleansing and publishing (and transcribing too if you like) for a buck or two using MechTurk or ELance type sites.

Current process of recording a 2(+) way podcast:

  • Co-ordinate things so you record the call.
  • Chat
  • Cleanse
  • Restart audio editor after it crashes
  • Cleanse
  • Remember to add meta-tags
  • Import to ITunes, add album art
  • Transfer file
  • Publish it

Ace way to record a podcast:

  • Call your mate, then call Ace.
  • Chat
  • Answer Ace’s questions
  • Ace publishes it or passes it on for post-production

PS There’s a lot that could be done along these lines. A lot of stuff should never have to leave the cloud and a lot of creative software should be providing options to FTP, upload, scp, whereever possible; not just hooks where you have to write your own script to do the upload. I realise it’s hard, requires standards, security, privacy, but the main thing to note is this: even with current technology and no further hardware advances, there are big gaps between our current usage and our potential usage.

PPS I’ve been busy. I’ll be releasing 1+ sites soon. More info to follow. I’d love to hear from any beta testers who have the time to check out a new Ajaxy/Web2y site and provide some feedback.

The New Ubiquities

Email and the web have traditionally been the two ubiquitous services on the internet (prior to the web, it was email and usenet). Podcasting (and vidcasting/vodcasting) is now becoming another ubiquitous service. The reason I mention this was an interesting quote on BBC news today in a story about the web’s birthday. Despite the story having nothing to do with podcasting, it’s intro’d as follows (@ 25:00):

The world wide web is 15 years old. While podcasting is relatively new, it’s difficult for many of us to remember a time before email and websites.

For a long time, I tried to use games as an example of the difference between the net and the web, to point out to non-techies that the net is more than just surfing. No longer.

There’s another service becoming ubiquitous as well: telephony (IM alone never got past early adopter stage).

In the aforementioned story, the BBC’s futurologist points to mobile as the next big thing. I tend to agree, and this is a case where the “leapfrogging” buzzword will come into full play. So much depends on mobile telephony regulation and the degree of innovation within the telco industry. Right now, mobile internet rates are laughable in most countries, and development platforms remain as fragmented and obscure as ever.

Appearance on EBA Ajax Podcast

The guys at EBusiness Apps – Andre Charland, Dave Johnson, Alexei White – have started a new weekly podcast on Ajax and invited me along for a general chat. They’re usually picking a general topic and riffing on it for a while – this week’s topic is long-term planning of Ajax projects … some companies aim to run their Ajax apps for up to 10 years, so what steps should they be taking to future-proof their apps, manage risks, and what future trends will there be? They invited me along.

It’s about an hour; the first few minutes are intro and a little discussion about the Ajax Design Patterns book.

As far as my own podcast, I should report here that I’ve actually been sitting on two new episodes, but didn’t release as the audio was quite poor on both. In the interests of proceeding with mor pattern podcasts, though, I will get them out soon, even if they have minimal shownotes for now. And getting the headset out again felt good, good enough to record some more.

Another DHTML “Game”

A new DHTML boxing “game” from the Man In Blue. Not quite DHTML Lemmings or Super Maryo World, but still more fun than it should be. A bit like the Ruby On Rael thing in reverse.

Also from the same presentation is an eerily lifelike OSX clone (Firefox-only). More evidence that Ajax might be useful in prototyping desktop apps. And since prototypes usually go on to become the real thing …

Thanks to the Web Essentials organisers for podcasting the talks. Safran on Sunday will have to go on hold for a while.

Ajax Design Patterns Book

Click to download the Podcast. You can also subscribe to the
feed if you want future podcasts automatically downloaded - check out the
podcast FAQ at

I’m pleased to announce the in-progress patterns at will be completed and published as an O’Reilly book: “Ajax Design Patterns”. The accompanying podcast explains the details, here’s a summary:

  • I’ll be completing full-text descriptions for all the listed patterns, give or take some restructuring.
  • will remain online, with full content – before, during and after the book’s release. I’ll continue building up the text on there. O’Reilly’s fully on board with this.
  • A Creative Commons license will apply throughout, with the non-commercial restriction possibly lifted after the book’s published. Contrary to John Dvorak’s recent rant, the CC license cannot, should not, and does not, preclude others from reusing the content commercially under fair use.
  • Some pages on the wiki are already open The main pattern pages will remain me-only until full-text is there, at which time I am hoping to take a branch, refine some things offline (mediawiki is painful for batch changes), and open everything up for editing.
  • The editor is Brett Mclaughlin and he too will be able to make edits. You might have seen that I’m highlighting patterns with full text on the main page. Brett will highlight them in a different colour once edited, hopefully leading to something resembling a “progress heatmap” and not a pile of visual mess.
  • I’ll continue to post updates about the patterns here, using the tags “Ajax”, “Patterns”, and, I’ve decided, “AjaxPatterns”.
  • I intend to podcast about the patterns and the corresponding examples at Ajaxify. I’m looking forward to being able to supplement the text with audio commentaries. Some prefer audio, some prefer text, but I think the best learning style is a multimodal combo deal.
  • Writing this in public will allow ample opportunity for feedback – as Dan Gillmor says, my readers are smarter than me. I know lots of you are using Ajax in different ways and for different tasks, so please tell me what sucks about the patterns. Comment in the Discussion tab for a given pattern (which I’ll pick up via RSS), leave a comment on my blog, or mail to [email protected].
  • Do you have any comments or suggestions about this writing strategy? Please leave them here or mail [email protected].

Click to download the Podcast. You can also subscribe to the
feed if you want future podcasts automatically downloaded - check out the
podcast FAQ at

This entry has a Podcast attached- an embedded MP3 link. On Internet Explorer, Click on the Podcast icon to listen, or click the right mouse button and “Save As…” to download. Better yet, you can subscribe for updates straight into your PC or ipod – it’s easy, open, and free. Install the free, open-source, Ipodder client and when it starts, just paste this in: “”. Or search for “software” under the ITunes Podcast Directory. More info in the Podcast FAQ.

The Story Behind “Developers, Developers, Developers!!!!”

You’re right, Jason – the voice behind “Developers, Developers, Developers” is Microsoft CEO Steve Ballmer. I thought it would be fun to include the clip over my podcast theme. Hearing Jason explain he had to pull over while laughing so hard makes it all worthwhile! I’ve seen few things that make people laugh so hard as the Ballmer performances, especially when you explain exactly who the guy is (“No, really!”). (Boris Yeltsin’s election campaign dance also comes to mind, though online footage is poor.)

In the podcast, I didn’t explain it, leaving listeners to either nod their heads knowingly or tilt their heads curiously. One thing I didn’t expect was a few people thought it was me (huh?)!!!! If you haven’t seen these clips, the Developers clip is actually tame compared to the “I love this company!” woo-woo effort. And if you listen carefully, there’s a little clip from that performance right at the end of the Ajax podcast.

Check out the mixup on that site too – I realy need to play it on the podcast sometime. Anyway, my podcasts are all speech for now until I work out a faster production mechanism. (Another reason to make the switch from Linux.)

Jeff Attwood was on the money when he blogged about “Steve Ballmer: Sweatiest Billionaire Ever”: “You have to respect a man with that much unbridled enthusiasm. I certainly can’t see staid, boring old Michael Dell dancing around on stage, screaming about how much he loves his company at the top of his lungs.” Dig the passion – I couldn’t agree more.

I’ve never heard the full story behind the “Developers” mantra, but I suspect it’s not what I initally assumed. Like most people, I originally assumed Ballmer was rallying the MS developers. But then I came across Joel Spolsky’s article where he uses the “Developers, Developers, Developers” catch-phrase to signify the company’s commitment to external MS developers. Joel’s an ex-Microsoftie and has great insight into the company. So, who exactly are all those clapping people in the clip? I’m guessing they’re the programmers who develop MS’s development tools, the managers who partner up with external developers, the marketing types who guide future directions … not just the MS developer community at large. Anyone, anyone?