# 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).

- Source: https://nabkey.com/tinkerings/wedding-stream
- Author: Chris Nabkey
- Published: 2026-04-25
- Built: 2012
- Status: shipped
- Stack: Node.js, RabbitMQ, AngularJS, Twitter API

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

<figure class="diagram">
  *Diagram: Wedding stream architecture: a crawler polls Twitter for the hashtag, emits to RabbitMQ; Node.js subscribes and pushes events to display clients via WebSockets; an admin dashboard with filter mode controls the flow.* ([view it on nabkey.com](https://nabkey.com/tinkerings/wedding-stream))
  <figcaption>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.</figcaption>
</figure>

- 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.
