<?xml version="1.0" encoding="UTF-8"?>
<!-- New Digg check : 91e798b4288645588f593f30fc09aaea -->
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Superfeedr Blog : Real-time cloudy thoughts from a super-hero</title>
    <link href="http://blog.superfeedr.com/atom.xml" rel="self" type="application/atom+xml"/>
    <link href="http://blog.superfeedr.com/" rel="alternate" type="text/html"/>
    <link rel="hub" href="http://superfeedr.com/hubbub" />
    <updated>2012-02-01T02:48:19-08:00</updated>
    <id>http://blog.superfeedr.com/</id>
    
    
    <entry>
        <title>Sinatra, Heroku and Superfeedr</title>
        
        <link href="http://blog.superfeedr.com/superfeedr-ruby-heroku"/>
        <published>2012-01-21T00:00:00-08:00</published>
        <updated>2012-01-21T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/superfeedr-ruby-heroku</id>
        <content type="html">&lt;p&gt;This is a short tutorial on how to deploy an Sinatra web app that uses Superfeedr to Heroku. This app provides a very simple home page that lists the latests entries of some of your favorites sites. It&amp;#8217;s greatly inspired by the awesome &lt;a href=&quot;http://start.io/&quot;&gt;start.io&lt;/a&gt; from the awesome &lt;a href=&quot;http://petervidani.com/&quot;&gt;Peter Vidani&lt;/a&gt; and &lt;a href=&quot;http://jacobbijani.com/&quot;&gt;Jacob Bijani&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Set up&lt;/h3&gt;
&lt;p&gt;We will use &lt;a href=&quot;http://www.sinatrarb.com/&quot;&gt;Sinatra&lt;/a&gt;, the &lt;a href=&quot;https://github.com/superfeedr/rack-superfeedr&quot;&gt;Rack Superfeedr gem&lt;/a&gt;, as well as Twitter&amp;#8217;s bootstrap for the layout, because I suck at making things shinny.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s start first by creating the application on Heroku.&lt;/p&gt;
&lt;p&gt;Create the repo:&lt;br /&gt;
&lt;code&gt;
    mkdir start-page &amp;amp;&amp;amp; cd start-page
&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;
    git init
&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;
    git add .
&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;
    git commit -m &quot;init&quot;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Create the application on Heroku:&lt;br /&gt;
&lt;code&gt;
    heroku create --stack cedar
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Add the hostname as an environment variable. It is used by the rack middleware to build the callback urls:&lt;br /&gt;
&lt;code&gt;
    heroku config:add  HOST=&amp;lt;YOUR APP DOMAIN&amp;gt;
&lt;/code&gt;&lt;br /&gt;
Add the superfeedr addon:&lt;br /&gt;
&lt;code&gt;
    heroku addons:add superfeedr
&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Implementation&lt;/h3&gt;
&lt;p&gt;This implementation is minimalistic, feel free to look at the code closely.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s add the files:&lt;br /&gt;
&lt;code&gt;
    touch app.rb
&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;
    touch config.ru
&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;
    touch Gemfile
&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;
    mkdir views/ &amp;amp;&amp;amp; touch views/index.erb
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;In &lt;code&gt;app.rb&lt;/code&gt;:&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/1653742.js?file=app.rb&quot;&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;In &lt;code&gt;config.ru&lt;/code&gt;:&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/1653744.js?file=config.ru&quot;&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;In &lt;code&gt;Gemfile&lt;/code&gt;:&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/1653748.js?file=Gemfile&quot;&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;In &lt;code&gt;views/index.erb&lt;/code&gt;:&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/1653753.js?file=index.erb&quot;&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;
    git add .
&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;
    git commit -m &quot;implemented&quot; -a
&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Deploying&lt;/h3&gt;
&lt;p&gt;That&amp;#8217;s the simplest part:&lt;/p&gt;
&lt;p&gt;First, let&amp;#8217;s install the gems.&lt;br /&gt;
&lt;code&gt;
    bundle install
&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;
    git add Gemfile.lock 
