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. I built a live Twitter wall: anyone tweeting the wedding hashtag had their tweet — text, photo, avatar, time — flow onto the projection screens around the venue. A designated person on a tablet had final say on what made it through.

It was scoped to one event. The original design imagined Facebook events and Google+ events and multi-tenant administration, but only Twitter ever shipped. That turned out to be the right call.

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.

The crawler subscribed to the Twitter streaming API for the configured hashtag, normalized each result (text, photo URL, username, avatar, timestamp), and emitted it onto RabbitMQ. The Node.js server subscribed to the queue and pushed events out to all connected display clients via WebSockets.

The choke point was the admin dashboard's filter mode — when on, the entire flow ran through a moderation queue, so anything off-topic (or off-color) could be quietly dropped before it reached 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.