When I started this blog on Movable Type 4, I used the Action Streams plug-in to put a list of Twitter and Facebook activities in the right hand column. I did this out of habit, treating the list of tweets as a black-box in the form of a widget rather than something actually integrated into the content of my blog. Over the last couple of week, I realized that while this made sense from a technical perspective, it didn’t really reflect the true relationship between the content generated through lifestreaming and long-form blog posts that expounded on a particular idea, never mind that fact that the former are going to outnumber the latter due to my lackadaisical efforts to compose interesting posts. But, more importantly, it demonstrated some of the limitations of using widgets as the fundamental building blocks of web publishing.
This isn’t particularly an epiphany for me, although I’ve spent many years advocating the idea that web publishing should be component-oriented. In 1998, Oliver Muoto and I started a company called Epicentric, that we built up to a $40 million a year business and sold to Vignette that was based on the idea that corporate intranets and extranets could be replaced by “My Yahoo”-style corporate portals. It made sense at the time, because it represented a much more efficient alternative to the cumbersome content management systems or hand-edited web sites that many businesses were trying to use as the basis of their web publishing efforts. Corporate America was trying to use the tools that had been developed for Internet sites whose primary business was the web to internal communications where these activities were supposed to be used in support of some other primary business and the end-result was at best overkill, and at worse a sinkhole of time and money. So, corporate portals where you simply assembled your page out of a collection of “portlets” (what we now call “widgets”), was a welcome alternative. Even then, we knew that there were some limitations to this, though. Each portlet was an isolated silo of content, we knew that eventually these things would need to talk to each other, and ideas like standards for “inter-portlet communications” were discussed at enterprise software conferences.
Seven years later, in the fall of 2005, I saw that Web 2.0 was recapitulating many of the developments of the enterprise software world. Content management systems, service-oriented architectures, and some of the work I’d done related to portals and portlets were now being redescovered in the form of blogging, mashups, and widgets. Teaming up with some of my former Epicentric colleagues, I started a company called Widgetbox that tried to implement some of the things we’d learned in the portal space to make widgets easier to build, find, and use. That company has since gone on to become the largest destination site for widgets on the web, with over 70,000 widgets available, and platform technologies like OpenSocial and Facebook’s Application API are built on many of the concepts that Widgetbox pioneered.
However, we still come back to the fundamental challenge of using widgets, which as that their strength is also their limitation. Widgets are componentized content, and components, by definition, compartmentalize. So, when I started this blog, and used Action Streams as a widget to segregate my microblogging activities from the rest of the content, I was falling into the trap of letting expediency drive information flow and the end result was a much less effective web site. Luckily, Action Streams is implemented as a plug-in and even though it can be used as a widget for quick integration, it can also be used within Movable Type’s powerful templating mechanism to let me easily create a single blog stream that merges my lifestreaming with posts like this. You can see the end results if you visit the main page of the site and see the blog posts intermixed with tweets on it. I really think that even a simple type of mash-up like this is a lot more interesting, especially when it can be accomplished without any coding just by editing a template.