&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;
    git commit -m &quot;adding Gemfile.lock&quot; -a
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And push the code&lt;br /&gt;
&lt;code&gt;
    git push heroku master
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&amp;#8230; And that&amp;#8217;s it!&lt;/p&gt;
&lt;p&gt;Point your browser to your Heroku application. It is likely that you&amp;#8217;ll have to wait for the feeds you have added to have new content before you see it appear on your home page. The last step is to make this page your default start page in your favorite web browser.&lt;/p&gt;
&lt;p&gt;Check &lt;a href=&quot;http://floating-sky-5183.herokuapp.com/&quot;&gt;mine&lt;/a&gt;!&lt;/p&gt;
&lt;h2&gt;Gotchas&lt;/h2&gt;
&lt;p&gt;Heroku will put this application to sleep if you only use a single dyno&amp;#8230; and since we store the entries in memory for now, that means you&amp;#8217;ll lose that data if the app goes idle. The solution is very simple: store the data, using another &lt;a href=&quot;https://addons.heroku.com/&quot;&gt;Heroku addon&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Of course, this is a very simple application and there is a ton of little things that one can do to improve it:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;add the ability to dynamically subscribe to feeds&lt;/li&gt;
	&lt;li&gt;show meta data, like the number of bit.ly clicks on each of the stories&lt;/li&gt;
	&lt;li&gt;auto-refresh the page&lt;/li&gt;
	&lt;li&gt;&amp;#8230;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;strong&gt;Superfeedr Heroku addon&lt;/strong&gt; is still in alpha to this date, so if you want to run, this, please &lt;a href=&quot;http://superfeedr.com/about&quot;&gt;email us&lt;/a&gt; and we&amp;#8217;ll get you in!&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Rack Middleware for Superfeedr</title>
        
        <link href="http://blog.superfeedr.com/rack-middleware-superfeedr"/>
        <published>2012-01-19T00:00:00-08:00</published>
        <updated>2012-01-19T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/rack-middleware-superfeedr</id>
        <content type="html">&lt;p&gt;I am a bit ashamed that this comes so late&amp;#8230; but it&amp;#8217;s always better late than never: we have a &lt;a href=&quot;http://rubygems.org/gems/rack-superfeedr&quot;&gt;rack middleware for Superfeedr&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What it does is simple: &lt;strong&gt;subscribe&lt;/strong&gt;, &lt;strong&gt;unsubscribe&lt;/strong&gt; and help you &lt;strong&gt;handle notifications&lt;/strong&gt; by hiding all the &lt;a href=&quot;http://superfeedr.com/documentation#pubsubhubbub&quot;&gt;PubSubHubbub&lt;/a&gt; &lt;del&gt;complexity&lt;/del&gt; magic. Since it&amp;#8217;s Rack, it should work with any Ruby web framework that supports Rack, including Rails and Sinatra.&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/1644799.js?file=superfeedr-sinatra.rb&quot;&gt;&lt;/script&gt;&lt;p&gt;Get it while it&amp;#8217;s hot: &lt;code&gt;gem install rack-superfeedr&lt;/code&gt;, and check the code on &lt;a href=&quot;https://github.com/superfeedr/rack-superfeedr&quot;&gt;github&lt;/a&gt;. If you build something awesome, please let us know and we&amp;#8217;ll link to it.&lt;/p&gt;
&lt;p&gt;As you can see it&amp;#8217;s quite elegant :) Can&amp;#8217;t wait to show you how to run that with our &lt;a href=&quot;https://gist.github.com/1585628&quot;&gt;Heroku Addon&lt;/a&gt;! if you want to be among the very first testers. Please let us know!&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Publish Subscribe for the web</title>
        
        <link href="http://blog.superfeedr.com/pubsub-web"/>
        <published>2012-01-13T00:00:00-08:00</published>
        <updated>2012-01-13T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/pubsub-web</id>
        <content type="html">&lt;p&gt;Everybody tries to make the web better. Here&amp;#8217;s my attempt.&lt;/p&gt;
