Build embeddable webapps with Livefyre StreamHub

bower install streamhub-sdk



Build Status Coverage Status

SDK to stream Content from Livefyre's StreamHub platform, create Views to render Streams and Content, and build amazing real-time social web applications.

Quick Example

To render Content from a StreamHub Collection as a list

function (Collection, ListView) {

    var collection = new Collection({
        "network": "",
        "siteId": "303827",
        "articleId": "xbox-0",
        "environment": ""

    var listView = new ListView({
        el: document.getElementById("listView")



Getting Started

You can use streamhub-sdk either by including a built version from Livefyre.js or using this repository locally.


To include it in your page from the CDN, add a script tag to your HTML file.

<script src=""></script>

Then use Livefyre.require to load streamhub-sdk

Livefyre.require(['streamhub-sdk#2'], function (SDK) {
    console.log('streamhub-sdk', SDK);

See this in action in this example:,console

Note: Any styling customization of Tweets rendered by streamhub-sdk must be done in accordance with Twitter's Display Requirements.

Local Development

To run locally, make sure you have NPM. It is bundled with node.js

npm install

This will install devDependencies and then use Bower to download client-side dependencies to lib/.

Run a web server for the project

npm start

Then check out http://localhost:8080/examples/listview for an example of streamhub-sdk/views/list-view

API Documentation

The full jsdoc documentation can be found at


Streams provide a standard interface to remote sources of Content, and behave like node.js streams3.

The browser-compatible Stream interface is provided by Livefyre/stream

// ad-hoc reading from a stream/readable
stream.on('readable', function () {
    var content =;
    content instanceof require('streamhub-sdk/content'); //true

// Or if sending to a stream/writable


Livefyre StreamHub Collections are a great source of Content, so this SDK includes Stream subclasses for reading historical Content from Collections and accessing any new Live Updates

  • streamhub-sdk/collection: Readable, will emit any new Content added to the Collection in real-time.
    • If piped to a Writable whose .more property is also a Writable (like streamhub-sdk/views/list-view), the Collection archive will be piped to .more. This sets up 'show more' behavior.
  • streamhub-sdk/collection/streams/updater: Readable, streams real-time updates to a Collection.
  • streamhub-sdk/collection/streams/archive: Readable, streams historical Content threads in a Collection in descending chronological order
  • streamhub-sdk/collection/streams/writer: Writable, written Content will be posted to the Collection

Create a Collection

var collection = new Collection({
    "network": "",
    "siteId": "303827",
    "articleId": "xbox-0",
    "environment": ""

Send real-time updates


Create a new real-time updater manually

var updater = collection.createUpdater();

Create a new archive Stream (historic Content)

var archive = collection.createArchive();

Post Content

collection.write(new Content('Foo!'))

Create a new writer manually

var writer = collection.createWriter();
writer.write(new Content('Foo!'));

Featured Content

StreamHub Collections support designating specific Content as 'featured', and this Featured Content can be retrieved specifically as a FeaturedContents object (streamhub-sdk/collection/featured-contents).

var featuredContents = collection.createFeaturedContents();

Just like a Collection, FeaturedContents objects have a .createArchive() method that returns a stream/readable that you can pipe into a ListView to display the Featured Contents.

var featuredArchive = featuredContents.createArchive();
var listView = new ListView();


Users can follow/unfollow collections. Followers (streamhub-sdk/collection/followers) provides access to all of the users currently following the collection as well as new following or unfollowing updates from the stream.

var followers = new Followers(collection);
followers.on('followers', function (followersArray) {
    followersArray.forEach(function (follower) {
        controller[follower.following ? 'addFollower' || 'removeFollower'](;
}).on('error', function (err) {


ListViews can render a Stream of Content into ContentViews to create real-time social Content experiences.

streamhub-sdk/views/list-view provides a basic view that will render a Stream of Content as an unordered list. ListViews are subclasses of stream/writable, so they can be written and piped to.

var view = new ListView({
    el: document.getElementById('example')

view.write(new Content('<p>Hello</p>'));

ListViews also have a .more property that is a stream/transform, and any streams piped to it will be throttled behind a "Show More" button. Piping a streamhub-sdk/collection to a ListView automatically pipes an archive to .more.

Thus this:


Is equivalent to:


You can configure the "Show More" behavior of ListViews:

var view = new ListView({
    // Number of initial items to display
    initial: 50,
    // Number of items to load when the
    // 'Show More' button is clicked
    showMore: 50


streamhub-sdk/content/content provides a structured base class to represent any Content on the web. Content must only have a .body, which is an HTML string.

var content = new Content('<p>Hello, world!</p>');
c.body; // '<p>Hello, world!</p>';

Content can also have the following properties:

  • more Content instances in its Array of .replies
  • streamhub-sdk/content/types/oembed instances in an array of .attachments
  • an .author object

Along with the Content base class, this SDK is bundled with:

  • streamhub-sdk/content/types/livefyre-content: Content sourced from Livefyre StreamHub
  • streamhub-sdk/content/types/livefyre-twitter-content: Tweets sourced from Livefyre StreamHub
  • streamhub-sdk/content/types/livefyre-facebook-content: Facebook posts sourced from Livefyre StreamHub
  • streamhub-sdk/content/types/livefyre-oembed: oEmbed Content sourced from Livefyre StreamHub


Usually you will want to render Content in a DOMElement using a streamhub-sdk/content/views/content-view.

var contentView = new ContentView({
    content: new Content('<p>Hello, world!</p>'),
    el: document.getElementById('example')

By default, this will render Content using the included hgn!streamhub-sdk/content/templates/content.mustache template to show the author's avatar and name with the content .body and any .attachments.

These other ContentViews are also included:

  • streamhub-sdk/content/views/twitter-content-view, a ContentView subclass for rendering tweets. This includes the twitter logo and the default template includes twitter's @anywhere intents for viewing the author's twitter profile as well as replying, retweeting, and favoriting the tweet.
  • streamhub-sdk/content/views/facebook-content-view, which renders Content with a Facebook logo.


The following CSS files are included as good defaults for your embedded Content experiences:

  • src/content/css/content.less: CSS for ContentViews
  • src/views/css/list-view.less: CSS for ListViews
  • src/css/style.less: All SDK CSS (bundles the above)