The streak your whole community shares — or loses

Reddit already runs on streaks and stubbornness. What it doesn't have is a streak you can't keep alone. The Chain is one shared flame per subreddit: every day, three different people each have to pour a link before midnight — or the chain shatters, for everyone. Not your streak. The community's.

You can't grind it solo. The goal counts distinct keepers, so your second tap does nothing; you need two other people to show up, every single day. Miss once and the rope snaps: a dozen days of lanterns fall off the hill and stay there as rubble. Then Chain II begins on the same ground, in full view of the wreck of Chain I.

What it feels like

You open the post and it's night. A hill, a rope climbing to a wooden pole, and twelve glowing paper lanterns — twelve days this place has kept the flame. The line reads "The chain holds — one more before nightfall." You tap once. A spark lifts off your fingertip, floats up to today's lantern, and it blooms open — and your username paints itself onto the paper, letter by letter. That lantern is yours now. It stays yours until the day the community misses and the whole rope comes down.

And if the day is running out and you're still short, the world goes cold on screen — the little garland bulbs die one by one, the paper turns to bone, the sky slides to slate, and a slow heartbeat starts under it. Nobody is attacking you. The clock is. If someone pours the last link in the cold, gold sweeps back up the rope, "Mended in gold" floats up, and a permanent gold notch is whipped onto the line — a scar that says this one almost died. Those scars are kept forever.

Why the hard parts are built the way they are

"Three distinct people" is a data structure, not a rule I police. Every day's pours go into a Redis sorted set keyed by the caller's server-resolved Reddit username — the client never gets to say who you are. A repeat tap is idempotent; zCard counts distinct members. So "you can't win alone" isn't a check I could get wrong — it's structurally impossible to clear the day by yourself.

The clock heals itself. The backend is serverless — only alive while answering a request — so nothing actually runs at midnight. Instead, whoever touches the app next resolves every elapsed day in order: days met roll the streak up; the first missed day records the fallen chain into a graveyard and snaps once (a week away kills you one time, not seven). A subreddit can go quiet for days and the history is still correct the instant someone comes back.

Zero image assets. Every lantern, the moon, the ridgelines, the liquid gold, the shatter physics, every last particle — all of it is drawn in Phaser code. The whole bundle is two font files and not a single image, because a Reddit webview can't reach a CDN, and I wanted the art direction to be the retention mechanic, not a skin painted over one.

How it's built

A Devvit Web app: a pure-CSS splash card in the feed, a Phaser 4 webview that boots on tap, and Node handlers backed by per-install Redis — one subreddit is one isolated chain, automatically. The client polls state every 3 seconds and rebuilds from it, so another player's pour animates on your screen exactly like your own — and every set-piece is seek-safe, because a poll can land in the middle of a four-second shatter and nothing is allowed to break.

What I learned

The mechanic and the art couldn't be two separate things. My first version had a streak counter and some nice lanterns, and it was inert — a number going up. It only became a game when the streak stopped being displayed and started being rendered: the cold isn't a warning label, it's the screen physically losing heat; the history isn't a stat, it's rubble you can still see three chains later. The second lesson was letting the serverless constraint win — fighting to make midnight "run" was hopeless, but making every request self-heal the clock turned the limitation into one of the best properties the game has.

Built With

Share this project:

Updates

Submission history