&lt;h3&gt;A brief history of the web.&lt;/h3&gt;
&lt;h4&gt;&lt;span class=&quot;caps&quot;&gt;READ&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;I&amp;#8217;m 29, but I was lucky enough to be among the very first web addicts. When I remember most of the websites from that time, I am pretty embarrassed by how ugly they were, but also (worse) by how useless they were. I&amp;#8217;m sorry to say, but &lt;em&gt;at the time, the web was not making anyone&amp;#8217;s life better&lt;/em&gt;. The only thing it did was replacing shinny paper based magazines with ugly looking screens. I now fail to see how I could consider this as an improvement.&lt;/p&gt;
&lt;p&gt;A lot of people wrote this, but &lt;strong&gt;the web was mostly &lt;span class=&quot;caps&quot;&gt;READ&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;ONLY&lt;/span&gt;&lt;/strong&gt;. In other words, aside from a very few things, the only activity one could ever do was read. This is &lt;em&gt;why we have pages, bookmarks, site indices&lt;/em&gt;&amp;#8230; etc. At this time, search engines appeared, because people needed to a way to find the content they wanted to read. Similarly e-commerce was born, because quickly, many companies exposed the traditional product lists on the web so that their prospects could read them.&lt;br /&gt;
This behavior is baked deep into the protocol that we use to access the web, in the form of &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;GET&lt;/span&gt; requests&lt;/strong&gt;.&lt;/p&gt;
&lt;h4&gt;&lt;span class=&quot;caps&quot;&gt;WRITE&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;A bit more than 10 years ago, a massive shift happened: we started to &lt;em&gt;write to the web&lt;/em&gt;. That was interesting. &lt;em&gt;For once, the web was offering something new&lt;/em&gt; as very few people were actually able to write in newspapers and magazines! Blogging was the very first step of this and quickly the web sites that allowed us to do write saw the massive spike in traffic: wikipedia, youtube, flickr outgrew the old portals that ISPs were forcing down their user&amp;#8217;s throats.&lt;br /&gt;
It&amp;#8217;s also at that time that &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; started to appear. Developers were able to program services that would write to 3rd party websites, instead of actual people. Writing is also baked deep into our protocols in the form of &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;POST&lt;/span&gt; requests&lt;/strong&gt;.&lt;/p&gt;
&lt;h4&gt;&lt;span class=&quot;caps&quot;&gt;SUBSCRIBE&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;People were now able to read and write the web. Increasingly they were interested by what other people they knew wrote, because, after all, that is who they used to interact with in the real world. &lt;em&gt;It slowly put people in broad light&lt;/em&gt;, as opposed to big media outlets. The logical next step was to map our physical friendships to the web. That&amp;#8217;s the social networks wave. The real new activity here is this &lt;strong&gt;bounding&lt;/strong&gt;: expressing interest in someone to later read the content they wrote. Whether you call that &lt;em&gt;subscribing&lt;/em&gt;, &lt;em&gt;following&lt;/em&gt;, &lt;em&gt;friending&lt;/em&gt; or &lt;em&gt;circling&lt;/em&gt;, it&amp;#8217;s all the same pattern.&lt;/p&gt;
&lt;p&gt;Interestingly enough this is &lt;strong&gt;more than just social&lt;/strong&gt;. Several very successful ecommerce services offer the same kind of pattern and allow you to subscribe to their deals mailing lists. Coincidentally, we now access the web more through mobile devices than through our computer, which means that context (place and time) is increasingly important, and some services are able to provide us a better experience by subscribing us to our context. What&amp;#8217;s interesting is that &lt;strong&gt;despite the obviousness and the ubiquity of this subscribe pattern, there is no such verb into the &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; protocol&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Hooks and Callbacks&lt;/h3&gt;
&lt;p&gt;The little story above is nice, but, even if we don&amp;#8217;t have this &amp;#8220;subscribe&amp;#8221; verb, it looks like we do already have all the services working just fine, so why would we need something to do it?&lt;/p&gt;
&lt;p&gt;The first answer is obviously &lt;strong&gt;standards&lt;/strong&gt;. By having a standard way to doing so, we could probably &lt;em&gt;decouple that action from specific services&lt;/em&gt;. If that happens, it means that we could start using generic clients to subscribe to all kinds of things online. Do you use a different browser for Facebook and Groupon? By pushing down the stack the subscription pattern, we can &lt;strong&gt;abstract it&lt;/strong&gt;! Hopefully we can even bake this in browsers in one way or another.&lt;/p&gt;
&lt;p&gt;Another reason is that I hope and believe that this will open the door for a &lt;strong&gt;new way of creating web applications&lt;/strong&gt;. Several programming languages also have a Publish Subscribe pattern. These languages and frameworks are usually very &lt;em&gt;efficient and elegant for decoupled systems&lt;/em&gt;. Many modern web technologies like Node.js, but also datastores like Redis&amp;#8217;s PubSub have made it much easier to write complex workflows.&lt;br /&gt;
Plugging complete web applications will certainly make creating complex systems much easier. Most web developers don&amp;#8217;t think much about electricity, cooling or even IO, with the advent of fully managed platforms. &lt;strong&gt;Layering common functionnalities and building on top is an amazing enabler&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For example, not only could we (humans and machines) &amp;#8220;subscribe&amp;#8221;, and combine that with other actions, like write. We could even imagine machines subscribing to other machines&amp;#8217;s action to let the user decide which workflow he wants. Does this remind you of &lt;a href=&quot;http://blog.superfeedr.com/webintents/&quot;&gt;WebIntents&lt;/a&gt;? it should, as web intents are a way to subscribe to a user&amp;#8217;s actions. I told you this publish/subscribe pattern is everywhere!&lt;/p&gt;
&lt;h3&gt;Getting involved!&lt;/h3&gt;
&lt;p&gt;Some of the smartest web engineers have fought for years to &lt;strong&gt;bring this subscribe approach to the web stack&lt;/strong&gt;, through start-ups, the use of other non-http protocols, by bending &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;, or by writing &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;-based protocols for specific sub-cases. None of these approaches became as ubiquitous as the pattern itself.&lt;/p&gt;
&lt;p&gt;But today, there is some kind of momentum as the web&amp;#8217;s data is becoming harder and harder to ingest for everybody (machines and humans). This is why I&amp;#8217;m trying to &lt;strong&gt;push the W3C to sit down and take some time to think about all this&lt;/strong&gt;. I have created a &lt;a href=&quot;http://www.w3.org/community/groups/#pubsub&quot;&gt;Community Group&lt;/a&gt; there and I hope that slowly, but surely people will express their needs, and why having this would make the web better. There are number of topics and use cases that need to be covered, I hope and believe we will cover them all.&lt;/p&gt;
&lt;p&gt;Please, join us.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Twitter SERP Drama</title>
        
        <link href="http://blog.superfeedr.com/twitter-serp-drama"/>
        <published>2012-01-10T00:00:00-08:00</published>
        <updated>2012-01-10T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/twitter-serp-drama</id>
        <content type="html">&lt;p&gt;Today Google introduced significant changes to their algorithm. Like every time this happens some people are scared their &lt;em&gt;free pension&lt;/em&gt; will end. This is clearly due to Google&amp;#8217;s &lt;del&gt;too&lt;/del&gt; incredibly high market share. This time, among the whiners, is Twitter, and this is interesting.&lt;/p&gt;
