Wedding stream.

Real-time Twitter wall for a friend's wedding (crawler → message queue → Node.js displays) with admin filter mode and starred users (bride, groom, party).

A friend was getting married and wanted something more interesting than a slideshow on the projector. So I built a live Twitter wall. Anyone who tweeted the wedding hashtag got their tweet onto the projection screens around the venue, with its text, photo, avatar and time. Someone on a tablet had final say on what made it through.

The original design had Facebook events, Google+ events and multi-tenant administration. Only Twitter shipped, scoped to the one event.

Architecture

admin · filter modeapprove / reject · starred userstwittercrawlerhashtag streamrabbitmqeventsnode.jswebsocket fanoutscreen Ascreen Bscreen CtweetsamqpsubscribewsDisplay modes: streaming-up · streaming-down · carousel, all consuming the same event stream.Filter mode pauses the stream and queues events for one-tap approve/reject.
The crawler pulls tweets matching the hashtag, normalizes them, and emits events to RabbitMQ. Node.js subscribes and pushes to all connected screens. Filter mode (hot) sits in front of the queue.
  • A crawler subscribed to the Twitter streaming API for the hashtag, normalized each tweet into text, photo URL, username, avatar and timestamp, and put it on RabbitMQ.
  • A Node.js server subscribed to the queue and pushed each event to every connected screen over WebSockets.
  • Filter mode on the admin dashboard ran everything through a moderation queue first, so anything off-topic (or off-color) got dropped before it hit a screen.

Overkill

This was one of the first applications I built from scratch, and I wanted to play with all of the stuff I'd been reading about. I think I threw in the obligatory MongoDB server somewhere, too.