Meme Grid is a daily challenge game on Reddit where players reveal cells on an 8x8 hidden meme and guess it as fast as possible. Fewer clicks and faster solves improve leaderboard rank. The app is built end-to-end with Devvit Web, using custom post entrypoints, Devvit Redis, Reddit APIs, scheduler automation, install triggers, and moderator menu actions.
Inspiration
Reddit thrives on recurring rituals and shared context. We wanted to build a daily game loop that feels native to that behavior: discover in-feed, play instantly, compare with others in the same thread, and come back tomorrow for a fresh challenge. Memes were the perfect theme because recognition is social, fast, and highly Reddit-native.
What it does
- Publishes a daily Meme Grid challenge post.
- Lets players reveal cells on an 8x8 hidden meme.
- Accepts guesses with tolerant answer matching (aliases and normalized text).
- Tracks solve time and click count.
- Ranks players per post leaderboard.
- Stores lifetime player stats.
- Supports both automated daily posting and moderator-triggered post creation.
How we built it
Platform + Runtime
- Devvit Web custom posts for game UX
@devvit/web/server+ Express for backend logic- Devvit Redis for persistence and rankings
- Reddit API for user identity and post creation
- Devvit scheduler + install trigger for daily automation
UX Architecture
- Inline splash entrypoint in feed (
default, inline) - Expanded gameplay entrypoint (
game) requestExpandedMode(..., 'game')to transition from discovery to full gameplay
Game/Server Model
- Single typed endpoint:
POST /api/game-message - Message-driven actions:
INIT_GAME,REVEAL_CELL,SUBMIT_GUESS,GIVE_UP,GET_LEADERBOARD,GET_STATS - Server-authoritative outcomes with shared TypeScript contracts
Data Model (Redis)
game:{userId}:{postId}: per-user run stateleaderboard:{postId}: daily rankingstats:{userId}: user lifetime statspost_meme:{postId}: post-specific meme assignmentused_memes: meme-cycle de-duplicationdaily_post:job_id: scheduler lifecycle
Scoring and Fairness
- Primary rank factor: solve time (
timeSeconds) - Tie-break factor: click count (
clickCount) - Composite score:
timeSeconds * 1000 + clickCount - Timer is resolved server-side for stronger leaderboard integrity
Key Devvit Features We Used
- Custom Post entrypoints (inline + expanded)
- Server context (
context.postId,context.subredditName) - Redis KV + sorted sets
- Reddit identity + post APIs
- Scheduler jobs (
daily-post) - App install trigger bootstrap
- Moderator menu action endpoints
Challenges we ran into
- Designing a game loop that feels instant while keeping server authority.
- Balancing strict answer validation with user-friendly guess tolerance.
- Ensuring deterministic meme assignment per post and no short-cycle repeats.
- Making daily automation robust (avoid duplicate scheduler jobs across reinstalls).
- Structuring ranking to prioritize speed while still rewarding efficiency.
How We Solved Them
- Used optimistic UI updates for cell reveals with rollback on failure.
- Normalized guesses and supported accepted aliases per meme.
- Cached
post_meme:{postId}and maintained aused_memescycle. - Stored job IDs, canceled stale schedulers, then registered current jobs on install.
- Used composite score math and Redis sorted sets for deterministic ordering.
Accomplishments that we're proud of
- Built a complete, Reddit-native daily game loop with minimal moderator overhead.
- Integrated multiple Devvit platform primitives in one coherent architecture.
- Delivered fair post-level competition with persistent progress and ranking.
- Created a scalable foundation for themed packs, events, and new modes.
What we learned
- Devvit’s dual-entry custom post model is powerful for game UX: a lightweight feed hook plus a deep expanded experience.
- Server-authoritative timing and scoring are essential for competitive trust, even when the client feels instant via optimistic updates.
- Treating
postIdas the competition boundary simplifies daily challenge design and aligns naturally with Reddit conversation threads. - Scheduler and install-trigger hygiene (storing/canceling prior job IDs) is critical for reliable long-running automation.
- Shared TypeScript contracts across client and server dramatically reduce integration bugs and speed up iteration.
What's next for Meme Grid
- Difficulty tiers (easy/medium/hard) and limited-time challenge variants.
- Subreddit-specific meme packs and seasonal events.
- Improved social loops (streak badges, friend challenges, post comments hooks).
- Analytics-driven balancing of penalties, guess limits, and meme selection.
- Moderation controls for meme pool curation and challenge configuration.
Built With
- devvit
- devvitredis
- devvitweb
- express.js
- react
- typescript
- vite
Log in or sign up for Devpost to join the conversation.