&lt;p&gt;Not so long ago, &lt;em&gt;Twitter sold its public and user-owned&lt;/em&gt; [their words, at the time] data to Microsoft and Google. What&amp;#8217;s interesting is that this is, to my knowledge &lt;strong&gt;the only time that Google paid anyone to index their content&lt;/strong&gt;. A couple years later, it looks like Google has sobered down and they eventually did not renew the Twitter contract when it ended. In other words, Google considered that Twitter&amp;#8217;s data wasn&amp;#8217;t worth more than anyone else&amp;#8217;s data on the web and that their regular crawling should be plenty. Now, Twitter seems to be a bit sour, because &lt;strong&gt;not only have they lost a significant revenue opportunity, but they also likely lost couple positions&lt;/strong&gt; in Google&amp;#8217;s search engine result pages.&lt;/p&gt;
&lt;p&gt;The $1Bn question becomes : &lt;em&gt;did Google favor their own results over Twitter&amp;#8217;s or did Twitter just go back to where they belong?&lt;/em&gt; Some people may give Google the benefit of the doubt after last week&amp;#8217;s &lt;a href=&quot;http://siliconfilter.com/this-post-is-sponsored-by-google-chrome/&quot;&gt;Chrome-gate&lt;/a&gt;, but that&amp;#8217;s not enough. The only way to know for real would be to make sure that Google+ and Twitter have the same visibility and that Google can access Twitter&amp;#8217;s data in the same way that they access their own data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This is where open protocols win&lt;/strong&gt;. Google has been a strong advocate for an open web, with no barrier, no contract and an undiscriminated access. If Twitter supported open protocols, Google (and anyone else) would be able to get this public data in realtime, and they should then get their old &lt;span class=&quot;caps&quot;&gt;SERP&lt;/span&gt; ranking back. If they did not, well, then, we could certainly suspect that Google is pushing up its own results.&lt;/p&gt;
&lt;p&gt;Using proprietary protocols, forcing partnerships, discriminating between services mostly obfuscates the play field. At the time nobody was really shocked that twitter and Google entered in a specific agreement, but what we&amp;#8217;re seeing today is the immediate consequence. Maybe Google is favoring their own results, but even if they did, can Twitter really complain about it? They lost their credibility when they restricted the access to that data: &lt;em&gt;Nemo auditur propriam turpitudinem allegans&lt;/em&gt;&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Node Superfeedr</title>
        
        <link href="http://blog.superfeedr.com/node-superfeedr"/>
        <published>2012-01-06T00:00:00-08:00</published>
        <updated>2012-01-06T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/node-superfeedr</id>
        <content type="html">&lt;p&gt;It&amp;#8217;s long overdue, but we built a little node.js library to interact with Superfeedr from any node.js application. I want to thank &lt;a href=&quot;https://github.com/mborho&quot;&gt;Martin Borho&lt;/a&gt; for his precious help, as well as &lt;a href=&quot;http://spaceboyz.net/~astro/&quot;&gt;Astro&lt;/a&gt; for his amazing work on &lt;a href=&quot;https://github.com/astro/node-xmpp&quot;&gt;node-xmpp&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;A bit of theory&lt;/h3&gt;
