🧩 UpvoteChain

Massively Multiplayer Word Chain Game on Reddit

🎮 Playtest on Reddit 💻 Source Code


💡 Inspiration

The inspiration came from classic word association games we all played as kids reimagined for Reddit’s community-driven environment.

I wanted to create something that:

  1. Brings communities together through simple, accessible gameplay
  2. Encourages participation without gaming expertise
  3. Rewards engagement with achievements and leaderboards
  4. Works asynchronously so players across timezones can contribute

Reddit’s collaborative nature makes it perfect for this imagine entire subreddits competing to build the longest word chain ever!


🎮 What It Does

UpvoteChain transforms Reddit posts into a collaborative word-chain experience.

Each player adds a new word starting with the last letter of the previous one: turtle → elephant → tiger → rabbit

✨ Core Gameplay

  • 📝 Players submit words via modal forms
  • ✅ Each word validated (starting letter, duplicates)
  • 🔥 Streaks and achievements unlock as you play
  • 🏆 Live leaderboard tracks top contributors
  • ⏱️ Rounds auto-end via countdown timers
  • 🌍 Asynchronous multiplayer global participation

📋 Key Features

  • Real-time countdown timer (auto-ends rounds)
  • 16 unlockable achievements across 5 categories
  • Persistent leaderboard using Redis
  • Streak system for consecutive valid words
  • Configurable round durations (2, 5, or 10 mins)
  • Full state persistence across sessions

🛠️ How We Built It

Stack

  • Platform: Devvit Web v0.12.1 (Reddit’s post framework)
  • Language: TypeScript
  • State: Redis (persistence + leaderboards)
  • UI: Devvit Blocks + modal forms
  • Development: Kiro-enhanced workflow (.kiro/ specs, hooks, steering)
  • Architecture: Three layers

State Layer (Redis)

  • Stores chain, leaderboard, history, achievements
  • Atomic updates via zAdd, zRange

Logic Layer

  • Word validation (letter, format, duplicates)
  • Streak + achievement tracking
  • Round timer control

UI Layer

  • Splash screen
  • Game screen with timer
  • Leaderboard view

Kiro Layer (Development)

Specs (.kiro/specs/) - Feature requirements and validation rules Hooks (.kiro/hooks/) - Pre-commit quality gates Steering (.kiro/steering/) - Development patterns and guidelines

Config (kiro-config.json) - Project-wide settings

⚙️ Challenges We Ran Into

1. Async State Updates Don’t Trigger Renders

  • 🧠 Learned Devvit’s render model differs from React
  • ✅ Solved by using event-driven loading before screen switch

2. Real-Time Timer for All Players

Used context.useInterval() for 1s precision updates:

context.useInterval(async () => {
  if (!gameActive) return;
  const remaining = Math.max(0, roundEndTime - Date.now());
  setTimeRemaining(remaining);
  if (remaining <= 0) await endCurrentRound();
}, 1000);

3. No Text Input Fields

Implemented modal-based forms using context.useForm() mobile-friendly and native to Reddit.

4. Race Conditions with Multiple Players

Solved via Redis atomic ops:

  • zAdd for leaderboard
  • Sorted sets for duplicates
  • Optimistic UI with rollback

🏆 Accomplishments

  • 🚀 Built a complete multiplayer game in <48 hours
  • 💡 Solved async render issue with event-driven model
  • 🧠 Redis-powered leaderboard with atomic updates
  • 🎯 16 Achievement System
  • 🔁 Real-time gameplay without WebSockets

📚 What We Learned

  1. Devvit is React-like, but different
  • Async ops shouldn’t happen inside render
  • Event-driven design works best

    1. Redis makes multiplayer trivial
  • Sorted sets = instant leaderboard

  • Atomic operations = no race conditions

    1. Simplicity drives engagement
  • One mechanic done well beats complex systems

    1. Validation is UX
  • Friendly error messages boost engagement


🚀 What’s Next

🗓️ Short-Term (Next Month)

  • 🌍 Multi-language support (EN/ES/FR/HI/JP)
  • 🏅 Daily challenges
  • ☁️ Word cloud visualizations

📅 Medium-Term (Next Quarter)

  • 👥 Team mode (subreddit competitions)
  • 🎭 Themed rounds (“Animals”, “Food”, “Places”)
  • 📊 Advanced stats dashboard

🧠 Quick Math Example

To track chain progress dynamically: ( \text{Chain Length} = \text{Total Valid Words} - \text{Errors} )


🖼️ Screenshots

UpvoteChain Gameplay


❤️ Acknowledgements

Built for the Devpost Reddit Devvit Hackathon 2025 Made with ☕ + 💡 by Shrey Chaturvedi


Play Now: 👉 UpvoteChain on Reddit Contribute: 🔗 GitHub Repo

Built With

Share this project:

Updates