&lt;p&gt;We built this wrapper using our &lt;a href=&quot;http://superfeedr.com/documentation#xmpp_pubsub&quot;&gt;&lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/a&gt;. This may sound surprising to a lot of you, as I have advised to a lot of people to use PubSubHubbub when they were building a web app.&lt;/p&gt;
&lt;p&gt;The main reason behind this is that &lt;em&gt;Node.js is the perfect framework to integrate an &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; client&lt;/em&gt;, transparently. For most people the syntax behind any node application is a bit odd with all these callbacks. It simply comes from the fact that Node.js is an implementation of the very famous reactor pattern. This means that &lt;strong&gt;node.js can handle stateful protocols&lt;/strong&gt; (like &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt;) very well&amp;#8230; Most of web framework do not offer this, because they map HTTP&amp;#8217;s stateless&amp;#8217;s approach.&lt;/p&gt;
&lt;h3&gt;Installing&lt;/h3&gt;
&lt;p&gt;&lt;span class=&quot;caps&quot;&gt;NPM&lt;/span&gt; is now a first class citizen in node&amp;#8230; which means you can install superfeedr-node with a simple:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;
    npm install -g superfeedr
&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Usage&lt;/h3&gt;
&lt;p&gt;In your node application, just instantiate a new Superfeedr Client, connect it, subscribe to feeds you need, and handle incoming notifications. It should all be relatively self-explanatory.&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/1571364.js?file=example.js&quot;&gt;&lt;/script&gt;&lt;h3&gt;FAQs!&lt;/h3&gt;
&lt;ul&gt;
	&lt;li&gt;Will this work behind the firewall?&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Yes! As opposed to PubSubHubbub, the connection initiated by the client is kept alive (&lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;FTW&lt;/span&gt;!), so Superfeedr can just use this connection to send you the data :)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
	&lt;li&gt;Will this work on fully-managed platforms (Nodejitsu, Heroku&amp;#8230;)?&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Yes! Of course&amp;#8230; this should work very well!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
	&lt;li&gt;It sucks, can I make it better?&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Please do, &lt;a href=&quot;https://github.com/superfeedr/superfeedr-node&quot;&gt;fork it&lt;/a&gt;!&lt;/p&gt;
&lt;/blockquote&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Happy New Year</title>
        
        <link href="http://blog.superfeedr.com/happy-new-year"/>
        <published>2012-01-05T00:00:00-08:00</published>
        <updated>2012-01-05T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/happy-new-year</id>
        <content type="html">&lt;p&gt;2012 is starting and, well, I have to confess we haven&amp;#8217;t published as much as we wanted on this blog! This is one of our new 2012 resolutions!&lt;/p&gt;
&lt;p&gt;Have a wonderful year, full of amazing projects, using technologies that you love!&lt;/p&gt;
&lt;p&gt;We have a &lt;span class=&quot;caps&quot;&gt;LOT&lt;/span&gt; on our plate&amp;#8230; and I can&amp;#8217;t wait to show you everything we&amp;#8217;ve been working on &lt;del&gt;secretly&lt;/del&gt; over the past couple weeks :)&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>WebIntents</title>
        
        <link href="http://blog.superfeedr.com/webintents"/>
        <published>2011-10-25T00:00:00-07:00</published>
        <updated>2011-10-25T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/webintents</id>
        <content type="html">&lt;p&gt;We &lt;strong&gt;hate barriers and user locks of any kind&lt;/strong&gt;, but the web is full of them. The &lt;em&gt;web works better when services are decoupled&lt;/em&gt;, when the user is at the center and picks the services he wants to use, not the services other services wants him to use.&lt;/p&gt;
&lt;p&gt;One of the key characteristics of the &lt;a href=&quot;http://msgboy.com&quot;&gt;msgboy&lt;/a&gt; is that it integrates seamlessly with your web : the user&amp;#8217;s web. We have 2 features in mind : &lt;strong&gt;allowing our users to subscribe&lt;/strong&gt; to more content using the msgboy or 3rd party services, and &lt;strong&gt;allowing the msgboy&amp;#8217;s users to share the content&lt;/strong&gt; they received using their favorite 3rd party services.&lt;/p&gt;
&lt;h2&gt;Enter WebIntents.&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://paul.kinlan.me/&quot;&gt;Paul Kinlan&lt;/a&gt; is a developer advocate at Google. He introduced &lt;a href=&quot;http://webintents.org/&quot;&gt;WebIntents&lt;/a&gt; almost a year ago. WebIntent&amp;#8217;s general idea is to allow web services to register features with each others in a decoupled way.  One of the example that Paul uses often is editing an image to remove red-eye.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If I am the developer who creates a photo library online, I may not have that feature. Yet, I know there exists services online that do that very well (maybe better than what I would do). WebIntents allows these 3rd services to register their &amp;#8220;red-eye-removal&amp;#8221; feature as an &amp;#8220;intent&amp;#8221;. WebIntents also allows my app to call these services without &amp;#8220;knowing&amp;#8221; about them previously.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you think about it, the web is full of services that do a great job, but the web itself would be tremendously more useful if all these services worked together in workflows.&lt;/p&gt;
&lt;p&gt;Msgboy wants to be a first class citizen of the web by allowing you to subscribe to content thru it anywhere you are. There are 2 ways of doing it :&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Convince every other website out there to just work for us and add a msgboy button to their site. Of course it&amp;#8217;d be much better for us in terms of branding&amp;#8230;. but that wouldn&amp;#8217;t work. Why would people promote us?&lt;/li&gt;
	&lt;li&gt;The other option is to implement the WebIntents so that rather than promoting another company/service/product, they promote a feature and make their application more useful for their users, without trading them!&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Registering the &amp;#8220;subscribe&amp;#8221; intent.&lt;/h3&gt;
&lt;p&gt;Registering an intent is fairly easy; you add the following code to your web application&amp;#8217;s &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; code (in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; part) :&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;intent action=&quot;http://webintents.org/subscribe&quot; /&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Also, make sure you add a &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; element to &lt;a href=&quot;http://code.google.com/p/webintents/source/browse/webintents.min.js&quot;&gt;webintents.min.js&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What this code does is simple : it registers an intent on the webintents.org service. This intent is to handle the &amp;#8220;subscribe&amp;#8221; action on behalf of the user. There are a couple more options, but for the sake of simplicity, let&amp;#8217;s stick with this simple default : feel free to check the &lt;a href=&quot;https://github.com/superfeedr/msgboy/tree/webintents&quot;&gt;msgboy&amp;#8217;s webintent&amp;#8217;s branch&lt;/a&gt; to see how registration is performed in the context of a more complex app.&lt;/p&gt;
&lt;p&gt;Technically, what happend here is that webintents.org stored the intent (using HTML5&amp;#8217;s localStorage). Which means that all the user data is local, but we&amp;#8217;ll come back to this a bit later. Of course the action/verb is stored, but also the url of the page that declared the intent.&lt;/p&gt;
&lt;h3&gt;Starting the activity.&lt;/h3&gt;
&lt;p&gt;Say you have a blog and you want to provide a subscribe button that your readers could use to indicate they want more of your content, using the application of their choice. When the button is triggered, you would do something like this:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;
    var intent = new Intent(&quot;http://webintents.org/subscribe&quot;, &quot;application/atom+xml&quot;, &quot;http://blog.msgboy.com/rss&quot;);
    window.navigator.startActivity(intent);
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;What this does is quite simple: it creates an action of type &amp;#8220;subscribe&amp;#8221;, and uses the params &lt;code&gt;&quot;application/atom+xml&quot;, &quot;http://blog.msgboy.com/rss&quot;&lt;/code&gt; for it. It then starts the activity, and that&amp;#8217;s when the magic happens:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;If you looked a bit in the webintents.js code, you would see that this will just send a request to webintents.org to perform that action.&lt;/li&gt;
	&lt;li&gt;Webintents.org will then open a popup and read the previously stored data in local storage about intents.&lt;/li&gt;
	&lt;li&gt;If there intents registered for that action, they are presented to the user&lt;/li&gt;
	&lt;li&gt;If the user choses any of the previously registered application, it it redirected to it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;small&gt;If you implement WebIntents you have to know that the params for the action are stored in a base64 encoded &lt;span class=&quot;caps&quot;&gt;JSON&lt;/span&gt; stringed used as the window&amp;#8217;s name.&lt;/small&gt;&lt;/p&gt;
&lt;h3&gt;What&amp;#8217;s next&lt;/h3&gt;
&lt;p&gt;It is fairly easy to register events, but also to trigger actions, and that works fine, even though this is very early for webintents. However, ff you&amp;#8217;ve taken a couple minutes to think about it, you will rightly notice that &lt;strong&gt;webintents.org becomes a single point of failure&lt;/strong&gt;, which kind of kills the principle of decentralized, decoupled, that&amp;#8217;s so precious for the web.&lt;/p&gt;
&lt;p&gt;Of course, you can run your own own if you forked the &lt;a href=&quot;https://github.com/PaulKinlan/WebIntents&quot;&gt;code from Github&lt;/a&gt;. But then, if an app is registered on a given web intents server, while the action is triggered on another server, the chain will not be completed.&lt;/p&gt;
&lt;p&gt;Luckily there is a solution for this, and that was actually Paul Kinlan&amp;#8217;s orginal idea : &lt;em&gt;use the browser to register intents and trigger actions&lt;/em&gt;. Browsers already include a lot of Javascript APIs, and it&amp;#8217;s Paul&amp;#8217;s goal to have them integrate the webintent&amp;#8217;s &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; as well. When that happens there is no need to use a 3rd party server. Users will eventually use their browsers to register intents and trigger actions, and the workflow stay the same.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Krtconf (realtime web conference)</title>
        
        <category term="meta" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/meta/krtconf"/>
        <published>2011-10-18T00:00:00-07:00</published>
        <updated>2011-10-18T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/meta/krtconf</id>
        <content type="html">&lt;p&gt;We&amp;#8217;ve been a bit silent over the past couple weeks, but &lt;strong&gt;we have an excuse&lt;/strong&gt;: days last 24 hours! We worked hard on the &lt;a href=&quot;msgboy.com&quot;&gt;msgboy&lt;/a&gt;. Chrome&amp;#8217;s latest versions broke our legs several times (changes in &lt;a href=&quot;http://www.w3.org/TR/IndexedDB/&quot;&gt;IndexedDB&lt;/a&gt;, changes in &lt;a href=&quot;http://dev.w3.org/html5/websockets/&quot;&gt;Websockets&lt;/a&gt;&amp;#8230; etc). If what doesn&amp;#8217;t kill us makes us stronger, &lt;em&gt;Msgboy is going to be super-hero strong&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Hopefully we can introduce it very soon, at the &lt;a href=&quot;http://krtconf.com/&quot;&gt;Krtconf&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://dl.dropbox.com/u/857122/krtconfscreen.png&quot; style=&quot;width:500px;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Krtconf is a &lt;strong&gt;2 day conference (Nov 7+8), organized by developers, for developers, in Portland, OR&lt;/strong&gt;. It&amp;#8217;s the place to be to stay to date on all realtime web technologies : &lt;em&gt;&lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt;, PubSubHubbub, Websockets, Socket.io, long-polling&lt;/em&gt;, and many many more. You will learn about these, but you will also get to implement them, with lots of demos, hackathons and conversations.&lt;/p&gt;
&lt;p&gt;Check the &lt;a href=&quot;http://krtconf.com/&quot;&gt;list of speakers&lt;/a&gt;. A lot of them are heroes for us. You&amp;#8217;ll see that you can&amp;#8217;t miss such an event, so &lt;a href=&quot;http://krtconf.eventbrite.com/&quot;&gt;grab your ticket now&lt;/a&gt; ($300 discount if you book before Oct 21st).&lt;/p&gt;
&lt;p&gt;Superfeedr is co-organizing it with the great folks at &lt;a href=&quot;http://andyet.net/&quot;&gt;&amp;amp;yet&lt;/a&gt;. We have a few speaker spots left, for sponsors mostly. If you&amp;#8217;re interested, please &lt;a href=&quot;mailto:adam@andyet.net&quot;&gt;drop us a note&lt;/a&gt;.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Superfeedr on FLOSS weekly</title>
        
        <category term="meta" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/meta/superfeedr-floss"/>
        <published>2011-10-13T00:00:00-07:00</published>
        <updated>2011-10-13T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/meta/superfeedr-floss</id>
        <content type="html">&lt;p&gt;Twit is an amazing web success. It&amp;#8217;s been an honor to be invited to talk about Superfeedr and PubSubHubbub on &lt;span class=&quot;caps&quot;&gt;FLOSS&lt;/span&gt; Weekly!&lt;br /&gt;
Watch the show : &lt;br /&gt;
&lt;iframe src=&quot;http://twit.tv/embed/9985&quot; width=&quot;480&quot; height=&quot;240&quot; scrolling=&quot;no&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; hspace=&quot;0&quot; align=&quot;middle&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;And don&amp;#8217;t forget to subscribe to the podcast, as it&amp;#8217;s one of the best podcasts out there :)&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Node XMPP Server</title>
        
        <link href="http://blog.superfeedr.com/node-xmpp-server"/>
        <published>2011-08-26T00:00:00-07:00</published>
        <updated>2011-08-26T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/node-xmpp-server</id>
        <content type="html">&lt;p&gt;At Superfeedr, we&amp;#8217;ve always been &lt;strong&gt;great fans of node.js&lt;/strong&gt;. We believe the ability to use the &lt;em&gt;same language on both servers and clients&lt;/em&gt; will breed a whole new generation of web developers that can do amazing work on both ends. Last year already, we released node.js code a couple hours ahead of &lt;a href=&quot;http://nodeknockout.com/&quot;&gt;NodeKO&lt;/a&gt;, and this year, we&amp;#8217;re doing it again.&lt;/p&gt;
&lt;h3&gt;A node KO treat&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;http://nodejs.org/logos/nodejs.png&quot; style=&quot;float:left; margin: 5px;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;In the context of the &lt;a href=&quot;http://msgboy.com&quot;&gt;msgboy&lt;/a&gt; (request your invite now!), we had to setup a new &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; server. After fighting with &lt;a href=&quot;http://www.ejabberd.im/&quot;&gt;ejabberd&lt;/a&gt;, we installed &lt;a href=&quot;http://prosody.im/&quot;&gt;Prosody&lt;/a&gt;, but we also quickly concluded that we would need a lot of customization, as well as the ability to tweak our server(s) to fit our exact needs.&lt;/p&gt;
&lt;p&gt;Since &lt;a href=&quot;http://spaceboyz.net/~astro/&quot;&gt;astro&lt;/a&gt; had been doing an &lt;strong&gt;amazing work&lt;/strong&gt; with his &lt;a href=&quot;https://github.com/astro/node-xmpp&quot;&gt;node-xmpp&lt;/a&gt; library to build &lt;em&gt;Client&lt;/em&gt;, &lt;em&gt;Components&lt;/em&gt; and even &lt;em&gt;Server to Server&lt;/em&gt; modules, the logical next step was to try to build a &lt;em&gt;Client to Server&lt;/em&gt; module so that we could have a full blown server. That&amp;#8217;s what we worked on the past couple days, and &lt;a href=&quot;https://github.com/superfeedr/node-xmpp&quot;&gt;it&amp;#8217;s now on Github&lt;/a&gt;!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Beware though&amp;#8230; as it&amp;#8217;s extremely early and some key features are not yet supported. Our biggest challenge is trying to fix a weird &lt;span class=&quot;caps&quot;&gt;TLS&lt;/span&gt; bug. Please help if you can!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Let&amp;#8217;s get dirty&lt;/h3&gt;
&lt;p&gt;If you&amp;#8217;re brave enough and want to get started, install our branch of node-xmpp from source. You should then be able to run a server by typing&lt;br /&gt;
&lt;code&gt;$ node examples/c2s.js&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now, take your favorite &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; client (we used Psi, but you need to make sure it will accept to transmit &lt;span class=&quot;caps&quot;&gt;PLAIN&lt;/span&gt; text passwords over an unencrypted connection) and connect to the server as user@zipline.local. Use &lt;code&gt;password&lt;/code&gt; for the password.&lt;/p&gt;
&lt;p&gt;Now, that was &lt;del&gt;relatively&lt;/del&gt; easy, and quite useless so far, as you could do that with any &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; server out there. The real interest of this one is that we wanted to give full control back to the developer to customize their server as much as they needed. Take a look at the &lt;code&gt;examples/c2s.js&lt;/code&gt; file for the code that runs this specific server:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Auth is simple: the c2s module will just callback with a username and a password. Your code should then decide whether you want to authorize or not connection, based on your database, or any other piece of application that you want.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;You can define modules supported by your server from the most popular XEPs, using &lt;code&gt;node-xmpp&lt;/code&gt;&amp;#8217;s mixins. The modules should be at the heart of any implementations, as we want to keep the c2s code itself very bare.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;There are currently 4 events that you can listen to on the C2S module itself : &lt;code&gt;connect, disconnect, authenticate, stanza&lt;/code&gt;, which are relatively self explanatory.  The &lt;code&gt;connect&lt;/code&gt; event should be used to register mixins to user connections. The &lt;code&gt;stanza&lt;/code&gt; event should probably be left empty (unlike in the example), as all meaningful stanzas should probably be treated in mixins.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Clustering!&lt;/h3&gt;
&lt;p&gt;Also, you get all the JS magic that lets you rewrite any code without much hassle. One of the key aspects of most &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; servers is their -in-ability to be deployed in clusters to handle more users. For those who want to dive in that direction, Redis&amp;#8217;s PubSub provides an elegant solution. Combining this with some sharding on the jids should probably go a long way! You can see in the basic example below that we rewrote the routing mechanism to use Redis and run multiple instances of the same server in a cluster.&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/1174490.js?file=cluster.js&quot;&gt;&lt;/script&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
</feed>
